API Reference
All endpoints are served over HTTPS at https://api.ipto.ai. Request and response bodies use JSON (application/json) unless otherwise noted. Timestamps are ISO 8601 UTC strings.
Base URL
Authentication
Most endpoints require one of the following headers:
| Method | Header |
| Session token | Authorization: Bearer {token} |
| API key | X-API-Key: ipto_{prefix}_{secret} |
See Authentication for details on obtaining tokens and keys.
Endpoint Index
Authentication
| Method | Path | Description | Auth Required |
POST | /v1/auth/signup | Create a new account and tenant | No |
POST | /v1/auth/login | Log in and obtain a session token | No |
POST | /v1/auth/logout | Invalidate the current session | Yes |
Users
| Method | Path | Description | Auth Required |
GET | /v1/me | Get the current user profile | Yes |
POST | /v1/me/password | Change the current user's password | Yes |
Datasets
| Method | Path | Description | Auth Required |
POST | /v1/datasets | Create a new dataset | Yes |
GET | /v1/datasets | List all datasets | Yes |
GET | /v1/datasets/{id} | Get a single dataset | Yes |
PATCH | /v1/datasets/{id} | Update a dataset | Yes |
DELETE | /v1/datasets/{id} | Delete a dataset | Yes |
Objects
| Method | Path | Description | Auth Required |
POST | /v1/datasets/{dataset_id}/objects/upload | Initiate an object upload | Yes |
POST | /v1/objects/{id}/confirm | Confirm a completed upload | Yes |
DELETE | /v1/objects/{id}/upload | Cancel a pending upload | Yes |
GET | /v1/datasets/{dataset_id}/objects | List objects in a dataset | Yes |
GET | /v1/objects/{id} | Get a single object | Yes |
GET | /v1/objects/{id}/download | Get a download URL for an object | Yes |
DELETE | /v1/objects/{id} | Delete an object | Yes |
Admin Review
| Method | Path | Description | Auth Required |
GET | /v1/admin/review/queue | List objects pending review | Yes (Admin) |
GET | /v1/admin/review/objects/{tenant_id}/{object_id} | Get a staged object's detail | Yes (Admin) |
POST | /v1/admin/review/objects/{tenant_id}/{object_id}/approve | Approve a staged object | Yes (Admin) |
POST | /v1/admin/review/objects/{tenant_id}/{object_id}/reject | Reject a staged object | Yes (Admin) |
GET | /v1/admin/review/objects/{tenant_id}/{object_id}/preview | Get a preview URL for a staged object | Yes (Admin) |
API Keys
| Method | Path | Description | Auth Required |
POST | /v1/api-keys | Create a new API key | Yes |
GET | /v1/api-keys | List all API keys | Yes |
GET | /v1/api-keys/{id} | Get a single API key | Yes |
DELETE | /v1/api-keys/{id} | Revoke an API key | Yes |
POST | /v1/api-keys/{id}/grants | Grant dataset access to a key | Yes |
DELETE | /v1/api-keys/{id}/grants/{grant_id} | Revoke a dataset grant | Yes |
Provider
| Method | Path | Description | Auth Required |
GET | /v1/provider/dashboard | Get provider dashboard summary | Yes |
GET | /v1/provider/datasets/{id}/analytics | Get analytics for a dataset | Yes |
GET | /v1/provider/payouts | List payout statements | Yes |
Buyer
| Method | Path | Description | Auth Required |
GET | /v1/buyer/dashboard | Get buyer dashboard summary | Yes |
GET | /v1/agent/activity/searches | List search activity | Yes |
GET | /v1/agent/activity/accesses | List dataset access activity | Yes |
GET | /v1/agent/spend | Get spend summary | Yes |
Health
| Method | Path | Description | Auth Required |
GET | /health | Check API health | No |
Response Envelope
All successful responses are wrapped in a standard envelope:
{
"data": { ... },
"request_id": "req_abc123",
"timestamp": "2026-04-05T10:00:00Z"
}
Error responses use this structure:
{
"error": {
"code": "not_found",
"message": "The requested resource was not found.",
"details": {}
},
"request_id": "req_abc123",
"timestamp": "2026-04-05T10:00:00Z"
}
List endpoints use cursor-based pagination:
| Parameter | Type | Description |
cursor | string | Opaque cursor from a previous response |
limit | integer | Number of results per page (default varies by endpoint) |
Rate Limiting
Requests that exceed rate limits receive a 429 Too Many Requests response with a Retry-After header.