Base URL
app.famulor.io with that domain. The paths stay the same.
API Access
REST requests require API Access through your workspace plan or a recurring add-on. If access is removed, existing API keys and OAuth credentials stay available to workspace administrators for review and revocation, but regular/api/v1 requests return 403 api_access_required.
After a failed plan payment, POST /api/v1/billing/invoice-payment and POST /api/v1/billing/portal remain available with a valid credential so an owner can recover billing. Authentication, role, and scope checks still apply.
Authentication
Send a Bearer token in theAuthorization header:
- Workspace API keys (
fam_...) — create them under Settings → API & MCP for server-to-server integrations. The full key is shown once. The dashboard has no scope picker, so a key created there always carries every scope. To mint a narrower key, callPOST /api/v1/api-keysorPOST /api/v1/workspaces/{workspace_id}/api-keyswith an explicitscopesarray — the new key’s scopes must be a subset of the credential that creates it. - OAuth 2.0 access tokens (
fam_at_...) — use Authorization Code with PKCE-S256 for applications acting on behalf of a signed-in user.
Key hygiene
- Store keys in environment variables or a secrets manager, never in source control.
- Scope each key to only what the integration needs — a key that only reads calls shouldn’t also have
assistants:write. Dashboard-created keys are always full-access; use the API path above to mint a scoped one. - Rotate keys periodically and immediately after anyone with access to one leaves the team.
- Revoking a key from Settings → API & MCP takes effect immediately; requests already in flight may still complete.
OAuth client requirements
A hand-built client drives the authorization and token endpoints directly:127.0.0.1. OAuth authorization requests must use PKCE-S256 and request only scopes registered for the client. When a request is rate-limited, retry after the delay indicated by the response.
The client either uses credentials pre-approved for your workspace, or registers itself dynamically with POST /api/oauth/register — supply between 1 and 10 unique redirect_uris. Endpoints, supported scopes, and grant types are discoverable at /.well-known/oauth-authorization-server.
A dynamically registered client that the user has not approved yet does not receive errors on its redirect URL: an invalid authorization request is answered on the authorization page instead. Once approved, later sign-ins receive only the tool groups the user selected; asking for more shows the consent screen again.
Access tokens are renewed with the refresh_token grant. Refresh tokens rotate on every use: requesting a new access token also issues a new refresh token and immediately invalidates the one you sent.
Response format
Successful responses wrap the result indata and may include meta:
Pagination
List endpoints uselimit and offset:
Use
meta.pagination.total to determine whether more pages are available.
Errors
Failures return a stable code and a readable message:White-label customer management
Authorised resellers can use theplatform endpoints to manage their own end customers, issue and revoke customer API tokens, transfer credits, and manage their custom domain. These endpoints require the platform:read or platform:write scopes; custom-domain operations use the corresponding settings scope.
See the White Label API guide for examples.
CLI
Every API operation is also a command in the Famulor CLI, with your API key stored in the system keychain:MCP
The same customer-facing capabilities are available as AI tools through the MCP endpoint:Realtime variants and native voices
Create or update an assistant withmode: "realtime" and realtime_variant: "full_duplex" to opt in when your workspace has access. Omitting the variant keeps Standard for new assistants and preserves it on updates. The reasoning model is managed centrally; assistant Pipeline model preferences do not override it.
Use GET /api/v1/voices?mode=realtime&realtime_variant=full_duplex to discover compatible voices. Pass a returned voice id as realtime_voice; Full Duplex also uses it for greetings, consent and tool announcements. Keep tts_voice as the saved Pipeline fallback voice. Uploaded greeting audio keeps its recorded voice. Voice identifiers are opaque; never infer a provider from an identifier. An unavailable voice or variant is rejected.
For TTS voices, use GET /api/v1/voices?mode=tts&language=de and omit realtime_variant. Combining mode=tts with any realtime variant returns 400. In the CLI: famulor list-voices --mode tts --language de; for Full Duplex: famulor list-voices --mode realtime --realtime-variant full_duplex --language de.
When a recorded native sample is available, preview_url is a relative API path. Resolve it against your API origin and download it with the same Bearer token and voices:read scope. GET /api/v1/voices/{id}/preview?realtime_variant=full_duplex returns WAV audio without generating a new sample. The MCP voice catalog includes the same preview reference.
Stored TTS samples use GET /api/v1/voices/{id}/preview?mode=tts, or famulor get-voice-preview --id <voice-id> --mode tts in the CLI. Use the returned preview_url; a missing sample is null. Downloading an existing sample does not synthesize new audio.
Where your plan permits model selection, GET /api/v1/models?type=realtime&realtime_variant=full_duplex lists compatible speech models. This does not expose a reasoning-model selector. Current credit rates are included in the usage response, and Full Duplex and avatar surcharges are additive when both are active.
Region availability: Full Duplex follows the models enabled for your selected workspace region, including EU, US and Global. It requires Beta access, Realtime plan access and compatible speech and reasoning models. The editor, API and MCP use the same availability rules.
MCP uses the same assistant fields. Its get_voices tool accepts mode and realtime_variant; get_models accepts realtime_variant. See Engine modes for supported settings and limitations.
Rate limits
REST requests share a fixed one-minute budget across all endpoints: 120 requests per API key or OAuth access token, and 600 requests per workspace, by default. Your plan may have different limits. Creating additional keys or switching domains does not increase the workspace budget. A separate limit of 1,800 requests per minute per IP address protects credential verification; integrations behind the same IP share that limit. When a budget is exhausted, the API returns429 with error.code: "rate_limited" and a Retry-After header containing the number of seconds to wait. Pause requests for that duration, then retry with backoff and a small random delay. Avoid continuously polling the same resource; use webhooks where available.
If request protection is temporarily unavailable, the API returns 503 with a retry delay. Dashboard requests and MCP use their own access and request policies.