Developer Portal

Open Call Portals is open infrastructure for the live entertainment economy. Build a booking assistant, an availability aggregator, a venue sourcing tool — and post to the platform directly from your app.

What you can build

Open Calls

Post a venue's open call for a DJ, live band, comedian, artist, or 18 other performer types. Respondents apply through the portal — you get notified by webhook or email.

Availability

Post a performer's availability window — dj-availability, lb-availability, etc. — so bookers can discover them in the supply-side registry.

Live Events

Post an upcoming event to the Live Events Map with geo coordinates, ticketing links, and event times. Use portal ID live-event and include eventTime.

MCP — for Claude Desktop, Cursor, Windsurf & MCP agents

The platform exposes a stateless Model Context Protocol server. No API key required. Drop this into your Claude Desktop config and start querying and posting immediately:

{
  "mcpServers": {
    "open-call-portals": {
      "url": "https://opencallportal.com/mcp"
    }
  }
}

Or in any MCP client: endpoint POST https://opencallportal.com/mcp, protocol JSON-RPC 2.0 / MCP 2024-11-05.

Inspect the server manifest: GET https://opencallportal.com/mcp

Available tools

search_open_calls
Filter active listings by portal, location, genre, type, date
search_live_events
Upcoming events with geo, ticketing, and source links
search_availability
Performers advertising their availability (supply side)
get_platform_schema
All portal IDs, field specs, write workflow
send_verification_code
Step 1 of the write loop — sends 6-digit code
confirm_verification_code
Step 2 — confirms code, returns verificationToken
post_listing
Step 3 — posts open call, availability, or live event
respond_to_listing
Submit a performer's response to an open call
register_webhook
Subscribe to listing.created / response.created push events
delete_webhook
Deactivate a registered webhook by ID and secret

REST API — the same verified write loop

Every portal uses the same 3-step write flow. Email verification is the trust anchor — it applies to AI agents and human users equally. In development the code is always 555555 and no real email is sent.

Full write loop with curl (dev mode, code 555555):

# ── Step 1: send verification code ──────────────────────────────────
curl -s -X POST https://opencallportal.com/api/auth/verify-email \
  -H "Content-Type: application/json" \
  -d '{"email":"you@example.com","portalId":"dj"}'
# → {"message":"Verification code sent to your email."}
# (in dev the code is always 555555 — no real email is sent)

# ── Step 2: confirm code and receive token ────────────────────────────
curl -s -X POST https://opencallportal.com/api/auth/verify-email/confirm \
  -H "Content-Type: application/json" \
  -d '{"email":"you@example.com","code":"555555"}'
# → {"verified":true,"token":"<verificationToken>"}

# ── Step 3: post the listing ──────────────────────────────────────────
curl -s -X POST https://opencallportal.com/api/listings \
  -H "Content-Type: application/json" \
  -d '{
    "portalId": "dj",
    "verificationToken": "<token from step 2>",
    "userRole": "venue-manager",
    "organizerName": "Fabric London",
    "locationIds": [42],
    "date": "2026-10-15",
    "closeDate": "2026-10-10",
    "openCallTypes": ["paid-fixed-fee"],
    "genres": ["techno","house"],
    "accommodation": "N/A",
    "feeExpectation": [],
    "drawPower": [],
    "crewNumbers": [],
    "insurance": "N/A",
    "djSetups": [],
    "audioSetup": "N/A",
    "travelBudget": "N/A"
  }'
# → {"id":1234,"uiReference":"DJ-3456","portalId":"dj"}

Full field spec (GET /api/agent/schema) Location IDs (GET /api/locations)

Webhooks — real-time push

Register an HTTPS endpoint and the platform will POST a JSON payload every time a listing is created or a response is submitted. The request is signed with HMAC-SHA256 in the X-OCP-Signature header — verify it to confirm authenticity. The secret is returned once at registration; store it securely.

# Register a webhook — receive a POST whenever a listing is created
curl -s -X POST https://opencallportal.com/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc":"2.0","id":1,"method":"tools/call",
    "params":{
      "name":"register_webhook",
      "arguments":{
        "url":"https://your-app.example.com/hooks/ocp",
        "sourceApp":"MyDJApp",
        "events":["listing.created"],
        "portalIds":["dj","lb"]
      }
    }
  }'
# → {"id":7,"secret":"<store-this-securely>"}
#
# Your endpoint will receive:
# POST https://your-app.example.com/hooks/ocp
# X-OCP-Event: listing.created
# X-OCP-Signature: sha256=<hmac-sha256 of body using your secret>
# { "portalId":"dj", "uiReference":"DJ-3456", "url":"...", ... }

Filter by portalIds to receive only the verticals you care about. Omit it to receive all portals. Subscribe via the register_webhook MCP tool or via POST /mcp directly.

Portal IDs

Use these in portalId when posting open calls. For availability, append -availability (e.g. dj-availability). For live events use live-event.

dj · lb · cc · comedian · artist · casting · ec · solopreneur · gh · demo · poker · bowling · darts · cue-sports · golf-society · liquor-supply · local-produce · coworking · dance-acts · fs · run-club

GET /api/agent/schema lists every portal with its reference format and field requirements.

GPT Actions & OpenAPI

The agent API is published as an OpenAPI 3.1.0 spec for ChatGPT custom GPTs, Semantic Kernel, LangChain, n8n, and any OpenAPI-compatible agent framework:

OpenAPI spec (GET /api/agent/openapi.json) · ChatGPT plugin manifest