REST API reference
Base path /v1 on api.followerx.de or api.followerx.ae. JSON request and response bodies. ISO-8601 timestamps. Token amounts are integers.
Hosts
Use the host that matches the site the workspace belongs to. Keys issued on followerx.de only work on api.followerx.de.
https://api.followerx.ae/v1
Authentication
Create a key in the dashboard under Account → API keys, or POST /v1/api-keys. Send it as a Bearer token. Live keys start with fx_live_, test keys with fx_test_. Test keys never move real tokens or open live jobs.
Scopes
account:read account:write catalog:read profiles:read profiles:write jobs:read jobs:write deliverables:read invoices:read webhooks:read webhooks:write
Versioning
The path version is v1. The calendar version 2026-09-11 is sent as FollowerX-Version. Omit the header to get the latest stable behaviour. Breaking changes get a new calendar version and at least 90 days notice.
Errors
Errors are JSON with error.code, error.message and a request_id. Validation failures add error.errors[] with path and reason.
| HTTP | Code | Meaning |
|---|---|---|
| 400 | bad_request | The request body or query is malformed. |
| 401 | unauthorized | Missing, expired or invalid API key. |
| 402 | insufficient_tokens | The quote cannot be accepted because the balance is too low. |
| 403 | forbidden | The key is valid but lacks the required scope. |
| 404 | not_found | The resource does not exist on this account. |
| 409 | conflict | The job is not in a state that accepts this action. |
| 422 | validation_error | A field failed validation. See errors[].path. |
| 429 | rate_limited | Too many requests. Wait for RateLimit-Reset. |
| 500 | internal_error | An unexpected error. Retry with the same Idempotency-Key. |
{
"request_id": "req_4f2c1a",
"error": {
"code": "insufficient_tokens",
"message": "This quote needs 100 tokens; 42 are available."
}
}Rate limits
Read requests: 120 per minute per key. Writes: 30 per minute. Burst headers follow the IETF RateLimit draft: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset. 429 includes Retry-After.
Idempotency
POST and PATCH accept Idempotency-Key (UUID). Replays with the same key and body return the original response for 24 hours. A different body with the same key returns 409.
Pagination
List endpoints take limit (1–100, default 25) and starting_after. Responses include has_more and next_cursor.
Catalogue
SKUs and token prices match the public services page. Creator fees are billed separately at cost and are not a catalogue SKU. Rush is a +50% surcharge on eligible SKUs, requested as rush: true on the job.
| SKU | Service line | Tokens | Unit | Turnaround |
|---|---|---|---|---|
| audit_roadmap | strategy | 500 | roadmap | 5 business days |
| short_form_edit | content | 100 | asset | 3–5 business days |
| carousel_set | content | 75 | asset | 3 business days |
| copy_hook_pack | content | 50 | pack | 2 business days |
| shoot_day | content | 2250 | day | scheduled |
| community_hour | community | 65 | hour | ongoing |
| creator_campaign | creators | 750 | campaign | 3–4 weeks |
| discovery_optimisation | discovery | 300 | profile | 7 business days |
| discovery_monitoring | discovery | 100 | month | ongoing |
| analytics_reporting | analytics | 200 | month | ongoing |
| attribution_setup | analytics | 375 | one-off | 5 business days |
Jobs
A job is a work request against one SKU. Creating it does not spend tokens. The studio returns a quote; accepting it reserves tokens. Approving the deliverable captures them. If a published turnaround is missed without an agreed reason, reserved tokens return to the balance.
Example
curl https://api.followerx.ae/v1/jobs \
-X POST \
-H "Authorization: Bearer $FOLLOWERX_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 8c1d2e3f-4a5b-6789-abcd-ef0123456789" \
-d '{
"sku": "copy_hook_pack",
"title": "Hooks for the April launch",
"platform": "instagram",
"brief": "Twenty hooks for a product launch. Tone: direct, no hype.",
"rush": false
}'{
"id": "job_8k2m1q",
"object": "job",
"sku": "copy_hook_pack",
"service_line": "content",
"title": "Hooks for the April launch",
"status": "requested",
"tokens_quoted": null,
"tokens_reserved": 0,
"rush": false,
"profile_id": null,
"platform": "instagram",
"brief": "Twenty hooks for a product launch. Tone: direct, no hype.",
"deliverable_ids": [],
"created_at": "2026-09-11T21:00:00.000Z",
"updated_at": "2026-09-11T21:00:00.000Z"
}Tokens
Balances sit at account level and can be spent on any brand, profile or service line. Tokens do not expire. Purchases happen on the hosted checkout; the API can open that checkout and can read the ledger afterwards.
{
"object": "balance",
"available": 420,
"reserved": 50,
"lifetime_purchased": 1560,
"currency": "EUR",
"expires": false
}The API and MCP do not sell or report purchased followers, likes or views. Analytics endpoints return only work you requested against the published catalogue.
Webhooks
Deliveries are POST JSON with X-FollowerX-Timestamp and X-FollowerX-Signature: sha256=<hex of HMAC-SHA-256(secret, timestamp + '.' + raw body)>. Reject timestamps older than 5 minutes. We retry for 24 hours with exponential backoff.
account.updated balance.updated job.created job.quoted job.started job.in_review job.completed job.cancelled deliverable.ready invoice.issued invoice.paid
{
"id": "evt_91ab",
"object": "event",
"type": "job.quoted",
"created_at": "2026-09-11T21:12:00.000Z",
"data": {
"id": "job_8k2m1q",
"status": "quoted",
"tokens_quoted": 50,
"sku": "copy_hook_pack"
}
}Endpoints
Return the authenticated workspace: company, locale and default currency.
Update company name, locale or notification email.
Available, reserved and lifetime purchased tokens. Tokens do not expire.
Cursor-paginated purchases, spends, refunds and adjustments.
Published SKUs with token price, unit and turnaround. Same rates as /services.
One SKU, including whether rush (+50%) is offered.
Networks the studio accepts work on.
Social profiles linked to the workspace. Access is always via the platform’s own collaborator tools.
Register a handle and platform. Does not collect login passwords.
One connected profile and its access state.
Rename the profile or mark it inactive.
Unlink a profile. Open jobs on that profile stay open until cancelled.
Filter by status, service line, SKU or profile.
Open a work request against a catalogue SKU. Tokens are not deducted until you accept the quote.
Status, quoted tokens, brief, linked profile and deliverable IDs.
Reserve the quoted tokens and move the job to active.
Cancel a quoted job without charging tokens.
Two revision rounds are included on production SKUs. Extra rounds are quoted.
Accept the deliverable. Reserved tokens are captured.
Cancel a requested, quoted or active job. Unused reserved tokens return to the balance.
Status changes, quotes, revision notes and approvals in time order.
Finished files and reports attached to jobs.
Metadata and signed file URLs (15-minute lifetime).
Tax invoices for token purchases. Amounts include 19% German VAT unless reverse-charged.
One invoice, including net, VAT and gross.
Returns application/pdf.
Token purchases and their payment state. Card charges are not taken over the API.
Returns a hosted URL on followerx.de / followerx.ae to buy a published token pack.
Registered HTTPS endpoints and their event subscriptions.
Subscribe an HTTPS URL. The signing secret is returned once.
Stop deliveries to that URL.
Issue a new signing secret. The previous secret stays valid for 24 hours.
Metadata only. Raw secrets are never shown again.
Create a live or test key with selected scopes. The secret is returned once.
Immediate revocation. In-flight requests finish; new ones return 401.