Skip to main content
The OurAiCalling platform exposes a REST API under your platform domain. Everything you can do in the dashboard — managing assistants, starting calls, running campaigns, reading transcripts — is available programmatically.

Base URL

app.famulor.io is the hosted platform. If you sign in on a white-label tenant domain, use that domain instead — the API runs under it with the tenant’s branding and the same paths apply.

Authentication

All requests require a Bearer token in the Authorization header. Two token types are accepted:
  • Service-account API keys (fam_...) — create them under Settings → API Keys. Each new key belongs to a dedicated, non-human principal instead of the admin who created it. The full key is shown exactly once; only a hash is stored. Every new key has explicit scopes from the canonical registry (for example assistants:read, calls:write, campaigns:write, dashboards:read, knowledge:write, voices:read, or billing:read). Best for server-to-server integrations.
  • OAuth 2.0 access tokens (fam_at_...) — issued through Authorization Code with mandatory PKCE-S256. Scoped and short-lived (1 hour, with rotating refresh tokens). Best for third-party apps acting on behalf of a user.
User-bound credentials are revoked in the same database transaction when a member is removed, demoted, or suspended. Workspace suspension revokes all workspace credentials. A service-account key is independent of the creating admin’s membership and remains governed by its own status and scopes.
Treat API keys like passwords. Never embed them in client-side code — for browser use cases, use the OAuth flow instead.

OAuth client security

Dynamic clients may register HTTPS redirect URIs. Native applications may additionally use HTTP redirect URIs on literal loopback addresses (127.0.0.1 or [::1]) with any port. localhost, non-loopback HTTP, URI fragments, and credentials in redirect URIs are rejected. Authorization requests must send code_challenge_method=S256 and a valid SHA-256 code challenge. Requested scopes must be both canonical and a subset of the scopes registered for that client. Dynamic registration, authorization, and token exchange are protected by distributed rate limits; a limited request returns 429 with Retry-After.

Response envelope

Every endpoint returns a consistent JSON envelope. Successful responses wrap the payload in data (plus optional meta):

What the API returns — and what it doesn’t

Both the REST API and the MCP endpoint return the same, deliberately curated view of your workspace data: everything you need to build on, nothing about how the platform runs internally. Not included in any response:
  • Infrastructure identifiers — media-session, room, trunk, dispatch and carrier identifiers of the underlying telephony stack.
  • Internal storage paths — recordings are served as time-limited signed URLs (GET /calls/{id}/recording), never as bucket paths.
  • Platform cost and billing internals — provider costs, token/character/second counters and charge bookkeeping. Your own consumption is reported in the units you are billed in: minutes and credits (GET /balance, GET /transactions).
  • Model internals — which model scored a call or wrote a summary. Verdicts, scores and summaries are returned; the engine behind them is not.
  • Secrets — passwords, tokens and carrier credentials are never readable back after they are stored; you get a masked hint at most.
  • Operational diagnostics — internal call events (component fallbacks, session errors, usage bookings) are filtered out of GET /calls/{id} events.
Everything else is fair game: transcripts, summaries, analysis verdicts, extracted fields, QA scores, contacts, campaigns, numbers, and your full assistant configuration.

Pagination

List endpoints paginate with limit and offset query parameters: The response’s meta.pagination.total carries the total number of matches (ignoring limit/offset), so you can page until offset + limit >= total:

Errors

Failures return an error envelope with a stable machine-readable code and a human-readable message:

Rate limits

Fair-use rate limits apply per account. If you exceed them the API responds with 429 Too Many Requests; back off and retry with exponential delay. Published per-plan limits will be documented here.

White label: manage your platform’s customers

If your workspace has the white-label feature, a dedicated endpoint group lets you run your own platform programmatically: list and register your end-users, issue them API tokens (with or without their password), log them out, move credits between your wallet and theirs, and manage the custom domain your platform runs on. Platform admins on the root platform get the same endpoints, scoped to direct platform customers. All of these require an API key of your white-label workspace with the platform:read / platform:write scopes (custom domain: settings:*): Step-by-step recipes (custom auth flows, dashboards, balance management): White Label API guide. The same capabilities are available as MCP tools via the platform toolset (https://<your-domain>/mcp?toolsets=platform).

MCP — use the API as AI tools

Everything in this reference is also exposed through the platform’s MCP endpoint (Model Context Protocol, streamable HTTP):
Connect Claude, ChatGPT, Cursor, or any MCP client and use the same capabilities as AI tools — same services, same validation (plan limits, model catalog, DNC checks) and the same permission model (API keys or OAuth). Requires the Connect AI / MCP plan feature. Full setup guide: MCP endpoint. Quick connect — Claude and ChatGPT discover authentication automatically (OAuth); other clients can pass an API key as a static Bearer header:

Available MCP tools