{"openapi":"3.1.0","info":{"title":"Open Call Portals — Read-only Agent API","description":"Public GET-only discovery of active listings, live events, the platform schema, and exact live opportunities. This document intentionally contains no form handoff or mutation operations.","version":"1.5.0","contact":{"url":"https://opencallportal.com"}},"servers":[{"url":"https://opencallportal.com/api","description":"Production"}],"paths":{"/agent/listings":{"get":{"operationId":"searchListings","summary":"Search open calls or provider availability","description":"Searches open calls or availability according to the speaker's perspective. Talent looking for gigs, jobs, opportunities, or work gets demand-side open calls. Venue managers, private event hosts, restaurants, and other buyers saying they need, want to find, hire, or book a provider get supply-side availability. Explicit requests to post, find, or search open calls always remain demand-side open-call searches. Natural phrases such as 'DJ gig Amsterdam', 'Texas Holdem poker opportunity', and 'analog listening sessions' resolve through a deterministic portal-scoped vocabulary. Returns venues and event hosts seeking DJs, live bands, comedians, artists, content creators, event crew, solopreneurs, and more. All active and PII-free.","parameters":[{"name":"query","in":"query","required":true,"description":"Always pass the user's complete original wording here. This field is sufficient for natural-language searches: speaker perspective selects open calls or availability, explicit open-call wording takes priority, and the server extracts safe portal, location, genre/category, and subtype aliases across every active vertical. Prefer query-only rather than guessing portalId, genre, or type.","schema":{"type":"string"}},{"name":"portalId","in":"query","description":"Optional explicit canonical override only. Do not infer or guess this from a role phrase; omit it and let query resolve the vertical. Use only when the caller supplied an exact canonical ID. Demand IDs: dj, lb, cc, fs, ec, darts, casting, cue-sports, golf-society, liquor-supply, solopreneur, artist, gh, comedian, demo, poker, bowling, local-produce, coworking, dance-acts. Supply IDs use the corresponding availability ID, such as dj-availability, lb-availability, gh-availability, casting-crew-availability, or artist-professional-availability.","schema":{"type":"string"}},{"name":"location","in":"query","description":"Suburb/town/city/region/country. Hierarchical matching includes broader parent areas and child locations.","schema":{"type":"string"}},{"name":"genre","in":"query","description":"Optional explicit canonical override only. Do not infer or guess this field from the request; query already performs portal-scoped normalization for music genres, art forms, produce categories, liquor styles, and business specialties.","schema":{"type":"string"}},{"name":"type","in":"query","description":"Optional explicit canonical subtype override only. Do not synthesize this from role nouns such as DJ, band, model, organiser, supplier, or venue. Omit it unless the caller supplied a known canonical subtype; query recognizes aliases such as music bingo and analogue/vinyl listening sessions. Generic event/session/gig/opportunity/job/tournament wording is ignored.","schema":{"type":"string"}},{"name":"from","in":"query","description":"ISO date YYYY-MM-DD — listings closing on or after","schema":{"type":"string","format":"date"}},{"name":"to","in":"query","description":"ISO date YYYY-MM-DD — listings closing on or before","schema":{"type":"string","format":"date"}},{"name":"limit","in":"query","description":"Max results (default 100, max 500)","schema":{"type":"integer","default":100,"maximum":500}},{"name":"format","in":"query","description":"'json' (default) or 'md' for paste-ready markdown","schema":{"type":"string","enum":["json","md"]}}],"responses":{"200":{"description":"Active open call listings","content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"},"listings":{"type":"array","items":{"type":"object"}}}}}}},"429":{"description":"Shared public AI request limit exceeded. Retry after the number of seconds in the Retry-After header."}}}},"/agent/live-events":{"get":{"operationId":"searchLiveEvents","summary":"Search upcoming live events","description":"Use when the user asks to find, show, attend, watch, visit, or buy tickets for an event or session—not to hire talent. For example, 'find an analogue listening session in Melbourne' is live-event discovery. Returns upcoming live events from the Live Events Map with geo coordinates (lat/lng), ticketing info, and source links.","parameters":[{"name":"query","in":"query","required":true,"description":"Always pass the complete original event-discovery request. Prefer query-only rather than guessing type or genre; the server maps natural phrases to authoritative live-event values.","schema":{"type":"string"}},{"name":"location","in":"query","description":"City, venue name, or country substring","schema":{"type":"string"}},{"name":"type","in":"query","description":"Optional exact canonical override only; omit when inferred from query. Canonical examples: dj, live-band, comedian, dance-act, snooker-tournament, pool-comp, bowling-tournament, poker-tournament, analog-listening, open-mic.","schema":{"type":"string"}},{"name":"genre","in":"query","description":"Optional exact canonical override only; omit when inferred from query. Canonical examples: house, techno, drum-bass, hip-hop, jazz, rock-pop.","schema":{"type":"string"}},{"name":"ticketed","in":"query","description":"yes | no | tbc","schema":{"type":"string","enum":["yes","no","tbc"]}},{"name":"from","in":"query","description":"ISO date YYYY-MM-DD","schema":{"type":"string","format":"date"}},{"name":"to","in":"query","description":"ISO date YYYY-MM-DD","schema":{"type":"string","format":"date"}},{"name":"limit","in":"query","description":"Max results (default 100, max 500)","schema":{"type":"integer","default":100,"maximum":500}}],"responses":{"200":{"description":"Upcoming live events with geo data","content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"},"events":{"type":"array","items":{"type":"object"}}}}}}},"429":{"description":"Shared public AI request limit exceeded. Retry after the number of seconds in the Retry-After header."}}}},"/agent/schema":{"get":{"operationId":"getPlatformSchema","summary":"Get the full platform schema and form-prefill contract","description":"Returns all portal IDs, field specs, MCP server details, and the no-write form-prefill contract.","responses":{"200":{"description":"Platform schema and API contract","content":{"application/json":{"schema":{"type":"object"}}}},"429":{"description":"Shared public AI request limit exceeded. Retry after the number of seconds in the Retry-After header."}}}},"/agent/opportunities/{reference}":{"get":{"operationId":"getOpportunity","summary":"Look up one live public opportunity by exact reference","description":"Before making claims about a referenced opportunity, use this exact live database lookup. State only fields returned in the result; missing fields mean they were not provided. Never invent volume, frequency, or competition.","parameters":[{"name":"reference","in":"path","required":true,"description":"Exact public UI reference, for example DJ-3128.","schema":{"type":"string"}}],"responses":{"200":{"description":"Live public opportunity with allowed responder roles.","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"No active public opportunity with that exact reference."}}}}},"components":{}}