API Reference
339 endpoints · v1.0.0Authorization: Bearer <api_key_or_jwt>. Scopes control access: read, write, schema, files, auth, ai, * (all).{ "success": true|false, "data": ..., "request_id": "..." }. Errors include: { "success": false, "error": { "code": "...", "message": "..." }, "request_id": "..." }.409 Conflict when dependent records exist, instead of silently cascade-deleting. The response includes a DEPENDENCY_EXISTS error with dependency counts and a one-time confirm_token:{ "success": false, "error": { "code": "DEPENDENCY_EXISTS", "message": "Cannot delete: dependent records exist", "dependencies": [{ "type": "objects", "count": 12, "label": "Objects" }], "confirm_token": "abc123..." } }To force cascade-delete, retry the request with
?force=true&confirm_token=<token>. Tokens are single-use and expire after 5 minutes.Public7
Health checks, docs, and landing pages. No authentication required.
/docs
API documentation UI
+
Returns the interactive HTML API documentation.
/health
Health check
+
Returns service status, version, deployment region, and timestamp.
{
"success": true,
"data": {
"status": "...",
"service": "...",
"version": "...",
"timestamp": "...",
"region": "...",
"uptime": "..."
},
"request_id": "..."
}/
Landing page
+
Returns the HTML landing page for the API.
/docs/openapi.json
OpenAPI specification
+
Returns this OpenAPI 3.1 JSON specification.
{}/ready
Readiness probe
+
Lightweight probe for load balancer health checks.
{
"success": true,
"data": {
"status": "ready",
"service": "...",
"timestamp": "..."
},
"request_id": "..."
}/v1/tenant-config
Get tenant config (public)
+
Returns public-facing tenant configuration (branding, auth config). No auth required but tenant must be identifiable.
{
"success": true,
"data": {},
"request_id": "..."
}/v1/tenants/lookup
Lookup tenants by email
+
Find tenants associated with an email address.
{
"email": "..."
}{
"success": true,
"data": [
{
"tenant_id": "...",
"brand_name": "..."
}
],
"request_id": "..."
}Billing1
Stripe billing integration and webhooks.
/webhooks/stripe
Stripe webhook
+
Receives Stripe webhook events. Verified using Stripe-Signature header. Handles checkout.session.completed, customer.subscription.updated, customer.subscription.deleted.
Tenants1
Multi-tenant provisioning, configuration, migration, quota management, and suspension.
/v1/usage
Get tenant usage
Bearer
+
Get tenant usage
{
"success": true,
"data": {
"tenant_id": "...",
"plan_tier": {},
"used_storage_bytes": 0,
"plan_limits": {}
},
"request_id": "..."
}API Keys5
API key lifecycle management — create, revoke, rotate, and update.
/v1/keys
List API keys
Bearer
+
List API keys
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/keys
Create API key
Bearer
+
Create API key
{
"label": "...",
"scopes": [
{}
],
"ip_allowlist": [
"..."
],
"expires_at": null,
"rate_limit": null
}{
"success": true,
"data": {
"key": {},
"token": "..."
},
"request_id": "..."
}/v1/keys/:key_id
Update API key
Bearer
+
Update API key
| Name | In | Type | Description |
|---|---|---|---|
key_id* | path | string |
{
"label": "...",
"scopes": [
{}
],
"ip_allowlist": [
"..."
],
"rate_limit": null
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/keys/:key_id
Revoke API key
Bearer
+
Revoke API key
| Name | In | Type | Description |
|---|---|---|---|
key_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/keys/:key_id/rotate
Rotate API key
Bearer
+
Rotate API key
| Name | In | Type | Description |
|---|---|---|---|
key_id* | path | string |
{
"label": "...",
"scopes": [
{}
]
}{
"success": true,
"data": {
"old_key": {},
"new_key": {},
"token": "..."
},
"request_id": "..."
}Users6
Admin management of tenant auth users.
/v1/users
List users
Bearer
+
List users
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer | |
offset | query | integer | |
search | query | string | |
role | query | string |
{
"success": true,
"data": {
"users": [
null
],
"total": 0
},
"request_id": "..."
}/v1/users
Create user
Bearer
+
Create user
{
"email": "...",
"password": "...",
"phone": "...",
"role": "...",
"email_verified": true,
"user_metadata": {}
}{
"success": true,
"data": null,
"request_id": "..."
}/v1/users/:user_id
Get user
Bearer
+
Get user
| Name | In | Type | Description |
|---|---|---|---|
user_id* | path | string |
{
"success": true,
"data": null,
"request_id": "..."
}/v1/users/:user_id
Update user
Bearer
+
Update user
| Name | In | Type | Description |
|---|---|---|---|
user_id* | path | string |
{
"email": "...",
"phone": "...",
"role": "...",
"banned": true,
"ban_reason": "...",
"email_verified": true,
"user_metadata": {}
}{
"success": true,
"data": null,
"request_id": "..."
}/v1/users/:user_id
Delete user
Bearer
+
Delete user
| Name | In | Type | Description |
|---|---|---|---|
user_id* | path | string | |
force | query | boolean | |
confirm_token | query | string |
{
"success": true,
"data": {
"user_id": "...",
"deleted": true
},
"request_id": "..."
}- 409 — Dependency exists — dependent records must be removed first
/v1/users/:user_id/mfa
List user MFA factors
Bearer
+
List user MFA factors
| Name | In | Type | Description |
|---|---|---|---|
user_id* | path | string |
{
"success": true,
"data": [
null
],
"request_id": "..."
}Auth Config2
Tenant authentication configuration — providers, password policy, branding, templates.
/v1/auth-config
Get auth config
Bearer
+
Get auth config
{
"success": true,
"data": {},
"request_id": "..."
}/v1/auth-config
Update auth config
Bearer
+
Update auth config
{}{
"success": true,
"data": {},
"request_id": "..."
}Webhooks7
Webhook endpoint management — create, test, replay, and configure event subscriptions.
/v1/webhooks
List webhooks
Bearer
+
List webhooks
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/webhooks
Create webhook
Bearer
+
Create webhook
{
"url": "...",
"events": [
"..."
],
"object_types": [
"..."
],
"status": {}
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/webhooks/:webhook_id
Update webhook
Bearer
+
Update webhook
| Name | In | Type | Description |
|---|---|---|---|
webhook_id* | path | string |
{
"url": "...",
"events": [
"..."
],
"status": {}
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/webhooks/:webhook_id
Delete webhook
Bearer
+
Delete webhook
| Name | In | Type | Description |
|---|---|---|---|
webhook_id* | path | string | |
force | query | boolean | |
confirm_token | query | string |
{
"success": true,
"data": {
"deleted": true
},
"request_id": "..."
}- 409 — Dependency exists — dependent records must be removed first
/v1/webhooks/:webhook_id/replay
Replay webhook
Bearer
+
Replay webhook
| Name | In | Type | Description |
|---|---|---|---|
webhook_id* | path | string |
{
"event": "...",
"payload": {}
}{
"success": true,
"data": {
"status_code": 0
},
"request_id": "..."
}/v1/webhooks/:webhook_id/rotate-secret
Rotate webhook secret
Bearer
+
Rotate webhook secret
| Name | In | Type | Description |
|---|---|---|---|
webhook_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/webhooks/:webhook_id/test
Test webhook
Bearer
+
Test webhook
| Name | In | Type | Description |
|---|---|---|---|
webhook_id* | path | string |
{
"success": true,
"data": {
"status_code": 0
},
"request_id": "..."
}Webhook Deliveries2
Webhook delivery logs and retry.
/v1/webhook-deliveries
List webhook deliveries
Bearer
+
List webhook deliveries
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer | |
offset | query | integer |
{
"success": true,
"data": {
"deliveries": [
{}
],
"total": 0
},
"request_id": "..."
}/v1/webhook-deliveries/:delivery_id/retry
Retry webhook delivery
Bearer
+
Retry webhook delivery
| Name | In | Type | Description |
|---|---|---|---|
delivery_id* | path | string |
{
"success": true,
"data": {
"retried": true
},
"request_id": "..."
}Policies4
Row-level security policy management for object types.
/v1/object-types/:object_type_id/policies
List access policies
Bearer
+
List access policies
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string |
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/object-types/:object_type_id/policies
Create access policy
Bearer
+
Create access policy
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string |
{
"name": "...",
"action": "select",
"role": null,
"condition_json": {},
"enabled": true
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/object-types/:object_type_id/policies/:policy_id
Update access policy
Bearer
+
Update access policy
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
policy_id* | path | string |
{
"name": "...",
"action": "...",
"role": null,
"condition_json": {},
"enabled": true
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/object-types/:object_type_id/policies/:policy_id
Delete access policy
Bearer
+
Delete access policy
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
policy_id* | path | string |
{
"success": true,
"data": {
"deleted": true
},
"request_id": "..."
}Analytics2
Tenant and global analytics dashboards.
/v1/analytics
Get tenant analytics
Bearer
+
Get tenant analytics
| Name | In | Type | Description |
|---|---|---|---|
period | query | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/analytics/engine
Analytics engine query
Bearer
+
Analytics engine query
| Name | In | Type | Description |
|---|---|---|---|
period | query | string |
{
"success": true,
"data": {},
"request_id": "..."
}Audit1
Tenant audit log queries.
/v1/audit-logs
List audit logs
Bearer
+
List audit logs
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer | |
offset | query | integer | |
action | query | string | |
resource_type | query | string |
{
"success": true,
"data": {
"logs": [
{}
],
"total": 0
},
"request_id": "..."
}SQL1
Direct SQL query execution against tenant D1 shards.
/v1/sql
Execute SQL query
Bearer
+
Execute SQL query
{
"sql": "...",
"params": [
null
]
}{
"success": true,
"data": {
"columns": [
"..."
],
"rows": [
{}
],
"row_count": 0,
"duration_ms": 0
},
"request_id": "..."
}DLQ3
Dead-letter queue message management.
/v1/dlq/:msg_id
Discard DLQ message
Bearer
+
Discard DLQ message
| Name | In | Type | Description |
|---|---|---|---|
msg_id* | path | string |
{
"success": true,
"data": {
"discarded": true
},
"request_id": "..."
}/v1/dlq
List DLQ messages
Bearer
+
List DLQ messages
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer | |
offset | query | integer |
{
"success": true,
"data": {
"messages": [
{}
],
"total": 0
},
"request_id": "..."
}/v1/dlq/:msg_id/retry
Retry DLQ message
Bearer
+
Retry DLQ message
| Name | In | Type | Description |
|---|---|---|---|
msg_id* | path | string |
{
"success": true,
"data": {
"retried": true
},
"request_id": "..."
}Realtime2
WebSocket connection and channel statistics.
/v1/realtime/stats
Get realtime stats
Bearer
+
Get realtime stats
{
"success": true,
"data": {
"total_connections": 0,
"channels": {},
"channel_count": 0
},
"request_id": "..."
}/v1/realtime
WebSocket upgrade
+
Upgrades to a WebSocket connection for real-time event subscriptions. Uses Durable Objects with WebSocket Hibernation. Channels: objects:<type_id>, files, files:<folder>.
| Name | In | Type | Description |
|---|---|---|---|
token* | query | string | |
tenant_id* | query | string |
- 101 — WebSocket upgrade
- 426 — Not a WebSocket upgrade request
Forms8
Public form builder management.
/v1/forms
List forms
Bearer
+
List forms
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/forms
Create form
Bearer
+
Create form
{
"name": "...",
"object_type_id": "...",
"fields": [
{}
],
"settings": {}
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/forms/:form_id
Update form
Bearer
+
Update form
| Name | In | Type | Description |
|---|---|---|---|
form_id* | path | string |
{
"name": "...",
"fields": [
{}
],
"settings": {},
"status": "active"
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/forms/:form_id
Delete form
Bearer
+
Delete form
| Name | In | Type | Description |
|---|---|---|---|
form_id* | path | string |
{
"success": true,
"data": {
"deleted": true
},
"request_id": "..."
}/v1/forms/:form_id/duplicate
Duplicate form
Bearer
+
Duplicate form
| Name | In | Type | Description |
|---|---|---|---|
form_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/forms/:form_id/submissions/export
Export form submissions
Bearer
+
Export form submissions
| Name | In | Type | Description |
|---|---|---|---|
form_id* | path | string | |
format | query | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/forms/:form_id/analytics
Get form analytics
Bearer
+
Get form analytics
| Name | In | Type | Description |
|---|---|---|---|
form_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/forms/:form_id/submissions
List form submissions
Bearer
+
List form submissions
| Name | In | Type | Description |
|---|---|---|---|
form_id* | path | string | |
limit | query | integer | |
offset | query | integer |
{
"success": true,
"data": {
"submissions": [
{}
],
"total": 0
},
"request_id": "..."
}Automations7
Event-driven automation rule management.
/v1/automations
List automations
Bearer
+
List automations
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/automations
Create automation
Bearer
+
Create automation
{
"name": "...",
"trigger_event": "...",
"conditions": [
{}
],
"actions": [
{}
],
"enabled": true
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/automations/:automation_id
Get automation
Bearer
+
Get automation
| Name | In | Type | Description |
|---|---|---|---|
automation_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/automations/:automation_id
Update automation
Bearer
+
Update automation
| Name | In | Type | Description |
|---|---|---|---|
automation_id* | path | string |
{
"name": "...",
"trigger_event": "...",
"conditions": [
{}
],
"actions": [
{}
],
"enabled": true
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/automations/:automation_id
Delete automation
Bearer
+
Delete automation
| Name | In | Type | Description |
|---|---|---|---|
automation_id* | path | string |
{
"success": true,
"data": {
"deleted": true
},
"request_id": "..."
}/v1/automations/:automation_id/runs
List automation runs
Bearer
+
List automation runs
| Name | In | Type | Description |
|---|---|---|---|
automation_id* | path | string | |
limit | query | integer | |
offset | query | integer |
{
"success": true,
"data": {
"runs": [
{}
],
"total": 0
},
"request_id": "..."
}/v1/automations/:automation_id/trigger
Trigger automation
Bearer
+
Trigger automation
| Name | In | Type | Description |
|---|---|---|---|
automation_id* | path | string |
{
"data": {}
}{
"success": true,
"data": {
"run_id": "..."
},
"request_id": "..."
}Roles9
Role-based access control — create roles, assign permissions, manage user-role assignments.
/v1/roles/:role_id/permissions
Assign permissions to role
Bearer
+
Assign permissions to role
| Name | In | Type | Description |
|---|---|---|---|
role_id* | path | string |
{
"permissions": [
"..."
]
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/roles/assign
Assign role to user
Bearer
+
Assign role to user
{
"user_id": "...",
"role_id": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/roles
List roles
Bearer
+
List roles
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/roles
Create role
Bearer
+
Create role
{
"name": "...",
"description": "...",
"parent_role_id": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/roles/:role_id
Get role
Bearer
+
Get role
| Name | In | Type | Description |
|---|---|---|---|
role_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/roles/:role_id
Update role
Bearer
+
Update role
| Name | In | Type | Description |
|---|---|---|---|
role_id* | path | string |
{
"name": "...",
"description": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/roles/:role_id
Delete role
Bearer
+
Delete role
| Name | In | Type | Description |
|---|---|---|---|
role_id* | path | string |
{
"success": true,
"data": {
"id": "...",
"deleted": true
},
"request_id": "..."
}/v1/users/:user_id/roles
List user roles
Bearer
+
List user roles
| Name | In | Type | Description |
|---|---|---|---|
user_id* | path | string |
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/roles/:role_id/users/:user_id
Remove role from user
Bearer
+
Remove role from user
| Name | In | Type | Description |
|---|---|---|---|
role_id* | path | string | |
user_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}Governance3
Tenant governance settings — security policies, session rules, password requirements, IP allowlists.
/v1/governance
Get governance settings
Bearer
+
Get governance settings
{
"success": true,
"data": {},
"request_id": "..."
}/v1/governance
Update governance settings
Bearer
+
Update governance settings
{
"audit_retention_days": 0,
"session_duration_secs": 0,
"password_min_length": 0,
"ip_allowlist": [
"..."
]
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/policies/simulate
Simulate RLS policy
Bearer
+
Simulate RLS policy
{
"policy": {},
"auth_context": {},
"sample_data": [
{}
]
}{
"success": true,
"data": {},
"request_id": "..."
}Dashboards9
Custom dashboard management with configurable widgets.
/v1/dashboards/public/:share_token
Get public dashboard
+
Access a publicly shared dashboard. No authentication required.
| Name | In | Type | Description |
|---|---|---|---|
share_token* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/dashboards/:dashboard_id/widgets
Add widget to dashboard
Bearer
+
Add widget to dashboard
| Name | In | Type | Description |
|---|---|---|---|
dashboard_id* | path | string |
{
"type": "...",
"title": "...",
"config_json": {},
"position_json": {}
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/dashboards
List dashboards
Bearer
+
List dashboards
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer | |
offset | query | integer |
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/dashboards
Create dashboard
Bearer
+
Create dashboard
{
"name": "...",
"description": "...",
"layout_json": {},
"is_public": true
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/dashboards/:dashboard_id
Get dashboard
Bearer
+
Get dashboard
| Name | In | Type | Description |
|---|---|---|---|
dashboard_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/dashboards/:dashboard_id
Update dashboard
Bearer
+
Update dashboard
| Name | In | Type | Description |
|---|---|---|---|
dashboard_id* | path | string |
{
"name": "...",
"description": "...",
"layout_json": {},
"is_public": true
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/dashboards/:dashboard_id
Delete dashboard
Bearer
+
Delete dashboard
| Name | In | Type | Description |
|---|---|---|---|
dashboard_id* | path | string |
{
"success": true,
"data": {
"id": "...",
"deleted": true
},
"request_id": "..."
}/v1/dashboards/:dashboard_id/widgets/:widget_id
Update widget
Bearer
+
Update widget
| Name | In | Type | Description |
|---|---|---|---|
dashboard_id* | path | string | |
widget_id* | path | string |
{
"type": "...",
"title": "...",
"config_json": {},
"position_json": {}
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/dashboards/:dashboard_id/widgets/:widget_id
Delete widget
Bearer
+
Delete widget
| Name | In | Type | Description |
|---|---|---|---|
dashboard_id* | path | string | |
widget_id* | path | string |
{
"success": true,
"data": {
"id": "...",
"deleted": true
},
"request_id": "..."
}Scheduled Jobs6
Scheduled job management — cron-based or one-time execution tasks.
/v1/scheduled-jobs
List scheduled jobs
Bearer
+
List scheduled jobs
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer | |
offset | query | integer |
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/scheduled-jobs
Create scheduled job
Bearer
+
Create scheduled job
{
"name": "...",
"description": "...",
"cron_expression": "...",
"run_at": "...",
"action_type": "...",
"action_config": {},
"enabled": true
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/scheduled-jobs/:job_id
Get scheduled job
Bearer
+
Get scheduled job
| Name | In | Type | Description |
|---|---|---|---|
job_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/scheduled-jobs/:job_id
Update scheduled job
Bearer
+
Update scheduled job
| Name | In | Type | Description |
|---|---|---|---|
job_id* | path | string |
{
"name": "...",
"description": "...",
"cron_expression": "...",
"action_type": "...",
"action_config": {},
"enabled": true
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/scheduled-jobs/:job_id
Delete scheduled job
Bearer
+
Delete scheduled job
| Name | In | Type | Description |
|---|---|---|---|
job_id* | path | string |
{
"success": true,
"data": {
"id": "...",
"deleted": true
},
"request_id": "..."
}/v1/scheduled-jobs/:job_id/execute
Execute scheduled job
Bearer
+
Execute scheduled job
| Name | In | Type | Description |
|---|---|---|---|
job_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}Saved Reports7
Saved report definitions with scheduling and export capabilities.
/v1/saved-reports
List saved reports
Bearer
+
List saved reports
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer | |
offset | query | integer |
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/saved-reports
Create saved report
Bearer
+
Create saved report
{
"name": "...",
"description": "...",
"type": "...",
"config_json": {},
"schedule": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/saved-reports/:report_id
Get saved report
Bearer
+
Get saved report
| Name | In | Type | Description |
|---|---|---|---|
report_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/saved-reports/:report_id
Update saved report
Bearer
+
Update saved report
| Name | In | Type | Description |
|---|---|---|---|
report_id* | path | string |
{
"name": "...",
"description": "...",
"config_json": {},
"schedule": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/saved-reports/:report_id
Delete saved report
Bearer
+
Delete saved report
| Name | In | Type | Description |
|---|---|---|---|
report_id* | path | string |
{
"success": true,
"data": {
"id": "...",
"deleted": true
},
"request_id": "..."
}/v1/saved-reports/:report_id/export
Export saved report
Bearer
+
Export saved report
| Name | In | Type | Description |
|---|---|---|---|
report_id* | path | string | |
format | query | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/saved-reports/:report_id/run
Run saved report
Bearer
+
Run saved report
| Name | In | Type | Description |
|---|---|---|---|
report_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}Integrations7
Third-party integration management with sync capabilities.
/v1/integrations
List integrations
Bearer
+
List integrations
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/integrations
Create integration
Bearer
+
Create integration
{
"provider": "...",
"name": "...",
"config_json": {},
"sync_direction": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/integrations/:integration_id
Get integration
Bearer
+
Get integration
| Name | In | Type | Description |
|---|---|---|---|
integration_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/integrations/:integration_id
Update integration
Bearer
+
Update integration
| Name | In | Type | Description |
|---|---|---|---|
integration_id* | path | string |
{
"name": "...",
"config_json": {},
"status": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/integrations/:integration_id
Delete integration
Bearer
+
Delete integration
| Name | In | Type | Description |
|---|---|---|---|
integration_id* | path | string |
{
"success": true,
"data": {
"id": "...",
"deleted": true
},
"request_id": "..."
}/v1/integrations/:integration_id/logs
List sync logs
Bearer
+
List sync logs
| Name | In | Type | Description |
|---|---|---|---|
integration_id* | path | string | |
limit | query | integer | |
offset | query | integer |
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/integrations/:integration_id/sync
Sync integration
Bearer
+
Sync integration
| Name | In | Type | Description |
|---|---|---|---|
integration_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}Plugins12
Plugin and custom function management — install, configure, execute.
/v1/functions
List custom functions
Bearer
+
List custom functions
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/functions
Create custom function
Bearer
+
Create custom function
{
"name": "...",
"description": "...",
"trigger_type": "...",
"code": "...",
"runtime": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/functions/:function_id
Get function
Bearer
+
Get function
| Name | In | Type | Description |
|---|---|---|---|
function_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/functions/:function_id
Update function
Bearer
+
Update function
| Name | In | Type | Description |
|---|---|---|---|
function_id* | path | string |
{
"name": "...",
"code": "...",
"enabled": true
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/functions/:function_id
Delete function
Bearer
+
Delete function
| Name | In | Type | Description |
|---|---|---|---|
function_id* | path | string |
{
"success": true,
"data": {
"id": "...",
"deleted": true
},
"request_id": "..."
}/v1/functions/:function_id/execute
Execute function
Bearer
+
Execute function
| Name | In | Type | Description |
|---|---|---|---|
function_id* | path | string |
{
"input": {}
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/plugins/:plugin_id
Get plugin
Bearer
+
Get plugin
| Name | In | Type | Description |
|---|---|---|---|
plugin_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/plugins/:plugin_id
Update plugin
Bearer
+
Update plugin
| Name | In | Type | Description |
|---|---|---|---|
plugin_id* | path | string |
{
"name": "...",
"config_json": {},
"enabled": true
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/plugins/:plugin_id
Uninstall plugin
Bearer
+
Uninstall plugin
| Name | In | Type | Description |
|---|---|---|---|
plugin_id* | path | string |
{
"success": true,
"data": {
"id": "...",
"deleted": true
},
"request_id": "..."
}/v1/plugins
List plugins
Bearer
+
List plugins
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/plugins
Install plugin
Bearer
+
Install plugin
{
"name": "...",
"version": "...",
"manifest_json": {},
"config_json": {},
"enabled": true
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/functions/:function_id/logs
List function logs
Bearer
+
List function logs
| Name | In | Type | Description |
|---|---|---|---|
function_id* | path | string | |
limit | query | integer | |
offset | query | integer |
{
"success": true,
"data": [
{}
],
"request_id": "..."
}Branding2
Tenant branding customization — logos, colors, domain, CSS.
/v1/branding
Get branding settings
Bearer
+
Get branding settings
{
"success": true,
"data": {},
"request_id": "..."
}/v1/branding
Update branding
Bearer
+
Update branding
{
"custom_domain": "...",
"logo_url": "...",
"favicon_url": "...",
"primary_color": "...",
"brand_name": "...",
"footer_text": "...",
"custom_css": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}AI Providers6
AI provider configuration and usage monitoring.
/v1/ai-providers
List AI providers
Bearer
+
List AI providers
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/ai-providers
Create AI provider
Bearer
+
Create AI provider
{
"name": "...",
"provider_type": "...",
"api_key": "...",
"config_json": {}
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/ai-providers/:provider_id
Get AI provider
Bearer
+
Get AI provider
| Name | In | Type | Description |
|---|---|---|---|
provider_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/ai-providers/:provider_id
Update AI provider
Bearer
+
Update AI provider
| Name | In | Type | Description |
|---|---|---|---|
provider_id* | path | string |
{
"name": "...",
"api_key": "...",
"config_json": {}
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/ai-providers/:provider_id
Delete AI provider
Bearer
+
Delete AI provider
| Name | In | Type | Description |
|---|---|---|---|
provider_id* | path | string |
{
"success": true,
"data": {
"id": "...",
"deleted": true
},
"request_id": "..."
}/v1/ai-usage
Get AI usage stats
Bearer
+
Get AI usage stats
{
"success": true,
"data": {},
"request_id": "..."
}Object Types5
Define your data schema. Object types are like database tables.
/v1/object-types
List object types
Bearer
+
List all object types for the authenticated tenant.
{
"success": true,
"data": [
{
"id": "ot_abc123",
"tenant_id": "tn_xyz789",
"name": "contacts",
"display_name": "Contacts",
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-15T12:00:00Z"
}
],
"request_id": "req_abc123"
}/v1/object-types
Create object type
schemaBearer
+
Create a new object type (schema). Requires "schema" scope.
{
"name": "contacts"
}{
"success": true,
"data": {
"id": "ot_abc123",
"tenant_id": "tn_xyz789",
"name": "contacts",
"display_name": "Contacts",
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-15T12:00:00Z"
},
"request_id": "req_abc123"
}/v1/object-types/:object_type_id
Get object type
Bearer
+
Get a single object type by ID.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string |
{
"success": true,
"data": {
"id": "ot_abc123",
"tenant_id": "tn_xyz789",
"name": "contacts",
"display_name": "Contacts",
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-15T12:00:00Z"
},
"request_id": "req_abc123"
}/v1/object-types/:object_type_id
Update object type
schemaBearer
+
Rename an object type. Requires "schema" scope.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string |
{
"name": "customers"
}{
"success": true,
"data": {
"id": "ot_abc123",
"tenant_id": "tn_xyz789",
"name": "contacts",
"display_name": "Contacts",
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-15T12:00:00Z"
},
"request_id": "req_abc123"
}/v1/object-types/:object_type_id
Delete object type
Bearer
+
Permanently deletes the object type, all its properties, objects, and associated data. This is destructive and cannot be undone.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
force | query | string | |
confirm_token | query | string |
{
"success": true,
"data": {
"deleted": true
},
"request_id": "req_abc123"
}Properties4
Typed fields on object types — 22 data types with indexing and validation.
/v1/object-types/:object_type_id/properties
List properties
Bearer
+
List all properties defined on an object type.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string |
{
"success": true,
"data": [
{
"id": "prop_abc123",
"object_type_id": "ot_abc123",
"name": "email",
"data_type": "email",
"is_indexed": false,
"is_sortable": false,
"is_unique": false,
"is_required": false,
"enum_values": null,
"description": "Contact email address",
"created_at": "2026-01-01T00:00:00Z"
}
],
"request_id": "req_abc123"
}/v1/object-types/:object_type_id/properties
Create property
schemaBearer
+
Add a typed field to an object type. Requires "schema" scope.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string |
{
"name": "email",
"data_type": "string",
"is_indexed": false,
"is_sortable": false,
"is_unique": false,
"is_required": false,
"default_value": null,
"enum_values": [
"..."
],
"description": "..."
}{
"success": true,
"data": {
"id": "prop_abc123",
"object_type_id": "ot_abc123",
"name": "email",
"data_type": "email",
"is_indexed": false,
"is_sortable": false,
"is_unique": false,
"is_required": false,
"default_value": null,
"enum_values": null,
"description": "Contact email address",
"created_at": "2026-01-01T00:00:00Z"
},
"request_id": "req_abc123"
}/v1/object-types/:object_type_id/properties/:property_id
Update property
Bearer
+
Update property settings. Name and data_type cannot be changed.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
property_id* | path | string |
{
"is_indexed": true,
"is_sortable": true,
"is_unique": true,
"is_required": true,
"default_value": null,
"description": "..."
}{
"success": true,
"data": {
"id": "prop_abc123",
"object_type_id": "ot_abc123",
"name": "email",
"data_type": "email",
"is_indexed": false,
"is_sortable": false,
"is_unique": false,
"is_required": false,
"default_value": null,
"enum_values": null,
"description": "Contact email address",
"created_at": "2026-01-01T00:00:00Z"
},
"request_id": "req_abc123"
}/v1/object-types/:object_type_id/properties/:property_id
Delete property
Bearer
+
Delete a property from an object type. Existing values become untyped.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
property_id* | path | string |
{
"success": true,
"data": {
"deleted": true
},
"request_id": "req_abc123"
}Objects10
CRUD on data records with versioning, batch operations, and soft-delete/restore.
/v1/objects/:object_type_id/batch/create
Batch create objects
writeBearer
+
Create up to 100 objects in a single request. Requires "write" scope.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string |
{
"objects": [
{
"properties": {
"name": "Acme Corp",
"email": "info@acme.com"
}
}
]
}{
"success": true,
"data": {
"created": 0,
"ids": [
"..."
]
},
"request_id": "req_abc123"
}/v1/objects/:object_type_id
Create object
writeBearer
+
Create a new object of the given type. Requires "write" scope.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string |
{
"properties": {
"name": "Acme Corp",
"email": "info@acme.com"
}
}{
"success": true,
"data": {
"id": "obj_abc123",
"object_type_id": "ot_abc123",
"tenant_id": "tn_xyz789",
"properties": {
"name": "Acme Corp",
"email": "info@acme.com"
},
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-15T12:00:00Z",
"created_by": "usr_abc123",
"version": 1,
"is_deleted": false
},
"request_id": "req_abc123"
}/v1/objects/:object_type_id/:object_id
Get object
Bearer
+
Retrieve a single object by type and ID.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
object_id* | path | string |
{
"success": true,
"data": {
"id": "obj_abc123",
"object_type_id": "ot_abc123",
"tenant_id": "tn_xyz789",
"properties": {
"name": "Acme Corp",
"email": "info@acme.com"
},
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-15T12:00:00Z",
"created_by": "usr_abc123",
"version": 1,
"is_deleted": false
},
"request_id": "req_abc123"
}/v1/objects/:object_type_id/:object_id
Update object
writeBearer
+
Update properties on an existing object. Requires "write" scope.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
object_id* | path | string |
{
"properties": {
"name": "Updated Name"
}
}{
"success": true,
"data": {
"id": "obj_abc123",
"object_type_id": "ot_abc123",
"tenant_id": "tn_xyz789",
"properties": {
"name": "Acme Corp",
"email": "info@acme.com"
},
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-15T12:00:00Z",
"created_by": "usr_abc123",
"version": 1,
"is_deleted": false
},
"request_id": "req_abc123"
}/v1/objects/:object_type_id/:object_id
Delete object
Bearer
+
Soft-delete an object (moves to trash). Use force=true for permanent deletion.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
object_id* | path | string | |
force | query | string | |
confirm_token | query | string |
{
"success": true,
"data": {
"id": "...",
"deleted": true
},
"request_id": "req_abc123"
}/v1/objects/:object_type_id/list
List objects
Bearer
+
List objects of a given type with pagination, filtering, and sorting.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
limit | query | integer | Default: 20 |
cursor | query | string | |
sort | query | string | |
order | query | string |
{
"success": true,
"data": {
"results": [
{
"id": "...",
"object_type_id": "...",
"tenant_id": "...",
"properties": "...",
"created_at": "...",
"updated_at": "...",
"created_by": "...",
"version": "...",
"is_deleted": "..."
}
],
"next_cursor": "eyJpZCI6...",
"total": 42
},
"request_id": "req_abc123"
}/v1/objects/:object_type_id/batch/read
Batch read objects
Bearer
+
Retrieve multiple objects by ID in a single request. Max 100 IDs.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string |
{
"object_ids": [
"..."
]
}{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/objects/:object_type_id/batch/update
Batch update objects
Bearer
+
Update multiple objects in a single request. Max 100 items.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string |
{
"updates": [
{
"object_id": "...",
"properties": {}
}
]
}{
"success": true,
"data": [
{
"object_id": "...",
"version": 0
}
],
"request_id": "..."
}/v1/objects/:object_type_id/trash
List trashed objects
Bearer
+
List soft-deleted objects that can be restored.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
limit | query | integer | |
cursor | query | string |
{
"success": true,
"data": {
"results": [
{}
],
"next_cursor": null,
"total": 0
},
"request_id": "..."
}/v1/objects/:object_type_id/:object_id/restore
Restore deleted object
Bearer
+
Restore a soft-deleted object from trash.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
object_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}Search2
Property-based filtering, full-text search, and aggregation.
/v1/objects/:object_type_id/search
Search objects
readBearer
+
Filter and search objects with complex queries. Requires "read" scope.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string |
{
"filters": [
{}
],
"sort": "...",
"order": "asc",
"limit": 0,
"cursor": "...",
"query": "..."
}{
"success": true,
"data": {
"results": [
{
"id": "...",
"object_type_id": "...",
"tenant_id": "...",
"properties": "...",
"created_at": "...",
"updated_at": "...",
"created_by": "...",
"version": "...",
"is_deleted": "..."
}
],
"next_cursor": "eyJpZCI6...",
"total": 42
},
"request_id": "req_abc123"
}/v1/objects/:object_type_id/aggregate
Aggregate objects
Bearer
+
Run aggregate queries (count, sum, avg, min, max) on object properties with optional filtering and grouping.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string |
{
"aggregations": [
{
"function": "count",
"property_id": "...",
"alias": "..."
}
],
"filters": [
{}
],
"group_by": [
"..."
]
}{
"success": true,
"data": {
"results": [
{}
]
},
"request_id": "..."
}Views4
Saved filter/sort/column presets for object types.
/v1/object-types/:object_type_id/views
List saved views
Bearer
+
List saved views (filter presets) for an object type.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string |
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/object-types/:object_type_id/views
Create saved view
Bearer
+
Create a saved view with filters, sort, and column configuration.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string |
{
"name": "...",
"filters": [
{}
],
"sort": {},
"columns": [
"..."
]
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/object-types/:object_type_id/views/:view_id
Update saved view
Bearer
+
Update an existing saved view.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
view_id* | path | string |
{
"name": "...",
"filters": [
{}
],
"sort": {},
"columns": [
"..."
]
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/object-types/:object_type_id/views/:view_id
Delete saved view
Bearer
+
Delete a saved view.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
view_id* | path | string |
{
"success": true,
"data": {
"deleted": true
},
"request_id": "..."
}Associations3
Typed relationships between objects across types.
/v1/objects/:from_type/:from_id/associations/:association_type/:to_type/:to_id
Create or update association
Bearer
+
Create or replace an association between two objects. Optionally include a meta object (max 10KB).
| Name | In | Type | Description |
|---|---|---|---|
from_type* | path | string | |
from_id* | path | string | |
association_type* | path | string | |
to_type* | path | string | |
to_id* | path | string |
{
"meta": {}
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/objects/:from_type/:from_id/associations/:association_type/:to_type/:to_id
Delete association
Bearer
+
Remove an association between two objects.
| Name | In | Type | Description |
|---|---|---|---|
from_type* | path | string | |
from_id* | path | string | |
association_type* | path | string | |
to_type* | path | string | |
to_id* | path | string |
{
"success": true,
"data": {
"deleted": true
},
"request_id": "..."
}/v1/objects/:type/:id/associations
List associations
Bearer
+
List associations for an object, optionally filtering by type and direction.
| Name | In | Type | Description |
|---|---|---|---|
type* | path | string | |
id* | path | string | |
direction | query | string | |
association_type | query | string | |
limit | query | integer | |
cursor | query | string |
{
"success": true,
"data": {
"results": [
{}
],
"next_cursor": null,
"total": 0
},
"request_id": "..."
}Files20
File storage on Cloudflare R2 with variants, signed URLs, versioning, and batch ops.
/v1/files/batch/delete
Batch delete files
Bearer
+
Delete multiple files in a single request. Max 100.
{
"file_ids": [
"..."
]
}{
"success": true,
"data": {
"deleted": [
"..."
],
"count": 0
},
"request_id": "..."
}/v1/files/batch/read
Batch read file metadata
Bearer
+
Retrieve metadata for multiple files by ID. Max 100.
{
"file_ids": [
"..."
]
}{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/files/batch/update
Batch update file metadata
Bearer
+
Update access or folder for multiple files. Max 100.
{
"file_ids": [
"..."
],
"access": {},
"folder": "..."
}{
"success": true,
"data": {
"updated": 0
},
"request_id": "..."
}/v1/files/:file_id/upload-complete
Confirm presigned upload
Bearer
+
Marks a presigned upload as complete. Status changes from "pending" to "ready".
| Name | In | Type | Description |
|---|---|---|---|
file_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/files/:file_id/signed-url
Generate signed URL
Bearer
+
Creates a time-limited, HMAC-signed URL for accessing private files without authentication.
| Name | In | Type | Description |
|---|---|---|---|
file_id* | path | string |
{
"expires_in": 0
}{
"success": true,
"data": {
"url": "...",
"expires_at": "...",
"ttl": 0
},
"request_id": "..."
}/v1/files/:file_id
Get file metadata
Bearer
+
Get metadata for a single file.
| Name | In | Type | Description |
|---|---|---|---|
file_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/files/:file_id
Update file metadata
Bearer
+
Update filename, access level, folder, meta, or linked object. Triggers file.updated webhook.
| Name | In | Type | Description |
|---|---|---|---|
file_id* | path | string |
{
"filename": "...",
"access": {},
"folder": "...",
"meta": {},
"object_type_id": null,
"object_id": null
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/files/:file_id
Delete file
Bearer
+
Soft-delete a file. R2 object is cleaned up asynchronously. Triggers file.deleted webhook.
| Name | In | Type | Description |
|---|---|---|---|
file_id* | path | string |
{
"success": true,
"data": {
"file_id": "...",
"deleted": true
},
"request_id": "..."
}/v1/files/:file_id/content
Download file content
Bearer
+
Returns raw binary content. Also accessible via signed URLs without Bearer auth when token/expires/t query params are present.
| Name | In | Type | Description |
|---|---|---|---|
file_id* | path | string | |
token | query | string | |
expires | query | number | |
t | query | string |
/v1/files/:file_id/variants/:variant
Get image variant
Bearer
+
On-the-fly image transformation. Only for image files. Results are cached.
| Name | In | Type | Description |
|---|---|---|---|
file_id* | path | string | |
variant* | path | string | |
w | query | integer | |
h | query | integer | |
fit | query | string | |
format | query | string |
/v1/files/stats
Storage statistics
Bearer
+
Get file storage usage and quota information.
{
"success": true,
"data": {},
"request_id": "..."
}/v1/files/upload-url
Get presigned upload URL
Bearer
+
Returns a presigned URL for direct client-side upload to R2, bypassing the Worker size limit.
{
"filename": "...",
"mime_type": "...",
"size_bytes": 0,
"access": {},
"folder": "...",
"meta": {}
}{
"success": true,
"data": {
"file_id": "...",
"r2_key": "...",
"upload_endpoint": "...",
"expires_at": "..."
},
"request_id": "..."
}/v1/files/trash
List trashed files
Bearer
+
List soft-deleted files that can be restored.
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer | |
cursor | query | string |
{
"success": true,
"data": {
"results": [
{}
],
"next_cursor": null,
"total": 0
},
"request_id": "..."
}/v1/files/:file_id/versions
List file versions
Bearer
+
Get the version history for a file.
| Name | In | Type | Description |
|---|---|---|---|
file_id* | path | string |
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/files/folders
List folders
Bearer
+
List all file folders with counts and sizes.
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer | |
offset | query | integer |
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/files/:file_id/restore
Restore deleted file
Bearer
+
Restore a soft-deleted file from trash.
| Name | In | Type | Description |
|---|---|---|---|
file_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/files/search
Search files
Bearer
+
Filter files by MIME type, access level, folder, filename, date range, and linked objects.
{
"mime_type": "...",
"mime_category": "...",
"access": {},
"status": {},
"folder": "...",
"filename": "...",
"object_type_id": "...",
"object_id": "...",
"created_after": "...",
"created_before": "...",
"sort": "size_bytes",
"sort_dir": {},
"limit": 0,
"cursor": null
}{
"success": true,
"data": {
"results": [
{}
],
"next_cursor": null,
"total": 0
},
"request_id": "..."
}/v1/files/:file_id/stale-cleanup
Clean stale uploads
Bearer
+
Remove pending files older than 24 hours that were never completed.
| Name | In | Type | Description |
|---|---|---|---|
file_id* | path | string |
{
"success": true,
"data": {
"cleaned": 0
},
"request_id": "..."
}/v1/files/upload
Upload file
Bearer
+
Direct multipart upload. Max 25MB per file. For larger files, use the presigned URL flow.
{
"success": true,
"data": {},
"request_id": "..."
}/v1/files/:file_id/upload-put
Upload file content to presigned slot
Bearer
+
Upload raw file content for a presigned upload slot.
| Name | In | Type | Description |
|---|---|---|---|
file_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}Events4
Custom event tracking for analytics and automation.
/events/stream
Server-sent events stream
Bearer
+
Real-time SSE stream of object and file events.
/events/types
List available event types
Bearer
+
List available event types
{
"success": true,
"data": [
"..."
],
"request_id": "..."
}/v1/events
Track custom event
Bearer
+
Track a custom event for analytics and automation triggers.
{
"event_type": "...",
"data": {}
}{
"success": true,
"data": {
"tracked": true
},
"request_id": "..."
}/v1/events/list
List custom events
Bearer
+
List custom events
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer | |
offset | query | integer |
{
"success": true,
"data": {
"events": [
{}
],
"total": 0
},
"request_id": "..."
}Errors1
Client-side error reporting.
/v1/errors/report
Report client error
Bearer
+
Report a client-side error for tracking and alerting.
{
"message": "...",
"stack": "...",
"source": "...",
"level": "error",
"path": "...",
"metadata": {}
}{
"success": true,
"data": {
"error_id": "..."
},
"request_id": "..."
}Versions1
Object version history.
/v1/objects/:object_type_id/:object_id/versions
List object version history
Bearer
+
Returns all previous versions of an object, newest first.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
object_id* | path | string | |
limit | query | integer |
{
"success": true,
"data": [
{}
],
"request_id": "..."
}Import / Export3
Bulk data import (CSV/JSON) and async export.
/v1/data/export/:export_id
Download export
Bearer
+
Download the exported data file.
| Name | In | Type | Description |
|---|---|---|---|
export_id* | path | string |
"..."
/v1/data/import
Import data
Bearer
+
Bulk import up to 10,000 rows from CSV, JSON file, or inline JSON body.
{
"object_type_id": "...",
"format": "json",
"data": [
{}
]
}{
"success": true,
"data": {
"imported": 0,
"errors": [
{}
],
"total": 0
},
"request_id": "..."
}/v1/data/export
Start data export
Bearer
+
Initiate an async export of all objects of a type. Max 100,000 records.
{
"object_type_id": "...",
"format": "json"
}{
"success": true,
"data": {
"export_id": "...",
"format": "...",
"record_count": 0,
"download_path": "..."
},
"request_id": "..."
}Comments4
Activity feed comments on objects.
/v1/objects/:object_type_id/:object_id/comments
List comments
Bearer
+
List comments on an object, newest first.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
object_id* | path | string | |
limit | query | integer | |
cursor | query | string |
{
"success": true,
"data": {
"results": [
{}
],
"next_cursor": null,
"total": 0
},
"request_id": "..."
}/v1/objects/:object_type_id/:object_id/comments
Create comment
Bearer
+
Add a comment to an object (activity feed). Requires authenticated user.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
object_id* | path | string |
{
"body": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/objects/:object_type_id/:object_id/comments/:comment_id
Update comment
Bearer
+
Edit a comment. Only the author can edit their own comments.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
object_id* | path | string | |
comment_id* | path | string |
{
"body": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/objects/:object_type_id/:object_id/comments/:comment_id
Delete comment
Bearer
+
Delete a comment. Only the author can delete their own comments.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
object_id* | path | string | |
comment_id* | path | string |
{
"success": true,
"data": {
"deleted": true
},
"request_id": "..."
}Workflows8
Object approval workflow operations — submit, approve, reject.
/v1/objects/:object_type_id/:object_id/approve
Approve object
Bearer
+
Approve an object in the current workflow stage.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
object_id* | path | string |
{
"comment": "..."
}{
"success": true,
"data": {
"approved": true,
"stage": "..."
},
"request_id": "..."
}/v1/objects/:object_type_id/:object_id/workflow-status
Get workflow status
Bearer
+
Get the current approval workflow status for an object.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
object_id* | path | string |
{
"success": true,
"data": {
"status": "...",
"stage": "...",
"history": [
{}
]
},
"request_id": "..."
}/v1/objects/:object_type_id/:object_id/reject
Reject object
Bearer
+
Reject an object in the current workflow stage.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
object_id* | path | string |
{
"reason": "..."
}{
"success": true,
"data": {
"rejected": true,
"stage": "..."
},
"request_id": "..."
}/v1/objects/:object_type_id/:object_id/submit-for-review
Submit for review
Bearer
+
Submit an object for approval workflow review.
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
object_id* | path | string |
{
"success": true,
"data": {
"submitted": true,
"stage": "..."
},
"request_id": "..."
}/v1/object-types/:object_type_id/workflows
List workflows
Bearer
+
List workflows
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string |
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/object-types/:object_type_id/workflows
Create workflow
Bearer
+
Create workflow
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string |
{
"name": "...",
"stages": [
{}
],
"enabled": true
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/object-types/:object_type_id/workflows/:workflow_id
Update workflow
Bearer
+
Update workflow
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
workflow_id* | path | string |
{
"name": "...",
"stages": [
{}
],
"enabled": true
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/object-types/:object_type_id/workflows/:workflow_id
Delete workflow
Bearer
+
Delete workflow
| Name | In | Type | Description |
|---|---|---|---|
object_type_id* | path | string | |
workflow_id* | path | string | |
force | query | boolean | |
confirm_token | query | string |
{
"success": true,
"data": {
"deleted": true
},
"request_id": "..."
}- 409 — Dependency exists — dependent records must be removed first
Reports4
Pipeline, time series, leaderboard, and funnel reports.
/v1/reports/funnel
Funnel report
Bearer
+
Generate a multi-step funnel conversion report.
{
"object_type_id": "...",
"steps": [
{
"name": "...",
"filters": [
"..."
]
}
]
}{
"success": true,
"data": {
"steps": [
{}
]
},
"request_id": "..."
}/v1/reports/leaderboard
Leaderboard report
Bearer
+
Generate a ranked leaderboard by a property value.
{
"object_type_id": "...",
"group_by": "...",
"aggregation": "count",
"value_property": "...",
"limit": 0,
"filters": [
{}
]
}{
"success": true,
"data": {
"entries": [
{}
]
},
"request_id": "..."
}/v1/reports/pipeline
Pipeline report
Bearer
+
Generate a pipeline/funnel stage breakdown report.
{
"object_type_id": "...",
"stage_property": "...",
"filters": [
{}
]
}{
"success": true,
"data": {
"stages": [
{}
]
},
"request_id": "..."
}/v1/reports/timeseries
Time series report
Bearer
+
Generate a time series report with configurable intervals.
{
"object_type_id": "...",
"date_property": "...",
"interval": "hour",
"aggregation": "count",
"value_property": "...",
"filters": [
{}
],
"start_date": "...",
"end_date": "..."
}{
"success": true,
"data": {
"series": [
{}
]
},
"request_id": "..."
}Email1
Transactional email sending through configured providers.
/v1/email/send
Send email
Bearer
+
Send a transactional email using the tenant's configured email provider.
{
"to": "...",
"subject": "...",
"html": "...",
"text": "...",
"from": "...",
"reply_to": "..."
}{
"success": true,
"data": {
"sent": true,
"message_id": "..."
},
"request_id": "..."
}AI16
Cloudflare Workers AI — chat, generation, embeddings, vector search, moderation, image description.
/v1/ai/auto-tag
Auto-tag content
Bearer
+
Automatically generate tags for an object based on its properties.
{
"object_type_id": "...",
"object_id": "..."
}{
"success": true,
"data": {
"tags": [
"..."
]
},
"request_id": "..."
}/v1/ai/chat
Chat completion
Bearer
+
Generate a chat response with optional conversation history. Max 20 history messages, 50KB combined.
{
"message": "...",
"history": [
{
"role": "user",
"content": "..."
}
],
"model": "..."
}{
"success": true,
"data": {
"response": "...",
"model": "..."
},
"request_id": "..."
}/v1/ai/conversations/:conversation_id/chat
Chat with conversation history
Bearer
+
Chat with conversation history
| Name | In | Type | Description |
|---|---|---|---|
conversation_id* | path | string |
{
"message": "...",
"model": "..."
}{
"success": true,
"data": {
"response": "...",
"model": "..."
},
"request_id": "..."
}/v1/ai/describe
Describe image
Bearer
+
Generate a text description of an image file stored in R2. Supports JPEG, PNG, WebP, GIF (max 10MB).
{
"file_id": "...",
"model": "..."
}{
"success": true,
"data": {
"description": "...",
"filename": "...",
"model": "..."
},
"request_id": "..."
}/v1/ai/generate
Text generation
Bearer
+
Generate text from a prompt.
{
"prompt": "...",
"model": "...",
"max_tokens": 0
}{
"success": true,
"data": {
"text": "...",
"model": "..."
},
"request_id": "..."
}/v1/ai/index
Index objects for vector search
Bearer
+
Generate embeddings for objects and insert them into the Vectorize index. Max 100 per request.
{
"object_type_id": "...",
"object_ids": [
"..."
]
}{
"success": true,
"data": {
"indexed": 0,
"model": "...",
"object_type_id": "..."
},
"request_id": "..."
}/v1/ai/moderate
Content moderation
Bearer
+
Classify text content for policy violations.
{
"text": "..."
}{
"success": true,
"data": {
"results": [
{}
],
"model": "..."
},
"request_id": "..."
}/v1/ai/summarise
Summarise content
Bearer
+
Generate a summary of an object's text content.
{
"object_type_id": "...",
"object_id": "...",
"max_length": 0
}{
"success": true,
"data": {
"summary": "..."
},
"request_id": "..."
}/v1/ai/search
Vector similarity search
Bearer
+
Search the Vectorize index for objects semantically similar to the query.
{
"query": "...",
"limit": 0,
"object_type_id": "..."
}{
"success": true,
"data": {
"results": [
{}
],
"model": "...",
"dimensions": 0
},
"request_id": "..."
}/v1/ai/conversations
List AI conversations
Bearer
+
List AI conversations
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer | |
offset | query | integer |
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/ai/conversations
Create AI conversation
Bearer
+
Create AI conversation
{
"title": "...",
"model": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/ai/conversations/:conversation_id
Get AI conversation
Bearer
+
Get AI conversation
| Name | In | Type | Description |
|---|---|---|---|
conversation_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/ai/conversations/:conversation_id
Update AI conversation
Bearer
+
Update AI conversation
| Name | In | Type | Description |
|---|---|---|---|
conversation_id* | path | string |
{
"title": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/ai/conversations/:conversation_id
Delete AI conversation
Bearer
+
Delete AI conversation
| Name | In | Type | Description |
|---|---|---|---|
conversation_id* | path | string |
{
"success": true,
"data": {
"conversation_id": "...",
"deleted": true
},
"request_id": "..."
}/v1/ai/embeddings
Generate embeddings
Bearer
+
Generate vector embeddings for one or more text inputs. Max 100 texts.
{
"text": null,
"model": "..."
}{
"success": true,
"data": {
"embeddings": [
[
0
]
],
"model": "...",
"dimensions": 0
},
"request_id": "..."
}/v1/ai/models
List available AI models
Bearer
+
List available Cloudflare Workers AI models grouped by capability.
{
"success": true,
"data": {
"text_generation": [
"..."
],
"text_embedding": [
"..."
],
"image_to_text": [
"..."
],
"text_classification": [
"..."
]
},
"request_id": "..."
}Authentication18
End-user auth: email/password, magic links, OAuth, phone OTP, anonymous sessions.
/v1/auth/anonymous
Create anonymous session
Bearer
+
Create an anonymous user with a session. Can be linked to a real account later.
{
"success": true,
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_token": "rt_abc123...",
"token_type": "bearer",
"expires_in": 3600,
"user": {
"id": "usr_abc123",
"email": "user@example.com",
"role": "authenticated"
}
},
"request_id": "req_abc123"
}/v1/auth/me/export
Export user data
Bearer
+
Export all data associated with the authenticated user (GDPR-style). Rate-limited to once per hour.
{
"success": true,
"data": {
"_meta": {
"user_id": "...",
"tenant_id": "...",
"export_type": "user_data_export",
"exported_at": "..."
}
},
"request_id": "req_abc123"
}/v1/auth/forgot-password
Request password reset
Bearer
+
Send a password reset email. Always returns 200 for security (anti-enumeration).
{
"email": "user@example.com",
"redirect_to": "...",
"turnstile_token": "..."
}{
"success": true,
"data": {
"message": "..."
},
"request_id": "req_abc123"
}/v1/auth/user
Get current user
Bearer
+
Returns the currently authenticated user profile.
{
"success": true,
"data": {
"id": "usr_abc123",
"email": "user@example.com",
"phone": "+15551234567",
"role": "authenticated",
"email_verified": true,
"phone_verified": false,
"user_metadata": {
"name": "Jane Doe"
},
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-15T12:00:00Z",
"last_sign_in_at": "2026-03-20T10:00:00Z"
},
"request_id": "req_abc123"
}/v1/auth/user
Update current user
Bearer
+
Update email, phone, password, or metadata for the authenticated user.
{
"email": "user@example.com",
"phone": "...",
"password": "...",
"user_metadata": {}
}{
"success": true,
"data": {
"id": "usr_abc123",
"email": "user@example.com",
"phone": "+15551234567",
"role": "authenticated",
"email_verified": true,
"phone_verified": false,
"user_metadata": {
"name": "Jane Doe"
},
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-15T12:00:00Z",
"last_sign_in_at": "2026-03-20T10:00:00Z"
},
"request_id": "req_abc123"
}/v1/auth/login
Log in
Bearer
+
Authenticate with email and password. Returns session tokens or MFA challenge.
{
"email": "user@example.com",
"password": "...",
"turnstile_token": "..."
}{
"success": true,
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_token": "rt_abc123...",
"token_type": "bearer",
"expires_in": 3600,
"user": {
"id": "usr_abc123",
"email": "user@example.com",
"role": "authenticated"
}
},
"request_id": "req_abc123"
}/v1/auth/logout
Log out
Bearer
+
Revoke the current refresh token.
{
"refresh_token": "..."
}{
"success": true,
"data": {
"message": "..."
},
"request_id": "req_abc123"
}/v1/auth/oauth/:provider/callback
OAuth callback
+
Handle OAuth provider callback. Creates or links user account.
| Name | In | Type | Description |
|---|---|---|---|
provider* | path | string |
{
"success": true,
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_token": "rt_abc123...",
"token_type": "bearer",
"expires_in": 3600,
"user": {
"id": "usr_abc123",
"email": "user@example.com",
"role": "authenticated"
}
},
"request_id": "req_abc123"
}- 302 — Redirect to app
/v1/auth/oauth/:provider
OAuth redirect
Bearer
+
Redirect to OAuth provider (Google, GitHub, etc.) for authentication.
| Name | In | Type | Description |
|---|---|---|---|
provider* | path | string | |
redirect_to | query | string |
- 302 — Redirect to OAuth provider
/v1/auth/refresh
Refresh tokens
Bearer
+
Exchange a refresh token for new access and refresh tokens.
{
"refresh_token": "..."
}{
"success": true,
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_token": "rt_abc123...",
"token_type": "bearer",
"expires_in": 3600,
"user": {
"id": "usr_abc123",
"email": "user@example.com",
"role": "authenticated"
}
},
"request_id": "req_abc123"
}/v1/auth/reset-password
Reset password
Bearer
+
Reset password using token from email. Revokes all refresh tokens.
{
"token": "...",
"password": "..."
}{
"success": true,
"data": {
"password_reset": true
},
"request_id": "req_abc123"
}/v1/auth/magic-link
Send magic link
Bearer
+
Send a passwordless magic-link login email.
{
"email": "user@example.com",
"redirect_to": "..."
}{
"success": true,
"data": {
"message": "..."
},
"request_id": "req_abc123"
}/v1/auth/otp/send
Send SMS OTP
Bearer
+
Send a one-time password via SMS to an E.164 phone number.
{
"phone": "..."
}{
"success": true,
"data": {
"message": "..."
},
"request_id": "req_abc123"
}/v1/auth/signup
Sign up
Bearer
+
Create a new user account with email and password. Sends verification email.
{
"email": "user@example.com",
"password": "...",
"phone": "...",
"user_metadata": {},
"turnstile_token": "..."
}{
"success": true,
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_token": "rt_abc123...",
"token_type": "bearer",
"expires_in": 3600,
"user": {
"id": "usr_abc123",
"email": "user@example.com",
"role": "authenticated"
}
},
"request_id": "req_abc123"
}/v1/auth/verify
Verify email (GET)
Bearer
+
Verify email via link from verification email.
| Name | In | Type | Description |
|---|---|---|---|
token* | query | string | |
type | query | string |
{
"success": true,
"data": {
"verified": true
},
"request_id": "req_abc123"
}/v1/auth/verify
Verify email
Bearer
+
Verify email address with token from signup email.
{
"token": "...",
"type": "..."
}{
"success": true,
"data": {
"verified": true
},
"request_id": "req_abc123"
}/v1/auth/magic-link/verify
Verify magic link
Bearer
+
Exchange magic-link token for an auth session.
{
"token": "..."
}{
"success": true,
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_token": "rt_abc123...",
"token_type": "bearer",
"expires_in": 3600,
"user": {
"id": "usr_abc123",
"email": "user@example.com",
"role": "authenticated"
}
},
"request_id": "req_abc123"
}/v1/auth/otp/verify
Verify OTP
Bearer
+
Verify the one-time password and create an auth session.
{
"phone": "...",
"code": "..."
}{
"success": true,
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_token": "rt_abc123...",
"token_type": "bearer",
"expires_in": 3600,
"user": {
"id": "usr_abc123",
"email": "user@example.com",
"role": "authenticated"
}
},
"request_id": "req_abc123"
}MFA7
TOTP-based multi-factor authentication enrollment, verification, and recovery.
/v1/auth/mfa/challenge
Challenge MFA
Bearer
+
Verify an MFA code during login. Returns user_id and verified status.
{
"factor_id": "...",
"code": "...",
"user_id": "..."
}{
"success": true,
"data": {
"user_id": "...",
"verified": true
},
"request_id": "req_abc123"
}/v1/auth/mfa/complete
Complete MFA login
+
Complete MFA-gated login with a TOTP code and MFA ticket.
{
"mfa_ticket": "...",
"factor_id": "...",
"code": "..."
}{
"success": true,
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_token": "rt_abc123...",
"token_type": "bearer",
"expires_in": 3600,
"user": {
"id": "usr_abc123",
"email": "user@example.com",
"role": "authenticated"
}
},
"request_id": "req_abc123"
}/v1/auth/mfa/enroll
Enroll TOTP factor
Bearer
+
Begin TOTP MFA enrollment. Returns secret and QR code URI.
{
"friendly_name": "..."
}{
"success": true,
"data": {
"factor_id": "...",
"type": "totp",
"totp": {
"secret": "...",
"uri": "...",
"qr_uri": "..."
}
},
"request_id": "req_abc123"
}/v1/auth/mfa/factors
List MFA factors
Bearer
+
List all enrolled MFA factors for the current user.
{
"success": true,
"data": [
{
"id": "mfa_abc123",
"type": "totp",
"friendly_name": "Work authenticator",
"created_at": "2026-01-01T00:00:00Z",
"verified_at": "2026-01-01T00:05:00Z"
}
],
"request_id": "req_abc123"
}/v1/auth/mfa/recover
MFA recovery
+
Bypass MFA using a recovery code. Consumes the recovery code.
{
"mfa_ticket": "...",
"recovery_code": "..."
}{
"success": true,
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_token": "rt_abc123...",
"token_type": "bearer",
"expires_in": 3600,
"user": {
"id": "usr_abc123",
"email": "user@example.com",
"role": "authenticated"
}
},
"request_id": "req_abc123"
}/v1/auth/mfa/:factor_id
Unenroll MFA factor
Bearer
+
Remove an MFA factor from the current user.
| Name | In | Type | Description |
|---|---|---|---|
factor_id* | path | string |
{
"success": true,
"data": {
"unenrolled": true
},
"request_id": "req_abc123"
}/v1/auth/mfa/verify
Verify TOTP code
Bearer
+
Verify a TOTP code to complete MFA factor enrollment.
{
"factor_id": "...",
"code": "..."
}{
"success": true,
"data": {
"verified": true
},
"request_id": "req_abc123"
}Sessions3
User session listing and revocation.
/v1/auth/sessions
List active sessions
Bearer
+
List all active sessions for the authenticated user.
{
"success": true,
"data": [
{
"id": "sess_abc123",
"user_id": "usr_abc123",
"ip": "203.0.113.1",
"user_agent": "Mozilla/5.0...",
"created_at": "2026-01-01T00:00:00Z",
"last_active_at": "2026-03-20T10:00:00Z"
}
],
"request_id": "req_abc123"
}/v1/auth/sessions
Revoke all sessions
Bearer
+
Revoke all active sessions for the authenticated user.
{
"success": true,
"data": {
"revoked": 0
},
"request_id": "req_abc123"
}/v1/auth/sessions/:session_id
Revoke session
Bearer
+
Revoke a specific session by ID.
| Name | In | Type | Description |
|---|---|---|---|
session_id* | path | string |
{
"success": true,
"data": {
"revoked": true
},
"request_id": "req_abc123"
}Notifications7
In-app notification management.
/v1/auth/notifications/preferences/:channel
Delete notification preference
Bearer
+
Remove a notification channel preference.
| Name | In | Type | Description |
|---|---|---|---|
channel* | path | string |
{
"success": true,
"data": {
"deleted": true
},
"request_id": "req_abc123"
}/v1/auth/notifications/preferences
Get notification preferences
Bearer
+
Get notification channel preferences for the authenticated user.
{
"success": true,
"data": [
{
"channel": "...",
"enabled": true,
"categories": [
"..."
]
}
],
"request_id": "req_abc123"
}/v1/auth/notifications/preferences
Update notification preferences
Bearer
+
Update notification channel preferences.
{
"channel": "...",
"enabled": true,
"categories": [
"..."
]
}{
"success": true,
"data": {
"updated": true
},
"request_id": "req_abc123"
}/v1/auth/notifications
List notifications
Bearer
+
List notifications for the authenticated user with pagination.
{
"success": true,
"data": {
"results": [
{
"id": "...",
"user_id": "...",
"type": "...",
"title": "...",
"body": "...",
"is_read": "...",
"metadata": "...",
"created_at": "..."
}
],
"next_cursor": "eyJpZCI6...",
"total": 42
},
"request_id": "req_abc123"
}/v1/auth/notifications/read-all
Mark all as read
Bearer
+
Mark all notifications as read for the authenticated user.
{
"success": true,
"data": {
"updated": 0
},
"request_id": "req_abc123"
}/v1/auth/notifications/:notification_id/read
Mark notification read
Bearer
+
Mark a single notification as read.
| Name | In | Type | Description |
|---|---|---|---|
notification_id* | path | string |
{
"success": true,
"data": {
"read": true
},
"request_id": "req_abc123"
}/v1/auth/notifications/count
Get unread count
Bearer
+
Get the number of unread notifications.
{
"success": true,
"data": {
"count": 0
},
"request_id": "req_abc123"
}Passkeys6
WebAuthn/FIDO2 passkey registration and authentication.
/v1/auth/passkeys/:credential_id
Delete passkey
Bearer
+
Remove a registered passkey.
| Name | In | Type | Description |
|---|---|---|---|
credential_id* | path | string |
{
"success": true,
"data": {
"deleted": true
},
"request_id": "req_abc123"
}/v1/auth/passkeys
List passkeys
Bearer
+
List all passkeys registered for the authenticated user.
{
"success": true,
"data": [
{
"id": "pk_abc123",
"user_id": "usr_abc123",
"credential_id": "cred_abc123...",
"friendly_name": "MacBook Touch ID",
"created_at": "2026-01-01T00:00:00Z",
"last_used_at": "2026-03-20T10:00:00Z"
}
],
"request_id": "req_abc123"
}/v1/auth/passkeys/authenticate/begin
Begin passkey authentication
Bearer
+
Get WebAuthn credential request options for passkey authentication.
{
"success": true,
"data": {
"options": {}
},
"request_id": "req_abc123"
}/v1/auth/passkeys/authenticate/complete
Complete passkey authentication
Bearer
+
Complete passkey authentication and receive a session.
{
"credential": {}
}{
"success": true,
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_token": "rt_abc123...",
"token_type": "bearer",
"expires_in": 3600,
"user": {
"id": "usr_abc123",
"email": "user@example.com",
"role": "authenticated"
}
},
"request_id": "req_abc123"
}/v1/auth/passkeys/register/begin
Begin passkey registration
Bearer
+
Get WebAuthn credential creation options for passkey registration.
{
"success": true,
"data": {
"options": {}
},
"request_id": "req_abc123"
}/v1/auth/passkeys/register/complete
Complete passkey registration
Bearer
+
Complete passkey registration with the credential from the browser.
{
"credential": {},
"friendly_name": "..."
}{
"success": true,
"data": {
"id": "pk_abc123",
"user_id": "usr_abc123",
"credential_id": "cred_abc123...",
"friendly_name": "MacBook Touch ID",
"created_at": "2026-01-01T00:00:00Z",
"last_used_at": "2026-03-20T10:00:00Z"
},
"request_id": "req_abc123"
}Public Forms2
Public-facing form access and submission (no auth).
/v1/forms/:form_id
Get public form
+
Retrieve a published form definition including fields, settings, and branding.
| Name | In | Type | Description |
|---|---|---|---|
form_id* | path | string | |
tenant_id* | query | string |
{
"success": true,
"data": {
"form_id": "...",
"name": "...",
"description": "...",
"object_type_id": "...",
"fields": [
{}
],
"settings": {},
"branding": {},
"require_captcha": true
},
"request_id": "..."
}/v1/forms/:form_id/submit
Submit public form
+
Submit data through a public form. Creates an object in the linked type. Rate-limited.
| Name | In | Type | Description |
|---|---|---|---|
form_id* | path | string |
{}{
"success": true,
"data": {
"submitted": true,
"object_id": "..."
},
"request_id": "..."
}SAML / SSO3
SAML 2.0 single sign-on integration.
/v1/auth/saml/:provider/acs
SAML ACS
+
Assertion Consumer Service endpoint. Receives SAML response from IdP, creates/links user, and redirects with session.
| Name | In | Type | Description |
|---|---|---|---|
provider* | path | string |
- 302 — Redirect to app with session tokens
/v1/auth/saml/:provider/login
SAML login redirect
+
Initiate SAML SSO by redirecting to the IdP.
| Name | In | Type | Description |
|---|---|---|---|
provider* | path | string |
- 302 — Redirect to SAML IdP
/v1/auth/saml/:provider/metadata
SAML metadata
+
Returns SAML SP metadata XML for configuring the IdP.
| Name | In | Type | Description |
|---|---|---|---|
provider* | path | string |
Short URLs5
URL shortener service via obfy.uk — create, manage, and track short links.
/v1/short-urls
List short URLs
Bearer
+
List short URLs
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer | |
offset | query | integer |
{
"success": true,
"data": {
"results": [
{}
],
"total": 0
},
"request_id": "..."
}/v1/short-urls
Create a short URL
Bearer
+
Create a short URL
{}{
"success": true,
"data": {},
"request_id": "..."
}- 409 — Slug already taken
/v1/short-urls/:slug
Get short URL details
Bearer
+
Get short URL details
| Name | In | Type | Description |
|---|---|---|---|
slug* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/short-urls/:slug
Update a short URL
Bearer
+
Update a short URL
| Name | In | Type | Description |
|---|---|---|---|
slug* | path | string |
{}{
"success": true,
"data": {},
"request_id": "..."
}/v1/short-urls/:slug
Delete a short URL
Bearer
+
Delete a short URL
| Name | In | Type | Description |
|---|---|---|---|
slug* | path | string |
{
"success": true,
"data": {
"slug": "...",
"deleted": true
},
"request_id": "..."
}Accounting68
Double-entry accounting via tenant API: chart of accounts, journal entries, invoices, payments, bank reconciliation, tax codes, financial reports.
/v1/accounting/reports/aged-payables
Aged payables report
Bearer
+
Aged payables report
| Name | In | Type | Description |
|---|---|---|---|
as_of | query | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/reports/aged-receivables
Aged receivables report
Bearer
+
Aged receivables report
| Name | In | Type | Description |
|---|---|---|---|
as_of | query | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/invoices/:invoice_id/approve
Approve invoice
Bearer
+
Approve invoice
| Name | In | Type | Description |
|---|---|---|---|
invoice_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/reports/balance-sheet
Balance sheet report
Bearer
+
Balance sheet report
| Name | In | Type | Description |
|---|---|---|---|
as_of | query | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/reports/cash-flow
Cash flow statement
Bearer
+
Cash flow statement
| Name | In | Type | Description |
|---|---|---|---|
from | query | string | |
to | query | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/periods/:period_id/close
Close period
Bearer
+
Close period
| Name | In | Type | Description |
|---|---|---|---|
period_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/accounts
List chart of accounts
Bearer
+
List chart of accounts
| Name | In | Type | Description |
|---|---|---|---|
type | query | string | |
active | query | string |
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/accounting/accounts
Create account
Bearer
+
Create account
{
"code": "...",
"name": "...",
"type": "...",
"sub_type": "...",
"parent_id": "...",
"description": "...",
"currency": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/bank-accounts
List bank accounts
Bearer
+
List bank accounts
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/accounting/bank-accounts
Create bank account
Bearer
+
Create bank account
{
"name": "...",
"account_number": "...",
"bank_name": "...",
"currency": "...",
"gl_account_id": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/currencies
List currencies
Bearer
+
List currencies
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/accounting/currencies
Create currency
Bearer
+
Create currency
{
"code": "...",
"name": "...",
"symbol": "...",
"decimal_places": 0
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/exchange-rates
List exchange rates
Bearer
+
List exchange rates
| Name | In | Type | Description |
|---|---|---|---|
from_currency | query | string | |
to_currency | query | string |
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/accounting/exchange-rates
Create exchange rate
Bearer
+
Create exchange rate
{
"from_currency": "...",
"to_currency": "...",
"rate": 0,
"effective_date": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/invoices
List invoices
Bearer
+
List invoices
| Name | In | Type | Description |
|---|---|---|---|
type | query | string | |
status | query | string | |
limit | query | integer | |
offset | query | integer |
{
"success": true,
"data": {
"invoices": [
{}
],
"total": 0
},
"request_id": "..."
}/v1/accounting/invoices
Create invoice
Bearer
+
Create invoice
{
"type": "sales",
"contact_name": "...",
"date": "...",
"due_date": "...",
"lines": [
{}
],
"currency": "...",
"notes": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/journal-entries
List journal entries
Bearer
+
List journal entries
| Name | In | Type | Description |
|---|---|---|---|
status | query | string | |
from | query | string | |
to | query | string | |
account_id | query | string | |
limit | query | integer | |
offset | query | integer |
{
"success": true,
"data": {
"entries": [
{}
],
"total": 0
},
"request_id": "..."
}/v1/accounting/journal-entries
Create journal entry
Bearer
+
Create journal entry
{
"date": "...",
"description": "...",
"reference": "...",
"lines": [
{}
],
"currency": "...",
"post": true
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/payments
List payments
Bearer
+
List payments
| Name | In | Type | Description |
|---|---|---|---|
type | query | string | |
limit | query | integer | |
offset | query | integer |
{
"success": true,
"data": {
"payments": [
{}
],
"total": 0
},
"request_id": "..."
}/v1/accounting/payments
Create payment
Bearer
+
Create payment
{
"type": "receipt",
"contact_name": "...",
"date": "...",
"amount": 0,
"method": "...",
"bank_account_id": "...",
"reference": "...",
"allocations": [
{}
]
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/periods
List accounting periods
Bearer
+
List accounting periods
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/accounting/periods
Create period
Bearer
+
Create period
{
"name": "...",
"start_date": "...",
"end_date": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/recurring
List recurring entries
Bearer
+
List recurring entries
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/accounting/recurring
Create recurring entry
Bearer
+
Create recurring entry
{
"name": "...",
"type": "journal_entry",
"template": {},
"frequency": "...",
"next_run": "...",
"end_date": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/tax-codes
List tax codes
Bearer
+
List tax codes
{
"success": true,
"data": [
{}
],
"request_id": "..."
}/v1/accounting/tax-codes
Create tax code
Bearer
+
Create tax code
{
"code": "...",
"name": "...",
"rate": 0,
"type": "inclusive",
"category": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/accounts/:account_id
Get account
Bearer
+
Get account
| Name | In | Type | Description |
|---|---|---|---|
account_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/accounts/:account_id
Update account
Bearer
+
Update account
| Name | In | Type | Description |
|---|---|---|---|
account_id* | path | string |
{
"name": "...",
"sub_type": "...",
"description": "...",
"is_active": true
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/accounts/:account_id
Delete account
Bearer
+
Delete account
| Name | In | Type | Description |
|---|---|---|---|
account_id* | path | string |
{
"success": true,
"data": {
"id": "...",
"deleted": true
},
"request_id": "..."
}/v1/accounting/bank-accounts/:bank_account_id
Get bank account
Bearer
+
Get bank account
| Name | In | Type | Description |
|---|---|---|---|
bank_account_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/bank-accounts/:bank_account_id
Update bank account
Bearer
+
Update bank account
| Name | In | Type | Description |
|---|---|---|---|
bank_account_id* | path | string |
{
"name": "...",
"account_number": "...",
"bank_name": "...",
"is_active": true
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/bank-accounts/:bank_account_id
Delete bank account
Bearer
+
Delete bank account
| Name | In | Type | Description |
|---|---|---|---|
bank_account_id* | path | string |
{
"success": true,
"data": {
"id": "...",
"deleted": true
},
"request_id": "..."
}/v1/accounting/currencies/:currency_id
Get currency
Bearer
+
Get currency
| Name | In | Type | Description |
|---|---|---|---|
currency_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/currencies/:currency_id
Update currency
Bearer
+
Update currency
| Name | In | Type | Description |
|---|---|---|---|
currency_id* | path | string |
{
"name": "...",
"symbol": "...",
"decimal_places": 0
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/currencies/:currency_id
Delete currency
Bearer
+
Delete currency
| Name | In | Type | Description |
|---|---|---|---|
currency_id* | path | string |
{
"success": true,
"data": {
"id": "...",
"deleted": true
},
"request_id": "..."
}/v1/accounting/exchange-rates/:rate_id
Get exchange rate
Bearer
+
Get exchange rate
| Name | In | Type | Description |
|---|---|---|---|
rate_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/exchange-rates/:rate_id
Delete exchange rate
Bearer
+
Delete exchange rate
| Name | In | Type | Description |
|---|---|---|---|
rate_id* | path | string |
{
"success": true,
"data": {
"id": "...",
"deleted": true
},
"request_id": "..."
}/v1/accounting/invoices/:invoice_id
Get invoice
Bearer
+
Get invoice
| Name | In | Type | Description |
|---|---|---|---|
invoice_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/invoices/:invoice_id
Update invoice
Bearer
+
Update invoice
| Name | In | Type | Description |
|---|---|---|---|
invoice_id* | path | string |
{
"contact_name": "...",
"date": "...",
"due_date": "...",
"notes": "...",
"lines": [
{}
]
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/invoices/:invoice_id
Delete invoice
Bearer
+
Delete invoice
| Name | In | Type | Description |
|---|---|---|---|
invoice_id* | path | string |
{
"success": true,
"data": {
"id": "...",
"deleted": true
},
"request_id": "..."
}/v1/accounting/journal-entries/:entry_id
Get journal entry
Bearer
+
Get journal entry
| Name | In | Type | Description |
|---|---|---|---|
entry_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/journal-entries/:entry_id
Update journal entry
Bearer
+
Update journal entry
| Name | In | Type | Description |
|---|---|---|---|
entry_id* | path | string |
{
"date": "...",
"description": "...",
"reference": "...",
"lines": [
{}
]
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/journal-entries/:entry_id
Delete journal entry
Bearer
+
Delete journal entry
| Name | In | Type | Description |
|---|---|---|---|
entry_id* | path | string |
{
"success": true,
"data": {
"id": "...",
"deleted": true
},
"request_id": "..."
}/v1/accounting/periods/:period_id
Get period
Bearer
+
Get period
| Name | In | Type | Description |
|---|---|---|---|
period_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/periods/:period_id
Update period
Bearer
+
Update period
| Name | In | Type | Description |
|---|---|---|---|
period_id* | path | string |
{
"name": "...",
"start_date": "...",
"end_date": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/periods/:period_id
Delete period
Bearer
+
Delete period
| Name | In | Type | Description |
|---|---|---|---|
period_id* | path | string |
{
"success": true,
"data": {
"id": "...",
"deleted": true
},
"request_id": "..."
}/v1/accounting/recurring/:recurring_id
Get recurring entry
Bearer
+
Get recurring entry
| Name | In | Type | Description |
|---|---|---|---|
recurring_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/recurring/:recurring_id
Update recurring entry
Bearer
+
Update recurring entry
| Name | In | Type | Description |
|---|---|---|---|
recurring_id* | path | string |
{
"name": "...",
"template": {},
"frequency": "...",
"next_run": "...",
"end_date": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/recurring/:recurring_id
Delete recurring entry
Bearer
+
Delete recurring entry
| Name | In | Type | Description |
|---|---|---|---|
recurring_id* | path | string |
{
"success": true,
"data": {
"id": "...",
"deleted": true
},
"request_id": "..."
}/v1/accounting/tax-codes/:tax_code_id
Get tax code
Bearer
+
Get tax code
| Name | In | Type | Description |
|---|---|---|---|
tax_code_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/tax-codes/:tax_code_id
Update tax code
Bearer
+
Update tax code
| Name | In | Type | Description |
|---|---|---|---|
tax_code_id* | path | string |
{
"name": "...",
"rate": 0,
"type": "...",
"category": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/tax-codes/:tax_code_id
Delete tax code
Bearer
+
Delete tax code
| Name | In | Type | Description |
|---|---|---|---|
tax_code_id* | path | string |
{
"success": true,
"data": {
"id": "...",
"deleted": true
},
"request_id": "..."
}/v1/accounting/recurring/:recurring_id/execute
Execute recurring entry now
Bearer
+
Execute recurring entry now
| Name | In | Type | Description |
|---|---|---|---|
recurring_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/reports/general-ledger
General ledger report
Bearer
+
General ledger report
| Name | In | Type | Description |
|---|---|---|---|
from | query | string | |
to | query | string | |
account_id | query | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/bank-transactions/:transaction_id
Get bank transaction
Bearer
+
Get bank transaction
| Name | In | Type | Description |
|---|---|---|---|
transaction_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/payments/:payment_id
Get payment
Bearer
+
Get payment
| Name | In | Type | Description |
|---|---|---|---|
payment_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/bank-accounts/:bank_account_id/import
Import bank transactions
Bearer
+
Import bank transactions
| Name | In | Type | Description |
|---|---|---|---|
bank_account_id* | path | string |
{
"transactions": [
{
"date": "...",
"description": "...",
"amount": 0,
"type": "debit"
}
]
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/bank-accounts/:bank_account_id/transactions
List bank transactions
Bearer
+
List bank transactions
| Name | In | Type | Description |
|---|---|---|---|
bank_account_id* | path | string | |
status | query | string | |
from | query | string | |
to | query | string | |
limit | query | integer | |
offset | query | integer |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/bank-transactions/:transaction_id/match
Match bank transaction
Bearer
+
Match bank transaction
| Name | In | Type | Description |
|---|---|---|---|
transaction_id* | path | string |
{
"entry_id": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/journal-entries/:entry_id/post
Post journal entry
Bearer
+
Post journal entry
| Name | In | Type | Description |
|---|---|---|---|
entry_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/reports/profit-and-loss
Profit and loss report
Bearer
+
Profit and loss report
| Name | In | Type | Description |
|---|---|---|---|
from | query | string | |
to | query | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/bank-accounts/:bank_account_id/reconcile
Reconcile bank account
Bearer
+
Reconcile bank account
| Name | In | Type | Description |
|---|---|---|---|
bank_account_id* | path | string |
{
"transaction_ids": [
"..."
]
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/periods/:period_id/reopen
Reopen period
Bearer
+
Reopen period
| Name | In | Type | Description |
|---|---|---|---|
period_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/journal-entries/:entry_id/reverse
Reverse journal entry
Bearer
+
Reverse journal entry
| Name | In | Type | Description |
|---|---|---|---|
entry_id* | path | string |
{
"date": "...",
"description": "..."
}{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/reports/tax
Tax report
Bearer
+
Tax report
| Name | In | Type | Description |
|---|---|---|---|
from | query | string | |
to | query | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/reports/trial-balance
Trial balance report
Bearer
+
Trial balance report
| Name | In | Type | Description |
|---|---|---|---|
as_of | query | string | |
period_id | query | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/invoices/:invoice_id/void
Void invoice
Bearer
+
Void invoice
| Name | In | Type | Description |
|---|---|---|---|
invoice_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}/v1/accounting/payments/:payment_id/void
Void payment
Bearer
+
Void payment
| Name | In | Type | Description |
|---|---|---|---|
payment_id* | path | string |
{
"success": true,
"data": {},
"request_id": "..."
}Portal Auth10
Public portal authentication endpoints — login, signup, password reset, magic links, OTP, and email verification. No Bearer token required.
/v1/auth/portal-forgot-password
Portal password reset request
+
Request a password reset email via the public portal.
{
"email": "user@example.com",
"redirect_to": "...",
"turnstile_token": "..."
}{
"success": true,
"data": {
"message": "..."
},
"request_id": "req_abc123"
}/v1/auth/portal-identify
Identify tenant by email
+
Look up which tenant(s) an email belongs to for portal login.
{
"email": "user@example.com"
}{
"success": true,
"data": {
"tenant_id": "...",
"multiple_tenants": true,
"tenants": [
{
"id": "...",
"name": "..."
}
]
},
"request_id": "req_abc123"
}/v1/auth/portal-login
Portal login
+
Authenticate via the public portal with email, password, and tenant ID.
{
"email": "user@example.com",
"password": "...",
"tenant_id": "...",
"turnstile_token": "..."
}{
"success": true,
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_token": "rt_abc123...",
"token_type": "bearer",
"expires_in": 3600,
"user": {
"id": "usr_abc123",
"email": "user@example.com",
"role": "authenticated"
}
},
"request_id": "req_abc123"
}/v1/auth/portal-magic-link
Portal send magic link
+
Send a passwordless magic-link email via the portal.
{
"email": "user@example.com",
"redirect_to": "..."
}{
"success": true,
"data": {
"message": "..."
},
"request_id": "req_abc123"
}/v1/auth/portal-magic-link-verify
Portal verify magic link
+
Exchange a portal magic-link token for an auth session.
{
"token": "..."
}{
"success": true,
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_token": "rt_abc123...",
"token_type": "bearer",
"expires_in": 3600,
"user": {
"id": "usr_abc123",
"email": "user@example.com",
"role": "authenticated"
}
},
"request_id": "req_abc123"
}/v1/auth/portal-otp-send
Portal send OTP
+
Send a one-time password via SMS for portal authentication.
{
"phone": "..."
}{
"success": true,
"data": {
"message": "..."
},
"request_id": "req_abc123"
}/v1/auth/portal-otp-verify
Portal verify OTP
+
Verify portal OTP and create a session.
{
"phone": "...",
"code": "..."
}{
"success": true,
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_token": "rt_abc123...",
"token_type": "bearer",
"expires_in": 3600,
"user": {
"id": "usr_abc123",
"email": "user@example.com",
"role": "authenticated"
}
},
"request_id": "req_abc123"
}/v1/auth/portal-reset-password
Portal password reset
+
Reset password using a token received via email.
{
"token": "...",
"password": "..."
}{
"success": true,
"data": {
"message": "..."
},
"request_id": "req_abc123"
}/v1/auth/portal-signup
Portal signup
+
Create a new account via the public portal.
{
"email": "user@example.com",
"password": "...",
"phone": "...",
"user_metadata": {},
"turnstile_token": "..."
}{
"success": true,
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_token": "rt_abc123...",
"token_type": "bearer",
"expires_in": 3600,
"user": {
"id": "usr_abc123",
"email": "user@example.com",
"role": "authenticated"
}
},
"request_id": "req_abc123"
}/v1/auth/portal-verify-email
Portal verify email
+
Verify email address via portal authentication flow.
{
"token": "..."
}{
"success": true,
"data": {
"message": "..."
},
"request_id": "req_abc123"
}