{"service":"GoUltra API","version":"1.0.0","modules":[{"key":"messages","public_status":"public","plans":"all","scopes":["messages:write"],"docs_url":"https://docs.goultra.ai/#messages","owner_approved_at":"2026-07-02"},{"key":"inbox","public_status":"public","plans":"all","scopes":["inbox:read","inbox:write"],"docs_url":"https://docs.goultra.ai/#inbox","owner_approved_at":"2026-07-02"},{"key":"templates","public_status":"public","plans":"all","scopes":["templates:read","templates:write"],"docs_url":"https://docs.goultra.ai/#templates","owner_approved_at":"2026-07-02"},{"key":"campaigns","public_status":"public","plans":"all","scopes":["campaigns:read","campaigns:write"],"docs_url":"https://docs.goultra.ai/#campaigns","owner_approved_at":"2026-07-02"},{"key":"contacts","public_status":"public","plans":"all","scopes":["contacts:read","contacts:write"],"docs_url":"https://docs.goultra.ai/#contacts","owner_approved_at":"2026-07-02"},{"key":"bookings","public_status":"public","plans":"all","scopes":["bookings:read","bookings:write"],"docs_url":"https://docs.goultra.ai/#bookings","owner_approved_at":"2026-07-02","note":"list + detail + create only; no cancel/reschedule/slots endpoints"},{"key":"quotes","public_status":"public","plans":"all","scopes":["quotes:read"],"docs_url":"https://docs.goultra.ai/#quotes","owner_approved_at":"2026-07-02","note":"read-only; no quote send endpoint"},{"key":"account","public_status":"public","plans":"all","scopes":["account:read"],"docs_url":"https://docs.goultra.ai/#account","owner_approved_at":"2026-07-02"},{"key":"usage","public_status":"public","plans":"all","scopes":["usage:read"],"docs_url":"https://docs.goultra.ai/#usage","owner_approved_at":"2026-07-02"},{"key":"webhooks","public_status":"public","plans":"all","scopes":["webhooks:read","webhooks:write"],"docs_url":"https://docs.goultra.ai/#webhooks","owner_approved_at":"2026-07-02"},{"key":"documents","public_status":"gated","plans":"all (quota per plan)","scopes":["documents:read","documents:write"],"docs_url":null,"owner_approved_at":null,"note":"beta - becomes public after the documents gate (Gate-2) passes; endpoints not enumerated until then"}],"endpoints":{"POST /v1/messages":"Send an approved WhatsApp template to one number (scope: messages:write)","GET /v1/messages/:id":"Get the recorded send status for a message","GET /v1/quotes":"List your price-list / quote menus per WhatsApp number (scope: quotes:read)","GET /v1/contacts":"List your contacts, paginated (scope: contacts:read)","POST /v1/contacts":"Create or upsert a contact by international phone (scope: contacts:write)","GET /v1/templates":"List your APPROVED message templates (scope: templates:read)","POST /v1/templates":"Create a message template and submit it to Meta for approval (scope: templates:write)","POST /v1/campaigns":"Submit a template campaign to the send queue (scope: campaigns:write)","GET /v1/campaigns/:id":"Get campaign send progress (scope: campaigns:read)","GET /v1/bookings":"List appointments, per WhatsApp number (scope: bookings:read)","GET /v1/bookings/:id":"Get one appointment (scope: bookings:read)","POST /v1/bookings":"Create a manual appointment (scope: bookings:write)","GET /v1/inbox/conversations":"List inbox conversations, per number (scope: inbox:read)","GET /v1/inbox/messages":"List messages of one conversation by ?phone=, newest page first; pass ?before=<next_before> for older pages (scope: inbox:read)","POST /v1/inbox/send":"Send a free-form session reply within the 24h window (scope: inbox:write)","GET /v1/media/:key":"Download the file an inbox message carried, as inbound.message media.url names it (scope: inbox:read)","GET /v1/contacts/:id":"Get one contact (scope: contacts:read)","PATCH /v1/contacts/:id":"Update a contact name/email/opt-out (scope: contacts:write)","DELETE /v1/contacts/:id":"Delete a contact (scope: contacts:write)","GET /v1/account/numbers":"List your connected WhatsApp numbers + quality/tier (scope: account:read)","GET /v1/account":"Account info: plan, usage, connected numbers count (scope: account:read)","GET /v1/webhooks":"List your webhook endpoints (scope: webhooks:read)","POST /v1/webhooks":"Register a webhook endpoint - returns the signing secret ONCE (scope: webhooks:write)","GET /v1/webhooks/:id":"Get one webhook endpoint (scope: webhooks:read)","PATCH /v1/webhooks/:id":"Update a webhook url/events/status (scope: webhooks:write)","DELETE /v1/webhooks/:id":"Delete a webhook endpoint (scope: webhooks:write)","POST /v1/webhooks/:id/secret":"Regenerate the signing secret - returns it ONCE; optional {\"keep_previous_for_seconds\": N} keeps the previous one signing for N seconds (scope: webhooks:write)","POST /v1/webhooks/:id/test":"Queue a test event to a webhook endpoint (scope: webhooks:write)","GET /v1/webhooks/:id/deliveries":"The deliveries of one endpoint, newest first; ?limit=, ?before=<next_before>, ?status=, ?event_type= (scope: webhooks:read)","GET /v1/webhooks/:id/deliveries/:delivery_id":"One delivery with its payload (scope: webhooks:read)","POST /v1/webhooks/:id/deliveries/:delivery_id/redeliver":"Send one delivery again, the same id (scope: webhooks:write)","POST /v1/webhooks/:id/deliveries/redeliver":"Send again what failed or was cancelled since a time, up to 500 a request, paced 5 a minute across GoUltra, one bulk of an account at a time (scope: webhooks:write)","GET /v1/usage":"This month plan usage + API-sent message count (scope: usage:read)"},"docs":"https://docs.goultra.ai/"}