{"openapi":"3.1.0","info":{"title":"Remoto Partner API","version":"1","summary":"Remoto interpreting API v1 (API version 2026-09-29).","description":"REST API and signed webhooks for platforms that need interpreters: request an interpreter on demand and hand your end user a join link, book scheduled calls, check live availability and price, and pull call logs, usage and Phone Line (OPI) accounts.\n\n**Keys.** Create keys under Your Business → API & Webhooks and send one as `Authorization: Bearer rmk_…` (or the `X-API-Key` header). Keys are server-side secrets; never ship them to a browser or app. The business is taken from the key alone, so a key only ever sees its own business's data.\n\n**Test vs live.** `rmk_test_…` keys work immediately against the sandbox: every endpoint and real response shapes and webhooks (livemode false), but no interpreter is rung, nothing is booked and nothing is billed. `rmk_live_…` keys place real calls and are available only after Remoto approves the business's live-access request (GET /me shows live_access). If live access is rejected or suspended, live keys get 403 live_access_not_approved while test keys keep working.\n\n**Limits and errors.** 120 requests per minute per key (X-RateLimit-* headers; 429 with Retry-After beyond it). Every response carries Remoto-Request-Id. Errors share one envelope: `{ \"error\": { \"type\", \"code\"?, \"message\", \"param\"? } }`.\n\n**Webhooks.** Each endpoint has its own whsec_ signing secret; every delivery is signed with the Remoto-Signature header (HMAC-SHA256 over \"<t>.<raw body>\").","contact":{"name":"Remoto support","email":"remoto.support@proz.com"}},"externalDocs":{"description":"Developer documentation","url":"https://www.proz.com/remoto/developers"},"servers":[{"url":"https://www.proz.com/remoto/api/v1"}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"tags":[{"name":"Account"},{"name":"Availability"},{"name":"On-demand calls"},{"name":"Scheduled calls"},{"name":"Calls and usage"},{"name":"Phone Line"},{"name":"Webhooks","description":"Events Remoto POSTs to your registered endpoints."}],"paths":{"/me":{"get":{"operationId":"getMe","tags":["Account"],"summary":"Who this key is","description":"The key's business, mode and live-access status. Use it as a connectivity check.","responses":{"200":{"description":"The key context.","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyContext"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/availability":{"get":{"operationId":"getAvailability","tags":["Availability"],"summary":"Online interpreters and price per language pair, right now","description":"Counted the way a call placed now would ring: your interpreter sourcing setting applies, plus a portal client's team rules when client_id is passed. Pass either source+target or pairs.","parameters":[{"name":"source","in":"query","description":"Source language (ISO 639), with target.","schema":{"type":"string"}},{"name":"target","in":"query","description":"Target language (ISO 639), with source.","schema":{"type":"string"}},{"name":"pairs","in":"query","description":"Comma-separated pair codes, up to 20, e.g. eng_ara,ara_urd (eng-ara also accepted). Overrides source/target.","schema":{"type":"string"}},{"name":"client_id","in":"query","description":"A portal client of this business: applies its team/network rules and rate card.","schema":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},{"name":"call_type","in":"query","description":"Which wholesale rate to quote: opi (phone, default) or vri (video).","schema":{"type":"string","enum":["opi","vri"],"default":"opi"}}],"responses":{"200":{"description":"One availability object per requested pair.","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailabilityList"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/call-requests":{"get":{"operationId":"listCallRequests","tags":["On-demand calls"],"summary":"List on-demand call requests","parameters":[{"name":"status","in":"query","schema":{"type":"string","enum":["waiting","ringing","accepted","completed","missed","cancelled"]}},{"$ref":"#/components/parameters/ExternalReference"},{"$ref":"#/components/parameters/Limit"},{"name":"starting_after","in":"query","description":"next_cursor from the previous page (a call request id).","schema":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}}],"responses":{"200":{"description":"A page of call requests, newest first.","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallRequestList"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}}},"post":{"operationId":"createCallRequest","tags":["On-demand calls"],"summary":"Request an on-demand interpreter now","description":"Returns a call request with a join_url for your end user. Nobody is rung until they open it and connect. Live keys need invoice terms or a verified payment method on the owner account (else 402), unless test_call is used.","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallRequestCreate"}}}},"responses":{"200":{"description":"Replayed: an earlier request with the same Idempotency-Key created this object.","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Idempotent-Replayed":{"$ref":"#/components/headers/IdempotentReplayed"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallRequest"}}}},"201":{"description":"Created (status waiting).","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallRequest"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/call-requests/{id}":{"parameters":[{"$ref":"#/components/parameters/CallRequestId"}],"get":{"operationId":"getCallRequest","tags":["On-demand calls"],"summary":"Retrieve a call request","description":"Brought up to date with the ring and call before it is returned.","responses":{"200":{"description":"The call request.","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallRequest"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/call-requests/{id}/cancel":{"parameters":[{"$ref":"#/components/parameters/CallRequestId"}],"post":{"operationId":"cancelCallRequest","tags":["On-demand calls"],"summary":"Withdraw a waiting or ringing call request","description":"Idempotent for an already-cancelled request. 409 call_request_accepted once an interpreter accepted, 409 call_request_closed once completed or missed. A test key cannot cancel a live request (403 livemode_mismatch). If an interpreter accepts at the same moment, the accepted request is returned.","responses":{"200":{"description":"The call request after cancelling.","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallRequest"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/scheduled-calls":{"get":{"operationId":"listScheduledCalls","tags":["Scheduled calls"],"summary":"List bookings","parameters":[{"name":"status","in":"query","schema":{"type":"string","enum":["pending","confirmed","in_progress","completed","cancelled","expired"]}},{"name":"from","in":"query","description":"Only bookings starting at or after this time (ISO 8601).","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","description":"Only bookings starting at or before this time (ISO 8601).","schema":{"type":"string","format":"date-time"}},{"$ref":"#/components/parameters/ExternalReference"},{"$ref":"#/components/parameters/Limit"},{"name":"starting_after","in":"query","description":"next_cursor from the previous page (a booking id).","schema":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}}],"responses":{"200":{"description":"A page of bookings, latest start_time first.","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledCallList"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}}},"post":{"operationId":"createScheduledCall","tags":["Scheduled calls"],"summary":"Book a scheduled call","description":"Remoto invites matching interpreters within your sourcing setting; the first to accept confirms it (scheduled_call.confirmed). Live bookings need invoice terms or a verified payment method on the owner account (else 402). Test keys validate everything but book nothing: they return a simulated object (livemode false) and fire scheduled_call.created; Idempotency-Key is validated but not replayed for test keys.","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledCallCreate"}}}},"responses":{"200":{"description":"Replayed: an earlier request with the same Idempotency-Key created this booking.","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Idempotent-Replayed":{"$ref":"#/components/headers/IdempotentReplayed"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledCall"}}}},"201":{"description":"Created (status pending).","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledCall"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/scheduled-calls/{id}":{"parameters":[{"$ref":"#/components/parameters/ScheduledCallId"}],"get":{"operationId":"getScheduledCall","tags":["Scheduled calls"],"summary":"Retrieve a booking","responses":{"200":{"description":"The booking.","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledCall"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/scheduled-calls/{id}/cancel":{"parameters":[{"$ref":"#/components/parameters/ScheduledCallId"}],"post":{"operationId":"cancelScheduledCall","tags":["Scheduled calls"],"summary":"Cancel a booking","description":"Cancels as the client: the late-cancellation policy may charge a fee (returned as cancellation_fee). An already cancelled or expired booking is returned unchanged with a null fee. 409 scheduled_call_closed once the call is in progress or completed; 403 livemode_mismatch for test keys.","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledCallCancel"}}}},"responses":{"200":{"description":"The booking and any cancellation fee.","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledCallCancelResult"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/calls":{"get":{"operationId":"listCalls","tags":["Calls and usage"],"summary":"Call log","description":"Connected calls and missed rings, newest first, including Phone Line (OPI) calls.","parameters":[{"$ref":"#/components/parameters/WindowFrom"},{"$ref":"#/components/parameters/WindowTo"},{"name":"status","in":"query","description":"Default all. In-progress calls appear only with all.","schema":{"type":"string","enum":["all","completed","missed","cancelled"],"default":"all"}},{"name":"channel","in":"query","schema":{"type":"string","enum":["phone_line","video","audio"]}},{"$ref":"#/components/parameters/Limit"},{"name":"starting_after","in":"query","description":"next_cursor from the previous page (opaque).","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of calls.","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallList"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/calls/{id}":{"parameters":[{"$ref":"#/components/parameters/CallId"}],"get":{"operationId":"getCall","tags":["Calls and usage"],"summary":"Retrieve a call","responses":{"200":{"description":"The call.","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Call"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/usage":{"get":{"operationId":"getUsage","tags":["Calls and usage"],"summary":"Billed minutes and cost by language pair, channel and day","parameters":[{"$ref":"#/components/parameters/WindowFrom"},{"$ref":"#/components/parameters/WindowTo"}],"responses":{"200":{"description":"Usage for the window.","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usage"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/phone-lines":{"get":{"operationId":"listPhoneLines","tags":["Phone Line"],"summary":"Phone Line (OPI) accounts","description":"Read-only: account numbers, dial-in number, speed-dial pairs, operator-fallback pair and SIP trunks.","responses":{"200":{"description":"All of the business's Phone Line accounts.","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneLineList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}}}}},"webhooks":{"call_request.ringing":{"post":{"operationId":"webhook_call_request_ringing","tags":["Webhooks"],"summary":"Your end user opened the join link and connected; interpreters are being rung.","parameters":[{"$ref":"#/components/parameters/RemotoSignature"},{"$ref":"#/components/parameters/RemotoEventId"},{"$ref":"#/components/parameters/RemotoEventType"},{"$ref":"#/components/parameters/RemotoDeliveryId"},{"$ref":"#/components/parameters/WebhookUserAgent"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallRequestRingingEvent"}}}},"responses":{"2XX":{"description":"Acknowledged. Respond quickly and process asynchronously."},"default":{"description":"Any other status, no response bytes for 10 s, or no complete response within 15 s fails the attempt. Redirects are not followed. Retried after 1 min, 5 min, 30 min, 2 h, 8 h and 24 h (7 attempts), then marked failed."}}}},"call_request.accepted":{"post":{"operationId":"webhook_call_request_accepted","tags":["Webhooks"],"summary":"An interpreter accepted. data.object.interpreter and call_id are set.","parameters":[{"$ref":"#/components/parameters/RemotoSignature"},{"$ref":"#/components/parameters/RemotoEventId"},{"$ref":"#/components/parameters/RemotoEventType"},{"$ref":"#/components/parameters/RemotoDeliveryId"},{"$ref":"#/components/parameters/WebhookUserAgent"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallRequestAcceptedEvent"}}}},"responses":{"2XX":{"description":"Acknowledged. Respond quickly and process asynchronously."},"default":{"description":"Any other status, no response bytes for 10 s, or no complete response within 15 s fails the attempt. Redirects are not followed. Retried after 1 min, 5 min, 30 min, 2 h, 8 h and 24 h (7 attempts), then marked failed."}}}},"call_request.completed":{"post":{"operationId":"webhook_call_request_completed","tags":["Webhooks"],"summary":"The call ended and was settled. data.object.call carries duration, billed seconds and cost.","parameters":[{"$ref":"#/components/parameters/RemotoSignature"},{"$ref":"#/components/parameters/RemotoEventId"},{"$ref":"#/components/parameters/RemotoEventType"},{"$ref":"#/components/parameters/RemotoDeliveryId"},{"$ref":"#/components/parameters/WebhookUserAgent"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallRequestCompletedEvent"}}}},"responses":{"2XX":{"description":"Acknowledged. Respond quickly and process asynchronously."},"default":{"description":"Any other status, no response bytes for 10 s, or no complete response within 15 s fails the attempt. Redirects are not followed. Retried after 1 min, 5 min, 30 min, 2 h, 8 h and 24 h (7 attempts), then marked failed."}}}},"call_request.missed":{"post":{"operationId":"webhook_call_request_missed","tags":["Webhooks"],"summary":"Nobody answered in time, nobody was available, or the end user left first (see end_reason).","parameters":[{"$ref":"#/components/parameters/RemotoSignature"},{"$ref":"#/components/parameters/RemotoEventId"},{"$ref":"#/components/parameters/RemotoEventType"},{"$ref":"#/components/parameters/RemotoDeliveryId"},{"$ref":"#/components/parameters/WebhookUserAgent"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallRequestMissedEvent"}}}},"responses":{"2XX":{"description":"Acknowledged. Respond quickly and process asynchronously."},"default":{"description":"Any other status, no response bytes for 10 s, or no complete response within 15 s fails the attempt. Redirects are not followed. Retried after 1 min, 5 min, 30 min, 2 h, 8 h and 24 h (7 attempts), then marked failed."}}}},"call_request.cancelled":{"post":{"operationId":"webhook_call_request_cancelled","tags":["Webhooks"],"summary":"You cancelled the request, or its join link expired before it was opened.","parameters":[{"$ref":"#/components/parameters/RemotoSignature"},{"$ref":"#/components/parameters/RemotoEventId"},{"$ref":"#/components/parameters/RemotoEventType"},{"$ref":"#/components/parameters/RemotoDeliveryId"},{"$ref":"#/components/parameters/WebhookUserAgent"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallRequestCancelledEvent"}}}},"responses":{"2XX":{"description":"Acknowledged. Respond quickly and process asynchronously."},"default":{"description":"Any other status, no response bytes for 10 s, or no complete response within 15 s fails the attempt. Redirects are not followed. Retried after 1 min, 5 min, 30 min, 2 h, 8 h and 24 h (7 attempts), then marked failed."}}}},"call.completed":{"post":{"operationId":"webhook_call_completed","tags":["Webhooks"],"summary":"A call ended and was settled. data.object is the call with final billed seconds and cost.","parameters":[{"$ref":"#/components/parameters/RemotoSignature"},{"$ref":"#/components/parameters/RemotoEventId"},{"$ref":"#/components/parameters/RemotoEventType"},{"$ref":"#/components/parameters/RemotoDeliveryId"},{"$ref":"#/components/parameters/WebhookUserAgent"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallCompletedEvent"}}}},"responses":{"2XX":{"description":"Acknowledged. Respond quickly and process asynchronously."},"default":{"description":"Any other status, no response bytes for 10 s, or no complete response within 15 s fails the attempt. Redirects are not followed. Retried after 1 min, 5 min, 30 min, 2 h, 8 h and 24 h (7 attempts), then marked failed."}}}},"call.missed":{"post":{"operationId":"webhook_call_missed","tags":["Webhooks"],"summary":"A ring ended unanswered, or a Phone Line call found nobody to ring. Re-routes to the operator pair are not reported as missed.","parameters":[{"$ref":"#/components/parameters/RemotoSignature"},{"$ref":"#/components/parameters/RemotoEventId"},{"$ref":"#/components/parameters/RemotoEventType"},{"$ref":"#/components/parameters/RemotoDeliveryId"},{"$ref":"#/components/parameters/WebhookUserAgent"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallMissedEvent"}}}},"responses":{"2XX":{"description":"Acknowledged. Respond quickly and process asynchronously."},"default":{"description":"Any other status, no response bytes for 10 s, or no complete response within 15 s fails the attempt. Redirects are not followed. Retried after 1 min, 5 min, 30 min, 2 h, 8 h and 24 h (7 attempts), then marked failed."}}}},"scheduled_call.created":{"post":{"operationId":"webhook_scheduled_call_created","tags":["Webhooks"],"summary":"A booking was created for your business (API, your portal, or on your behalf). Test-key bookings send livemode false.","parameters":[{"$ref":"#/components/parameters/RemotoSignature"},{"$ref":"#/components/parameters/RemotoEventId"},{"$ref":"#/components/parameters/RemotoEventType"},{"$ref":"#/components/parameters/RemotoDeliveryId"},{"$ref":"#/components/parameters/WebhookUserAgent"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledCallCreatedEvent"}}}},"responses":{"2XX":{"description":"Acknowledged. Respond quickly and process asynchronously."},"default":{"description":"Any other status, no response bytes for 10 s, or no complete response within 15 s fails the attempt. Redirects are not followed. Retried after 1 min, 5 min, 30 min, 2 h, 8 h and 24 h (7 attempts), then marked failed."}}}},"scheduled_call.confirmed":{"post":{"operationId":"webhook_scheduled_call_confirmed","tags":["Webhooks"],"summary":"An interpreter was confirmed. Fires again if a different interpreter takes over.","parameters":[{"$ref":"#/components/parameters/RemotoSignature"},{"$ref":"#/components/parameters/RemotoEventId"},{"$ref":"#/components/parameters/RemotoEventType"},{"$ref":"#/components/parameters/RemotoDeliveryId"},{"$ref":"#/components/parameters/WebhookUserAgent"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledCallConfirmedEvent"}}}},"responses":{"2XX":{"description":"Acknowledged. Respond quickly and process asynchronously."},"default":{"description":"Any other status, no response bytes for 10 s, or no complete response within 15 s fails the attempt. Redirects are not followed. Retried after 1 min, 5 min, 30 min, 2 h, 8 h and 24 h (7 attempts), then marked failed."}}}},"scheduled_call.cancelled":{"post":{"operationId":"webhook_scheduled_call_cancelled","tags":["Webhooks"],"summary":"A booking was cancelled, or expired unfilled (status expired).","parameters":[{"$ref":"#/components/parameters/RemotoSignature"},{"$ref":"#/components/parameters/RemotoEventId"},{"$ref":"#/components/parameters/RemotoEventType"},{"$ref":"#/components/parameters/RemotoDeliveryId"},{"$ref":"#/components/parameters/WebhookUserAgent"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledCallCancelledEvent"}}}},"responses":{"2XX":{"description":"Acknowledged. Respond quickly and process asynchronously."},"default":{"description":"Any other status, no response bytes for 10 s, or no complete response within 15 s fails the attempt. Redirects are not followed. Retried after 1 min, 5 min, 30 min, 2 h, 8 h and 24 h (7 attempts), then marked failed."}}}},"invoice.issued":{"post":{"operationId":"webhook_invoice_issued","tags":["Webhooks"],"summary":"You issued a white-label invoice. data.object is the invoice with its line items.","parameters":[{"$ref":"#/components/parameters/RemotoSignature"},{"$ref":"#/components/parameters/RemotoEventId"},{"$ref":"#/components/parameters/RemotoEventType"},{"$ref":"#/components/parameters/RemotoDeliveryId"},{"$ref":"#/components/parameters/WebhookUserAgent"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceIssuedEvent"}}}},"responses":{"2XX":{"description":"Acknowledged. Respond quickly and process asynchronously."},"default":{"description":"Any other status, no response bytes for 10 s, or no complete response within 15 s fails the attempt. Redirects are not followed. Retried after 1 min, 5 min, 30 min, 2 h, 8 h and 24 h (7 attempts), then marked failed."}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"rmk_live_… or rmk_test_…","description":"Authorization: Bearer rmk_live_… (or rmk_test_… for the sandbox)."},"apiKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Alternative to the bearer header. Used only when no Bearer token is sent."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"type":{"type":"string","enum":["authentication_error","permission_error","invalid_request_error","not_found","rate_limit_error","api_error"],"description":"authentication_error (401), permission_error (403), invalid_request_error (400/402/409), not_found (404), rate_limit_error (429), api_error (500)."},"code":{"type":"string","description":"Machine-readable reason, when there is one. Auth: missing_api_key, key_malformed, key_unknown, key_revoked, key_expired, business_inactive, live_access_not_approved. Lookups: resource_missing. Validation: invalid_json, invalid_body, invalid_language_pair, unknown_language, invalid_start_time, start_time_too_soon, start_time_too_far, invalid_duration, invalid_call_type, invalid_notes, invalid_external_reference, invalid_client_email, client_email_required, invalid_metadata, invalid_idempotency_key, invalid_status, invalid_from, invalid_to, invalid_cursor, invalid_test_call, invalid_join_expiry, invalid_ring_timeout. Billing (402/403): missing_payment_method, payment_method_unverified, payment_method_expired, payment_method_required, credit_limit_reached, no_test_allowance, test_credit_unavailable, no_billing_account. State: livemode_mismatch, call_request_closed, call_request_accepted, scheduled_call_closed. Some 400s (availability, calls, usage) carry only a param, no code."},"message":{"type":"string","description":"Human-readable explanation."},"param":{"type":"string","description":"The request parameter or header the error is about, e.g. start_time, language_pair, Idempotency-Key."},"details":{"description":"Optional structured detail. Not currently sent by any v1 endpoint."}},"required":["type","message"]}},"required":["error"],"description":"Every error uses this envelope. Quote the Remoto-Request-Id response header when contacting support.","example":{"error":{"type":"invalid_request_error","code":"invalid_start_time","message":"start_time must be an ISO 8601 date-time","param":"start_time"}}},"LanguagePair":{"type":"object","properties":{"source":{"type":["string","null"],"description":"ISO 639 language code, e.g. eng."},"target":{"type":["string","null"],"description":"ISO 639 language code, e.g. ara."},"code":{"type":["string","null"],"description":"source_target, e.g. eng_ara. Null when either side is missing."}},"required":["source","target","code"],"description":"A language pair as returned by the API."},"LanguagePairInput":{"type":"object","properties":{"source":{"type":"string","description":"ISO 639 code Remoto supports, e.g. eng.","pattern":"^[A-Za-z-]{2,8}$"},"target":{"type":"string","description":"ISO 639 code Remoto supports, e.g. ara. Must differ from source.","pattern":"^[A-Za-z-]{2,8}$"}},"required":["source","target"],"description":"Codes are canonicalised (legacy spellings are mapped) and must be languages Remoto supports, otherwise 400 unknown_language. Order does not matter for matching interpreters."},"Metadata":{"type":"object","additionalProperties":{"type":"string"},"description":"Your key/value pairs as stored, echoed on the object and on every webhook. Empty object when none."},"MetadataInput":{"type":"object","maxProperties":20,"propertyNames":{"pattern":"^[A-Za-z0-9_\\-.]{1,40}$"},"additionalProperties":{"type":["string","number","boolean","null"],"maxLength":500,"description":"Scalar values are stored as strings (max 500 characters); null values are dropped."},"description":"Up to 20 keys of 1-40 letters, digits, _ - . with scalar values."},"InterpreterRef":{"type":"object","properties":{"id":{"type":["string","null"],"description":"Remoto interpreter id. Null for an interpreter assigned by name only (scheduled calls)."},"name":{"type":["string","null"],"description":"Interpreter display name."}},"required":["id","name"]},"ApiKeyContext":{"type":"object","properties":{"object":{"type":"string","const":"api_key_context"},"api_version":{"type":"string","const":"2026-09-29"},"livemode":{"type":"boolean","description":"True for a live key, false for a test key."},"key":{"type":"object","properties":{"id":{"type":"string","description":"The key's public lookup id (never the secret)."},"name":{"type":"string","description":"The name given to the key."},"mode":{"type":"string","enum":["live","test"]}},"required":["id","name","mode"]},"business":{"type":"object","properties":{"id":{"type":"string","description":"Business id."},"name":{"type":"string","description":"Business display name."},"slug":{"type":"string"},"interpreter_sourcing":{"type":"string","enum":["none","internal_team","marketplace_only","hybrid"],"description":"The business's interpreter sourcing setting (internal_team = own roster only, hybrid = roster first)."},"white_label_portal":{"type":"boolean","description":"Whether the business's white-label portal is enabled."},"live_access":{"type":"string","enum":["none","requested","approved","rejected","suspended"],"description":"Live API access review status. Test keys work regardless."},"billing":{"type":["string","null"],"enum":["invoice","card",null],"description":"How live calls are billed: invoice terms or the owner's card."}},"required":["id","name","slug","interpreter_sourcing","white_label_portal","live_access","billing"]}},"required":["object","api_version","livemode","key","business"],"description":"Who this key is."},"AvailabilityRate":{"type":"object","properties":{"amount":{"type":"number","description":"Price per minute."},"currency":{"type":"string","description":"ISO 4217 currency."},"unit":{"type":"string","const":"minute"},"source":{"type":"string","enum":["wholesale_rate_group","business_rate_card","platform"],"description":"Where the rate comes from: your wholesale rate group, your client rate card for the pair, or the Remoto platform rate."},"rate_group":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"}},"required":["key","label"],"description":"Wholesale rate group (wholesale_rate_group only)."},"billing_increment":{"type":"string","enum":["per_second","per_6_seconds","per_minute"],"description":"Wholesale billing increment (wholesale_rate_group only)."},"minimum_billable_seconds":{"type":"integer","description":"Wholesale minimum billable seconds (wholesale_rate_group only)."}},"required":["amount","currency","unit","source"]},"Availability":{"type":"object","properties":{"object":{"type":"string","const":"availability"},"language_pair":{"type":"object","properties":{"source":{"type":"string"},"target":{"type":"string"},"code":{"type":"string","description":"source_target, e.g. eng_ara."},"label":{"type":"string","description":"Human label, e.g. English ↔ Arabic."}},"required":["source","target","code","label"]},"available_now":{"type":"boolean","description":"True when at least one interpreter a call placed now would ring is online."},"interpreters_online":{"type":"integer","description":"Online interpreters a call placed now would ring (after sourcing rules and any wholesale payout ceiling)."},"roster_interpreters_online":{"type":"integer","description":"How many of those are on your own roster."},"interpreters_total":{"type":["integer","null"],"description":"Depth of the bench: your roster for roster-only businesses, the directory otherwise. Null if unknown."},"sourcing":{"type":"string","enum":["roster","coverage_fallback","roster_first","marketplace"]},"rate":{"$ref":"#/components/schemas/AvailabilityRate"},"checked_at":{"type":"string","format":"date-time"}},"required":["object","language_pair","available_now","interpreters_online","roster_interpreters_online","interpreters_total","sourcing","rate","checked_at"],"description":"Who could take a call for this pair right now, and at what price. Counts only; never interpreter identities."},"AvailabilityList":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Availability"}}},"required":["object","data"]},"CallRequestCreate":{"type":"object","properties":{"language_pair":{"$ref":"#/components/schemas/LanguagePairInput"},"call_type":{"type":"string","enum":["video","audio"],"description":"Default video."},"client_name":{"type":"string","description":"Your end user's name, shown to the interpreter (truncated to 80 characters). Also accepted as client.name."},"notes":{"type":"string","description":"Context for your own records.","maxLength":2000},"external_reference":{"type":"string","description":"Your id for this call. Filter on it later.","minLength":1,"maxLength":64},"metadata":{"$ref":"#/components/schemas/MetadataInput"},"join_expires_in_minutes":{"type":"integer","description":"How long the join link stays valid before it is opened.","minimum":5,"maximum":1440,"default":60},"ring_timeout_seconds":{"type":"integer","description":"How long interpreters are rung once your user connects.","minimum":30,"maximum":300,"default":120},"test_call":{"type":"boolean","description":"Live keys only: spend the business's admin-granted test-call allowance instead of billing (free; rings only designated test interpreters). 402 no_test_allowance / test_credit_unavailable when there is none."}},"required":["language_pair"],"description":"Top-level source and target are also accepted in place of language_pair, and client.name in place of client_name."},"CallRequest":{"type":"object","properties":{"id":{"type":"string","description":"Call request id."},"object":{"type":"string","const":"call_request"},"livemode":{"type":"boolean"},"status":{"type":"string","enum":["waiting","ringing","accepted","completed","missed","cancelled"]},"language_pair":{"$ref":"#/components/schemas/LanguagePair"},"call_type":{"type":"string","enum":["video","audio"]},"test_call":{"type":"boolean","description":"True when the request spends the test-call allowance."},"client_name":{"type":["string","null"]},"notes":{"type":["string","null"]},"external_reference":{"type":["string","null"]},"metadata":{"$ref":"#/components/schemas/Metadata"},"join_url":{"type":["string","null"],"description":"Your end user's link into the call (open in a new tab, redirect or in-app browser; not an iframe). Null once the request is closed."},"client_secret":{"type":["string","null"],"description":"Same credential as join_url, for the Remoto Call script (embedded mode). Browser-only, per call. Null once closed."},"join_expires_at":{"type":["string","null"],"description":"After this an unopened link is cancelled (end_reason join_link_expired).","format":"date-time"},"ring_timeout_seconds":{"type":"integer"},"interpreters_rung":{"type":"integer"},"interpreter":{"anyOf":[{"$ref":"#/components/schemas/InterpreterRef"},{"type":"null"}],"description":"Set when an interpreter accepts."},"call_id":{"type":["string","null"],"description":"The connected call. GET /calls/{call_id} for duration, billed seconds and cost."},"created_at":{"type":["string","null"],"format":"date-time"},"joined_at":{"type":["string","null"],"format":"date-time"},"ring_started_at":{"type":["string","null"],"format":"date-time"},"accepted_at":{"type":["string","null"],"format":"date-time"},"ended_at":{"type":["string","null"],"format":"date-time"},"end_reason":{"type":["string","null"],"description":"completed, not_answered, no_interpreter_available, client_left, not_connected, ring_failed, cancelled_by_partner, join_link_expired, billing_unavailable, business_inactive, test_credit_unavailable, test_credit_exhausted."},"cancelled_by":{"type":["string","null"],"enum":["partner","system",null],"description":"Set only when status is cancelled."}},"required":["id","object","livemode","status","language_pair","call_type","test_call","client_name","notes","external_reference","metadata","join_url","client_secret","join_expires_at","ring_timeout_seconds","interpreters_rung","interpreter","call_id","created_at","joined_at","ring_started_at","accepted_at","ended_at","end_reason","cancelled_by"],"description":"An on-demand interpreter request. Nobody is rung until the end user opens join_url and connects. Test-key requests run a simulated lifecycle (accepted about 6 s and completed about 30 s after ringing starts, advanced when the request is read)."},"CallRequestList":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/CallRequest"}},"has_more":{"type":"boolean","description":"True when another page exists. Pass next_cursor as starting_after to fetch it."},"next_cursor":{"type":["string","null"],"description":"Cursor for the next page, or null on the last page."}},"required":["object","data","has_more","next_cursor"],"description":"On-demand call requests, newest first."},"CallRequestCompletedObject":{"allOf":[{"$ref":"#/components/schemas/CallRequest"},{"type":"object","properties":{"call":{"anyOf":[{"$ref":"#/components/schemas/Call"},{"$ref":"#/components/schemas/SandboxCallSummary"}],"description":"The settled call (live), or a reduced simulated call (test keys). Absent if the call object could not be loaded."}}}],"description":"data.object of call_request.completed: the call request plus the settled call."},"SandboxCallSummary":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","const":"call"},"channel":{"type":"string","enum":["video","audio"]},"status":{"type":"string","const":"completed"},"duration_seconds":{"type":"integer"},"billed_seconds":{"type":"integer"},"cost":{"type":"object","properties":{"amount":{"type":"number"},"currency":{"type":"string"},"payment_status":{"type":"string","const":"test"}},"required":["amount","currency","payment_status"]},"test":{"type":"boolean","const":true}},"required":["id","object","channel","status","duration_seconds","billed_seconds","cost","test"],"description":"The simulated call attached to a test-key call_request.completed event."},"ScheduledCallCreate":{"type":"object","properties":{"language_pair":{"$ref":"#/components/schemas/LanguagePairInput"},"start_time":{"type":"string","description":"ISO 8601. At least 15 minutes and at most 365 days in the future.","format":"date-time"},"duration_minutes":{"type":"integer","minimum":5,"maximum":480,"default":60},"call_type":{"type":"string","enum":["audio","video"],"description":"Default audio."},"notes":{"type":"string","description":"Shown to the interpreter.","maxLength":2000},"external_reference":{"type":"string","description":"Your id for the booking.","minLength":1,"maxLength":64},"client_name":{"type":"string","description":"The end user's name (truncated to 80 characters). Also accepted as client.name."},"client_email":{"type":"string","description":"The end user's email (also accepted as client.email). Used only with notify_client.","format":"email","maxLength":160},"notify_client":{"type":"boolean","description":"Email the end user Remoto's confirmation and reminders. Requires client_email. Default false."},"metadata":{"$ref":"#/components/schemas/MetadataInput"}},"required":["language_pair","start_time"],"description":"Top-level source and target are also accepted in place of language_pair."},"ScheduledCall":{"type":"object","properties":{"id":{"type":"string","description":"Booking id. Test-key bookings are simulated and use an sc_test_ id that cannot be fetched."},"object":{"type":"string","const":"scheduled_call"},"livemode":{"type":"boolean"},"status":{"type":"string","enum":["pending","confirmed","in_progress","completed","cancelled","expired","awaiting_client_payment"],"description":"pending until an interpreter accepts. awaiting_client_payment is an internal state passed through unmapped."},"raw_status":{"type":["string","null"],"description":"Remoto's internal booking status."},"language_pair":{"$ref":"#/components/schemas/LanguagePair"},"start_time":{"type":["string","null"],"description":"UTC.","format":"date-time"},"duration_minutes":{"type":["integer","null"]},"call_type":{"type":"string","enum":["audio","video"]},"notes":{"type":["string","null"]},"external_reference":{"type":["string","null"]},"metadata":{"$ref":"#/components/schemas/Metadata"},"client_name":{"type":["string","null"],"description":"The end user's name, for bookings made through the API."},"join_url":{"type":["string","null"],"description":"Your end user's link into the call room (no Remoto account). API bookings only; null once the booking is over."},"client_secret":{"type":["string","null"],"description":"Same credential as join_url, for the Remoto Call script. Not present on test-key bookings."},"origin":{"type":"string","enum":["api","portal","direct"],"description":"How it was booked."},"interpreter":{"anyOf":[{"$ref":"#/components/schemas/InterpreterRef"},{"type":"null"}],"description":"Set once confirmed."},"interpreters_invited":{"type":"integer"},"client":{"anyOf":[{"$ref":"#/components/schemas/ClientRef"},{"type":"null"}],"description":"Your portal client, for white-label portal bookings. Not present on test-key bookings."},"reference_code":{"type":["string","null"],"description":"Cost-centre / case reference. Not present on test-key bookings."},"created_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"},"cancelled_at":{"type":["string","null"],"format":"date-time"},"cancelled_by":{"type":["string","null"],"enum":["client","admin","interpreter",null],"description":"Set only when status is cancelled."},"cancellation_reason":{"type":["string","null"],"description":"Set only when status is cancelled."},"expired_reason":{"type":["string","null"],"enum":["unfilled","client_did_not_select","client_did_not_confirm",null],"description":"Set only when status is expired."}},"required":["id","object","livemode","status","raw_status","language_pair","start_time","duration_minutes","call_type","notes","external_reference","metadata","client_name","join_url","origin","interpreter","interpreters_invited","created_at","updated_at","cancelled_at","cancelled_by","cancellation_reason","expired_reason"],"description":"A scheduled booking."},"ClientRef":{"type":"object","properties":{"id":{"type":"string","description":"Portal client id."}},"required":["id"]},"ScheduledCallList":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/ScheduledCall"}},"has_more":{"type":"boolean","description":"True when another page exists. Pass next_cursor as starting_after to fetch it."},"next_cursor":{"type":["string","null"],"description":"Cursor for the next page, or null on the last page."}},"required":["object","data","has_more","next_cursor"],"description":"Bookings, latest start_time first."},"ScheduledCallCancel":{"type":"object","properties":{"reason":{"type":"string","description":"Why it was cancelled (truncated to 1000 characters)."}},"required":[]},"CancellationFee":{"type":"object","properties":{"amount":{"type":"number"},"currency":{"type":"string"},"percent":{"type":"number","description":"Share of the slot charged under the late-cancellation policy."},"status":{"type":"string","description":"Charge status, e.g. pending or failed."}},"required":["amount","currency","percent","status"]},"ScheduledCallCancelResult":{"type":"object","properties":{"call":{"$ref":"#/components/schemas/ScheduledCall"},"cancellation_fee":{"anyOf":[{"$ref":"#/components/schemas/CancellationFee"},{"type":"null"}],"description":"Late-cancellation fee, or null when none applies (or the booking was already closed)."}},"required":["call","cancellation_fee"]},"CallCost":{"type":"object","properties":{"amount":{"type":"number","description":"Total charged for the call."},"currency":{"type":"string"},"rate_per_minute":{"type":["number","null"]},"breakdown":{"type":"object","properties":{"interpreting":{"type":"number"},"added_interpreters":{"type":"number"},"recording":{"type":"number"},"phone_dialout":{"type":"number"}},"required":["interpreting","added_interpreters","recording","phone_dialout"]},"billed_to":{"type":"string","enum":["business","client"]},"payment_status":{"type":"string","description":"e.g. pending, succeeded."},"agency_earnings":{"type":["number","null"],"description":"Your earnings on a white-label portal call; null otherwise."}},"required":["amount","currency","rate_per_minute","breakdown","billed_to","payment_status","agency_earnings"]},"CallPhoneLine":{"type":"object","properties":{"account_id":{"type":["string","null"]},"account_number":{"type":["string","null"]},"caller_number_masked":{"type":["string","null"]},"sip_trunk_id":{"type":["string","null"]},"partner_ref":{"type":["string","null"],"description":"Your own call reference, sent as the X-Remoto-Ref SIP header."},"leg":{"anyOf":[{"type":"object","properties":{"answered_at":{"type":["string","null"],"format":"date-time"},"ended_at":{"type":["string","null"],"format":"date-time"},"billable_seconds":{"type":["integer","null"]},"hangup_cause":{"type":["string","null"]}},"required":["answered_at","ended_at","billable_seconds","hangup_cause"]},{"type":"null"}],"description":"The inbound phone leg, when there is one."}},"required":["account_id","account_number","caller_number_masked","sip_trunk_id","partner_ref","leg"]},"AddedInterpreter":{"type":"object","properties":{"interpreter":{"$ref":"#/components/schemas/InterpreterRef"},"language_pair":{"$ref":"#/components/schemas/LanguagePair"},"joined_at":{"type":["string","null"],"format":"date-time"},"left_at":{"type":["string","null"],"format":"date-time"},"billed_seconds":{"type":"integer"},"cost":{"type":"number"}},"required":["interpreter","language_pair","joined_at","left_at","billed_seconds","cost"]},"CallClient":{"type":"object","properties":{"id":{"type":"string","description":"Portal client id."},"user_name":{"type":["string","null"]}},"required":["id","user_name"]},"Call":{"type":"object","properties":{"id":{"type":"string","description":"Call id (connected calls) or ring id (missed rings)."},"object":{"type":"string","const":"call"},"channel":{"type":"string","enum":["phone_line","video","audio"],"description":"phone_line = dialled in to the Remoto Phone Line."},"status":{"type":"string","enum":["completed","missed","cancelled","in_progress"],"description":"A call that was cancelled after billed time reports as completed."},"language_pair":{"$ref":"#/components/schemas/LanguagePair"},"requested_at":{"type":["string","null"],"description":"When ringing started. For operator-fallback calls, the first ring.","format":"date-time"},"answered_at":{"type":["string","null"],"format":"date-time"},"started_at":{"type":["string","null"],"format":"date-time"},"ended_at":{"type":["string","null"],"format":"date-time"},"answer_seconds":{"type":["integer","null"],"description":"Pickup time: requested_at to answered_at."},"ring_seconds":{"type":["integer","null"],"description":"Missed rings only: how long it rang."},"duration_seconds":{"type":"integer","description":"Connected duration."},"billed_seconds":{"type":"integer","description":"Seconds billed for the primary interpreter."},"operator_fallback_used":{"type":"boolean"},"requested_language_pair":{"anyOf":[{"$ref":"#/components/schemas/LanguagePair"},{"type":"null"}],"description":"The pair the caller asked for, when operator fallback was used."},"added_interpreters":{"type":"array","items":{"$ref":"#/components/schemas/AddedInterpreter"}},"added_interpreter_used":{"type":"boolean"},"interpreter":{"anyOf":[{"$ref":"#/components/schemas/InterpreterRef"},{"type":"null"}],"description":"The primary interpreter."},"cost":{"anyOf":[{"$ref":"#/components/schemas/CallCost"},{"type":"null"}]},"phone_line":{"anyOf":[{"$ref":"#/components/schemas/CallPhoneLine"},{"type":"null"}]},"client":{"anyOf":[{"$ref":"#/components/schemas/CallClient"},{"type":"null"}],"description":"Your portal client, for white-label portal calls."},"reference_code":{"type":["string","null"]},"scheduled_call_id":{"type":["string","null"]},"missed_reason":{"type":["string","null"],"description":"Missed calls only, e.g. not_answered, no_answer, not_joined, client_left, ring_failed, no_interpreter_available, portal_inactive, rerouted_to_operator (or the ring's own cancel reason)."},"interpreters_rung":{"type":"integer","description":"Missed rings only."},"pro_bono":{"type":"boolean"},"test":{"type":"boolean","description":"Test calls are excluded from usage totals."}},"required":["id","object","channel","status","language_pair","requested_at","answered_at","started_at","ended_at","answer_seconds","duration_seconds","billed_seconds","operator_fallback_used","requested_language_pair","added_interpreters","added_interpreter_used","interpreter","cost","phone_line","client","reference_code","scheduled_call_id","missed_reason","pro_bono","test"],"description":"A connected call or an unanswered ring. Interpreter pay and Remoto margins are never exposed."},"Window":{"type":"object","properties":{"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"}},"required":["from","to"]},"CallList":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Call"}},"has_more":{"type":"boolean","description":"True when another page exists. Pass next_cursor as starting_after to fetch it."},"next_cursor":{"type":["string","null"],"description":"Cursor for the next page, or null on the last page."},"window":{"$ref":"#/components/schemas/Window"}},"required":["object","data","has_more","next_cursor","window"],"description":"Connected calls and missed rings, newest first."},"UsageAmount":{"type":"object","properties":{"currency":{"type":"string"},"amount":{"type":"number"}},"required":["currency","amount"]},"UsageBucket":{"type":"object","properties":{"calls":{"type":"integer"},"billed_seconds":{"type":"integer"},"billed_minutes":{"type":"number"},"cost":{"type":"array","items":{"$ref":"#/components/schemas/UsageAmount"},"description":"One entry per currency."}},"required":["calls","billed_seconds","billed_minutes","cost"]},"Usage":{"type":"object","properties":{"object":{"type":"string","const":"usage"},"window":{"$ref":"#/components/schemas/Window"},"completed":{"$ref":"#/components/schemas/UsageBucket"},"added_interpreter_billed_seconds":{"type":"number"},"missed":{"type":"object","properties":{"total":{"type":"integer"},"phone_line":{"type":"integer"},"other":{"type":"integer"}},"required":["total","phone_line","other"]},"pro_bono_calls":{"type":"integer"},"test_calls_excluded":{"type":"integer"},"by_language_pair":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/UsageBucket"},{"type":"object","properties":{"language_pair":{"$ref":"#/components/schemas/LanguagePair"}},"required":["language_pair"]}]}},"by_channel":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/UsageBucket"},{"type":"object","properties":{"channel":{"type":"string","enum":["phone_line","video","audio"]}},"required":["channel"]}]}},"by_day":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/UsageBucket"},{"type":"object","properties":{"date":{"type":"string","description":"UTC day.","format":"date"}},"required":["date"]}]}},"truncated":{"type":"boolean","description":"True when the window held more calls than one usage request reads (20,000)."}},"required":["object","window","completed","added_interpreter_billed_seconds","missed","pro_bono_calls","test_calls_excluded","by_language_pair","by_channel","by_day","truncated"],"description":"Completed (billed) calls by language pair, channel and UTC day, plus missed counts. Test calls are excluded."},"SipTrunk":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["active","disabled"]},"test":{"type":"boolean","description":"Test route: rings only test interpreters and settles at $0."},"sip_uri":{"type":"string"},"auth_mode":{"type":"string","enum":["ip","digest","ip_and_digest"]},"allowed_ips":{"type":"array","items":{"type":"string"}},"digest_username":{"type":["string","null"]},"extensions":{"type":"array","items":{"type":"object","properties":{"extension":{"type":"string"},"language_pair":{"$ref":"#/components/schemas/LanguagePair"},"sip_uri":{"type":"string","description":"SIP URI that pre-selects this pair."}},"required":["extension","language_pair","sip_uri"]}}},"required":["id","name","status","test","sip_uri","auth_mode","allowed_ips","digest_username","extensions"]},"PhoneLine":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","const":"phone_line"},"status":{"type":"string","enum":["pending","approved","rejected","suspended"]},"account_number":{"type":["string","null"]},"dial_in_number":{"type":["string","null"],"description":"The Phone Line number to dial; set only when the account is approved."},"owner_type":{"type":"string","enum":["user","business_client"]},"client":{"anyOf":[{"$ref":"#/components/schemas/ClientRef"},{"type":"null"}],"description":"The portal client that owns the line (owner_type business_client)."},"speed_dial":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"language_pair":{"$ref":"#/components/schemas/LanguagePair"}},"required":["key","language_pair"]}},"operator_fallback_pair":{"anyOf":[{"$ref":"#/components/schemas/LanguagePair"},{"type":"null"}]},"sip_trunks":{"type":"array","items":{"$ref":"#/components/schemas/SipTrunk"}},"created_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"}},"required":["id","object","status","account_number","dial_in_number","owner_type","client","speed_dial","operator_fallback_pair","sip_trunks","created_at","updated_at"],"description":"A Phone Line (OPI) account. IVR PINs and SIP passwords are never returned."},"PhoneLineList":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/PhoneLine"}}},"required":["object","data"]},"InvoiceLineItem":{"type":"object","properties":{"call_id":{"type":["string","null"]},"date":{"type":["string","null"],"format":"date-time"},"language_pair":{"type":["string","null"],"description":"Language pair label as printed on the invoice."},"minutes":{"type":"number"},"rate_per_minute":{"type":["number","null"]},"amount":{"type":"number"},"reference_code":{"type":["string","null"]},"description":{"type":["string","null"]}},"required":["call_id","date","language_pair","minutes","rate_per_minute","amount","reference_code","description"]},"Invoice":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","const":"invoice"},"number":{"type":["string","null"]},"kind":{"type":"string","enum":["client_invoice","agency_statement"]},"status":{"type":"string","enum":["draft","issued","paid","void"]},"currency":{"type":"string"},"subtotal":{"type":"number"},"discount":{"type":"number"},"tax":{"type":"number"},"tax_label":{"type":["string","null"]},"total":{"type":"number"},"amount_paid":{"type":"number"},"balance_due":{"type":"number"},"period":{"type":"object","properties":{"start":{"type":["string","null"],"format":"date-time"},"end":{"type":["string","null"],"format":"date-time"}},"required":["start","end"]},"client":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":["string","null"]}},"required":["id","name"]},{"type":"null"}]},"payment_terms":{"type":["string","null"],"enum":["net_15","net_30","net_45","eom",null]},"purchase_order_number":{"type":["string","null"]},"issued_at":{"type":["string","null"],"format":"date-time"},"due_at":{"type":["string","null"],"format":"date-time"},"line_items":{"type":"array","items":{"$ref":"#/components/schemas/InvoiceLineItem"}}},"required":["id","object","number","kind","status","currency","subtotal","discount","tax","tax_label","total","amount_paid","balance_due","period","client","payment_terms","purchase_order_number","issued_at","due_at","line_items"],"description":"A white-label invoice as frozen at issue."},"Event":{"type":"object","properties":{"id":{"type":"string","description":"Event id. Deterministic per transition (e.g. evt_call_completed_<call id>); deduplicate on it. Dashboard test events get a random id."},"object":{"type":"string","const":"event"},"type":{"type":"string","enum":["call_request.ringing","call_request.accepted","call_request.completed","call_request.missed","call_request.cancelled","call.completed","call.missed","scheduled_call.created","scheduled_call.confirmed","scheduled_call.cancelled","invoice.issued"]},"api_version":{"type":"string","const":"2026-09-29"},"created":{"type":"string","format":"date-time"},"livemode":{"type":"boolean","description":"False for test-key activity and dashboard test sends."},"business_id":{"type":"string"},"data":{"type":"object","properties":{"object":{"type":"object","description":"The object the event is about."}},"required":["object"]}},"required":["id","object","type","api_version","created","livemode","business_id","data"],"description":"Webhook event envelope. Delivered at least once; ordering is not guaranteed."},"CallRequestRingingEvent":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"type":"string","const":"call_request.ringing"},"data":{"type":"object","properties":{"object":{"$ref":"#/components/schemas/CallRequest"}},"required":["object"]}},"required":["type","data"]}]},"CallRequestAcceptedEvent":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"type":"string","const":"call_request.accepted"},"data":{"type":"object","properties":{"object":{"$ref":"#/components/schemas/CallRequest"}},"required":["object"]}},"required":["type","data"]}]},"CallRequestCompletedEvent":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"type":"string","const":"call_request.completed"},"data":{"type":"object","properties":{"object":{"$ref":"#/components/schemas/CallRequestCompletedObject"}},"required":["object"]}},"required":["type","data"]}]},"CallRequestMissedEvent":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"type":"string","const":"call_request.missed"},"data":{"type":"object","properties":{"object":{"$ref":"#/components/schemas/CallRequest"}},"required":["object"]}},"required":["type","data"]}]},"CallRequestCancelledEvent":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"type":"string","const":"call_request.cancelled"},"data":{"type":"object","properties":{"object":{"$ref":"#/components/schemas/CallRequest"}},"required":["object"]}},"required":["type","data"]}]},"CallCompletedEvent":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"type":"string","const":"call.completed"},"data":{"type":"object","properties":{"object":{"$ref":"#/components/schemas/Call"}},"required":["object"]}},"required":["type","data"]}]},"CallMissedEvent":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"type":"string","const":"call.missed"},"data":{"type":"object","properties":{"object":{"$ref":"#/components/schemas/Call"}},"required":["object"]}},"required":["type","data"]}]},"ScheduledCallCreatedEvent":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"type":"string","const":"scheduled_call.created"},"data":{"type":"object","properties":{"object":{"$ref":"#/components/schemas/ScheduledCall"}},"required":["object"]}},"required":["type","data"]}]},"ScheduledCallConfirmedEvent":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"type":"string","const":"scheduled_call.confirmed"},"data":{"type":"object","properties":{"object":{"$ref":"#/components/schemas/ScheduledCall"}},"required":["object"]}},"required":["type","data"]}]},"ScheduledCallCancelledEvent":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"type":"string","const":"scheduled_call.cancelled"},"data":{"type":"object","properties":{"object":{"$ref":"#/components/schemas/ScheduledCall"}},"required":["object"]}},"required":["type","data"]}]},"InvoiceIssuedEvent":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"type":"string","const":"invoice.issued"},"data":{"type":"object","properties":{"object":{"$ref":"#/components/schemas/Invoice"}},"required":["object"]}},"required":["type","data"]}]}},"parameters":{"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"description":"Recommended. Retrying with the same key returns the original object (HTTP 200, Idempotent-Replayed: true) instead of creating a second one.","schema":{"type":"string","pattern":"^[A-Za-z0-9_\\-:.]{8,128}$"}},"Limit":{"name":"limit","in":"query","description":"Page size, 1-100 (default 50).","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},"ExternalReference":{"name":"external_reference","in":"query","description":"Only objects with this external_reference.","schema":{"type":"string","maxLength":64}},"WindowFrom":{"name":"from","in":"query","description":"Window start (ISO 8601). Default: 30 days before `to`. The window may span at most 366 days.","schema":{"type":"string","format":"date-time"}},"WindowTo":{"name":"to","in":"query","description":"Window end (ISO 8601). Default: now.","schema":{"type":"string","format":"date-time"}},"CallRequestId":{"name":"id","in":"path","required":true,"description":"Call request id.","schema":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"ScheduledCallId":{"name":"id","in":"path","required":true,"description":"Booking id.","schema":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"CallId":{"name":"id","in":"path","required":true,"description":"Call id (connected call) or ring id (missed ring), as returned by GET /calls or a call_request's call_id.","schema":{"type":"string","maxLength":200}},"RemotoSignature":{"name":"Remoto-Signature","in":"header","required":true,"description":"t=<unix seconds>,v1=<hex HMAC-SHA256 of \"<t>.<raw request body>\" keyed with the endpoint's whsec_ secret>. Verify over the raw bytes in constant time and reject timestamps more than 5 minutes old.","schema":{"type":"string","pattern":"^t=\\d+,v1=[0-9a-f]{64}$"}},"RemotoEventId":{"name":"Remoto-Event-Id","in":"header","required":true,"description":"Same as the body's id.","schema":{"type":"string"}},"RemotoEventType":{"name":"Remoto-Event-Type","in":"header","required":true,"description":"Same as the body's type.","schema":{"type":"string","enum":["call_request.ringing","call_request.accepted","call_request.completed","call_request.missed","call_request.cancelled","call.completed","call.missed","scheduled_call.created","scheduled_call.confirmed","scheduled_call.cancelled","invoice.issued"]}},"RemotoDeliveryId":{"name":"Remoto-Delivery-Id","in":"header","required":true,"description":"Id of this delivery (one per event per endpoint; retries reuse it).","schema":{"type":"string"}},"WebhookUserAgent":{"name":"User-Agent","in":"header","required":true,"schema":{"type":"string","const":"Remoto-Webhooks/2026-09-29"}}},"headers":{"RequestId":{"description":"Unique id of this request (req_…). Quote it when contacting support.","required":true,"schema":{"type":"string","pattern":"^req_[0-9a-f]{24}$"}},"RateLimitLimit":{"description":"Requests allowed per key per 60-second window (default 120, counted per Remoto data centre).","schema":{"type":"integer"}},"RateLimitRemaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimitReset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"RetryAfter":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"IdempotentReplayed":{"description":"Present (true) when the response replays the object created by an earlier request with the same Idempotency-Key.","schema":{"type":"string","const":"true"}}},"responses":{"BadRequest":{"description":"invalid_request_error: a parameter or the body is invalid (see error.param / error.code).","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"authentication_error: the API key is missing (missing_api_key), malformed, unknown, revoked, or a rotated key whose 24-hour grace period has ended (key_expired).","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"PaymentRequired":{"description":"invalid_request_error: live billing is not set up (no verified payment method on the owner account and no invoice terms, or the invoice credit limit is reached), or test_call was requested without an available test-call allowance.","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Forbidden":{"description":"permission_error: the business is not active (business_inactive), live access is not approved or was suspended (live_access_not_approved; test keys still work), or the operation is not allowed for this key (e.g. livemode_mismatch, no_billing_account). Rate-limit headers are absent on the authentication-stage 403s.","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"not_found (code resource_missing): no such object for this business.","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Conflict":{"description":"invalid_request_error: the object's state does not allow this (see error.code).","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"TooManyRequests":{"description":"rate_limit_error: over the per-key budget, or too many failed authentication attempts from this IP (30 per minute). X-RateLimit-* headers are sent only for the per-key limit.","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ServerError":{"description":"api_error: something went wrong on Remoto's side. Quote Remoto-Request-Id to support.","headers":{"Remoto-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}