Send finished sales calls from Salesforce, middleware or your own systems to Chambr. Chambr scores them against your scorecards.
- You send the transcript. Chambr does not transcribe audio; a recording is for playback only.
- The API returns an id, a status and an
app_url. It never returns scores: people view results in Chambr.
Base URL: https://api.staging.chambr.ai/v1 (alias
https://app.staging.chambr.ai/api/v1, identical). The
OpenAPI document is the full contract.
Before you start
| Check | Where |
|---|---|
| Real Call Scoring is enabled for your account | Ask your Chambr contact |
| The team has a default scorecard or a scorecard rule | Real Call Scoring, Scorecard rules |
| Reps have signed in to Chambr at least once | Chambr |
| An admin can create an API key | API keys and authentication |
There is no test mode. Every call you send is a real call in your account. A manager removes a test call in Chambr: open the call, then Remove call.
Quickstart
Send a call without a rep. Chambr files it under the API key's team.
export CHAMBR_API=https://api.staging.chambr.ai/v1
export CHAMBR_KEY=chambr_sk_...
curl -sS --max-time 60 "$CHAMBR_API/calls" \
-H "Authorization: Bearer $CHAMBR_KEY" \
-H "Content-Type: application/json" \
-d @- <<'JSON'
{
"external_id": "quickstart-001",
"provider": "quickstart",
"occurred_at": "2026-09-28T15:02:14Z",
"call_type": "discovery",
"transcript": {
"rep_speaker": "Sarah",
"segments": [
{ "speaker": "Dana", "text": "Morning. I have about twenty minutes." },
{ "speaker": "Sarah", "text": "Understood, I will keep it tight. What prompted the call?" },
{ "speaker": "Dana", "text": "Our carrier costs went up twelve percent this quarter." },
{ "speaker": "Sarah", "text": "Which lanes are hurting the most?" },
{ "speaker": "Dana", "text": "Mostly the Midwest runs into Chicago." },
{ "speaker": "Sarah", "text": "Could we look at your last three months of those lanes together next week?" }
]
}
}
JSON
Chambr returns 202:
{
"id": "6f1c2b0e-8a4d-4c1e-9d55-0d6c7b1e2a90",
"object": "call",
"external_id": "quickstart-001",
"provider": "quickstart",
"status": "queued",
"created": true,
"attribution": { "rep_source": "api_key_owner", "speaker_source": "rep_speaker" },
"recording_attached": false,
"app_url": "https://app.staging.chambr.ai/t/3a1d9c52-.../real-calls/6f1c2b0e-..."
}
Check its status. Scoring takes minutes.
curl -sS "$CHAMBR_API/calls/6f1c2b0e-8a4d-4c1e-9d55-0d6c7b1e2a90" \
-H "Authorization: Bearer $CHAMBR_KEY"
{
"id": "6f1c2b0e-8a4d-4c1e-9d55-0d6c7b1e2a90",
"object": "call",
"external_id": "quickstart-001",
"provider": "quickstart",
"status": "scored",
"skip_reason": null,
"rep": { "email": "admin@yourcompany.com" },
"call_type": "discovery",
"has_recording": false,
"attribution": { "rep_source": "api_key_owner", "speaker_source": "rep_speaker" },
"occurred_at": "2026-09-28T15:02:14.000Z",
"created_at": "2026-09-28T15:40:02.000Z",
"app_url": "https://app.staging.chambr.ai/t/3a1d9c52-.../real-calls/6f1c2b0e-..."
}
Running the same request again returns 200 with the same id. See
Idempotency.
Next steps
- Send calls: every field, and how Chambr finds the rep.
- Salesforce: send calls from Apex.
- Errors and Rate limits and retries.