{"openapi":"3.1.0","info":{"title":"Long Distance API","version":"0.1.0","description":"A fully local, hand-curated long-distance-relationship tips guide: practical tips across communication, visits, trust, independence, technology and milestones, a communication-cadence guide, a visit-planning checklist, virtual date ideas, discussion prompts, and a pure-compute days-until-visit calculator.\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://longdistance.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/longdistance/docs"},"termsOfService":"https://connectorbay.com/longdistance/terms"},"servers":[{"url":"https://longdistance.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/longdistance/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/tips_by_category":{"post":{"operationId":"tips_by_category","summary":"Practical long-distance tips for one category. Use for \"communication tips for long distance\", \"how to","description":"Practical long-distance tips for one category. Use for \"communication tips for long distance\", \"how to\n    build trust long distance\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"category":{"description":"communication, visits, trust, independence, technology, or milestones.","minLength":1,"title":"Category","type":"string"},"count":{"default":10,"maximum":20,"minimum":1,"title":"Count","type":"integer"}},"required":["category"],"title":"tips_by_categoryArguments","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/tip_search":{"post":{"operationId":"tip_search","summary":"Keyword search across every tip's text and category. Use for \"tips about jealousy\", \"tips about visits\".","description":"Keyword search across every tip's text and category. Use for \"tips about jealousy\", \"tips about visits\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"query":{"description":"Keyword to search for.","minLength":1,"title":"Query","type":"string"},"count":{"default":10,"maximum":20,"minimum":1,"title":"Count","type":"integer"}},"required":["query"],"title":"tip_searchArguments","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/category_list":{"post":{"operationId":"category_list","summary":"All six tip categories with a one-line note and count each. Use for \"what topics do you cover\".","description":"All six tip categories with a one-line note and count each. Use for \"what topics do you cover\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"category_listArguments","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/random_tip":{"post":{"operationId":"random_tip","summary":"One random tip, optionally narrowed to a category. Use for \"give me a random long-distance tip\".","description":"One random tip, optionally narrowed to a category. Use for \"give me a random long-distance tip\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"category":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optionally narrow to one category.","title":"Category"}},"title":"random_tipArguments","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/communication_cadence_guide":{"post":{"operationId":"communication_cadence_guide","summary":"Describes light/moderate/heavy communication-cadence patterns and what situations each tends to fit, with a","description":"Describes light/moderate/heavy communication-cadence patterns and what situations each tends to fit, with a\n    note that the right cadence is whatever both partners agree on. Use for \"how often should we talk long\n    distance\", \"is texting every day too much\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"intensity":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optionally narrow to light, moderate, or heavy.","title":"Intensity"}},"title":"communication_cadence_guideArguments","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/visit_planning_checklist":{"post":{"operationId":"visit_planning_checklist","summary":"A staged visit-planning checklist from as-soon-as-possible through after the visit. Use for \"how do I plan a","description":"A staged visit-planning checklist from as-soon-as-possible through after the visit. Use for \"how do I plan a\n    visit\", \"what should we do before our next visit\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optionally narrow to one stage, e.g. one_to_two_months_out.","title":"Stage"}},"title":"visit_planning_checklistArguments","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/timezone_coordination_note":{"post":{"operationId":"timezone_coordination_note","summary":"General time-zone coordination habits, plus a pointer to a dedicated time-zone connector for the actual","description":"General time-zone coordination habits, plus a pointer to a dedicated time-zone connector for the actual\n    conversion math (this reference intentionally doesn't duplicate that). Use for \"how do we coordinate across\n    time zones\", \"tips for scheduling calls across time zones\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"timezone_coordination_noteArguments","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/virtual_date_ideas":{"post":{"operationId":"virtual_date_ideas","summary":"Activities to do \"together\" while apart — cooking on a call, synced movie watching, online games, and more.","description":"Activities to do \"together\" while apart — cooking on a call, synced movie watching, online games, and more.\n    Use for \"virtual date ideas for long distance\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"count":{"default":6,"maximum":10,"minimum":1,"title":"Count","type":"integer"}},"title":"virtual_date_ideasArguments","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/discussion_prompts":{"post":{"operationId":"discussion_prompts","summary":"Open-ended discussion questions for a couple to talk through how the distance is actually going. Use for","description":"Open-ended discussion questions for a couple to talk through how the distance is actually going. Use for\n    \"discussion questions for a long-distance relationship\", \"conversation starters about how we're doing long\n    distance\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"count":{"default":5,"maximum":7,"minimum":1,"title":"Count","type":"integer"}},"title":"discussion_promptsArguments","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/days_until_visit":{"post":{"operationId":"days_until_visit","summary":"Pure-compute calculator for days and weeks until (or since) a given visit date. Use for \"how many days until","description":"Pure-compute calculator for days and weeks until (or since) a given visit date. Use for \"how many days until\n    our next visit\", \"how long since we last saw each other\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"visit_date":{"description":"The visit date, YYYY-MM-DD.","examples":["2026-12-20"],"title":"Visit Date","type":"string"},"today":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optionally override today's date, YYYY-MM-DD; defaults to the current date.","title":"Today"}},"required":["visit_date"],"title":"days_until_visitArguments","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}}}}