solarOS Organization API

Organization API

Log a call from a phone system

Requires conversations and phoneSystem enabled. Use E.164 phone numbers (US ten-digit numbers are also accepted). A known customer matches the newest open Case, or their General Conversation when no Case is open. Unknown or ambiguous callers wait in Unmatched for staff selection. A Case hint must belong to the matched customer. Processing is asynchronous; 202 returns id (the Call ID), eventId and status in the data envelope. Repeating an identical request returns the same receipt; reusing a key or provider call ID with different details returns 409. Recording links remain at the provider. Maximum request body: 300,000 bytes.

/api/v1/communications/calls

Requires conversations and phoneSystem enabled. Use E.164 phone numbers (US ten-digit numbers are also accepted). A known customer matches the newest open Case, or their General Conversation when no Case is open. Unknown or ambiguous callers wait in Unmatched for staff selection. A Case hint must belong to the matched customer. Processing is asynchronous; 202 returns id (the Call ID), eventId and status in the data envelope. Repeating an identical request returns the same receipt; reusing a key or provider call ID with different details returns 409. Recording links remain at the provider. Maximum request body: 300,000 bytes.

Log a call from a phone system. Use an organization API key with communications:write. Check the response envelope and meta.requestId before triggering dependent workflow steps.

Required scopes

communications:writeIdempotency-Key required

Parameters

No path or query parameters.

Request body

objectrequired
FieldTypeDescription
providerCallIdstringStable provider ID, unique within the company. Prefix with the phone system name when using multiple systems. Omit to derive an ID from this API key and Idempotency-Key.
directionrequiredINBOUND | OUTBOUNDOptional unless marked required.
fromrequiredstringOptional unless marked required.
torequiredstringOptional unless marked required.
startedAtrequiredstringOptional unless marked required.
endedAtstringOptional unless marked required.
durationSecondsintegerOptional unless marked required.
resultrequiredANSWERED | MISSED | VOICEMAIL | BUSY | FAILEDOptional unless marked required.
userobjectOptional unless marked required.
user.emailrequiredstringActive company team member who handled the call.
personEmailstringAlias of user.email; when both are supplied they must match.
recordingUrlstringHTTPS provider recording link. Recording audio is never copied into solarOS.
recordingExpiresAtstringOptional unless marked required.
transcriptstringOptional unless marked required.
summarystringOptional unless marked required.
hintobjectOptional unless marked required.
hint.caseNumberstring | integerOptional unless marked required.
hint.customerEmailstringOptional unless marked required.
logcommunicationcallRequest
{
  "providerCallId": "phone-system:call-2417",
  "direction": "INBOUND",
  "from": "+17075550101",
  "to": "+17075550102",
  "startedAt": "2026-09-12T17:00:00Z",
  "endedAt": "2026-09-12T17:02:00Z",
  "durationSeconds": 120,
  "result": "ANSWERED",
  "user": {
    "email": "service@example.com"
  },
  "recordingUrl": "https://phone.example.com/recordings/call-2417",
  "transcript": "Customer: The inverter lights are red and green.",
  "summary": "Customer reports red and green inverter lights.",
  "hint": {
    "caseNumber": "2417"
  }
}

Responses

202

Call retained for matching; receipt contains id (the Call ID), eventId and status

#/components/schemas/OrgApiResourceEnvelope

401

Missing or invalid organization API key

#/components/schemas/OrgApiError

402

Organization billing access or an endpoint-specific business quota denied the request

#/components/schemas/OrgApiError

403

Missing required scope: communications:write

#/components/schemas/OrgApiError

409

Idempotency key or provider call ID already used with different details

#/components/schemas/OrgApiError

429

Rate limit exceeded

#/components/schemas/OrgApiError

Errors

401 Missing or invalid organization API key402 Organization billing access or an endpoint-specific business quota denied the request403 Missing required scope: communications:write409 Idempotency key or provider call ID already used with different details429 Rate limit exceeded

Static examples

curl -X POST "$SOLAROS_BASE_URL/api/v1/communications/calls" \
  -H "Authorization: Bearer $SOLAROS_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $SOLAROS_IDEMPOTENCY_KEY" \
  --data '{"providerCallId":"phone-system:call-2417","direction":"INBOUND","from":"+17075550101","to":"+17075550102","startedAt":"2026-09-12T17:00:00Z","endedAt":"2026-09-12T17:02:00Z","durationSeconds":120,"result":"ANSWERED","user":{"email":"service@example.com"},"recordingUrl":"https://phone.example.com/recordings/call-2417","transcript":"Customer: The inverter lights are red and green.","summary":"Customer reports red and green inverter lights.","hint":{"caseNumber":"2417"}}'