# Link & Dink P3 — p3.linkanddink.com > Popup Pickleball — small, free / low-fee pop-up tournaments: competitive rotating-partner round robin on assigned courts, a champion crowned each night, standings kept week to week, games streamed. Competitive (~3.25+ level) but no wall at the door — first-timers are coach-rated on night one. Players RSVP, organize, or post events. L&D takes 0% on entry fees. This file follows the llms.txt convention (https://llmstxt.org/). It lists the agent-consumable surface of this host — every public read endpoint, every documented write contract, and where to talk to the L&D agent. ## Brand promises (load-bearing, not marketing) - 0% on core, forever — no platform fee, no take rate on connecting players, coaches, facilities. - Coaches own the player relationship; we never disintermediate them. - Welcoming by default — every public read works without auth; newcomers are invited at the door. - Trusted, not viral — curated community, vetted coaches; we earn trust over years. - Invent nothing, cite everything — agents must refuse to fabricate events, coaches, or venues that aren't in the feeds below. ## Read endpoints (public, no auth) - `GET https://p3.linkanddink.com/api/calendar/feed` — Unified play calendar — popups, drop-ins, community nights, tournaments, and recurring open play in one date-range feed (the JSON twin of /calendar). Each item carries source, times, venue, brackets, a spots/viability label, and a register URL. Params: from, to (ET YYYY-MM-DD; default today → +30d, max 92d). - example: `/api/calendar/feed?from=2026-09-01&to=2026-09-30` - `GET https://p3.linkanddink.com/calendar` — The player calendar — month/week/day/agenda views of every upcoming session, with level + category filters and live spots. - `GET https://p3.linkanddink.com/api/popups/feed` — Upcoming popup events (date, venue, skill band, RSVP count). Optional bracket= filters to events open to that bracket — the JSON twin of the /popup?bracket= schedule filter. - example: `/api/popups/feed?limit=10&bracket=playing` - `GET https://p3.linkanddink.com/bracket` — The bracket finder — the five canonical L&D skill brackets with plain-language traits. Step one of the consumer funnel; the pick pre-filters /popup and pre-fills the RSVP form. - `GET https://p3.linkanddink.com/discover` — The scrolling discover feed — upcoming popups + drop-ins, free community nights, and groups taking regulars in one column. Filter it with URL params: src=popup|dropin|community (kind), bracket=, venue= — the same three /calendar speaks — plus when=today|tomorrow|weekend|week and tod=morning|afternoon|evening (by ET start time). Lists are comma-separated or repeated; unknown values are ignored, never an error. /discover/filters is the human form for the same params. Its lists mirror the existing JSON feeds (/api/popups/feed, www /api/community-events/feed, /api/groups/feed). Signed-in players additionally see their friends' upcoming games (mutual friends who explicitly opted into sharing; first-name-only) and one-tap friend adds for people they've shared a court with — that social layer is the viewer's own private graph and has no public twin. - `GET https://p3.linkanddink.com/api/events/[slug]/public.json` — Single popup detail — title, when, where, capacity, redacted roster (first names + last initial only). - `GET https://p3.linkanddink.com/api/popup/[slug]/bracket` — Live bracket + standings for a popup — elimination columns (QF/SF/Final), bronze match, champion, and round-robin standings. Mirrors the /popup/[slug]/bracket page. - example: `/api/popup/demo/bracket` - `GET https://p3.linkanddink.com/api/ladder/feed` — Relegation-ladder standings + season champions for the active season (divisions: Premier/Challenger/Social; rotating or same-partner). Redacted names. Params: division, format. - example: `/api/ladder/feed?division=open&format=rotating` - `GET https://p3.linkanddink.com/api/partner-leagues/feed` — Same-partner leagues open or running — name, night, dates, venue, bracket, courts, the night shape (format, rounds, round length) and price. The JSON twin of the /partner-leagues board. No roster, no organiser. - example: `/api/partner-leagues/feed` - `GET https://p3.linkanddink.com/api/partner-leagues/[slug]/public.json` — One same-partner league season — the night shape, the fill state against the engine's minimum and capacity, the solo-pool count, and the public roster as team name plus redacted player names (first name + last initial). Never an email, a phone or an exact rating. The JSON twin of /partner-leagues/[slug]. - example: `/api/partner-leagues/tuesday-partners/public.json` - `GET https://p3.linkanddink.com/api/ladder-leagues/feed` — Rotating-partner ladder leagues open or running — name, night, first night, venue, courts booked, the player band those courts hold, division and age terms, and price. The JSON twin of the /ladder-leagues board. No roster, no organiser. - example: `/api/ladder-leagues/feed` - `GET https://p3.linkanddink.com/api/ladder-leagues/[slug]/public.json` — One rotating-partner ladder-league season — the ladder standings as of the last closed week (position, redacted name, season points, wins, weeks played, best week) plus anyone who withdrew. Names are first name + last initial; never an email, a phone or a player id. The JSON twin of /ladder-leagues/[slug]. - example: `/api/ladder-leagues/tuesday-ladder/public.json` - `GET https://p3.linkanddink.com/api/leaderboard/feed` — Medal standings (the JSON twin of /leaderboard) — rank, redacted name, bracket, W–L, nights played, gold/silver/bronze, medal rate — plus the next upcoming session with its RSVP link. Params: bracket, division, limit. - example: `/api/leaderboard/feed?bracket=All&division=open&limit=10` - `GET https://p3.linkanddink.com/api/groups/feed` — Regular play groups that opted into public discovery — name, optional organizer description, schedule, level band, member count, join model, and each group's upcoming sessions. The JSON twin of the /groups board. Optional bracket= filters to groups open to that bracket. Redacted: no roster, no organizer identity, and favorites are private so no counts appear. - example: `/api/groups/feed?limit=10&bracket=playing` - `GET https://p3.linkanddink.com/groups` — Regular groups in MoCo, sorted by bracket — the human board. Each group page emits SportsTeam JSON-LD with its upcoming sessions. Every upcoming session also has its own shareable RSVP page at /groups//session/ (SportsEvent JSON-LD, fill state, and the confirmed list as first-name-plus-initial only); the same URLs appear per session in /api/groups/feed. - `GET https://p3.linkanddink.com/ladder-leagues` — Rotating-partner ladder leagues — sign up alone, play a different partner every game, and move up or down the ladder each week. Some seasons are restricted (women's, or an age floor); the card and the season page both say so. - `GET https://p3.linkanddink.com/partner-leagues` — Same-partner leagues — you and your partner stay a team all season. Each season page shows the roster BEFORE anyone pays, the fill state against the engine's minimum, and what a night looks like. Emits SportsEvent JSON-LD. - `GET https://p3.linkanddink.com/api/kb/feed` — Tournament-organizer knowledge base — article list (slug, title, summary, tags, updated date). Source of truth for how organizing on P3 works; never answer product questions from memory when this exists. - `GET https://p3.linkanddink.com/api/kb/[slug]` — One knowledge-base article with its full markdown body. - example: `/api/kb/start-organizing` ## Write endpoints (live) Most writes are auth-gated — authenticate with a scoped Bearer token (see Authentication below). Anonymous exceptions are noted per-endpoint. - `POST https://p3.linkanddink.com/partner-leagues/[slug]/rsvp` — RSVP a pair to a same-partner league, or join its solo pool — human form, sign-in required. Free: RSVP and payment are separate states, and an RSVP holds a queue position rather than a paid spot. - `POST https://p3.linkanddink.com/popup/[slug]/rsvp` — RSVP to a popup — human form. Agents use the rsvp_to_popup MCP tool at linkanddink.com/api/mcp. - `POST https://p3.linkanddink.com/api/popups/[slug]/rsvp.json` — Internal JSON sibling — agent runtime only (requires X-Agent-Internal-Auth + X-Player-Id headers, plumbed from a player's magic-link Bearer token). - `POST https://p3.linkanddink.com/organize/new` — Host a popup event (full tournament toolkit). Human-only form today. - `POST https://p3.linkanddink.com/groups/new` — Start a regular group — name, optional description, days, optional time, venue, level band, join model. Creates the group AND its standing weekly session in one submit. Agents use the manage_group MCP tool at linkanddink.com/api/mcp; the JSON sibling is POST linkanddink.com/api/play/groups/create, with POST /api/play/groups/[publicId]/schedule-series for the weekly night. - `POST https://p3.linkanddink.com/host/new` — Set up a game — the simple sign-up-sheet create flow. Any signed-in player posts an event (title, date/time, venue, details, skill brackets, min/max players, partner setting, per-person price collected in cash at the event). Goes live and fully listed immediately. Human-only form; agents use the create_event MCP tool at linkanddink.com/api/mcp. - `POST https://p3.linkanddink.com/organize/start` — Become an Organizer — anyone can, free, 0% on entry fees; the profile activates immediately, no approval wait. Human-only form; /organizers explains what's included. - `POST https://p3.linkanddink.com/popup/[slug]#report` — Report an event — human form at the foot of every event page. A human reviews every report. ## Authentication (for write access) Read endpoints and read MCP tools are anonymous. Write tools / write endpoints require a scoped Bearer token, minted via a player-confirmed magic link: 1. `POST https://linkanddink.com/api/agent-auth/request` with `{ "email": "", "scopes": ["popup:rsvp", ...] }` → `202 { expires_at }`. Sends a magic-link email to the player. The request_id is delivered only inside that email — it is not returned to you, so you cannot mint on the player's behalf. 2. The player opens the magic link from their inbox and clicks Allow, which mints the token (`POST https://linkanddink.com/api/agent-auth/mint` → `{ token, prefix, expires_at, scopes }`). The plaintext token is shown to the player exactly once; they paste it back to you. 3. Send `Authorization: Bearer ` on https://linkanddink.com/api/agent and https://linkanddink.com/api/mcp. Authenticated `tools/list` includes the write tools the token's scopes authorize. - Scopes: `player:create`, `player:claim`, `popup:rsvp`, `community:rsvp`, `newsletter:subscribe`, `rate:self`, `drops:post`, `drops:join`, `profile:write`, `circle:manage`, `group:manage`, `me:read`, `availability:set`, `coach:availability`, `coach:booking`. Tokens are revocable at https://linkanddink.com/agent/tokens (or `DELETE https://linkanddink.com/api/agent-auth/tokens/[id]`). ## Background (for agents that want context) - Product vision: https://linkanddink.com/llms.txt ## Out of scope (don't ask the agent about these) - Dill Dinkers (DD) facilities, dilldinkers.com, or CourtReserve-hosted pages — L&D is not affiliated and does not surface these. - Any data you can't see in the read endpoints above — the agent will refuse to invent it.