Programmatic access to all AdFlow resources via HTTP.
Base URL and version
https://app.cloudadflow.com/api/v1
Current version: v1. Breaking changes only happen in major versions. Non-breaking additions (new fields, new endpoints) are added without a version bump.
Authentication
JWT Bearer token. Login to get the token:
curl -X POST https://app.cloudadflow.com/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"email": "your@email.com", "password": "yourpassword"}'
Response:
{
"token": "eyJ...",
"expires_at": "2026-05-04T12:00:00Z"
}
Use the token in all requests:
Authorization: Bearer eyJ...
Tokens expire in 24h. Use /auth/refresh to renew without logging in again.
Rate limits
| Plan | Limit |
|---|---|
| Free | 100 req/min per organization |
| Operator | 500 req/min |
| Captain / Zion | 1,000 req/min |
Response when limit is hit: 429 Too Many Requests with Retry-After header in seconds.
Endpoints
| Resource | Endpoint | Methods |
|---|---|---|
| Auth | /auth/login | POST |
| Auth | /auth/refresh | POST |
| Auth | /auth/logout | DELETE |
| Campaigns | /campaigns | GET, POST |
| Campaigns | /campaigns/:id | GET, PUT, DELETE |
| Profiles | /profiles | GET, POST |
| Profiles | /profiles/:id | GET, PUT, DELETE |
| Proxies | /proxies | GET, POST |
| Proxies | /proxies/:id | GET, PUT, DELETE |
| Templates | /templates | GET, POST |
| Templates | /templates/:id | GET, PUT, DELETE |
| Audit Logs | /audit_logs | GET |
| Webhooks | /webhook_endpoints | GET, POST |
| Webhooks | /webhook_endpoints/:id | GET, DELETE |
Example: create a campaign
curl -X POST https://app.cloudadflow.com/api/v1/campaigns \
-H "Authorization: Bearer eyJ..." \
-H "Content-Type: application/json" \
-d '{
"name": "product_conversions_20260503",
"objective": "conversions",
"profile_id": "prf_abc123",
"daily_budget": 25.00,
"currency": "USD"
}'
Response 201 Created:
{
"id": "cmp_xyz789",
"name": "product_conversions_20260503",
"status": "draft",
"created_at": "2026-05-03T10:00:00Z"
}
Pagination
Lists return paginated with cursor:
{
"data": [...],
"meta": {
"next_cursor": "eyJpZCI6MTAwfQ==",
"has_more": true
}
}
Pass ?cursor=eyJpZCI6MTAwfQ== in the next request for the following page.