FOUNDLY · CONTEXT PLATFORM

Build anything on a business’s live context.

One verified, always-current record per business — delivered as a REST API, an MCP endpoint, an OpenAI Actions manifest, an embeddable script, and change webhooks. Read it, build on it, and stay in sync. Reference, don’t copy.

# Everything about a business, live (public, CORS-open)
curl https://tryfoundly.com/api/c/<slug>/context

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

GET/api/c/<slug>/context

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

GET/api/v1/business

The same business behind an API key (higher limits, usage metering). Create and manage keys in the dashboard under Build. Send Authorization: Bearer <key>.

POST/api/c/<slug>/mcp

Model Context Protocol endpoint. Point Claude, ChatGPT, Vapi, or any agent at it and it queries the business live — including real-time availability and offerings.

GET/api/c/<slug>/openapi.json

A ready OpenAPI 3 spec — import it into a Custom GPT’s Actions to let it read the business with no code.

GET/api/c/<slug>/embed.js

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

Looking for the market data API (rankings, coverage across every business)? See /developers.