The Cloudymonkey API
Pull live flight prices into your own website, booking tool or spreadsheet. One request, clean JSON back.
Private documentation
Checking accessβ¦
Getting a key
API access is included on every paid plan: Freelance, Boutique and Corporate. Sign in to your dashboard, open API Keys, give the key a label and select Create key. The full key is shown once, so copy it straight away. You can hold up to 5 active keys and revoke any of them at any time.
Treat keys like passwords. Never put one in public front-end code.
Authentication
Send your key in an x-api-key header. Keys start with cm_live_.
Daily limits
| Plan | Requests per day |
|---|---|
| Freelance | 500 |
| Boutique | 2,000 |
| Corporate | 10,000 |
Limits reset at midnight UTC. Going over returns HTTP 429.
Per-minute limits
| Plan | Requests per minute, per key |
|---|---|
| Freelance | 20 |
| Boutique | 60 |
| Corporate | 120 |
Going over the per-minute limit returns HTTP 429 with a Retry-After: 60 header. Wait that long, then retry. If one key is used from many different IP addresses in an hour (5 or more), we flag it for review.
Search flights
POST /cloudymonkey-search
| Field | Type | Notes |
|---|---|---|
origin | string | Required. 3-letter IATA code, e.g. LHR |
destination | string | Required. 3-letter IATA code, e.g. CUN |
departure_date | string | Required. YYYY-MM-DD |
return_date | string | Optional. Omit for one-way |
adults | number | Optional. Default 1 |
children | number | Optional. Default 0 |
cabin_class | string | Optional. economy (default), premium_economy, business or first |
max_results | number | Optional. Default 20, maximum 50 |
Example request
curl -X POST "https://xynpuavrmbhspkckfxvt.supabase.co/functions/v1/cloudymonkey-search" \
-H "x-api-key: cm_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"origin": "LHR",
"destination": "CUN",
"departure_date": "2026-12-01",
"return_date": "2026-12-10",
"adults": 2,
"cabin_class": "economy",
"max_results": 10
}' Example response
{
"success": true,
"search": { "origin": "LHR", "destination": "CUN", "trip_type": "return", ... },
"results": [
{
"id": "off_...",
"price": { "total": "612.40", "base": "480.00", "tax": "132.40", "currency": "GBP" },
"expires_at": "2026-11-01T12:00:00Z",
"airline": { "name": "...", "iata_code": "..." },
"slices": [ { "origin": "LHR", "destination": "CUN", "stops": 0, "duration": "PT10H30M", "segments": [ ... ] } ]
}
],
"meta": {
"total_results": 10,
"rate_limit": { "plan": "freelance", "limit_per_day": 500, "used_today": 1, "remaining_today": 499 }
}
} Errors
| Status | Meaning |
|---|---|
| 400 | Missing or invalid fields in the request body |
| 401 | Missing, invalid or revoked API key |
| 403 | Request came from a domain or IP address not approved for this key |
| 429 | Daily or per-minute request limit reached. For the per-minute limit, wait for the Retry-After period |
| 502 | Flight data temporarily unavailable. Retry shortly |
Domain and IP restrictions
You can limit a key to your website domains and your server IP addresses from the API Keys tab. Once a list is set, requests from anywhere else get a 403. Keys with no list work from anywhere. To test from a staging domain, request it on the key; it works once Cloudymonkey approves it, and approvals may expire.
Need help?
Read the Help Centre or contact us through your dashboard.