{"openapi":"3.0.3","info":{"title":"Trillboards Public API Index","version":"2026-03-09T00:00:00.000Z","description":"Machine-readable catalog of Trillboards' public API surfaces for humans, SDKs,\nand AI agents.\n\nUse this document as the canonical discovery entrypoint. It does not attempt to\nflatten every API into one giant contract. Instead, it points to the correct\nOpenAPI spec and interactive documentation for each public surface:\n\n- Partner API for device registration, ad serving, and partner webhooks\n- Proof-of-Play API for cryptographically signed impression verification\n- Attribution API for closed-loop DOOH measurement\n- Programmatic & FEIN API for OpenRTB, VAST, OMSDK, audience intelligence, and FEIN\n- Content Intelligence API for content performance, recommendations, semantic search, and audience correlation\n- OpenRTB Extensions spec for outbound bid-request signal schemas\n- Attribution Data Model Ontology for the measurement data layer\n\nAI agents should combine this index with `https://api.trillboards.com/llms.txt`\nand `https://api.trillboards.com/.well-known/adagents.json`.\n","contact":{"name":"Trillboards Developer Support","email":"developers@trillboards.com"}},"servers":[{"url":"https://api.trillboards.com","description":"Production"}],"tags":[{"name":"API Catalog","description":"Raw machine-readable specs for each public API surface"},{"name":"Interactive Documentation","description":"Human-readable interactive documentation"},{"name":"AI Discovery","description":"AI-agent discovery documents and transports"},{"name":"Public Utilities","description":"Unauthenticated utility endpoints that are live in production but were not\npreviously listed in any OpenAPI document.\n"}],"paths":{"/docs/openapi/partner-api.yaml":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[],"tags":["API Catalog"],"operationId":"getPartnerApiSpec","summary":"Raw Partner API OpenAPI YAML","description":"Device registration, ad serving, the CTV SDK & CSI surface, sensing,\ndevice provisioning and federated learning. This is the largest public\nsurface and the one a supply-side integrator needs.\n","responses":{"200":{"description":"Partner API OpenAPI 3.0.3 document","content":{"text/yaml":{"schema":{"type":"string"},"example":"openapi: 3.0.3\ninfo:\n  title: Trillboards Partner API\n  version: 1.2.0\n"}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -sS https://api.trillboards.com/docs/openapi/partner-api.yaml"}]}},"/docs/openapi/dsp-api.yaml":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[],"tags":["API Catalog"],"operationId":"getDspApiSpec","summary":"Raw DSP API OpenAPI YAML","description":"The demand-side contract — onboarding, adslots, forecast, discovery,\nbidding, creatives, campaigns, deals and reporting under\n`/openrtb/v2`. Listed in `x-trillboards-public-specs` since this\ncatalogue was created; the path entry was missing until 2026-09-01\neven though the file has always answered `200`.\n","responses":{"200":{"description":"DSP API OpenAPI 3.0.3 document","content":{"text/yaml":{"schema":{"type":"string"},"example":"openapi: 3.0.3\ninfo:\n  title: Trillboards DSP API\n  version: 1.0.0\n"}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -sS https://api.trillboards.com/docs/openapi/dsp-api.yaml"}]}},"/docs/openapi/proof-of-play.yaml":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[],"tags":["API Catalog"],"operationId":"getProofOfPlayApiSpec","summary":"Raw Proof-of-Play API OpenAPI YAML","description":"Cryptographically signed impression proofs. Verify them against the\nEd25519 public keys at `/.well-known/jwks.json`.\n","responses":{"200":{"description":"Proof-of-Play API OpenAPI 3.0.3 document","content":{"text/yaml":{"schema":{"type":"string"},"example":"openapi: 3.0.3\ninfo:\n  title: Trillboards Proof-of-Play API\n  version: 2.0.0\n"}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -sS https://api.trillboards.com/docs/openapi/proof-of-play.yaml"}]}},"/docs/openapi/attribution-api.yaml":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[],"tags":["API Catalog"],"operationId":"getAttributionApiSpec","summary":"Raw Attribution API OpenAPI YAML","description":"Closed-loop DOOH measurement — conversion ingestion, campaign\nattribution reads, incrementality and experiments.\n","responses":{"200":{"description":"Attribution API OpenAPI 3.0.3 document","content":{"text/yaml":{"schema":{"type":"string"},"example":"openapi: 3.0.3\ninfo:\n  title: Trillboards Attribution & Measurement API\n  version: 1.0.0\n"}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -sS https://api.trillboards.com/docs/openapi/attribution-api.yaml"}]}},"/docs/openapi/programmatic-api.yaml":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[],"tags":["API Catalog"],"operationId":"getProgrammaticApiSpec","summary":"Raw Programmatic & FEIN API OpenAPI YAML","description":"OpenRTB, VAST, OMSDK, audience intelligence and FEIN. The authoritative\ncontract for the four `/openrtb/v2/fein/*` operations catalogued below.\n","responses":{"200":{"description":"Programmatic/OpenRTB/FEIN OpenAPI 3.0.3 document","content":{"text/yaml":{"schema":{"type":"string"},"example":"openapi: 3.0.3\ninfo:\n  title: Trillboards Programmatic & FEIN API\n  version: 2026-03-09\n"}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -sS https://api.trillboards.com/docs/openapi/programmatic-api.yaml"}]}},"/docs/openapi/partner-webhooks.yaml":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[],"tags":["API Catalog"],"operationId":"getPartnerWebhooksSpec","summary":"Raw Partner Webhooks OpenAPI YAML","description":"The outbound webhook event catalogue, as OpenAPI 3.1 (`webhooks:` is a\n3.1 keyword). Describes what Trillboards POSTs to a subscriber\nendpoint; the subscription-management endpoints live in the Partner API\nspec. This file is GENERATED — regenerate with\n`node scripts/generate-webhook-spec.js`, never edit it by hand.\n","responses":{"200":{"description":"Partner Webhooks OpenAPI 3.1.0 document","content":{"text/yaml":{"schema":{"type":"string"},"example":"# GENERATED FILE — DO NOT EDIT BY HAND.\n#\n# Regenerate with:  node scripts/generate-webhook-spec.js\n"}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -sS https://api.trillboards.com/docs/openapi/partner-webhooks.yaml"}]}},"/docs/openapi/openrtb-extensions.yaml":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[],"tags":["API Catalog"],"operationId":"getOpenRtbExtensionsSpec","summary":"Raw OpenRTB 2.6 extensions schema YAML","description":"Schema reference for the proprietary bid-request extensions we emit.\nDeclares ZERO paths — it is a schema catalogue, which is why its\nrendered form lives in the guides layer at\n`/docs/guides/openrtb-extensions` and not as a Scalar reference.\n","responses":{"200":{"description":"OpenRTB extension schema reference","content":{"text/yaml":{"schema":{"type":"string"},"example":"openapi: 3.0.3\ninfo:\n  title: Trillboards OpenRTB 2.6 Extension Schema Reference\n  version: 2026-03-v1\n"}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -sS https://api.trillboards.com/docs/openapi/openrtb-extensions.yaml"}]}},"/docs/openapi/attribution-data-models.yaml":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[],"tags":["API Catalog"],"operationId":"getAttributionDataModelsSpec","summary":"Raw attribution data-model ontology YAML","description":"The 6-layer DOOH measurement data model. Like `openrtb-extensions.yaml`\nit declares ZERO paths and renders at\n`/docs/guides/attribution-data-models`.\n","responses":{"200":{"description":"Attribution ontology and schema catalog","content":{"text/yaml":{"schema":{"type":"string"},"example":"openapi: 3.0.3\ninfo:\n  title: Trillboards Attribution Data Model Ontology\n  version: 1.0.0\n"}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -sS https://api.trillboards.com/docs/openapi/attribution-data-models.yaml"}]}},"/openrtb/v2/fein/content-performance/{videoId}":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[{"apiKeyAuth":[]}],"tags":["API Catalog"],"operationId":"getContentPerformance","summary":"Content performance metrics for a video across the network","description":"Returns plays, attention, audience size, venue distribution, daypart\ndistribution, and top screens for a single video. Requires `X-API-Key`\nwith read permission.\n","externalDocs":{"description":"Authoritative contract (parameters, errors, full schema)","url":"https://api.trillboards.com/docs/openapi/programmatic-api.yaml"},"responses":{"200":{"description":"Aggregated content performance data","content":{"application/json":{"example":{"videoId":"vid_9c1b0d2e3f4a","title":"Summer Refresh 15s","totalPlays":1247,"uniqueScreens":38,"avgAttention":0.72,"avgAudienceSize":4.6,"avgDwellMs":3820,"venueDistribution":[{"venue_type":"retail","plays":742},{"venue_type":"transit","plays":505}],"daypartDistribution":[{"daypart":"morning","plays":402},{"daypart":"afternoon","plays":611},{"daypart":"evening","plays":234}],"topScreens":[{"screenId":"6512a9f3c4d5e6f708192a3b","plays":96,"avgAttention":0.81}],"period":{"start":"2026-08-25","end":"2026-09-01"}}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -sS \"https://api.trillboards.com/openrtb/v2/fein/content-performance/vid_9c1b0d2e3f4a\" \\\n  -H \"X-API-Key: $TRILLBOARDS_API_KEY\"\n"}]}},"/openrtb/v2/fein/content-recommendations":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[{"apiKeyAuth":[]}],"tags":["API Catalog"],"operationId":"getContentRecommendations","summary":"Best-performing content for a venue, time, and audience context","description":"Ranks content by a composite performance score (attention, replay\ndensity, dwell time) for a given venue type and optional daypart.\nRequires `X-API-Key` with read permission.\n","externalDocs":{"description":"Authoritative contract (parameters, errors, full schema)","url":"https://api.trillboards.com/docs/openapi/programmatic-api.yaml"},"responses":{"200":{"description":"Ranked content recommendations","content":{"application/json":{"example":{"data":[{"videoId":"vid_9c1b0d2e3f4a","title":"Summer Refresh 15s","contentCategory":"beverage","durationSeconds":15,"totalPlays":1247,"uniqueScreens":38,"avgAttention":0.72,"avgDwellMs":3820,"performanceScore":0.81}],"meta":{"count":1,"venue_type":"retail","daypart":"afternoon","limit":10}}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -sS \"https://api.trillboards.com/openrtb/v2/fein/content-recommendations?venue_type=retail&daypart=afternoon\" \\\n  -H \"X-API-Key: $TRILLBOARDS_API_KEY\"\n"}]}},"/openrtb/v2/fein/content-semantic-search":{"post":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[{"apiKeyAuth":[]}],"tags":["API Catalog"],"operationId":"searchContentSemantic","summary":"Natural language search over content embeddings (768-D pgvector)","description":"Embeds a natural language query and returns content ordered by cosine\nsimilarity against 768-D content review embeddings. Requires\n`X-API-Key` with read permission.\n","externalDocs":{"description":"Authoritative contract (request body, errors, full schema)","url":"https://api.trillboards.com/docs/openapi/programmatic-api.yaml"},"responses":{"200":{"description":"Semantically similar content results","content":{"application/json":{"example":{"data":[{"videoId":"vid_9c1b0d2e3f4a","title":"Summer Refresh 15s","contentCategory":"beverage","description":"Fifteen-second spot, outdoor picnic setting.","durationSeconds":15,"reviewStatus":"approved","similarity":0.87}],"meta":{"count":1,"query":"family friendly cooking content","limit":10,"minSimilarity":0.5}}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -sS -X POST \"https://api.trillboards.com/openrtb/v2/fein/content-semantic-search\" \\\n  -H \"X-API-Key: $TRILLBOARDS_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"query\":\"family friendly cooking content\",\"limit\":10}'\n"}]}},"/openrtb/v2/fein/content-audience-correlation":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[{"apiKeyAuth":[]}],"tags":["API Catalog"],"operationId":"getContentAudienceCorrelation","summary":"Content category x audience demographic breakdown","description":"Cross-tabulates content categories with audience metrics (attention,\nface count, dwell time, receptivity) per venue type. Requires\n`X-API-Key` with read permission.\n","externalDocs":{"description":"Authoritative contract (parameters, errors, full schema)","url":"https://api.trillboards.com/docs/openapi/programmatic-api.yaml"},"responses":{"200":{"description":"Content-audience correlation matrix","content":{"application/json":{"example":{"data":[{"contentCategory":"beverage","venueType":"retail","totalPlays":742,"avgAttention":0.72,"avgFaceCount":4.6,"avgDwellMs":3820,"avgReceptivity":0.64}],"meta":{"count":1,"days":7,"content_category":"beverage","venue_type":"retail"}}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -sS \"https://api.trillboards.com/openrtb/v2/fein/content-audience-correlation?days=7&venue_type=retail\" \\\n  -H \"X-API-Key: $TRILLBOARDS_API_KEY\"\n"}]}},"/docs":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[],"tags":["Interactive Documentation"],"operationId":"openApiReference","summary":"Interactive API reference — all four surfaces","description":"One Scalar UI over FOUR documents, grouped by the credential you hold:\n`#partner` (supply, CTV SDK & CSI, sensing, device provisioning,\nfederated learning), `#demand` (DSP + programmatic serving),\n`#measurement` (attribution + proof-of-play), and `#data`. A fifth\nsection, `#webhooks`, describes what we POST to you.\n\nThe page is a thin shell: it loads the Scalar client from\n`cdn.jsdelivr.net` and the four bundled documents from this origin.\n","responses":{"200":{"description":"Scalar UI over the four bundled reference documents","content":{"text/html":{"schema":{"type":"string"},"example":"<!doctype html>\n<html>\n  <head>\n    <title>Scalar API Reference</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"https://cdn.jsdelivr.net/npm/@scalar/api-reference\"></script>\n  </body>\n</html>\n"}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -sS https://api.trillboards.com/docs"}]}},"/docs/guides":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[],"tags":["Interactive Documentation"],"operationId":"openApiGuides","summary":"Quickstarts, integration guides, schema references and examples","description":"The task-shaped half of the documentation. Individual pages live at\n`/docs/guides/<slug>` with the raw markdown at `/docs/guides/<slug>.md`.\nIncludes the two endpoint-less schema catalogues —\n`/docs/guides/openrtb-extensions` and\n`/docs/guides/attribution-data-models` — which are derived from their\nOpenAPI documents at request time.\n\nThis index is also served as raw markdown at `/docs/guides.md`.\n","responses":{"200":{"description":"Guide index","content":{"text/html":{"schema":{"type":"string"},"example":"<!doctype html>\n<html><head><title>Trillboards API — Guides</title></head>\n<body><main id=\"content\">…rendered from /docs/guides.md…</main></body>\n</html>\n"}}}},"x-codeSamples":[{"lang":"Shell","label":"curl (markdown source)","source":"curl -sS https://api.trillboards.com/docs/guides.md"}]}},"/docs/errors":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[],"tags":["Interactive Documentation"],"operationId":"openErrorReference","summary":"Canonical error reference","description":"The 111-code error catalog as a rendered page. Every `doc_url` on an\nerror response points here. Raw markdown at `/docs/errors.md`; the\nmachine-readable form is `GET /v1/errors`.\n","responses":{"200":{"description":"Error reference","content":{"text/html":{"schema":{"type":"string"},"example":"<!doctype html>\n<html><head><title>Trillboards API — Error Reference</title></head>\n<body><main id=\"content\">…rendered from /docs/errors.md…</main></body>\n</html>\n"}}}},"x-codeSamples":[{"lang":"Shell","label":"curl (markdown source)","source":"curl -sS https://api.trillboards.com/docs/errors.md"}]}},"/docs/integrations/webhook-signature-verification.md":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[],"tags":["Public Utilities"],"operationId":"getWebhookSignatureGuide","summary":"Webhook signature verification guide","description":"Worked, copy-pasteable verification code for the webhook HMAC signature,\ncovering both live header formats and the replay-tolerance window.\n\nThis is the single source of truth the Partner API spec, the DSP API\nspec, the `@trillboards/api-client` SDK and the\n`/api/discover.globals.webhook_contract` manifest all derive from.\n","responses":{"200":{"description":"Markdown guide","content":{"text/markdown":{"schema":{"type":"string"},"example":"# Webhook signature verification\n\nCanonical contract for verifying Trillboards-emitted webhook deliveries.\nSingle source of truth — partner-api.yaml, dsp-api.yaml, the\n`@trillboards/api-client` SDK, and the `/api/discover.globals.webhook_contract`\nruntime manifest all derive from this document.\n"}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -sS https://api.trillboards.com/docs/integrations/webhook-signature-verification.md"}]}},"/llms.txt":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[],"tags":["AI Discovery"],"operationId":"getLlmsTxt","summary":"AI-readable documentation manifest","description":"A plain-text orientation document for AI agents: what Trillboards is,\nthe base URL, how to register, and where each spec lives. Pair it with\n`/.well-known/adagents.json`.\n","responses":{"200":{"description":"Top-level AI-readable docs index","content":{"text/plain":{"schema":{"type":"string"},"example":"# Trillboards\n\n## What Trillboards sells, and to whom\n## Try it with no key\n## Get a sandbox key in one call\n## Connect\n## Discovery files\n"}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -sS https://api.trillboards.com/llms.txt"}]}},"/llms-full.txt":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[],"tags":["AI Discovery"],"operationId":"getLlmsFullTxt","summary":"Every reference and guide in one plain-text file","description":"`/llms.txt` followed by the error reference, the monetization and\ninventory-security references, and every guide at `/docs/guides`, in\nfull. Built from the same files the docs pages render.\n","responses":{"200":{"description":"The full documentation as plain text","content":{"text/plain":{"schema":{"type":"string"},"example":"# Trillboards\n...\n---\n\n# Error reference\n# Source: https://api.trillboards.com/docs/errors.md\n"}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -sS https://api.trillboards.com/llms-full.txt"}]}},"/openapi.json":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[],"tags":["AI Discovery"],"operationId":"getOpenApiIndexJson","summary":"This index as JSON, at the root path agents try first","description":"The same document as `/docs/openapi.json`, served at the root with open\nCORS. It points at every reference: Partner, Demand, Measurement, Data\nand Webhooks.\n","responses":{"200":{"description":"The public API index","content":{"application/json":{"schema":{"type":"object"},"example":{"openapi":"3.0.3","info":{"title":"Trillboards Public API Index"}}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -sS https://api.trillboards.com/openapi.json"}]}},"/mcp/server-card":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[],"tags":["AI Discovery"],"operationId":"getMcpServerCard","summary":"MCP server card for /mcp","description":"The live server, described before you connect. An MCP Server Card\n(SEP-2127, valid against\n`https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json`):\nidentity, and `remotes` with the endpoint, its optional key header and\nthe protocol versions it speaks. It also carries the exact `tools/list`\nthe server answers, its resources, prompts and capabilities, and which\ntools need no key. Served as `application/mcp-server-card+json` with an\n`ETag`; also at `/.well-known/mcp/server-card.json` and\n`/.well-known/mcp.json`. The campaign planner's card is at\n`/mcp/advertiser/server-card`.\n","responses":{"200":{"description":"The server card","content":{"application/mcp-server-card+json":{"schema":{"type":"object"},"example":{"$schema":"https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json","name":"com.trillboards/dooh","version":"1.0.0","remotes":[{"type":"streamable-http","url":"https://api.trillboards.com/mcp","supportedProtocolVersions":["2025-11-25"]}],"endpoint":"https://api.trillboards.com/mcp","authentication":{"required":false,"schemes":["bearer"]}}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -sS https://api.trillboards.com/mcp/server-card"}]}},"/.well-known/ai-catalog.json":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[],"tags":["AI Discovery"],"operationId":"getAiCatalog","summary":"Every agent-facing document this host serves","description":"An AI Catalog (ai-catalog.io, `specVersion` 1.0): both MCP server cards\n(`/mcp` and the campaign planner at `/mcp/advertiser`), the OpenAPI\nindex, `llms.txt`, `llms-full.txt` and the AdCP documents, one entry\neach, every entry an `identifier`, a media `type` and a `url`.\n","responses":{"200":{"description":"The catalog","content":{"application/ai-catalog+json":{"schema":{"type":"object"},"example":{"specVersion":"1.0","host":{"displayName":"Trillboards","identifier":"trillboards.com"},"entries":[{"identifier":"urn:air:trillboards.com:mcp:dooh","type":"application/mcp-server-card+json","url":"https://api.trillboards.com/mcp/server-card"},{"identifier":"urn:air:trillboards.com:mcp:planner","type":"application/mcp-server-card+json","url":"https://api.trillboards.com/mcp/advertiser/server-card"}]}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -sS https://api.trillboards.com/.well-known/ai-catalog.json"}]}},"/.well-known/adagents.json":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[],"tags":["AI Discovery"],"operationId":"getAdagentsDiscovery","summary":"AdCP seller-agent discovery document","description":"The AdCP v3 discovery document: who to contact, what properties we\nrepresent, and which capabilities each one exposes. This is how an\nagent finds the MCP endpoint and the DSP spec without being told.\n","responses":{"200":{"description":"Authorized agent and property discovery metadata","content":{"application/json":{"example":{"$schema":"https://adcontextprotocol.org/schemas/v3/adagents.json","contact":{"name":"Trillboards","email":"partners@trillboards.com","domain":"trillboards.com"},"properties":[{"property_id":"trillboards_dooh_network","property_type":"dooh","name":"Trillboards DOOH Network","identifiers":[{"type":"domain","value":"trillboards.com"}],"supported_channels":["dooh"],"tags":["dooh","us_national","edge_ai","deterministic_audience"],"capabilities":{"programmatic_buying":{"openapi_spec":"https://api.trillboards.com/docs/openapi/dsp-api.yaml","endpoints":["POST /openrtb/v2/onboard","POST /openrtb/v2/bid"]}}}]}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -sS https://api.trillboards.com/.well-known/adagents.json"}]}},"/mcp":{"post":{"x-trillboards-agent-safe":false,"x-trillboards-idempotent":false,"x-trillboards-cost-tier":"free","security":[{},{"BearerAuth":[]}],"tags":["AI Discovery"],"operationId":"connectMcpServer","summary":"Trillboards MCP server","description":"Streamable HTTP MCP endpoint for AI-agent access to seller tools.\nSpeaks JSON-RPC 2.0 over POST; send `Accept: application/json,\ntext/event-stream`. Begin with `initialize`, then `tools/list`.\n\nTool categories: partner management, device management, impression\ntracking, analytics, webhooks and inventory discovery.\n","responses":{"200":{"description":"MCP protocol response","content":{"application/json":{"example":{"result":{"protocolVersion":"2024-11-05","capabilities":{"tools":{"listChanged":true},"resources":{"listChanged":true},"prompts":{"listChanged":true}},"serverInfo":{"name":"dooh-exchange","version":"1.0.0"}}}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl (initialize)","source":"curl -sS -X POST https://api.trillboards.com/mcp \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Accept: application/json, text/event-stream\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\n        \"protocolVersion\":\"2024-11-05\",\"capabilities\":{},\n        \"clientInfo\":{\"name\":\"my-agent\",\"version\":\"1.0.0\"}}}'\n"}]}},"/sellers.json":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[],"tags":["API Catalog"],"operationId":"getSellersJson","summary":"IAB sellers.json — authorized seller declarations","description":"The IAB OpenRTB sellers.json file listing every entity authorized to\nsell Trillboards DOOH inventory. No authentication. Cached for 24 hours.\n\nServed from the domain root because the IAB spec requires it there.\n","responses":{"200":{"description":"IAB sellers.json document","content":{"application/json":{"example":{"sellers":[{"name":"Trillboards","domain":"trillboards.com","seller_id":"trillboards","seller_type":"PUBLISHER","is_passthrough":0,"is_confidential":0},{"name":"Curb Mobility LLC","domain":"gocurb.com","seller_id":"curb-mobility","seller_type":"PUBLISHER","is_passthrough":0,"is_confidential":0}]}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -sS https://api.trillboards.com/sellers.json"}]}},"/.well-known/jwks.json":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[],"tags":["Public Utilities"],"operationId":"getJwks","summary":"Ed25519 public keys (JWKS)","description":"The JSON Web Key Set holding our Ed25519 **public** signing keys. Use it to\nverify AdCP RFC 9421 HTTP Message Signatures (`Signature` /\n`Signature-Input` / `Content-Digest`) on requests and webhooks we send.\n\nNo authentication. Cached for one hour (`Cache-Control: public, max-age=3600`).\n\nA key whose material is not configured is **omitted**, so `keys` can be a\nvalid empty array — treat an empty set as \"no key published right now\",\nnot as an error, and do not cache a lookup failure as a verification failure.\n\nMatch on `kid`, never on position: several `kid`s may share one `x` value,\nso key material alone does not identify the signer.\n\nThis is not the webhook HMAC scheme. Partner webhook signatures are\nshared-secret HMAC-SHA256 (`X-Trillboards-Signature`) and are not verified\nwith these keys.\n","responses":{"200":{"description":"JSON Web Key Set","headers":{"Cache-Control":{"schema":{"type":"string","example":"public, max-age=3600"}}},"content":{"application/json":{"schema":{"type":"object","required":["keys"],"properties":{"keys":{"type":"array","description":"Published public keys. MAY be empty.","items":{"type":"object","required":["kty","crv","x","kid","alg","use","key_ops"],"properties":{"kty":{"type":"string","enum":["OKP"]},"crv":{"type":"string","enum":["Ed25519"]},"x":{"type":"string","description":"base64url-encoded public key"},"kid":{"type":"string","description":"Key id, matched against the signature's `keyid`"},"alg":{"type":"string","enum":["EdDSA"]},"use":{"type":"string","enum":["sig"]},"key_ops":{"type":"array","items":{"type":"string","enum":["verify"]}},"adcp_use":{"type":"string","description":"Present on the AdCP key only.","enum":["request-signing"]}}}}}},"example":{"keys":[{"kty":"OKP","crv":"Ed25519","x":"VQzj5AmA51mAdCWjZcbNdaaFypNateSjM-zOASqcrSU","kid":"proof-v2-2026","alg":"EdDSA","use":"sig","key_ops":["verify"]},{"kty":"OKP","crv":"Ed25519","x":"VQzj5AmA51mAdCWjZcbNdaaFypNateSjM-zOASqcrSU","kid":"adcp-ed25519-2026","alg":"EdDSA","use":"sig","key_ops":["verify"],"adcp_use":"request-signing"}]}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -sS https://api.trillboards.com/.well-known/jwks.json"}]}},"/v1/taxonomy/openooh":{"get":{"x-trillboards-agent-safe":true,"x-trillboards-idempotent":true,"x-trillboards-cost-tier":"free","security":[],"tags":["Public Utilities"],"operationId":"getOpenOohTaxonomy","summary":"OpenOOH venue taxonomy","description":"The OpenOOH venue-type taxonomy used by `openooh_venue_type_id` across the\nPartner and DSP APIs, as a three-level tree. No authentication.\n\n`children` and `grandchildren` carry a `parent` key referencing the level\nabove; `parents` do not. The response contains only `key`, `id`, `name`\n(and `parent` where applicable) — no other attributes are exposed.\n\nAlso reachable at `/api/v1/taxonomy/openooh`; both paths serve the same\nhandler.\n","responses":{"200":{"description":"The venue taxonomy","content":{"application/json":{"schema":{"type":"object","required":["status","data"],"properties":{"status":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["parents","children","grandchildren"],"properties":{"parents":{"type":"array","items":{"type":"object","required":["key","id","name"],"properties":{"key":{"type":"string"},"id":{"type":"integer"},"name":{"type":"string"}}}},"children":{"type":"array","items":{"$ref":"#/components/schemas/TaxonomyChildNode"}},"grandchildren":{"type":"array","items":{"$ref":"#/components/schemas/TaxonomyChildNode"}}}}}},"example":{"status":true,"data":{"parents":[{"key":"transit","id":1,"name":"Transit"},{"key":"retail","id":2,"name":"Retail"}],"children":[{"key":"airports","id":101,"parent":"transit","name":"Airports"},{"key":"buses","id":102,"parent":"transit","name":"Buses"}],"grandchildren":[{"key":"arrivals_hall","id":10101,"parent":"airports","name":"Arrival Hall"}]}}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -sS https://api.trillboards.com/v1/taxonomy/openooh"}]}}},"x-trillboards-public-specs":[{"id":"partner","title":"Trillboards Partner API","yaml_url":"https://api.trillboards.com/docs/openapi/partner-api.yaml","ui_url":"https://api.trillboards.com/docs#partner","audience":"partners_and_screen_integrators"},{"id":"proof-of-play","title":"Trillboards Proof-of-Play API","yaml_url":"https://api.trillboards.com/docs/openapi/proof-of-play.yaml","ui_url":"https://api.trillboards.com/docs#measurement","audience":"advertisers_and_auditors"},{"id":"attribution","title":"Trillboards Attribution API","yaml_url":"https://api.trillboards.com/docs/openapi/attribution-api.yaml","ui_url":"https://api.trillboards.com/docs#measurement","audience":"advertisers_and_measurement_partners"},{"id":"programmatic","title":"Trillboards Programmatic & FEIN API","yaml_url":"https://api.trillboards.com/docs/openapi/programmatic-api.yaml","ui_url":"https://api.trillboards.com/docs#demand","audience":"dsp_ssp_and_data_consumers"},{"id":"dsp","title":"Trillboards DSP API","yaml_url":"https://api.trillboards.com/docs/openapi/dsp-api.yaml","ui_url":"https://api.trillboards.com/docs#demand","audience":"demand_side_platforms_and_agencies"},{"id":"openrtb-extensions","title":"Trillboards OpenRTB 2.6 Extensions","yaml_url":"https://api.trillboards.com/docs/openapi/openrtb-extensions.yaml","ui_url":"https://api.trillboards.com/docs/guides/openrtb-extensions","audience":"bidding_algorithms_and_signal_consumers"},{"id":"attribution-data-models","title":"Trillboards Attribution Data Model Ontology","yaml_url":"https://api.trillboards.com/docs/openapi/attribution-data-models.yaml","ui_url":"https://api.trillboards.com/docs/guides/attribution-data-models","audience":"measurement_engineers_and_warehouse_consumers"},{"id":"partner-webhooks","title":"Trillboards Partner Webhooks","yaml_url":"https://api.trillboards.com/docs/openapi/partner-webhooks.yaml","ui_url":"https://api.trillboards.com/docs#webhooks","audience":"partners_and_screen_integrators"}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","description":"A Trillboards platform API key, `Authorization: Bearer <platform_api_key>`.\nOn `/mcp` the open tools (`get_products`, `get_pricing`,\n`register_partner` and the discovery tools) answer without one;\n`register_partner` returns a sandbox key in one call.\n"},"apiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"FEIN API key with read permission (see programmatic-api.yaml)."}},"schemas":{"TaxonomyChildNode":{"type":"object","required":["key","id","parent","name"],"properties":{"key":{"type":"string"},"id":{"type":"integer"},"parent":{"type":"string","description":"The `key` of the node one level up"},"name":{"type":"string"}}}}}}