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.
| Query | Means |
|---|---|
search | Text to look for in the name, city, address, phone, website or business, or a tag that matches it exactly |
status | draft, published or archived. Left out, every status the person can see |
kind | One kind, by its key, such as restaurant |
region | One region, by its key |
limit | Up to 200 a page. Default 100 |
cursor | The 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.