Read websites and the directory

Read your Halo CMS websites and your Halo CRM listings and businesses with an API key. What's in them, how to page, and what's left out on purpose.

The Developer API reads Halo CMS and Halo CRM as well as Halo Data. These routes need an API key with content.read, and they read as its person: their organization needs the product on its plan, and they need a role in it. Otherwise you get 403 forbidden, or 403 plan_feature_unavailable for the plan.

Everything here reads. Nothing changes a website or the directory.

Websites

curl -sS https://api.usehalo.net/v1/developer/websites \
  -H "Authorization: Bearer $HALO_API_KEY"
{
  "id": "0195f3a2-…",
  "name": "Visit Newport",
  "live": true,
  "liveNumber": 12,
  "liveAt": "2026-11-01T17:30:00Z",
  "pageCount": 24,
  "updatedAt": "2026-11-04T09:12:00Z"
}

GET /v1/developer/websites/{id} adds domains (custom domains that are live), pages (each one's path and title) and collections (each one's key, name and how many entries it has).

What people send through a website's forms isn't here, and neither is what's on its pages. Read the published website for that.

Listings

GET /v1/developer/listings lists the directory's places, offerings and events.

QueryMeans
searchText to look for in the name, city, address, phone, website or business, or a tag that matches it exactly
statusdraft, published or archived. Left out, every status the person can see
kindOne kind, by its key, such as restaurant
regionOne region, by its key
limitUp to 200 a page. Default 100
cursorThe nextCursor of the page before

Ask for status=published to read what's public.

{
  "id": "6f1c2a90-…",
  "kind": "restaurant",
  "name": "The Harbor Kitchen",
  "slug": "the-harbor-kitchen",
  "status": "published",
  "summary": "Oysters by the water.",
  "description": "",
  "website": "https://example.com",
  "phone": "+1 541 555 0100",
  "address": "1 Pier St",
  "city": "Newport",
  "postalCode": "97365",
  "region": "central-coast",
  "lat": 44.63,
  "lng": -124.05,
  "startsAt": null,
  "endsAt": null,
  "tags": ["seafood"],
  "data": { "hours": "Daily, 11 to 9" },
  "businessId": "0b7e…",
  "businessName": "Harbor Hospitality",
  "verifiedAt": "2026-10-30T12:00:00Z",
  "stale": false,
  "createdAt": "2026-02-01T10:00:00Z",
  "updatedAt": "2026-10-30T12:00:00Z"
}

data holds the fields the listing's kind adds, which your organization defines. GET /v1/developer/listings/{id} answers with the same fields.

Businesses

GET /v1/developer/businesses takes search, status (prospect, active, paused or closed), region, limit and cursor. Its search looks in the name, city and website, or for a tag that matches exactly: never in what the answer leaves out, so it can't confirm a business's email, phone or address. Each has its id, name, status, summary, website, city, postalCode, region, tags, listingCount, createdAt and updatedAt.

GET /v1/developer/businesses/{id} adds listings.

Paging

A full page has a nextCursor. Send it back as cursor until an answer has none.

curl -sS "https://api.usehalo.net/v1/developer/listings?status=published&limit=200&cursor=$CURSOR" \
  -H "Authorization: Bearer $HALO_API_KEY"

The list of websites doesn't page. It holds up to 200, with truncated: true if more match.

These routes count toward your requests a minute, and not the daily row budget, which is for data.query.

What's left out

A directory holds details about people, so these routes never answer with them:

  • The people at a business: no contact's name, email or phone

  • A business's own email and phone, and a listing's email, which are often someone's own

  • A business's street address, and who at your organization looks after it

  • Notes, tasks, plans and prices

  • What's waiting in the Inbox

A listing's phone is there: it's the number its page gives visitors, public business information like its address, and what a feed puts on your website. The same goes for the MCP server. The directory's tables in Halo Data have no phone numbers at all. To reach a business, someone with access opens it in Halo CRM.

To hear about changes rather than ask for them, use webhooks.