# Link & Dink Weekly — www.linkanddink.com > The Link & Dink Weekly newsletter homepage, /play surface (where to play locally), skill-bracket placement quiz, and community poll. Marketing surface for the broader L&D platform. 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://www.linkanddink.com/api/schedule/feed` — Combined schedule — every upcoming Link & Dink adult event AND Next Gen Academy youth session on one board, sorted by day/time. Each entry carries brand (ld/nga), title, day/time, venue, confirmed/registered count, capacity, and a direct registerUrl to the brand's own registration surface (p3.linkanddink.com for L&D, nextgenpbacademy.com for NGA). Browse + route only — register on the linked surface. - `GET https://www.linkanddink.com/play/today/feed.json` — Everything pickleball you can join today in the DMV — live drops, Popup events, recurring open play whose weekday is today, and tournaments starting today. Sorted by start time. - `GET https://www.linkanddink.com/api/tournaments/feed` — Upcoming Maryland / DMV pickleball tournaments. Curated; no DD / no CourtReserve events. - `GET https://www.linkanddink.com/api/community-events/feed` — Upcoming free Link & Dink community events (L&D Nights, adult drop-ins) — title, time, venue, skill band, brackets, signup link, the rsvp_url for native agent registration, plus live fill state: joined_count, min_players (fire floor), player_capacity (null = uncapped), spots_left, and fill.will_fire (is the event firing?). Sorted by start time. - `GET https://www.linkanddink.com/api/regular-play/feed` — Recurring open play, drop-in, and weekly leagues in MoCo + DMV. Schedule (day-of-week + time) plus the public path to join. - `GET https://www.linkanddink.com/api/coaches/feed` — Vetted Link & Dink coaches available for private lessons, small groups, and clinics in MoCo + the DMV. Each coach has a /coaches/ profile and direct booking deep-links into coach.linkanddink.com. Curated — not an open directory. - `GET https://www.linkanddink.com/api/courts/feed` — Every public pickleball court in MoCo — counts, lights, indoor/outdoor, coordinates, and the canonical /map/ deep-link page for each court. - `GET https://www.linkanddink.com/play/highlights` — Community pickleball highlights — clips from members' own match footage. The JSON source is /api/highlights/feed. - `GET https://www.linkanddink.com/api/groups/feed` — Active Link & Dink recurring play groups — name, slug, join lifecycle, typical days/time, skill range, member count, and upcoming-event count. Redacted: no member identities, no private data. ?limit= caps the count. Single group: /api/groups/{public_id}. L&D takes 0% — groups are free community infrastructure. - example: `/api/groups/feed?limit=20` - `GET https://www.linkanddink.com/api/play/partners/feed` — Open tournament doubles-partner listings (someone needs a partner for a local/DMV tournament). Each entry: seat headline, tournament name/city/date, division, skill band, partner needed (female/male/any), plus the /play/partners/{public_id} page and respond_url. Seat-only + redacted — no poster/responder contact, and never a minor's name or age. Human board: /play/partners. ## 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://www.linkanddink.com/api/subscribe` — Subscribe to the newsletter. Body: { email, source? }. Double-opt-in: confirmation email required. Agents call this via subscribe_to_newsletter at linkanddink.com/api/mcp. - `POST https://www.linkanddink.com/api/community-events/{id}/rsvp.json` — RSVP an existing player to a free community event (id from /api/community-events/feed). Scope community:rsvp. Internal-auth-gated (the agent runtime calls it with the player's resolved identity); idempotent — a repeat RSVP returns the existing confirmed registration; 409 event_full at capacity. Returns joined_count + fill state. Agents call this via rsvp_to_community_event at linkanddink.com/api/mcp. - `POST https://www.linkanddink.com/api/community-events/{id}/join` — Public player-facing RSVP for a free community event. Body: { email, name?, action?: 'join' | 'cancel' }. Find-or-creates the player by email; idempotent; rate-limited; 409 event_full / event_past / event_closed. Returns joined_count + fill state. Same action as the I'm-in button on /play/upcoming. - `POST https://www.linkanddink.com/api/play/groups/create` — Create a recurring play group you organize. Body: { name, join_lifecycle?, typical_days?, categories? }. Scope group:manage. Internal-auth-gated. Companion writes: /api/play/groups/{public_id}/members (add/invite players), /api/play/groups/{public_id}/fill-from-circle (seat your closest connections — your private connection tier picks who, and is NEVER disclosed; returns counts only), /api/play/groups/{public_id}/respond (accept/decline your own invite). Agents call these via manage_group at linkanddink.com/api/mcp. - `POST https://www.linkanddink.com/api/poll/vote` — Anonymous vote in the active newsletter poll. Body: { poll_id, option_id }. - `POST https://www.linkanddink.com/api/rate` — Place yourself into a skill bracket via the /rate quiz. Body: { email, level (1.5..5.0 in 0.25 steps) }. Coach-eval-wins precedence server-side. Agents call this via submit_self_rating. - `POST https://www.linkanddink.com/api/clinic` — Sign up for the MoCo High School Pickleball clinic interest list (/hs). Body: { first_name, email, last_name?, phone?, school?, grade?, skill_level?, bringing_friend?, friend_name?, notes?, source?, utm_campaign? }. Sends a confirmation email and writes to the clinic_signups table on tqqh. - `POST https://www.linkanddink.com/api/play/partners/post.json` — Post a tournament doubles-partner listing (public, no account). Body: { tournament_name, tournament_url?, city?, event_date? (yyyy-mm-dd), division: 'mixed'|'mens'|'womens'|'singles', bracket_band?, partner_needed: 'female'|'male'|'any', seat_note?, youth_seat?, requester_first_name?, contact_email, contact_phone?, opt_in? }. opt_in (default false) consents the poster to future practice-partner matching; ignored for youth seats. Rate-limited. Seat-only: DD/CourtReserve links and any minor's name/age are rejected. Returns { public_id, url }. - `POST https://www.linkanddink.com/api/play/partners/{public_id}/respond.json` — Respond to an open partner listing ('I'm in / I know someone'). Body: { responder_email, responder_name?, responder_phone?, message?, opt_in? }. opt_in (default false) consents the responder to future practice-partner matching. Idempotent per email; the poster is notified by email. The responder's and poster's contact are never exposed publicly. ## 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.