Appearance
API Endpoints
Complete list of all available API endpoints.
Health
Health Check
http
GET /healthResponse:
json
{
"success": true,
"data": {
"status": "healthy",
"version": "1.0.0",
"timestamp": "2026-02-08T12:00:00Z"
}
}Drivers
List Drivers
http
GET /api/v1/driversQuery Parameters:
page(number, optional): Page number (default: 1)pageSize(number, optional): Page size, max 100 (default: 50)status(string, optional): Filter by status (active,inactive,pending)
Response:
json
{
"success": true,
"data": {
"items": [
{
"id": "drv_abc123",
"ovnDriverId": "OVN-DRIVER-789",
"name": "John Smith",
"email": "john@example.com",
"phone": "+15551234567",
"status": "active",
"kycStatus": "verified",
"totalPaid": 125000,
"pendingPayouts": 0
}
],
"total": 142,
"page": 1,
"pageSize": 50,
"hasNextPage": true
}
}Get Driver by ID
http
GET /api/v1/drivers/:idResponse:
json
{
"success": true,
"data": {
"id": "drv_abc123",
"ovnDriverId": "OVN-DRIVER-789",
"name": "John Smith",
"email": "john@example.com",
"phone": "+15551234567",
"status": "active",
"kycStatus": "verified"
}
}Register Driver
http
POST /api/v1/driversBody:
json
{
"ovnDriverId": "OVN-DRIVER-789",
"name": "John Smith",
"email": "john@example.com",
"phone": "+15551234567"
}Response:
json
{
"success": true,
"data": {
"id": "drv_abc123",
"ovnDriverId": "OVN-DRIVER-789",
"name": "John Smith",
"status": "invited",
"kycStatus": "pending"
}
}Update Driver
http
PUT /api/v1/drivers/:idDelete Driver
http
DELETE /api/v1/drivers/:idGet Driver Payouts
http
GET /api/v1/drivers/:id/payoutsResponse:
json
{
"success": true,
"data": {
"items": [
{
"id": "pay_xyz",
"loadId": "L-12345",
"driverId": "drv_abc123",
"driverName": "John Smith",
"amount": 45000,
"fee": 450,
"netAmount": 44550,
"status": "completed",
"rail": "standard",
"requestedAt": "2026-01-31T12:00:00Z",
"completedAt": "2026-02-02T12:00:00Z"
}
],
"total": 12,
"page": 1,
"pageSize": 50
}
}Payouts
Create Payout
http
POST /api/v1/payoutsBody:
json
{
"driverId": "drv_abc123",
"amount": 45000,
"urgency": "standard",
"description": "Payment for load #L-12345"
}Response:
json
{
"success": true,
"data": {
"id": "pay_xyz",
"loadId": "L-12345",
"driverId": "drv_abc123",
"driverName": "John Smith",
"amount": 45000,
"fee": 250,
"netAmount": 44750,
"status": "validated",
"rail": "standard",
"requestedAt": "2026-01-31T12:00:00Z"
}
}List Payouts
http
GET /api/v1/payoutsQuery Parameters:
page(number, optional): Page number (default: 1)pageSize(number, optional): Page size, max 100 (default: 50)status(string, optional): Filter by statusdriverId(string, optional): Filter by driver ID
Response:
json
{
"success": true,
"data": {
"items": [
{
"id": "pay_xyz",
"loadId": "L-12345",
"driverId": "drv_abc123",
"driverName": "John Smith",
"amount": 45000,
"fee": 250,
"netAmount": 44750,
"status": "completed",
"rail": "standard",
"requestedAt": "2026-01-31T12:00:00Z",
"completedAt": "2026-02-02T12:00:00Z"
}
],
"total": 45,
"page": 1,
"pageSize": 50,
"hasNextPage": false
}
}Get Payout Details
http
GET /api/v1/payouts/:idResponse:
json
{
"success": true,
"data": {
"id": "pay_xyz",
"loadId": "L-12345",
"driverId": "drv_abc123",
"amount": 45000,
"fee": 250,
"netAmount": 44750,
"status": "completed",
"rail": "standard",
"requestedAt": "2026-01-31T12:00:00Z",
"completedAt": "2026-02-02T12:00:00Z"
}
}Cancel Payout
http
POST /api/v1/payouts/:id/cancelResponse:
json
{
"success": true,
"data": {
"id": "pay_xyz",
"status": "canceled",
"canceledAt": "2026-01-31T12:30:00Z"
}
}Retry Failed Payout
http
POST /api/v1/payouts/:id/retryResponse:
json
{
"success": true,
"data": {
"id": "pay_xyz",
"status": "queued",
"retriedAt": "2026-01-31T12:30:00Z"
}
}Instant Pay
Request Instant Pay
http
POST /api/v1/payouts/instantBody:
json
{
"driverId": "drv_abc123",
"amount": 45000,
"requestedBy": "driver-789"
}Response:
json
{
"success": true,
"data": {
"id": "pay_xyz",
"driverId": "drv_abc123",
"amount": 45000,
"fee": 450,
"netAmount": 44550,
"status": "processing",
"rail": "instant",
"requestedAt": "2026-01-31T12:00:00Z",
"estimatedSettlement": "~30 seconds"
}
}Get Instant Pay Fee
http
GET /api/v1/payouts/instant/fee?amount=50000Response:
json
{
"success": true,
"data": {
"amount": 50000,
"fee": 250,
"feePercent": 0.5,
"total": 50250,
"estimatedDeposit": 49750
}
}Batches
Create Batch
http
POST /api/v1/batchesBody:
json
{
"name": "Weekly Payouts - 2026-01-31",
"urgency": "standard",
"payouts": [
{
"amount": 45000,
"driverId": "drv_abc123",
"loadId": "L-12345",
"description": "Load #12345"
}
**Response:**
```json
{
"success": true,
"data": {
"id": "batch_xyz",
"name": "Weekly Payouts - 2026-01-31",
"payoutCount": 3,
"totalAmount": 135000,
"totalFees": 675,
"netAmount": 134325,
"status": "queued",
"createdAt": "2026-01-31T12:00:00Z"
}
}List Batches
http
GET /api/v1/batchesQuery Parameters:
page(number, optional): Page number (default: 1)pageSize(number, optional): Page size (default: 20)status(string, optional): Filter by status
Response:
json
{
"success": true,
"data": {
"items": [
{
"id": "batch_xyz",
"name": "Weekly Payouts - 2026-01-31",
"payoutCount": 45,
"totalAmount": 2025000,
"totalFees": 11250,
"netAmount": 2013750,
"status": "completed",
"createdAt": "2026-01-31T14:00:00Z",
"completedAt": "2026-01-31T14:30:00Z"
}
],
"total": 8,
"page": 1,
"pageSize": 20,
"hasNextPage": false
}
}Get Batch Details
http
GET /api/v1/batches/:idResponse:
json
{
"success": true,
"data": {
"id": "batch_xyz",
"name": "Weekly Payouts - 2026-01-31",
"payoutCount": 3,
"totalAmount": 135000,
"totalFees": 675,
"netAmount": 134325,
"status": "completed",
"createdAt": "2026-01-31T12:00:00Z",
"completedAt": "2026-01-31T14:30:00Z",
"payouts": [
{
"id": "pay_xyz",
"driverId": "drv_001",
"driverName": "John Smith",
"amount": 45000,
"status": "completed"
}
]
}
}Release Batch
http
POST /api/v1/batches/:id/releaseResponse:
json
{
"success": true,
"data": {
"id": "batch_xyz",
"status": "processing",
"releasedAt": "2026-01-31T12:00:00Z"
}
}Run Batch
http
POST /api/v1/batches/:id/runResponse:
json
{
"success": true,
"data": {
"id": "batch_xyz",
"status": "processing",
"processedAt": "2026-01-31T12:00:00Z"
}
}Create Batch
http
POST /api/v1/batchesBody:
json
{
"name": "Weekly Payouts - 2026-01-31",
"urgency": "standard",
"payouts": [
{
"amount": 45000,
"driverId": "drv_abc123",
"loadId": "L-12345",
"description": "Load #12345"
},
{
"amount": 50000,
"driverId": "drv_def456",
"loadId": "L-12346",
"description": "Load #12346"
},
{
"amount": 40000,
"driverId": "drv_ghi789",
"description": "Bonus payment"
}
],
"scheduledFor": "2026-01-31T17:00:00Z"
}Response:
json
{
"success": true,
"data": {
"id": "batch_xyz",
"name": "Weekly Payouts - 2026-01-31",
"payoutCount": 3,
"totalAmount": 135000,
"totalFees": 675,
"netAmount": 134325,
"status": "queued",
"createdAt": "2026-01-31T12:00:00Z"
}
}List Batches
http
GET /api/v1/batchesQuery Parameters:
page(number, optional): Page number (default: 1)pageSize(number, optional): Page size (default: 20)status(string, optional): Filter by status
Response:
json
{
"success": true,
"data": {
"items": [
{
"id": "batch_xyz",
"name": "Weekly Payouts - 2026-01-31",
"payoutCount": 45,
"totalAmount": 2025000,
"totalFees": 11250,
"netAmount": 2013750,
"status": "completed",
"createdAt": "2026-01-31T12:00:00Z",
"completedAt": "2026-01-31T14:00:00Z"
}
],
"total": 8,
"page": 1,
"pageSize": 20,
"hasNextPage": false
}
}Get Batch Details
http
GET /api/v1/batches/:idResponse:
json
{
"success": true,
"data": {
"id": "batch_xyz",
"name": "Weekly Payouts - 2026-01-31",
"payoutCount": 3,
"totalAmount": 135000,
"totalFees": 675,
"netAmount": 134325,
"status": "completed",
"createdAt": "2026-01-31T12:00:00Z",
"completedAt": "2026-01-31T14:30:00Z",
"payouts": [
{
"id": "pay_xyz",
"driverId": "drv_001",
"driverName": "John Smith",
"amount": 45000,
"status": "completed"
}
]
}
}Release Batch
http
POST /api/v1/batches/:id/releaseResponse:
json
{
"success": true,
"data": {
"id": "batch_xyz",
"status": "processing",
"releasedAt": "2026-01-31T12:00:00Z"
}
}Run Batch
Process a scheduled batch immediately, regardless of its scheduled time.
http
POST /api/v1/batches/:id/runResponse:
json
{
"success": true,
"data": {
"id": "batch_xyz",
"status": "processing",
"processedAt": "2026-01-31T12:00:00Z"
}
}Bulk Operations
Bulk operations allow you to process multiple items in a single request. All bulk operations return detailed results showing which items succeeded or failed. Maximum 100 items per request.
Bulk Register Drivers
http
POST /api/v1/drivers/bulkBody:
json
{
"drivers": [
{
"ovnDriverId": "OVN-DRIVER-789",
"name": "John Smith",
"email": "john@example.com",
"phone": "+15551234567"
},
{
"ovnDriverId": "OVN-DRIVER-790",
"name": "Jane Doe",
"email": "jane@example.com",
"phone": "+15551234568"
}
]
}Response:
json
{
"success": true,
"data": {
"succeeded": 2,
"failed": 0,
"total": 2,
"results": [
{
"item": {
"id": "drv_abc123",
"ovnDriverId": "OVN-DRIVER-789",
"name": "John Smith",
"status": "invited"
},
"status": "success"
},
{
"item": {
"id": "drv_def456",
"ovnDriverId": "OVN-DRIVER-790",
"name": "Jane Doe",
"status": "invited"
},
"status": "success"
}
]
}
}Bulk Create Payouts
http
POST /api/v1/payouts/bulkBody:
json
{
"urgency": "standard",
"payouts": [
{
"amount": 45000,
"driverId": "drv_abc123",
"loadId": "L-12345",
"description": "Load #12345"
},
{
"amount": 50000,
"driverId": "drv_def456",
"loadId": "L-12346",
"description": "Load #12346"
},
{
"amount": 40000,
"driverId": "drv_ghi789",
"description": "Bonus payment"
}
]
}Response:
json
{
"success": true,
"data": {
"succeeded": 3,
"failed": 0,
"total": 3,
"results": [
{
"item": {
"id": "pay_xyz",
"driverId": "drv_abc123",
"amount": 45000,
"status": "validated"
},
"status": "success"
},
{
"item": {
"id": "pay_def456",
"driverId": "drv_def456",
"amount": 50000,
"status": "validated"
},
"status": "success"
},
{
"item": {
"id": "pay_ghi789",
"driverId": "drv_ghi789",
"amount": 40000,
"status": "validated"
},
"status": "success"
}
]
}
}Bulk Cancel Payouts
http
POST /api/v1/payouts/bulk/cancelBody:
json
{
"payoutIds": ["pay_xyz", "pay_abc", "pay_def"]
}Response:
json
{
"success": true,
"data": {
"succeeded": 3,
"failed": 0,
"total": 3,
"results": [
{
"item": {
"id": "pay_xyz",
"status": "canceled"
},
"status": "success"
}
]
}
}Bulk Retry Payouts
http
POST /api/v1/payouts/bulk/retryBody:
json
{
"payoutIds": ["pay_xyz", "pay_abc", "pay_def"]
}Response:
json
{
"success": true,
"data": {
"succeeded": 2,
"failed": 1,
"total": 3,
"results": [
{
"item": {
"id": "pay_xyz",
"status": "queued"
},
"status": "success"
},
{
"item": {
"id": "pay_abc",
"status": "queued"
},
"status": "success"
},
{
"item": {
"id": "pay_def",
"status": "failed"
},
"status": "error",
"error": "Insufficient funds"
}
]
}
}Scheduled Payouts
List Scheduled Payouts
http
GET /api/v1/scheduled-payoutsQuery Parameters:
page(number, optional): Page number (default: 1)pageSize(number, optional): Page size, max 100 (default: 20)status(string, optional): Filter by status (queued,processing,completed,failed)
Response:
json
{
"success": true,
"data": {
"items": [
{
"id": "batch_xyz",
"name": "Weekly Payouts - 2026-02-08",
"payoutCount": 45,
"totalAmount": 2025000,
"status": "queued",
"scheduledFor": "2026-02-08T17:00:00Z",
"createdAt": "2026-02-07T12:00:00Z"
}
],
"total": 12,
"page": 1,
"pageSize": 20
}
}Scheduled Payouts Stats
http
GET /api/v1/scheduled-payouts/statsResponse:
json
{
"success": true,
"data": {
"total": 156,
"byStatus": {
"queued": 45,
"processing": 12,
"completed": 87,
"failed": 12
},
"upcomingTotal": 892500,
"nextScheduled": "2026-02-08T17:00:00Z"
}
}Funding
List Funding Transactions
http
GET /api/v1/funding/transactionsQuery Parameters:
page(number, optional): Page number (default: 1)pageSize(number, optional): Page size, max 100 (default: 50)type(string, optional): Filter by transaction type
Response:
json
{
"success": true,
"data": {
"items": [
{
"id": "txn_abc123",
"type": "credit",
"amount": 1000000,
"balance": 5000000,
"description": "Wallet funding",
"createdAt": "2026-02-08T10:00:00Z"
}
],
"total": 234,
"page": 1,
"pageSize": 50
}
}Get Funding Projection
http
GET /api/v1/funding/projectionResponse:
json
{
"success": true,
"data": {
"currentBalance": 5000000,
"projectedBalance": 3500000,
"projectedOutflow": 1500000,
"dailyProjection": [
{ "date": "2026-02-08", "outflow": 250000 },
{ "date": "2026-02-09", "outflow": 300000 },
{ "date": "2026-02-10", "outflow": 275000 }
]
}
}Top Up Funding
http
POST /api/v1/funding/topupBody:
json
{
"amount": 500000,
"description": "Weekly funding",
"method": "bank_transfer"
}Response:
json
{
"success": true,
"data": {
"transactionId": "txn_xyz",
"amount": 500000,
"balance": 5500000,
"status": "pending",
"createdAt": "2026-02-08T10:00:00Z"
}
}Balance
Get Wallet Balance
http
GET /api/v1/balanceResponse:
json
{
"success": true,
"data": {
"available": 5000000,
"pending": 50000,
"inTransit": 25000,
"currency": "USD"
}
}Analytics
Analytics endpoints provide business intelligence and reporting capabilities for OVN Pay platform.
Configure webhooks to receive real-time updates about payout status changes. All webhook payloads include a signature header for verification:
X-Signature: t={timestamp},v1={signature}Paystream Webhook
http
POST /api/v1/webhooks/paystreamWebhook endpoint for Paystream events. Verifies webhook signatures.
Body:
json
{
"event": "payout.completed",
"timestamp": "2026-02-08T10:00:00Z",
"data": {
"payoutId": "pay_xyz",
"status": "completed",
"amount": 45000
},
"signature": "t=1234567890,v1 signature_here"
}Response:
json
{
"success": true,
"data": {
"message": "Webhook processed"
}
}Webhook Logs
http
GET /api/v1/webhooks/logsQuery Parameters:
page(number, optional): Page number (default: 1)pageSize(number, optional): Page size (default: 50)event(string, optional): Filter by event type
Response:
json
{
"success": true,
"data": {
"items": [
{
"id": "log_abc123",
"event": "payout.completed",
"payload": {},
"processedAt": "2026-02-08T10:00:00Z",
"status": "success"
}
],
"total": 456,
"page": 1,
"pageSize": 50
}
}API Keys (Developer)
List Your API Keys
http
GET /api/v1/developer/keys
Authorization: Bearer your_session_tokenResponse:
json
{
"success": true,
"keys": [
{
"id": "key_abc123",
"name": "Development Key",
"mode": "sandbox",
"prefix": "ovnp_sbox_",
"scopes": ["drivers:read", "payouts:read"],
"approval_status": "approved",
"created_at": "2026-02-15T10:00:00Z",
"is_usable": true
}
]
}Create API Key
http
POST /api/v1/developer/keys
Authorization: Bearer your_session_tokenBody:
json
{
"name": "My Integration Key",
"mode": "sandbox",
"scopes": ["drivers:read", "payouts:read", "payouts:write"],
"expires_in": 90
}For production keys, include an approval reason:
json
{
"name": "ERP Integration",
"mode": "production",
"scopes": ["drivers:read", "payouts:write", "balance:read"],
"approval_reason": "Automated weekly payouts from our ERP system"
}Get Key Details
http
GET /api/v1/developer/keys/:id
Authorization: Bearer your_session_tokenRevoke Key
http
DELETE /api/v1/developer/keys/:id
Authorization: Bearer your_session_tokenRegenerate Key
http
POST /api/v1/developer/keys/:id/regenerate
Authorization: Bearer your_session_tokenList Available Scopes
http
GET /api/v1/developer/scopes
Authorization: Bearer your_session_tokenAPI Keys (Admin)
Admin endpoints for managing all API keys and approving production keys. Requires owner or admin role.
List All API Keys
http
GET /api/v1/admin/api-keys
Authorization: Bearer your_session_tokenQuery Parameters:
page(number, optional): Page number (default: 1)pageSize(number, optional): Page size (default: 20)mode(string, optional): Filter by mode (sandbox,production)status(string, optional): Filter by approval status (pending,approved,rejected)
Response:
json
{
"success": true,
"data": {
"items": [
{
"id": "key_abc123",
"name": "Development Key",
"mode": "sandbox",
"prefix": "ovnp_sbox_",
"scopes": ["drivers:read", "payouts:read"],
"created_by": "developer@example.com",
"approval_status": "approved",
"created_at": "2026-02-15T10:00:00Z",
"expires_at": null,
"last_used_at": "2026-02-18T14:30:00Z",
"is_usable": true
}
],
"total": 15,
"page": 1,
"pageSize": 20
}
}List Pending Approval Keys
Get all production keys awaiting admin approval.
http
GET /api/v1/admin/api-keys/pending
Authorization: Bearer your_session_tokenResponse:
json
{
"success": true,
"keys": [
{
"id": "key_xyz789",
"name": "ERP Integration",
"mode": "production",
"prefix": "ovnp_prod_",
"scopes": ["drivers:read", "payouts:write", "balance:read"],
"created_by": "developer@example.com",
"approval_reason": "Automated weekly payouts from our ERP system",
"approval_status": "pending",
"created_at": "2026-02-18T10:00:00Z"
}
]
}Get Key Details
http
GET /api/v1/admin/api-keys/:id
Authorization: Bearer your_session_tokenResponse:
json
{
"success": true,
"data": {
"id": "key_xyz789",
"name": "ERP Integration",
"mode": "production",
"prefix": "ovnp_prod_",
"scopes": ["drivers:read", "payouts:write", "balance:read"],
"created_by": "developer@example.com",
"approval_reason": "Automated weekly payouts from our ERP system",
"approval_status": "pending",
"approved_by": null,
"approved_at": null,
"created_at": "2026-02-18T10:00:00Z",
"expires_at": null,
"last_used_at": null,
"revoked_at": null,
"is_usable": false
}
}Approve Production Key
Approve a pending production key. The full key is returned once and cannot be retrieved again.
http
POST /api/v1/admin/api-keys/:id/approve
Authorization: Bearer your_session_tokenResponse:
json
{
"success": true,
"id": "key_xyz789",
"name": "ERP Integration",
"mode": "production",
"approval_status": "approved",
"approved_by": "admin@example.com",
"approved_at": "2026-02-18T11:00:00Z",
"key": "ovnp_prod_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"note": "Save this key now. It will not be shown again."
}Reject Production Key
Reject a pending production key.
http
POST /api/v1/admin/api-keys/:id/reject
Authorization: Bearer your_session_tokenBody:
json
{
"reason": "Insufficient justification for production access"
}Response:
json
{
"success": true,
"id": "key_xyz789",
"approval_status": "rejected",
"rejected_at": "2026-02-18T11:00:00Z"
}Revoke Any Key
Admin can revoke any API key (sandbox or production).
http
DELETE /api/v1/admin/api-keys/:id
Authorization: Bearer your_session_tokenResponse:
json
{
"success": true,
"message": "API key revoked successfully"
}Sandbox Utilities
These endpoints are available for sandbox keys to simulate various scenarios.
Reset Sandbox State
Clear all sandbox data and start fresh.
http
POST /api/v1/sandbox/reset
Authorization: Bearer ovnp_sbox_xxxResponse:
json
{
"success": true,
"message": "Sandbox state reset successfully"
}Get Sandbox State
View current sandbox data (drivers, payouts, balance).
http
GET /api/v1/sandbox/state
Authorization: Bearer ovnp_sbox_xxxResponse:
json
{
"success": true,
"data": {
"drivers": [...],
"payouts": [...],
"balance": 1000000
}
}Seed Sandbox Data
Pre-populate sandbox with test data.
http
POST /api/v1/sandbox/seed
Authorization: Bearer ovnp_sbox_xxxResponse:
json
{
"success": true,
"message": "Sandbox seeded with test data",
"data": {
"drivers": 5,
"payouts": 10
}
}Sandbox Scenarios
Control sandbox behavior with the X-Sandbox-Scenario header:
http
POST /api/v1/payouts
Authorization: Bearer ovnp_sbox_xxx
X-Sandbox-Scenario: insufficient_funds
{
"driverId": "drv_test",
"amount": 50000
}Available Scenarios:
| Scenario | Description |
|---|---|
success | Default, operation succeeds |
insufficient_funds | Returns 400, low balance error |
payout_failed | Payout transitions to failed status |
kyc_pending | Driver returns kyc_pending status |
rate_limited | Returns 429 Too Many Requests |
slow_response | Adds 2 second delay |