Skip to main content
This page is a decision guide. It answers two questions: which service do I activate first, and how do I actually wire one up so it survives contact with production.

Start here

1

1. Pick the service that matches the problem

Building editorial content, a blog, or a multi-language site? Start with AI CMS — it is the service with a full reference today. Storing user uploads or generated media? Storage. Authenticating your own users? Auth. Taking money? Payments.

What is Octavia

What each service covers.
2

2. Activate it and pick a plan

Enable the service from Dashboard → Octavia Services, then choose a plan. Every plan is the same API — the difference is what you are allowed to do before the API answers 426.

Quickstart

The click-by-click version, with screenshots.
3

3. Create a key at the lowest role that works

One key per system. Start with Read-only for anything that only reads, and raise the role only when a call actually fails with 403.

Teams & API keys

Roles, scopes, and rotation.
4

4. Use the SDK, not raw HTTP

Official clients exist for JavaScript, Python, PHP, C# and Go. They send the key for you, unwrap the envelope, and give you typed results.

All SDKs

Compare the five and pick one.

Pick an SDK, not a language

The five SDKs wrap the same REST endpoints and return the same envelope. They differ only in how the language spells things.
Every SDK sends exactly one header, x-api-key, and none of them expose a way to add headers. If you find yourself wanting to set a header manually, the answer is in the gateway, not the client.

Put together something real

For AI CMS, the content model has an order. Building it in this order means each step needs only what is above it.

Content model

Every resource, its fields, and what it depends on.

API quickstart

Build the whole model in about five minutes.

Before you ship

Four things separate a working demo from an integration that holds up. Handle 429 and 426 differently. 429 is transient — back off exponentially with jitter. 426 means a plan quota is exhausted, and retrying cannot fix it. Putting them in the same retry loop just burns rate-limit budget. Set a timeout. The PHP SDK defaults to no timeout, so a hung request will hang your worker. Set timeoutMs explicitly in every language.

Rate limits & errors

Which failures you can retry, and which you cannot.

Plans

What each plan includes, limit by limit.
Keep keys on the server. A key in a browser bundle is a compromised key. Read it from the environment, give each system its own, and rotate on a schedule. Paginate from the start. total counts the filtered set, not the page. Build the loop now rather than after the first timeout.

Status codes

Every code and its meaning.

Support

Ask the engineering team.