Developers

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 Settings in Supahost.
  • Find Public API, then select Create key.
  • Name the integration and select only the access that it needs.
  • Pick Live for real workspace data or Test for 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
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.

TypeScript
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.

Python
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 exc

Read the response

List endpoints return complete canonical records. You do not need a special flag to get nested data.

JSON
{
  "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"
    }
  }
}

Next steps