OdyDocs

REST API overview

Base URL, request and response conventions, the OpenAPI spec, and every endpoint on one page.

The Ody REST API is a JSON-over-HTTPS API rooted at https://api.ody.co/v1/api. It uses standard HTTP verbs, returns standard status codes, authenticates with a Bearer API key, and is described by a machine-readable OpenAPI 3.1 document.

#Base URL

Text
https://api.ody.co/v1/api

Every path in this reference is relative to that base. All traffic is HTTPS-only.

#Conventions

TopicRule
FormatRequest and response bodies are JSON (Content-Type: application/json). A body that isn't valid JSON returns 400 invalid_argument
AuthAuthorization: Bearer ody_live_… or ody_test_… on every request — see Authentication
Partial updatesPATCH changes only the fields you send. Array fields (phones, emails, tags, notes, agent jobs) are replaced wholesale when supplied
IDsUUIDs. A malformed ID returns 404 not_found, the same as an unknown one
Phone numbersE.164 (+15125550123). Encode + as %2B in paths
ListsSome lists paginate with opaque cursors — see Pagination
RetriesPOST /messages and POST /numbers accept an Idempotency-Key — see Idempotency
ErrorsOne envelope: { "error": { "code", "message", "requestId" } } — see Errors
Limits600 requests per minute per key — see Rate limits
TracingEvery response carries X-Request-Id
CORSAny origin is allowed (keys, not cookies, authenticate)

#OpenAPI specification

The full contract is served without authentication:

Shell
curl https://api.ody.co/v1/api/openapi.json

Import it into Postman, Insomnia or Bruno, or generate a typed client in any language. The official SDKs are built against it.

#Endpoints

Method & pathWhat it doesScope
GET /contactsList or search contactscontacts:read
POST /contactsCreate a contactcontacts:write
GET /contacts/:idRetrieve a contactcontacts:read
PATCH /contacts/:idUpdate a contactcontacts:write
DELETE /contacts/:idDelete a contactcontacts:write
GET /conversationsList conversationsconversations:read
GET /conversations/:idRetrieve a full threadconversations:read
PATCH /conversations/:idMark open or doneconversations:write
POST /messagesSend SMS/MMSmessages:send
GET /messages/searchSearch message bodies and transcriptsconversations:read
GET /callsCall and voicemail historyconversations:read
POST /callsPlace an outbound AI callcalls:place
GET /numbersList workspace numbersnumbers:read
GET /numbers/availableSearch numbers you can buynumbers:manage
POST /numbersBuy a numbernumbers:manage
POST /numbers/:e164/connectRoute a number to Astraagent:manage
POST /numbers/:e164/disconnectRoute a number away from Astraagent:manage
GET /messaging10DLC statusnumbers:manage
POST /messaging/registrationFile 10DLC brand + campaignnumbers:manage
POST /messaging/refreshRe-check 10DLC statusnumbers:manage
POST /messaging/otp/verifySole proprietor: submit PINnumbers:manage
POST /messaging/otp/resendSole proprietor: resend PINnumbers:manage
GET /agentAstra config + credit usageagent:manage
PATCH /agentCreate or update the draftagent:manage
POST /agent/publishPush the config liveagent:manage
GET /webhook-eventsSubscribable event typeswebhooks:manage
GET /webhooksList endpointswebhooks:manage
POST /webhooksRegister an endpointwebhooks:manage
GET /webhooks/:idRetrieve an endpointwebhooks:manage
PATCH /webhooks/:idUpdate an endpointwebhooks:manage
DELETE /webhooks/:idDelete an endpointwebhooks:manage
POST /webhooks/:id/rotateRotate the secretwebhooks:manage
POST /webhooks/:id/testSend a signed pingwebhooks:manage
GET /webhooks/:id/deliveriesDelivery historywebhooks:manage
GET /openapi.jsonThe OpenAPI specnone
Last updated Wed Oct 14 2026 00:00:00 GMT+0000 (Coordinated Universal Time)Something wrong on this page? Tell us