{"openapi":"3.1.0","info":{"title":"Family Dare Play API","version":"0.1.0","description":"A real, stateless, playable family-friendly dare/challenge game session engine with a 110+ original, family-safe dare bank, constraint filtering, no-repeat tracking, a real difficulty-based point system, and per-player completion scoring. Every tool call takes the full session state and returns the new state; nothing is stored server-side.\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://familydareplay.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/familydareplay/docs"},"termsOfService":"https://connectorbay.com/familydareplay/terms"},"servers":[{"url":"https://familydareplay.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/familydareplay/docs"},"security":[{},{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/filter_dares":{"post":{"operationId":"filter_dares","summary":"Browses the dare bank for dares matching constraints, WITHOUT touching any session state or","description":"Browses the dare bank for dares matching constraints, WITHOUT touching any session state or\n    marking anything as served. Use for \"what indoor dares do you have\", \"show me kid-safe options\n    with no props\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"indoor_only":{"default":false,"description":"Only dares playable indoors (or anywhere).","title":"Indoor Only","type":"boolean"},"outdoor_only":{"default":false,"description":"Only dares playable outdoors (or anywhere).","title":"Outdoor Only","type":"boolean"},"no_props":{"default":false,"description":"Only dares that need no props/objects.","title":"No Props","type":"boolean"},"max_age_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only dares suitable for a group whose youngest player is at least this age (keeps dares with age_min <= this value).","title":"Max Age Min"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Restrict to one difficulty: easy, medium, or hard.","title":"Difficulty"}},"title":"filter_daresArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/new_session":{"post":{"operationId":"new_session","summary":"Starts a fresh Family Dare Play session. Use for \"let's play a dare game\", \"start a family","description":"Starts a fresh Family Dare Play session. Use for \"let's play a dare game\", \"start a family\n    challenge round\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"players":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Optional list of player names. Leave empty for solo play (scored under 'solo').","title":"Players"}},"title":"new_sessionArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/next_dare":{"post":{"operationId":"next_dare","summary":"Serves a fresh dare never before served in this session, matching any constraints given (no-","description":"Serves a fresh dare never before served in this session, matching any constraints given (no-\n    repeat mechanic backed by used_ids). Fails with bad_input once every matching dare has already\n    been served this session. Use for \"give us a dare\", \"something for outdoors\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"The current session state, exactly as returned by new_session/next_dare/complete_dare.","examples":[{"completions":[],"current_dare":{"age_min":5,"difficulty":"easy","id":"fd_001","location":"any","points":5,"prop_needed":false,"text":"..."},"players":["Alice","Bob"],"scores":{"Alice":0,"Bob":0},"used_ids":["fd_001"]}],"title":"State","type":"object"},"indoor_only":{"default":false,"description":"Only dares playable indoors (or anywhere).","title":"Indoor Only","type":"boolean"},"outdoor_only":{"default":false,"description":"Only dares playable outdoors (or anywhere).","title":"Outdoor Only","type":"boolean"},"no_props":{"default":false,"description":"Only dares that need no props/objects.","title":"No Props","type":"boolean"},"max_age_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only dares suitable for a group whose youngest player is at least this age (keeps dares with age_min <= this value).","title":"Max Age Min"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Restrict to one difficulty: easy, medium, or hard.","title":"Difficulty"}},"required":["state"],"title":"next_dareArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/complete_dare":{"post":{"operationId":"complete_dare","summary":"Marks a dare done or skipped for a player and updates their running score: 'done' awards","description":"Marks a dare done or skipped for a player and updates their running score: 'done' awards\n    that dare's point value (easy=5, medium=10, hard=15); 'skipped' awards zero. Use for \"Alice did\n    it!\", \"we're skipping this one\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"The current session state, exactly as returned by new_session/next_dare/complete_dare.","examples":[{"completions":[],"current_dare":{"age_min":5,"difficulty":"easy","id":"fd_001","location":"any","points":5,"prop_needed":false,"text":"..."},"players":["Alice","Bob"],"scores":{"Alice":0,"Bob":0},"used_ids":["fd_001"]}],"title":"State","type":"object"},"status":{"description":"'done' or 'skipped'.","title":"Status","type":"string"},"player":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Which player completed it. Required when more than one player is in the session.","title":"Player"},"dare_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Which dare id to mark. Omit to use the current dare.","title":"Dare Id"}},"required":["state","status"],"title":"complete_dareArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/render":{"post":{"operationId":"render","summary":"A human-readable summary: the current dare (if any), recent completions, and scores. Use for","description":"A human-readable summary: the current dare (if any), recent completions, and scores. Use for\n    \"what's the score\", \"show me the current dare\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"The current session state, exactly as returned by new_session/next_dare/complete_dare.","examples":[{"completions":[],"current_dare":{"age_min":5,"difficulty":"easy","id":"fd_001","location":"any","points":5,"prop_needed":false,"text":"..."},"players":["Alice","Bob"],"scores":{"Alice":0,"Bob":0},"used_ids":["fd_001"]}],"title":"State","type":"object"}},"required":["state"],"title":"renderArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}