linkBase URL
All v1 endpoints are under:
Unversioned paths (/api/developer/stt/ etc.) are still accepted and redirect permanently (301) to their v1 equivalents. New integrations should use the versioned path.
keyAuthentication
Pass your API key in the X-API-Key header.
ori_test_ for development (free, mock responses) and ori_live_ for production (billed).scienceTest Mode
Every endpoint returns a deterministic mock response when called with a ori_test_ key — no credit is deducted and no real AI inference runs.
| Endpoint | Test response |
|---|---|
| stt | "Ina son abinci. I want food please." (Hausa-English, code-switching) |
| tts | Empty audio, cost_ngn: "0.00" |
| langdetect | ha, confidence 0.94, code-switching detected |
All test responses include "mode": "test". Sandbox keys are rate-limited to 5 requests/min and 200 requests/day.
replayIdempotency Keys
On any POST that bills credits, include the Idempotency-Key header with a UUID you generate. If the server already processed a request with that key for your account, it returns the original result without re-billing.
When the server replays an idempotent response it includes "idempotent_replay": true in the body. Keys expire after 24 hours.
fingerprintRequest IDs
Every response — success or error — includes a unique request_id UUID in the JSON body and as the X-Request-Id response header.
Log the request_id in your application and quote it when contacting support. We can trace any request in our system from this ID.
errorError Responses
All errors return JSON with error (human-readable message), code (machine-readable), request_id, and optional detail.
| HTTP | code | Meaning | Action |
|---|---|---|---|
| 401 | auth_required | No API key supplied | Add X-API-Key header |
| 403 | invalid_key | Key not found or revoked | Check your key in the portal |
| 402 | insufficient_balance | Not enough API credit | Top up at /developer/billing/ |
| 429 | rate_limited | Too many requests/minute | Retry after Retry-After header seconds |
| 400 | validation_error | Bad request parameters | Check detail for field errors |
| 400 | invalid_audio | Unsupported file type or too large | Upload WAV/MP3/OGG ≤50 MB |
| 500 | internal_error | Server fault | Retry with exponential backoff; quote request_id in support |
speedRate Limits
Limits are enforced per API key, per minute. When exceeded the server returns HTTP 429 with a Retry-After value in seconds.
| Tier | Requests / min | Sandbox daily cap |
|---|---|---|
| Sandbox (test keys) | 5 | 200 / day |
| Developer | 60 | — |
| Business | 300 | — |
| Enterprise | Unlimited | — |
micSpeech-to-Text
Transcribe audio to text. Supports English (Nigerian accent), Hausa, Igbo, and Yoruba — including mid-sentence code-switching where the speaker mixes a native language with English.
Request — multipart/form-data
| Field | Type | Description | |
|---|---|---|---|
| audio | file | Required | Audio file — WAV, MP3, or OGG. Max 50 MB. 16 kHz mono WAV recommended for best accuracy. |
| language | string | Optional | en, ha, ig, yo, or auto (default). Auto runs language detection first and adds ~80ms. Providing a hint is faster. |
Request Headers
| Header | Description | |
|---|---|---|
| X-API-Key | Required | Your API key |
| Idempotency-Key | Recommended | UUID to prevent double-billing on retry |
Response — 200 OK
Code examples
Pricing note
Billed at ₦5.00/minute based on the actual measured audio duration. A 30-second clip costs ₦5.00 / 2.
volume_upText-to-Speech
Convert text to speech using Orinode's Nigerian-accent AI voices. Returns base64-encoded WAV audio. Tone and language are configurable.
Request — application/json
| Field | Type | Description | |
|---|---|---|---|
| text | string | Required | Text to synthesize. Max 5,000 characters. |
| language | string | Required | en, ha, ig, or yo. Selects the voice model. |
| voice_tone | string | Optional | friendly (default), formal, or neutral. |
Response — 200 OK
translateLanguage Detection
Detect the spoken language in audio without running a full transcription. Only the first 10 seconds are analyzed. Useful for routing callers to the right handler before investing in a full STT request.
Request — multipart/form-data
| Field | Type | Description | |
|---|---|---|---|
| audio | file | Required | Audio file (WAV, MP3, OGG). Max 50 MB. Only the first 10s are read. |
Response — 200 OK
secondary_language is null when code-switching is not detected. Use is_code_switching: true as a hint to run STT in multilingual mode.
bar_chartUsage Statistics
Returns aggregated usage for the current calendar month. Test key calls are excluded from cost totals.
attach_moneyCall Rate
Returns your effective per-minute AI Call Agent rate given this month's cumulative usage. Use this to display pricing to your own users or to estimate costs before a call.
receiptPricing
| Endpoint | Rate (NGN) | Unit | Notes |
|---|---|---|---|
| stt | ₦5.00 | per minute of audio | Billed on actual duration |
| tts | ₦3.00 | per 1,000 characters | — |
| langdetect | ₦2.00 | per request | Only first 10s analyzed |
| agent_call | ₦8.00–₦3.00 | per minute | Volume discounts apply (see below) |
| summary | ₦10.00 | per call | Post-call AI summary |
All ori_test_ sandbox keys are always free. Prices shown are defaults; contact us for custom enterprise rates.
discountVolume Discounts
The AI Call Agent endpoint uses tiered pricing based on your cumulative call minutes within a calendar month. Rates step down automatically — no action required.
| Minutes / month | Rate (NGN/min) | Example (100 min) |
|---|---|---|
| 0 – 1,000 | ₦8.00 | ₦800 |
| 1,001 – 10,000 | ₦6.00 | ₦600 |
| 10,001 – 100,000 | ₦4.50 | ₦450 |
| 100,000+ | ₦3.00 | ₦300 |
Use GET /api/developer/v1/call-rate/ to query your effective rate at any time.
webhookWebhooks
Configure webhook endpoints in the Developer Portal → Webhooks. Orinode signs each delivery with HMAC-SHA256 using your webhook secret so you can verify authenticity.
Signature Verification
Events
| Event | Triggered when | Key payload fields |
|---|---|---|
| call.completed | An AI call agent call finishes | request_id, duration_seconds, cost_ngn |
| call.transcribed | STT transcript is ready (after /stt/) | request_id, duration_seconds, cost_ngn |
| balance.low | API credit drops below your alert threshold | balance_ngn, threshold_ngn |
| key.created | A new API key is generated on your account | key_name, is_test |
Webhook payload structure
languageSupported Languages
| Code | Language | STT | TTS | Code-switching |
|---|---|---|---|---|
| en | English (Nigerian) | ✓ | ✓ | With ha, ig, yo |
| ha | Hausa | ✓ | ✓ | With en |
| ig | Igbo | ✓ | ✓ | With en |
| yo | Yoruba | ✓ | ✓ | With en |
Code-switching means a caller can mix a native language with English mid-sentence. When is_code_switching: true is returned by /langdetect/ or /stt/, both languages are preserved exactly as spoken in the transcript.
account_balanceAPI Credit vs. Plan Billing
Your Orinode subscription (Free / Starter / Pro / Enterprise) covers inbound call handling on your dashboard. The Developer API uses a completely separate credit balance that you top up independently from the billing section of your developer portal.
- Making API calls will never touch your call center plan balance or monthly call count.
- Plan upgrades and downgrades have no effect on your API credit.
- You can hold both a subscription and API credit simultaneously.
Top up API credit at /developer/billing/. Set a low-balance alert threshold so you receive an email before calls start failing.
Ready to integrate?
Get a free sandbox key in 30 seconds — no credit card required.