{"openapi":"3.1.0","info":{"title":"Aido Public API","version":"1.0.0","description":"Public API for the Aido landing page. All endpoints are unauthenticated and rate limited per client IP. Rate-limit state is exposed via RateLimit-* and X-RateLimit-* response headers; 429 responses include Retry-After.","contact":{"name":"Aido","email":"myaido.co@gmail.com","url":"https://myaido.app"},"termsOfService":"https://myaido.app/terms-of-use"},"servers":[{"url":"https://myaido.app"}],"externalDocs":{"description":"Agent onboarding & auth notes","url":"https://myaido.app/auth.md"},"paths":{"/api/waitlist":{"post":{"operationId":"joinWaitlist","summary":"Join the Aido ecosystem waitlist","description":"Adds a person to the waitlist. Duplicate emails are rejected with 409. Rate limit: 3 requests per IP per hour.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","email"],"properties":{"name":{"type":"string","description":"Full name."},"email":{"type":"string","format":"email"},"message":{"type":"string","description":"Optional note."}}},"example":{"name":"Ada Lovelace","email":"ada@example.com","message":"Excited for the planner!"}}}},"responses":{"200":{"description":"Registered successfully.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}}},"400":{"description":"Missing or invalid fields.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable message (Turkish)."},"error":{"type":"object","properties":{"code":{"type":"string","enum":["VALIDATION_ERROR","RATE_LIMITED","DUPLICATE_SUBMISSION","NOT_FOUND","METHOD_NOT_ALLOWED","INTERNAL_ERROR"]},"retry_after":{"type":"integer","description":"Seconds to wait before retrying (present on RATE_LIMITED)."}}}}}}}},"409":{"description":"Email already on the waitlist.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable message (Turkish)."},"error":{"type":"object","properties":{"code":{"type":"string","enum":["VALIDATION_ERROR","RATE_LIMITED","DUPLICATE_SUBMISSION","NOT_FOUND","METHOD_NOT_ALLOWED","INTERNAL_ERROR"]},"retry_after":{"type":"integer","description":"Seconds to wait before retrying (present on RATE_LIMITED)."}}}}}}}},"429":{"description":"Rate limited (3/hour/IP). Respect Retry-After.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable message (Turkish)."},"error":{"type":"object","properties":{"code":{"type":"string","enum":["VALIDATION_ERROR","RATE_LIMITED","DUPLICATE_SUBMISSION","NOT_FOUND","METHOD_NOT_ALLOWED","INTERNAL_ERROR"]},"retry_after":{"type":"integer","description":"Seconds to wait before retrying (present on RATE_LIMITED)."}}}}}}}},"500":{"description":"Server error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable message (Turkish)."},"error":{"type":"object","properties":{"code":{"type":"string","enum":["VALIDATION_ERROR","RATE_LIMITED","DUPLICATE_SUBMISSION","NOT_FOUND","METHOD_NOT_ALLOWED","INTERNAL_ERROR"]},"retry_after":{"type":"integer","description":"Seconds to wait before retrying (present on RATE_LIMITED)."}}}}}}}}}}},"/api/contact":{"post":{"operationId":"contactSupport","summary":"Send a contact/support message to the Aido team","description":"Requires Content-Type: application/json and a body under 12 KB. Issue text must be at least 10 characters. Rate limits: 5 requests per IP per hour, 3 per email per day; identical email+issue within 15 minutes is rejected as duplicate.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","issue"],"properties":{"name":{"type":"string","maxLength":120},"email":{"type":"string","format":"email","maxLength":254},"issue":{"type":"string","minLength":10,"maxLength":2000}}},"example":{"name":"Ada Lovelace","email":"ada@example.com","issue":"The supplement reminder fires twice on iOS 19."}}}},"responses":{"200":{"description":"Message received.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}}},"400":{"description":"Missing/invalid fields or malformed JSON.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable message (Turkish)."},"error":{"type":"object","properties":{"code":{"type":"string","enum":["VALIDATION_ERROR","RATE_LIMITED","DUPLICATE_SUBMISSION","NOT_FOUND","METHOD_NOT_ALLOWED","INTERNAL_ERROR"]},"retry_after":{"type":"integer","description":"Seconds to wait before retrying (present on RATE_LIMITED)."}}}}}}}},"403":{"description":"Origin not allowed.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable message (Turkish)."},"error":{"type":"object","properties":{"code":{"type":"string","enum":["VALIDATION_ERROR","RATE_LIMITED","DUPLICATE_SUBMISSION","NOT_FOUND","METHOD_NOT_ALLOWED","INTERNAL_ERROR"]},"retry_after":{"type":"integer","description":"Seconds to wait before retrying (present on RATE_LIMITED)."}}}}}}}},"409":{"description":"Duplicate message (same email + issue within 15 minutes).","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable message (Turkish)."},"error":{"type":"object","properties":{"code":{"type":"string","enum":["VALIDATION_ERROR","RATE_LIMITED","DUPLICATE_SUBMISSION","NOT_FOUND","METHOD_NOT_ALLOWED","INTERNAL_ERROR"]},"retry_after":{"type":"integer","description":"Seconds to wait before retrying (present on RATE_LIMITED)."}}}}}}}},"413":{"description":"Body exceeds 12 KB.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable message (Turkish)."},"error":{"type":"object","properties":{"code":{"type":"string","enum":["VALIDATION_ERROR","RATE_LIMITED","DUPLICATE_SUBMISSION","NOT_FOUND","METHOD_NOT_ALLOWED","INTERNAL_ERROR"]},"retry_after":{"type":"integer","description":"Seconds to wait before retrying (present on RATE_LIMITED)."}}}}}}}},"415":{"description":"Content-Type is not application/json.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable message (Turkish)."},"error":{"type":"object","properties":{"code":{"type":"string","enum":["VALIDATION_ERROR","RATE_LIMITED","DUPLICATE_SUBMISSION","NOT_FOUND","METHOD_NOT_ALLOWED","INTERNAL_ERROR"]},"retry_after":{"type":"integer","description":"Seconds to wait before retrying (present on RATE_LIMITED)."}}}}}}}},"429":{"description":"Rate limited. Respect Retry-After.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable message (Turkish)."},"error":{"type":"object","properties":{"code":{"type":"string","enum":["VALIDATION_ERROR","RATE_LIMITED","DUPLICATE_SUBMISSION","NOT_FOUND","METHOD_NOT_ALLOWED","INTERNAL_ERROR"]},"retry_after":{"type":"integer","description":"Seconds to wait before retrying (present on RATE_LIMITED)."}}}}}}}},"500":{"description":"Server error.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable message (Turkish)."},"error":{"type":"object","properties":{"code":{"type":"string","enum":["VALIDATION_ERROR","RATE_LIMITED","DUPLICATE_SUBMISSION","NOT_FOUND","METHOD_NOT_ALLOWED","INTERNAL_ERROR"]},"retry_after":{"type":"integer","description":"Seconds to wait before retrying (present on RATE_LIMITED)."}}}}}}}}}}}},"components":{"schemas":{"ApiError":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable message (Turkish)."},"error":{"type":"object","properties":{"code":{"type":"string","enum":["VALIDATION_ERROR","RATE_LIMITED","DUPLICATE_SUBMISSION","NOT_FOUND","METHOD_NOT_ALLOWED","INTERNAL_ERROR"]},"retry_after":{"type":"integer","description":"Seconds to wait before retrying (present on RATE_LIMITED)."}}}}}}}}