Quick Start
Get your first API call working in under 5 minutes. You'll need an API key from your Oravio dashboard under Settings → Developer → API Keys.
Go to Dashboard → Settings → API Keys and create a new key. Copy it - it won't be shown again.
Send a GET /v1/conversations to verify your key is working.
All responses are JSON. Check the status field - 200 OK means you're good.
# List recent conversations
curl https://api.oravio.in/v1/conversations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
{
"data": [
{
"id": "conv_01HXYZ123",
"contact_phone": "+919876543210",
"status": "active",
"last_message": "Bhai, aapka salon Sunday ko open hai-,
"last_message_at": "2026-05-10T08:23:41Z",
"ai_handled": true
}
],
"meta": { "total": 248, "page": 1, "per_page": 20 }
}
Authentication
Oravio uses Bearer token authentication. Pass your API key in the Authorization header of every request.
Authorization: Bearer orv_live_xxxxxxxxxxxxxxxxxxxx
API Key Types
| Prefix | Type | Use |
|---|---|---|
orv_live_ | Live key | Production - real conversations & data |
orv_test_ | Test key | Sandbox - no real messages sent |
Base URL & Versioning
https://api.oravio.in/v1
The current API version is v1. We follow semantic versioning - breaking changes result in a new major version (v2), and old versions are supported for a minimum of 12 months after deprecation notice.
Request Format
| Property | Value |
|---|---|
| Protocol | HTTPS only |
| Content-Type | application/json |
| Encoding | UTF-8 |
| Timestamps | ISO 8601 (2026-05-10T08:23:41Z) |
Errors & Status Codes
Oravio uses standard HTTP status codes. All error responses include a JSON body with a machine-readable code and a human-readable message.
| Status | Meaning |
|---|---|
| 200 OK | Request succeeded |
| 201 Created | Resource created successfully |
| 400 Bad Request | Invalid parameters - check the errors array |
| 401 Unauthorized | Missing or invalid API key |
| 403 Forbidden | Key valid but lacks permission for this action |
| 404 Not Found | Resource doesn't exist |
| 429 Too Many Requests | Rate limit exceeded - back off and retry |
| 500 Server Error | Something went wrong on our end |
{
"error": {
"code": "unauthorized",
"message": "Invalid API key. Check your Authorization header."
}
}
Messages
Send messages to any contact using your connected WhatsApp number. Supports text, templates, and media.
/v1/messages
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
to | string | required | Recipient phone with country code (+919876543210) |
type | string | required | text · template · image |
text | string | conditional | Required when type is text |
template | object | conditional | Template name & variables when type is template |
curl -X POST https://api.oravio.in/v1/messages \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "+919876543210",
"type": "text",
"text": "Namaste! Aapki appointment kal 3 baje confirm ho gayi hai. ✅"
}'
Webhooks
Oravio sends POST requests to your webhook URL whenever a key event happens - new message received, lead captured, booking created, or human escalation triggered.
X-Oravio-Signature header against an HMAC-SHA256 hash of the payload using your webhook secret.
Webhook Events
| Event | Triggered when |
|---|---|
message.received | Customer sends a message to your WhatsApp |
message.sent | AI sends a reply to a customer |
lead.captured | AI collects contact details from a conversation |
booking.created | Customer books an appointment via AI |
conversation.escalated | AI hands off conversation to a human agent |
conversation.resolved | Conversation marked as resolved |
lead.captured{
"event": "lead.captured",
"timestamp": "2026-05-10T08:41:12Z",
"data": {
"lead_id": "lead_01HXYZ789",
"name": "Rahul Verma",
"phone": "+919876543210",
"source": "whatsapp",
"intent": "appointment_booking",
"conversation_id": "conv_01HXYZ123"
}
}
SDKs & Libraries
Official SDKs wrap the REST API with idiomatic interfaces. Community libraries are listed below - they are not officially maintained.
Rate Limits
Rate limits are applied per API key. When exceeded, requests return 429 Too Many Requests. Use the response headers to track your current usage.
| Plan | Requests/minute | Requests/day |
|---|---|---|
| Starter | 60 | 5,000 |
| Growth | 300 | 50,000 |
| Enterprise | Custom | Unlimited |
Rate Limit Headers
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 287
X-RateLimit-Reset: 1715334600
Changelog
Added broadcast endpoint for sending bulk template messages.
New webhook event: booking.cancelled.
Introduced knowledge_base API - programmatically update your AI's knowledge.
Python SDK v1.0 officially released.
Added contacts and leads endpoints.
Webhook signature verification introduced.