{"openapi":"3.1.0","info":{"title":"Allori Developer API","version":"1.0.0","description":"Allori is a client selection SaaS for interior designers.\nThis specification documents the **public HTTP surface** agents and integrations may call without designer login, plus documented designer-session scopes for reference.\n\n**Self-serve access:** Create selection requests for free at /selection-request; 30-day trial starts at checkout after a client's first selection.\n**Third-party OAuth clients:** not supported — designer access is via the web app session after sign-in.\n\nHuman docs: /developers · Machine summary: /llms.txt · OpenAPI: /openapi.json","contact":{"name":"Allori Support","email":"hello@allori.app","url":"https://www.allori.app/support"}},"servers":[{"url":"https://www.allori.app","description":"Production"}],"tags":[{"name":"Discovery","description":"API and agent resource discovery"},{"name":"Public","description":"Unauthenticated public endpoints"},{"name":"Agent","description":"Machine-readable content for AI agents"}],"paths":{"/api":{"get":{"operationId":"getAlloriApiDiscovery","summary":"Allori API discovery document","description":"Returns links to OpenAPI, developer documentation, llms.txt, and the self-serve free trial.","tags":["Discovery"],"responses":{"200":{"description":"API discovery metadata","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiDiscovery"}}}}}}},"/openapi.json":{"get":{"operationId":"getAlloriOpenApiSpec","summary":"OpenAPI specification","description":"Returns this OpenAPI 3.1 document.","tags":["Discovery"],"responses":{"200":{"description":"OpenAPI JSON document","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/support":{"post":{"operationId":"submitAlloriSupportRequest","summary":"Submit a support request","description":"Public support form submission. Accepts multipart form data with topic, email, message, and optional screenshot.","tags":["Public"],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["topic","email","message"],"properties":{"topic":{"type":"string","enum":["Question about using Allori","Account or billing","Technical issue","Feature suggestion","Something else"]},"email":{"type":"string","format":"email"},"message":{"type":"string"},"screenshot":{"type":"string","format":"binary"}}}}}},"responses":{"200":{"description":"Support request accepted","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true}}}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/team-waitlist":{"post":{"operationId":"joinAlloriTeamWaitlist","summary":"Join the Allori Team plan waitlist","description":"Public waitlist signup for multi-seat Team plans.","tags":["Public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamWaitlistRequest"}}}},"responses":{"200":{"description":"Waitlist signup recorded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamWaitlistResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/vote":{"post":{"operationId":"submitClientSelection","summary":"Submit a client selection on a shared link","description":"Public endpoint used by clients on selection pages. No designer login required.","tags":["Public"],"security":[{"ClientSelection":["client:selection:submit"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientSelectionRequest"}}}},"responses":{"200":{"description":"Selection recorded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientSelectionResponse"}}}},"400":{"description":"Invalid request or selection closed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Selection not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/markdown/{path}":{"get":{"operationId":"getAlloriAgentMarkdown","summary":"Agent markdown representation of a public page","description":"Returns markdown for public marketing pages. Also available via Accept: text/markdown on the canonical URL.","tags":["Agent"],"parameters":[{"name":"path","in":"path","required":false,"schema":{"type":"string"},"description":"Public page path without leading slash (empty for homepage)."}],"responses":{"200":{"description":"Markdown document","content":{"text/markdown":{"schema":{"type":"string"}}}},"404":{"description":"Page not found","content":{"text/markdown":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"ApiError":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Stable machine-readable error code."},"message":{"type":"string","description":"Human-readable error message."},"resolution":{"type":"string","description":"Suggested next step for the client or agent."}}}}},"ApiDiscovery":{"type":"object","required":["name","openapi","documentation"],"properties":{"name":{"type":"string","const":"Allori Public API"},"description":{"type":"string"},"openapi":{"type":"string","format":"uri"},"documentation":{"type":"string","format":"uri"},"llmsTxt":{"type":"string","format":"uri"},"freeTrialUrl":{"type":"string","format":"uri"},"pricingUrl":{"type":"string","format":"uri"},"thirdPartyOAuth":{"type":"boolean","const":false},"thirdPartyApiKeys":{"type":"boolean","const":false},"cliTool":{"type":"boolean","const":false}}},"TeamWaitlistRequest":{"type":"object","required":["name","email","teamSize"],"properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"},"teamSize":{"type":"string","enum":["2-4","5-8","9+"]}}},"TeamWaitlistResponse":{"type":"object","properties":{"ok":{"type":"boolean"},"alreadyRegistered":{"type":"boolean"}}},"ClientSelectionRequest":{"type":"object","required":["selectionId","optionId","voterId"],"properties":{"selectionId":{"type":"string","description":"Selection UUID or share token."},"optionId":{"type":"string","format":"uuid"},"voterId":{"type":"string","description":"Anonymous client voter identifier."},"clientNote":{"type":"string","nullable":true}}},"ClientSelectionResponse":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}},"securitySchemes":{"DesignerSession":{"type":"oauth2","description":"Designer access via Supabase browser session after sign-in at /login. Not available to third-party OAuth clients.","flows":{"authorizationCode":{"authorizationUrl":"https://www.allori.app/login","tokenUrl":"https://www.allori.app/api/auth/token","scopes":{"designer:product:access":"Full Allori web application access for authenticated designers","designer:selections:read":"Read selection requests and projects","designer:selections:write":"Create and edit selection requests","designer:billing:read":"View subscription and billing"}}}},"ClientSelection":{"type":"oauth2","description":"Scope describing anonymous client selection submission on shared links (no login).","flows":{"implicit":{"authorizationUrl":"https://www.allori.app/selection","scopes":{"client:selection:submit":"Submit a selection on a shared client selection page"}}}}}}}