{"openapi":"3.0.0","paths":{"/developer/v1/campaigns":{"get":{"operationId":"DeveloperApiController_listCampaigns","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List the campaigns this API key may read.","tags":["Developer API"]}},"/developer/v1/campaigns/{id}/summary":{"get":{"operationId":"DeveloperApiController_getSummary","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Attendance totals and breakdowns for one campaign.","tags":["Developer API"]}},"/developer/v1/campaigns/{id}/respondents":{"get":{"operationId":"DeveloperApiController_listRespondents","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"1-based page number.","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":200,"default":50,"type":"number"}},{"name":"since","required":false,"in":"query","description":"ISO-8601. Returns responses with submittedAt strictly greater than this value. NOTE: submittedAt is a LAST-MODIFIED timestamp — it is bumped when a respondent edits their RSVP — so an edited response reappears in a later `since` window.","schema":{"format":"date-time","type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Paginated respondents, limited to the key's allow-listed fields.","tags":["Developer API"]}},"/developer/auth/login":{"post":{"operationId":"DeveloperAuthController_login","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperLoginDto"}}}},"responses":{"200":{"description":""}},"summary":"Password login. Returns a session when a valid trusted-device token is presented, otherwise emails a 6-digit code.","tags":["Developer Portal — Auth"]}},"/developer/auth/verify-otp":{"post":{"operationId":"DeveloperAuthController_verifyOtp","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperVerifyOtpDto"}}}},"responses":{"200":{"description":""}},"summary":"Exchange the emailed code for a session, optionally trusting this device for 30 days.","tags":["Developer Portal — Auth"]}},"/developer/auth/step-up":{"post":{"operationId":"DeveloperAuthController_stepUp","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperStepUpDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Request (no body) or redeem (with code) a step-up OTP for key reveal/rotation.","tags":["Developer Portal — Auth"]}},"/developer/auth/me":{"get":{"operationId":"DeveloperAuthController_me","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"The current session principal.","tags":["Developer Portal — Auth"]}},"/developer/auth/change-password":{"post":{"operationId":"DeveloperAuthController_changePassword","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperChangePasswordDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Change the account password and clear mustChangePassword.","tags":["Developer Portal — Auth"]}},"/developer/auth/devices":{"get":{"operationId":"DeveloperAuthController_listDevices","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Trusted devices for the calling account.","tags":["Developer Portal — Auth"]}},"/developer/auth/devices/{id}":{"delete":{"operationId":"DeveloperAuthController_revokeDevice","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Revoke a trusted device, forcing an OTP on its next login.","tags":["Developer Portal — Auth"]}}},"info":{"title":"Tixbae Developer API","description":"Read-only access to RSVP campaign data.","version":"1.0.0","contact":{}},"tags":[],"servers":[{"url":"https://api.tixbae.com"}],"components":{"securitySchemes":{"ApiKey":{"scheme":"bearer","bearerFormat":"JWT","type":"http","description":"Your API key, e.g. tbk_live_…"}},"schemas":{"DeveloperLoginDto":{"type":"object","properties":{"email":{"type":"string","example":"dev@partner.org"},"password":{"type":"string"},"deviceToken":{"type":"string","description":"Plaintext trusted-device token previously issued by verify-otp. A valid, unexpired token skips the OTP challenge."}},"required":["email","password"]},"DeveloperVerifyOtpDto":{"type":"object","properties":{"email":{"type":"string","example":"dev@partner.org"},"code":{"type":"string","example":"048213","pattern":"^\\d{6}$"},"rememberDevice":{"type":"boolean","default":false,"description":"Issue a 30-day trusted-device token alongside the session."},"deviceLabel":{"type":"string","description":"Coarse device label for the portal's \"your devices\" list, e.g. \"Chrome on macOS\"."}},"required":["email","code"]},"DeveloperStepUpDto":{"type":"object","properties":{"code":{"type":"string","example":"048213","pattern":"^\\d{6}$"}}},"DeveloperChangePasswordDto":{"type":"object","properties":{"currentPassword":{"type":"string"},"newPassword":{"type":"string","minLength":12,"maxLength":72}},"required":["currentPassword","newPassword"]}}}}