# SparkleTree Campaign Pages > Live, server-rendered brand campaign pages with schema.org JSON-LD, served > at the edge. Each page presents a brand's currently active campaign content > and stays up to date as the campaign changes. ## Discovery - [Brand home](https://staging-campaigns.sparkletree.io/): the site root — a server-rendered brand home page listing the brand's live campaigns (on the platform host, a directory of all public campaigns). - [Sitemap](https://staging-campaigns.sparkletree.io/sitemap.xml): all public campaign pages. - Campaign page URLs follow the shape https://staging-campaigns.sparkletree.io/c/{campaign-id}/{slug}. ## Machine-readable campaign data - Every campaign page and the brand home also serve text/markdown: request the same URL with "Accept: text/markdown" for a token-lean variant carrying the same facts (headline, brand, call to action) front-loaded. - GET https://staging-campaigns.sparkletree.io/api/embed/v1/content?campaign={campaign-uuid} returns campaign content as JSON. On a brand domain the host identifies the organization; on shared hosts add organization={org-uuid}. AI agents receive the campaign's canonical variant — the same creative the campaign page shows; live display surfaces may rotate variants. ## Ask - POST https://staging-campaigns.sparkletree.io/ask with JSON body {"question": "...", "campaign": "{campaign-uuid}"} returns JSON {"answer", "campaign": {"id","name","url"}, "links", "homeCampaignId", "session"} — grounded answers about that campaign. - The campaign UUID is the {campaign-id} segment of any campaign page URL (see the sitemap). On a brand domain "campaign" may be omitted — the question then runs against the brand's whole live roster (a brand concierge): the response carries "campaign" and "links" only when the answer recommends a specific campaign, and no "homeCampaignId". "organization": "{org-uuid}" is accepted but never required. - Multi-turn: echo the response's "session" in the next request body to continue the same conversation with history. Brand-scope conversations (no "campaign") move across campaigns without losing history. - With a pinned campaign, the answer may recommend a sibling campaign of the same brand; the response's "campaign" and "links" then carry that recommended campaign's identity, page URL, and call to action, while "homeCampaignId" keeps naming the campaign the conversation is grounded in. ## Agent card - [Agent card](https://staging-campaigns.sparkletree.io/.well-known/agent-card.json): machine-readable description of this site and its /ask skill for AI agents. ## Agent discovery - [API catalog](https://staging-campaigns.sparkletree.io/.well-known/api-catalog): RFC 9727 linkset of this host's public APIs; OpenAPI at https://staging-campaigns.sparkletree.io/.well-known/openapi.json. - [Agent skills](https://staging-campaigns.sparkletree.io/.well-known/agent-skills/index.json): task-oriented SKILL.md guides for asking, fetching content, and discovery. - [MCP server card](https://staging-campaigns.sparkletree.io/.well-known/mcp/server-card.json): the platform MCP server behind this site (campaign management, analytics; OAuth-protected). - [Authentication guide](https://staging-campaigns.sparkletree.io/auth.md): this host needs no auth; the guide covers OAuth registration for the platform MCP server.