Your API keys
Create a key for each site or app that uses the API, so you can revoke one without breaking the others.
Loading…
Plans and billing
API plans are separate from your Express Briefs website plan. Each has its own monthly generations, so heavy API use never uses up what you have for the website, and the other way round.
| Loading plans… |
Each successful request uses one generation, however many platforms it asks for. Failed and invalid requests are free. Your count resets on the first of each month (UTC).
Upgrading takes effect immediately for every key you already have, with nothing to change in your code. The requests-per-minute figure is per key. Payments are processed by Bachs.
Authentication
Send your key in the Authorization header. The X-API-Key header works too.
Authorization: Bearer eb_live_YOUR_KEY
Treat keys like passwords. We only store a fingerprint of each key, so if you lose one we can't show it again. Create a new key and revoke the old one.
POST/api/v1/generate
Generates a full description plus a caption for each platform you ask for, and three headline options.
| Field | Type | Description |
|---|---|---|
industry required | string | The type of business: real-estate, automotive, ecommerce, restaurants, fitness, recruitment, events, local-services, hospitality, fashion-resale or wedding-vendors. |
fields required | object | The details to write about. The keys depend on the industry, so use the field explorer below. |
platforms required | string[] | One or more of WhatsApp, Instagram, Facebook, Twitter, LinkedIn, TikTok, Snapchat, Reddit, Quora. Not case-sensitive. |
tone | string | Professional (default), Casual, Urgent, Luxury, Friendly or Bold. |
features | string[] | Up to 20 short selling points, such as "24/7 Security". |
extra | string | Anything else worth mentioning, up to 1,000 characters. |
Response
| Field | Description |
|---|---|
captions | An object with one entry per section: full_listing, one key per platform you requested (lowercase, such as instagram), and headlines, which is an array of strings. |
raw | The unparsed text we received. Use it as a fallback if a section is ever missing from captions. |
truncated | true if the output hit its length limit and later sections may be cut off. Ask for fewer platforms per request and make a second call for the rest. |
usage | Generations used this month, your monthly limit, your plan, and when the count resets. |
Each successful request uses one generation from your API plan, however many platforms you ask for. Failed and invalid requests are free.
Industries and fields
Each industry has its own fields. Pick one to see the keys it expects and the values its dropdowns offer on the website. The same data is available from GET /api/v1/industries/{slug}, without a key, if you'd rather build your form from it.
GET/api/v1/usage
Returns your API plan and how many generations you have used this month. Handy for alerting yourself before you run out.
{
"plan": "builder",
"used": 12,
"limit": 300,
"rate_limit_per_min": 30,
"resets_at": "2026-10-01T00:00:00.000Z"
}
Errors
Errors always look like this, so you can branch on code rather than reading the message:
{ "error": { "code": "invalid_request", "message": "\"platforms\" must be a non-empty array. Valid values: WhatsApp, Instagram, …" } }
| Status | Code | What to do |
|---|---|---|
| 400 | invalid_request | Something in the request is wrong or missing. The message says which part. |
| 401 | missing_api_key | No key was sent. Add the Authorization header. |
| 401 | invalid_api_key | The key is mistyped or has been revoked. Create a new one above. |
| 429 | limit_reached | You have used all of this month's generations on your API plan. The response includes upgrade_url. Upgrade, or wait for the monthly reset. |
| 429 | rate_limited | More requests per minute than your plan allows for one key. Wait a moment and retry, or upgrade for a higher limit. |
| 500 | generation_failed | The AI didn't return a result. Retry. Nothing was counted against your quota. |
| 503 | service_unavailable | Temporary problem on our side. Retry shortly. |