Quickstart
Every business has a slug (find it in the dashboard, under Build). Read its full context with a single request — no key needed for public fields:
GET https://tryfoundly.com/api/c/<slug>/context
{
"name": "Radiance Med Spa",
"category": "med-spa",
"services": ["Botox", "Microneedling", "Morpheus8"],
"hours": "Mon–Fri 9 AM–6 PM",
"open_now": true,
"open_status": "Open now · until 6 PM",
"price_range": "$20–$160",
"contact": { "phone": "…", "booking_url": "…" },
"freshness": { "last_updated": "…" },
"live": { "mcp_endpoint": "https://tryfoundly.com/api/c/<slug>/mcp" },
"verified_owner": true
}Ways to build
/api/c/<slug>/contextThe full verified context as JSON. CORS-open — read it from any site, app, or AI, right in the browser. This is the one you’ll use most.
/api/v1/businessThe same business behind an API key (higher limits, usage metering). Create and manage keys in the dashboard under Build. Send Authorization: Bearer <key>.
/api/c/<slug>/mcpModel Context Protocol endpoint. Point Claude, ChatGPT, Vapi, or any agent at it and it queries the business live — including real-time availability and offerings.
/api/c/<slug>/openapi.jsonA ready OpenAPI 3 spec — import it into a Custom GPT’s Actions to let it read the business with no code.
/api/c/<slug>/embed.jsOne-line bind script for any website. Tag elements with data-foundly="phone|hours|services|…" and they fill live and update when the record changes.
Put it on any site
<script src="https://tryfoundly.com/api/c/<slug>/embed.js" defer></script> <span data-foundly="name"></span> <div data-foundly="hours"></div> <a data-foundly="contact.booking_url" data-foundly-attr="href">Book</a> <ul data-foundly="services" data-foundly-list></ul>
Change a value once in Foundly and every page that binds it updates on next load — no rebuild.
Stay in sync — webhooks
Subscribe a URL in the dashboard (Build → Webhooks). Whenever the context changes, Foundly POSTs a signed event — so your app stays current without polling.
POST <your endpoint>
X-Foundly-Signature: sha256=<hmac of the raw body, keyed by your secret>
{
"event": "context.updated",
"place_id": "…",
"context_url": "https://tryfoundly.com/api/c/<slug>/context",
"changed": ["hours", "service_details"],
"at": "2026-09-26T20:00:00Z"
}Verify each delivery (Node):
import crypto from "crypto";
function verify(rawBody, signature, secret) {
const expected = "sha256=" +
crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
}Authentication
Public context fields need no key. For higher limits or the keyed API, create a key in the dashboard (Build → Developer API keys) — it’s bound to one business and read-only. Pass it as Authorization: Bearer <key>. Webhook secrets sign deliveries; rotate by removing and re-adding a webhook.