API quickstart
Connect a tool with one key. You do not need a partner selection, an OAuth token exchange, or a refresh-token job.
Create an API key
- Open
Settingsin Supahost. - Find
Public API, then selectCreate key. - Name the integration and select only the access that it needs.
- Pick
Livefor real workspace data orTestfor the sandbox dataset. - Copy the key. Supahost shows it one time.
A member with API key permission can create, change, or revoke a key.
Make a request
Send the key as a Bearer token. The key works directly, so no other authentication request is necessary.
Use the example closest to your runtime. Each one reads the key from the SUPAHOST_API_KEY environment variable.
Each response includes a request ID. Keep this ID when you ask for support.
cURL
Use cURL for smoke tests and support reproductions. --fail-with-body returns a non-zero exit status while preserving the problem JSON.
curl --fail-with-body --silent --show-error \
"https://supahost.io/api/v1/properties?limit=100" \
--header "Authorization: Bearer $SUPAHOST_API_KEY"TypeScript
Use the built-in fetch API in Next.js, Node.js, or an edge runtime. No SDK is required.
const response = await fetch(
'https://supahost.io/api/v1/properties?limit=100',
{
headers: {
Authorization: 'Bearer ' + process.env.SUPAHOST_API_KEY,
},
},
)
if (!response.ok) {
const problem = await response.json()
throw new Error(response.status + ' ' + problem.code + ': ' + problem.detail)
}
const properties = await response.json()Python
Use the Python standard library for scripts and workers. The example keeps the API problem detail when a request fails.
import json
import os
from urllib import error, request
api_request = request.Request(
'https://supahost.io/api/v1/properties?limit=100',
headers={'Authorization': 'Bearer ' + os.environ['SUPAHOST_API_KEY']},
)
try:
with request.urlopen(api_request) as response:
properties = json.load(response)
except error.HTTPError as exc:
problem = json.load(exc)
raise RuntimeError(
str(exc.code) + ' ' + problem['code'] + ': ' + problem['detail'],
) from excRead the response
List endpoints return complete canonical records. You do not need a special flag to get nested data.
{
"data": [
{
"id": "42",
"code": "HARBOR-LOFT",
"name": "Harbor Loft",
"timezone": "America/New_York",
"status": "active",
"updatedAt": "2026-08-19T20:00:00.000Z",
"inventory": {
"maxGuests": 4,
"physicalUnits": 1,
"strategies": ["fixed_unit"]
},
"channels": ["airbnb", "vrbo"],
"startingRate": { "amountMinor": "22500", "currency": "USD" }
}
],
"meta": {
"requestId": "6a660c5f-3e6f-4926-a24a-6292dd54fdd3",
"page": {
"limit": 100,
"hasMore": false,
"nextCursor": null,
"snapshotAt": "2026-08-19T20:00:00.000Z"
}
}
}