{"openapi":"3.0.3","info":{"title":"Canondex","version":"0.1.0","description":"Canondex is an index of curated public-data directories. GET /v1/discover returns a tenant pointer (next.url), not listings. Metered with X-Api-Key. Demo key canondex_dev_discover_000. Pricing draft $0/$29/$99/$249. Stripe Checkout is not live (stripe.wired=false). SameRead is the first tenant (food inspections)."},"servers":[{"url":"https://canondex.com"},{"url":"https://canondex.ai"},{"url":"https://directory-of-directories.itiriumgroup.workers.dev"}],"paths":{"/v1/discover":{"get":{"operationId":"discover","summary":"Find a live directory pointer for an intent and geo","parameters":[{"name":"intent","in":"query","required":true,"schema":{"type":"string","enum":["food_inspections","realtors","trade_licenses","childcare_ops","chiropractors","nursing_homes","k12_schools","pharmacies","osha_inspections","building_permits","hospitals","home_health","hospice","dialysis","dentists","physical_therapists","optometrists","business_licenses","banks","colleges"]}},{"name":"country","in":"query","required":false,"schema":{"type":"string"}},{"name":"state","in":"query","required":false,"schema":{"type":"string"}},{"name":"county","in":"query","required":false,"schema":{"type":"string"}},{"name":"city","in":"query","required":false,"schema":{"type":"string"}},{"name":"stale","in":"query","required":false,"schema":{"type":"string","enum":["true","1","false","0"]}}],"security":[{"ApiKeyHeader":[]},{"BearerAuth":[]}],"responses":{"200":{"description":"Pointer matches (may be empty)","content":{"application/json":{"schema":{"type":"object","required":["query","matches","note"],"properties":{"query":{"type":"object"},"matches":{"type":"array","items":{"type":"object","properties":{"directoryId":{"type":"string"},"title":{"type":"string"},"status":{"type":"string"},"fresh":{"type":"boolean"},"geoId":{"type":"string"},"metering":{"type":"string"},"next":{"type":"object","properties":{"method":{"type":"string"},"url":{"type":"string"},"mcp":{},"auth":{}}}}}},"note":{"type":"string"}}}}}},"400":{"description":"intent missing"},"401":{"description":"missing or unknown API key"},"402":{"description":"quota exceeded (billing stub; no payment_url)"}}}},"/v1/mcp/tools":{"get":{"operationId":"listMcpTools","summary":"List MCP tools. Unmetered. Worker MCP HTTP, not Streamable HTTP.","responses":{"200":{"description":"{ tools: [{ name, description, inputSchema }] }"}}}},"/v1/mcp/call":{"post":{"operationId":"callMcpTool","summary":"Call discover. Same JSON and ledger as GET /v1/discover.","security":[{"ApiKeyHeader":[]},{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","enum":["discover"]},"arguments":{"type":"object","required":["intent"],"properties":{"intent":{"type":"string"},"country":{"type":"string"},"state":{"type":"string"},"county":{"type":"string"},"city":{"type":"string"},"stale":{"type":"boolean"}}}}}}}},"responses":{"200":{"description":"Same pointer JSON as GET /v1/discover"},"400":{"description":"unknown tool or intent missing"},"401":{"description":"missing or unknown API key"},"402":{"description":"quota exceeded (billing stub; no payment_url)"}}}},"/llms.txt":{"get":{"operationId":"llmsTxt","summary":"Agent instructions","responses":{"200":{"description":"text/plain"}}}},"/openapi.json":{"get":{"operationId":"openapi","summary":"This document","responses":{"200":{"description":"application/json"}}}},"/health":{"get":{"operationId":"health","summary":"Liveness; reports stripe.wired","responses":{"200":{"description":"application/json"}}}},"/v1/billing/checkout":{"post":{"operationId":"createCheckoutSession","summary":"Create a Stripe Checkout session. Not live. Returns 501 unless wired.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["tier","successUrl","cancelUrl"],"properties":{"tier":{"type":"string","enum":["starter","operator","build"]},"customerId":{"type":"string"},"successUrl":{"type":"string"},"cancelUrl":{"type":"string"}}}}}},"responses":{"200":{"description":"{ url } when wired"},"400":{"description":"free tier, unknown tier, or missing fields"},"501":{"description":"not_wired; Stripe Checkout is not live"}}}},"/v1/billing/portal":{"post":{"operationId":"createPortalSession","summary":"Create a Stripe Customer Portal session. Not live. Returns 501 unless wired.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["customerId","returnUrl"],"properties":{"customerId":{"type":"string"},"returnUrl":{"type":"string"}}}}}},"responses":{"200":{"description":"{ url } when wired"},"400":{"description":"missing customerId or returnUrl"},"501":{"description":"not_wired; Stripe Checkout is not live"}}}},"/v1/billing/webhook":{"post":{"operationId":"handleStripeWebhook","summary":"Verify Stripe-Signature. Not live. Returns 501 unless wired. Does not enroll quota.","parameters":[{"name":"Stripe-Signature","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ received: true } when the signature verifies"},"400":{"description":"bad_signature"},"501":{"description":"not_wired; Stripe Checkout is not live"}}}}},"components":{"securitySchemes":{"ApiKeyHeader":{"type":"apiKey","in":"header","name":"X-Api-Key"},"BearerAuth":{"type":"http","scheme":"bearer"}}}}