Developer Portal API
The Developer Portal API allows you to manage your developer resources - applications, API keys, webhook endpoints, and more.
These endpoints require JWT authentication with the MANAGE_DEVELOPER_KEYS permission and a valid business context.
All endpoints are prefixed with:
/api/developerCatalogs
Two read-only endpoints return the canonical lists your UI can render - so you never have to hardcode scopes or event names.
GET /api/developer/scopesReturns every assignable API-key scope with a label, group, and risk level.
GET /api/developer/webhook-eventsReturns every webhook event you can subscribe to, with a label and group. See the full list in the Webhooks event catalog.
Developer Apps
Developer apps group your API keys and webhook endpoints by application and environment.
List Apps
GET /api/developer/appsResponse:
{
"message": "Developer apps retrieved",
"data": [
{
"id": "uuid",
"businessId": "uuid",
"name": "My App",
"environment": "test",
"status": "active",
"isDefault": false,
"createdAt": "2026-01-01T00:00:00.000Z",
"updatedAt": "2026-01-01T00:00:00.000Z"
}
]
}Create App
POST /api/developer/appsRequest Body:
{
"name": "My App",
"environment": "test"
}API Keys
List API Keys
GET /api/developer/api-keys?developer_app_id=uuidQuery Parameters:
Create API Key
POST /api/developer/api-keysCreating, rotating, or viewing API key secrets requires recent password verification. You will be prompted to re-enter your password.
Request Body:
{
"name": "Production Key",
"developer_app_id": "uuid",
"environment": "live",
"scopes": ["vox:calls:read", "vox:calls:create"],
"allowed_origins": ["https://myapp.com"],
"allowed_ip_ranges": ["203.0.113.0/24"],
"expires_at": "2027-01-01T00:00:00.000Z"
}A live key granted a finance-write scope (payouts:write or
wallet:withdrawals:create) must include allowed_ip_ranges. Creation is rejected
otherwise.
The withdrawal_policy object gates API-initiated withdrawals (see
Wallet & payouts → Withdrawals):
{
"withdrawal_policy": {
"max_per_transaction": 50000,
"max_per_day": 200000,
"currency": "NGN",
"allowed_payout_account_ids": ["pa1a2b3c-..."]
}
}Limits: a business may hold at most 10 active keys per environment.
Get API Key
GET /api/developer/api-keys/:idUpdate API Key
PATCH /api/developer/api-keys/:idAllows updating name, scopes, allowed_origins, allowed_ip_ranges, and expires_at. Note: developer_app_id and environment cannot be changed after creation.
Rotate API Key
POST /api/developer/api-keys/:id/rotateRotates the secret while keeping the same public key. The old secret is immediately invalidated. Requires password re-verification.
View API Key Secret
POST /api/developer/api-keys/:id/view-secretReturns the currently stored secret (encrypted at rest). Requires password re-verification.
Revoke API Key
POST /api/developer/api-keys/:id/revokeImmediately revokes the key. Revoked keys cannot be updated or rotated.
Delete API Key
DELETE /api/developer/api-keys/:idPermanently deletes the key and its associated data.
Webhook Endpoints
List Webhook Endpoints
GET /api/developer/webhook-endpoints?developer_app_id=uuidCreate Webhook Endpoint
POST /api/developer/webhook-endpointsRequest Body:
{
"name": "Call Events Handler",
"developer_app_id": "uuid",
"url": "https://myapp.com/webhooks/vox",
"environment": "live",
"events": ["vox.call.completed", "vox.call.failed"]
}Rate Limits: Maximum 8 active endpoints per environment.
Update Webhook Endpoint
PATCH /api/developer/webhook-endpoints/:idDisable Webhook Endpoint
POST /api/developer/webhook-endpoints/:id/disableDisables the endpoint without deleting it.
Webhook Settings
GET /api/developer/webhook-settings?developer_app_id=uuidReturns webhook signing settings, including the signing secret prefix and rotation status.
Rotate Webhook Secret
POST /api/developer/webhook-settings/:environment/rotate-secretRequires password re-verification.
Request Body:
{
"developer_app_id": "uuid"
}View Webhook Secret
POST /api/developer/webhook-settings/:environment/view-secretRequires password re-verification.
Webhook Deliveries
List Deliveries
GET /api/developer/webhook-deliveries?developer_app_id=uuidReturns the last 100 delivery attempts.
Resend Delivery
POST /api/developer/webhook-deliveries/:id/resendQueues the webhook event for redelivery.
Events
List Events
GET /api/developer/events?api_key_id=uuid&event_type=api_key.created&page=1&per_page=50Returns a paginated audit log of developer actions (key creation, rotation, webhook management, etc.).
Query Parameters:
Response:
{
"success": true,
"message": "Developer API key events retrieved",
"data": [
{
"id": "uuid",
"businessId": "uuid",
"developerApiKeyId": "uuid",
"actorUserId": "uuid",
"actorName": "John Doe",
"eventType": "api_key.created",
"title": "API key created",
"ipAddress": "203.0.113.1",
"metadata": {
"environment": "live",
"scopes": ["vox:calls:read"]
},
"createdAt": "2026-01-01T00:00:00.000Z"
}
],
"meta": {
"total": 50,
"page": 1,
"perPage": 50,
"totalPages": 1,
"hasMore": false
}
}Usage Analytics
GET /api/developer/usage?days=30&developer_app_id=uuidReturns aggregated API usage data, grouped by day, environment, method, endpoint, and status family.
Query Parameters:
Response:
{
"message": "Developer API usage retrieved",
"data": [
{
"date": "2026-01-15",
"environment": "live",
"method": "GET",
"endpoint": "/v1/vox/calls",
"statusFamily": "2xx",
"requestCount": 150,
"errorCount": 3,
"totalLatencyMs": 45000
}
]
}