Skip to content

Explore CallMissed

Developer hub

One key. The whole API surface.

A cm_ key opens chat, embeddings, speech, images, search, voice, WhatsApp, email and telephony. Nothing below needs a dashboard session — if you can paste a bearer token, you can call it.

curl -X POST https://api.callmissed.com/v1/chat/completions \
  -H "Authorization: Bearer cm_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"model":"sarvam-105b","messages":[{"role":"user","content":"Hello in Hindi"}]}'

That is the whole first request. Base URL, bearer key, a model id and a message.

01 — Authenticate

Create a key in the console, then send it as a bearer token. Keys start with cm_, do not expire, and can be revoked at any time. Keep them server-side.

Inference base URL
https://api.callmissed.com/v1
The OpenAI-compatible surface: chat, embeddings, audio, images, search, models.
Resource base URL
https://api.callmissed.com/api/v1
WhatsApp, email, telephony, knowledge, bots, conversations, webhooks.
Header
Authorization: Bearer cm_…
The /v1/messages endpoint also accepts x-api-key, so the Anthropic SDK works unchanged.
Two kinds of grant
permissions · scopes
Service permissions (llm, stt, tts, search, image) gate the inference surface; resource scopes gate the /api/v1 surface.

Authentication reference

02 — The endpoint map

16 families, one key. Each row is the primary call for that family; the reference behind it has the variants, the request schema and the model list.

Deep dives on the speech endpoints: speech to text · text to speech · Indian language coverage

03 — Build a request

Pick a chat model and the form only offers the reasoning_effort values the verified per-model matrix says it accepts — some models take the full ladder, some take only the off switch, and two drop the field entirely. The curl it writes is valid before you paste it.

reasoning_effort

"none" and "minimal" are mapped down to "low" — thinking cannot be switched off on this model.

curl
curl -X POST https://api.callmissed.com/v1/chat/completions \
  -H "Authorization: Bearer cm_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "sarvam-105b",
    "messages": [
      {
        "role": "user",
        "content": "Hello in Hindi"
      }
    ],
    "stream": true
  }'

Using the OpenAI SDK? reasoning_effort goes in extra_body — the client rejects unknown kwargs. Raw HTTP sends it at the top level, as above.

The matrix this is built from: reasoning_effort by model

04 — SDKs

There is no separate client library to learn. Two SDK families work as-is: point the official OpenAI SDK at the inference base URL, or point the Anthropic SDK at the host and let it append its own version prefix. Go, PHP and Ruby OpenAI clients take the same override.

from openai import OpenAI

client = OpenAI(
    api_key="cm_your_api_key",
    base_url="https://api.callmissed.com/v1",
)

resp = client.chat.completions.create(
    model="sarvam-105b",
    messages=[{"role": "user", "content": "Hello in Hindi"}],
)
from anthropic import Anthropic

client = Anthropic(
    api_key="cm_your_api_key",
    base_url="https://api.callmissed.com",
)

msg = client.messages.create(
    model="sarvam-105b",
    max_tokens=512,
    messages=[{"role": "user", "content": "Hello in Hindi"}],
)

Note the difference: the OpenAI clients want the /v1 suffix on base_url, the Anthropic client does not — it adds one itself. SDK reference

05 — Limits and credits

One credit is ₹1 ≈ US$0.0104 (US$1 = ₹96). New accounts start with 1,000 credits, and each plan adds a monthly grant on top. Credits do not expire. Two separate things can stop a request, and they return different codes: run out of credits and you get 402, exceed the request rate and you get 429.

Requests per minute and monthly credits by plan
PlanRequests / minuteMonthly credits
free60100
starter500550 first month, then 500
pro3,0006,000 first month, then 5,000
enterprise10,00026,000 first month, then 20,000

A per-key override set in the console wins over the plan default. Plan comparison

Headers on every response

X-RateLimit-Limit
The ceiling this key is measured against.
X-RateLimit-Remaining
What is left in the current window.
X-RateLimit-Reset
When the window resets, as ISO-8601.
X-Credits-Balance
Credits left on the account after this call.
X-Usage-Warning
Set to warning at 80% of a cap, critical at 95%.
Retry-After
On a 429, how long to wait before trying again.

06 — Errors

Failures come back in the standard OpenAI error envelope on the /v1 surface, so SDK error handling keeps working unchanged. Read the code field, not the message — messages are written for humans and can change.

{
  "error": {
    "code": "insufficient_credits",
    "message": "Your credit balance is too low to complete this request.",
    "type": "billing_error"
  }
}

Pick a status below for what causes it, the retry rule, and the named error codes published under it. 402 and 403 are never worth retrying; 429 tells you how long to wait.

402 — Payment Required

Insufficient credits or a monthly budget cap reached.

Retry: Do not retry — top up credits or raise the budget cap first.

Documented error codes for 402
insufficient_creditsTop up credits to continue.
budget_exceededMonthly credit budget cap reached.

Every error code, with the retry rule for each

07 — Idempotency

Send an Idempotency-Key on any POST, PUT or PATCH and a retry after a dropped connection replays the original response instead of doing the work twice. Reuse the key with a different body and the call is rejected with 409, which is how you find a bug rather than double-charge someone. Keys are scoped to your account.

curl -X POST https://api.callmissed.com/api/v1/bots \
  -H "Authorization: Bearer cm_your_api_key" \
  -H "Idempotency-Key: 6f1c2b7e-9a41-4d0e-9a1e-1f2b3c4d5e6f" \
  -H "Content-Type: application/json" \
  -d '{"name": "Support bot"}'

Idempotency reference

08 — Agent tools over MCP

The same account is reachable as an MCP server over streamable HTTP, so a coding agent or assistant can place a call, read a transcript, search the CRM or send a message without you writing a client. Connect with the same cm_ key, or sign in with OAuth and approve the tool groups you want to expose.

claude mcp add --transport http callmissed \
  https://api.callmissed.com/api/v1/mcp \
  --header "Authorization: Bearer cm_your_api_key"

A second, credential-free MCP server serves the documentation itself, so your agent can read the reference while it writes the integration. MCP reference