{"openapi":"3.1.0","info":{"title":"Lanes API","version":"0.2.4","description":"The Lanes API. The public product surface is Lanes Forms: hosted form endpoints an agent can provision mid-task.\n\n**No account needed to start.** `POST /v1/forms` works with no credential and returns a live endpoint plus a single-use claim link to hand to the site owner.\n\n**Authentication.** Two bearer credentials: a workspace API key (`Authorization: Bearer lfk_...`, created self-serve in the dashboard) or a Firebase ID token for dashboard sessions. Machine-readable description at `/.well-known/oauth-protected-resource`.\n\n**Errors.** Domain endpoints return `{\"error\": {\"code\", \"message\", \"docs_url\"}}`. Branch on `code`, which is stable; the HTTP status carries the class. Every response carries `x-request-id`.\n\n**Rate limits.** Responses carry `RateLimit-Policy` and `RateLimit` (draft-ietf-httpapi-ratelimit-headers) plus the older `RateLimit-Limit`/`RateLimit-Remaining`/`RateLimit-Reset`. A 429 carries `Retry-After` in seconds.\n\n**Versioning.** The version is in the URL path. Within a version, new endpoints, new optional request fields, new response fields, and new error `code` values are backwards compatible: ignore unknown response fields. Retirement is signalled with `Deprecation` and `Sunset` headers at least six months ahead. Full policy: https://lanes.sh/developers","contact":{"name":"Lanes","email":"hello@lanes.sh","url":"https://lanes.sh/developers"},"termsOfService":"https://lanes.sh/terms/terms-and-conditions","license":{"name":"Proprietary","url":"https://lanes.sh/terms/terms-and-conditions"}},"paths":{"/v1/health/check":{"get":{"tags":["Health"],"summary":"Route Check","operationId":"getHealthCheck","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"description":"Route Check. Public. No credential required. Errors use the standard envelope; branch on error.code."}},"/v1/activity":{"post":{"tags":["Activity"],"summary":"Route Log Event","description":"Log an activity event (app_startup, daily_login, etc.).\n\nRequires a signed-in user (Firebase ID token).","operationId":"createActivity","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}]},"get":{"tags":["Activity"],"summary":"Route Get Events","description":"Get recent activity events for the authenticated user.\n\n``workspace_id`` optionally narrows to one workspace (the dashboard's\nsessions trace); events stay uid-scoped either way.\n\nRequires a signed-in user (Firebase ID token).","operationId":"getActivity","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}},{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}]}},"/v1/workspaces":{"get":{"tags":["Workspaces"],"summary":"Route List Workspaces","description":"List remote workspaces the authenticated user is a member of.\n\nRequires a signed-in user (Firebase ID token).","operationId":"getWorkspaces","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}]},"post":{"tags":["Workspaces"],"summary":"Route Create Workspace","description":"Create a remote workspace. The creator is auto-added as an admin member.\n\nRequires a signed-in user (Firebase ID token).","operationId":"createWorkspaces","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}]}},"/v1/workspaces/{wid}":{"patch":{"tags":["Workspaces"],"summary":"Route Update Workspace","description":"Rename a workspace. Admin only.\n\nRequires a signed-in user (Firebase ID token).","operationId":"updateWorkspacesByWid","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}]},"delete":{"tags":["Workspaces"],"summary":"Route Delete Workspace","description":"Delete a workspace. Admin only.\n\nRequires a signed-in user (Firebase ID token).","operationId":"deleteWorkspacesByWid","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}]}},"/v1/workspaces/{wid}/members":{"get":{"tags":["Workspace Members"],"summary":"Route List Members","operationId":"getWorkspacesByWidMembers","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route List Members. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."},"post":{"tags":["Workspace Members"],"summary":"Route Invite Member","operationId":"createWorkspacesByWidMembers","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Invite Member. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."}},"/v1/workspaces/{wid}/members/{member_id}/resend":{"post":{"tags":["Workspace Members"],"summary":"Route Resend Invite","operationId":"createWorkspacesByWidMembersByMemberResend","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}},{"name":"member_id","in":"path","required":true,"schema":{"type":"string","title":"Member Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Resend Invite. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."}},"/v1/workspaces/{wid}/members/{member_id}":{"patch":{"tags":["Workspace Members"],"summary":"Route Update Member","operationId":"updateWorkspacesByWidMembersByMember","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}},{"name":"member_id","in":"path","required":true,"schema":{"type":"string","title":"Member Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Update Member. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."},"delete":{"tags":["Workspace Members"],"summary":"Route Remove Member","operationId":"deleteWorkspacesByWidMembersByMember","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}},{"name":"member_id","in":"path","required":true,"schema":{"type":"string","title":"Member Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Remove Member. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."}},"/v1/invites/{token}":{"get":{"tags":["Workspace Members"],"summary":"Route Invite Page","operationId":"getInvitesByToken","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"description":"Route Invite Page. Public. No credential required. Errors use the standard envelope; branch on error.code."}},"/v1/invites/{token}/accept":{"post":{"tags":["Workspace Members"],"summary":"Route Accept Invite","operationId":"createInvitesByTokenAccept","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"description":"Route Accept Invite. Public. No credential required. Errors use the standard envelope; branch on error.code."}},"/v1/workspaces/{wid}/issues":{"post":{"tags":["Issues"],"summary":"Route Create Issue","operationId":"createWorkspacesByWidIssues","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Create Issue. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."},"get":{"tags":["Issues"],"summary":"Route List Issues","operationId":"getWorkspacesByWidIssues","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}},{"name":"since_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Since Id"}},{"name":"include_deleted","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Deleted"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route List Issues. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."}},"/v1/workspaces/{wid}/issues/{issue_id}":{"get":{"tags":["Issues"],"summary":"Route Get Issue","operationId":"getWorkspacesByWidIssuesByIssue","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Get Issue. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."},"patch":{"tags":["Issues"],"summary":"Route Update Issue","operationId":"updateWorkspacesByWidIssuesByIssue","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Update Issue. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."},"delete":{"tags":["Issues"],"summary":"Route Delete Issue","operationId":"deleteWorkspacesByWidIssuesByIssue","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Delete Issue. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."}},"/v1/workspaces/{wid}/sessions":{"post":{"tags":["Sessions"],"summary":"Route Upsert Session","operationId":"createWorkspacesByWidSessions","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Upsert Session. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."},"get":{"tags":["Sessions"],"summary":"Route List Sessions","operationId":"getWorkspacesByWidSessions","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}},{"name":"since_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Since Id"}},{"name":"include_deleted","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Deleted"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route List Sessions. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."}},"/v1/workspaces/{wid}/sessions/{issue_id}":{"get":{"tags":["Sessions"],"summary":"Route Get Session","operationId":"getWorkspacesByWidSessionsByIssue","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Get Session. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."},"patch":{"tags":["Sessions"],"summary":"Route Update Session","operationId":"updateWorkspacesByWidSessionsByIssue","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Update Session. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."},"delete":{"tags":["Sessions"],"summary":"Route Delete Session","operationId":"deleteWorkspacesByWidSessionsByIssue","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Delete Session. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."}},"/v1/workspaces/{wid}/sessions/{issue_id}/heartbeat":{"patch":{"tags":["Sessions"],"summary":"Route Session Heartbeat","operationId":"updateWorkspacesByWidSessionsByIssueHeartbeat","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Session Heartbeat. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."}},"/v1/workspaces/{wid}/sessions/{issue_id}/claim":{"post":{"tags":["Sessions"],"summary":"Route Session Claim","operationId":"createWorkspacesByWidSessionsByIssueClaim","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Session Claim. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."}},"/v1/workspaces/{wid}/sessions/{issue_id}/history":{"get":{"tags":["Sessions"],"summary":"Route Get Session History","operationId":"getWorkspacesByWidSessionsByIssueHistory","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Get Session History. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."},"put":{"tags":["Sessions"],"summary":"Route Upload Session History","operationId":"replaceWorkspacesByWidSessionsByIssueHistory","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}},{"name":"issue_id","in":"path","required":true,"schema":{"type":"integer","title":"Issue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Upload Session History. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."}},"/v1/workspaces/{wid}/draft":{"put":{"tags":["Drafts"],"summary":"Route Upsert Draft","operationId":"replaceWorkspacesByWidDraft","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Upsert Draft. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."},"get":{"tags":["Drafts"],"summary":"Route Get Draft","operationId":"getWorkspacesByWidDraft","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Get Draft. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."},"delete":{"tags":["Drafts"],"summary":"Route Delete Draft","operationId":"deleteWorkspacesByWidDraft","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Delete Draft. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."}},"/v1/workspaces/{wid}/project-components":{"post":{"tags":["Project Components"],"summary":"Route Create","operationId":"createWorkspacesByWidProjectComponents","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Create. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."},"get":{"tags":["Project Components"],"summary":"Route List","operationId":"getWorkspacesByWidProjectComponents","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}},{"name":"since_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since Id"}},{"name":"include_deleted","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Deleted"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route List. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."}},"/v1/workspaces/{wid}/project-components/{rid}":{"get":{"tags":["Project Components"],"summary":"Route Get","operationId":"getWorkspacesByWidProjectComponentsByRid","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}},{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Get. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."},"patch":{"tags":["Project Components"],"summary":"Route Update","operationId":"updateWorkspacesByWidProjectComponentsByRid","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}},{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Update. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."},"delete":{"tags":["Project Components"],"summary":"Route Delete","operationId":"deleteWorkspacesByWidProjectComponentsByRid","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}},{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Delete. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."}},"/v1/workspaces/{wid}/beacons":{"get":{"tags":["Beacons"],"summary":"Route List Beacons","operationId":"getWorkspacesByWidBeacons","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route List Beacons. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."}},"/v1/workspaces/{wid}/messages":{"get":{"tags":["Workspace Messages"],"summary":"Route List Messages","operationId":"getWorkspacesByWidMessages","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route List Messages. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."},"post":{"tags":["Workspace Messages"],"summary":"Route Create Message","operationId":"createWorkspacesByWidMessages","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Create Message. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."}},"/v1/workspaces/{wid}/messages/read":{"post":{"tags":["Workspace Messages"],"summary":"Route Mark Messages Read","operationId":"createWorkspacesByWidMessagesRead","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Route Mark Messages Read. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."}},"/v1/auth/google/config":{"get":{"tags":["Auth"],"summary":"Route Google Config","operationId":"getAuthGoogleConfig","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"description":"Route Google Config. Public. No credential required. Errors use the standard envelope; branch on error.code."}},"/v1/auth/google/exchange":{"post":{"tags":["Auth"],"summary":"Route Google Exchange","operationId":"createAuthGoogleExchange","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"description":"Route Google Exchange. Public. No credential required. Errors use the standard envelope; branch on error.code."}},"/v1/auth/github/config":{"get":{"tags":["Auth"],"summary":"Route Github Config","operationId":"getAuthGithubConfig","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"description":"Route Github Config. Public. No credential required. Errors use the standard envelope; branch on error.code."}},"/v1/auth/github/exchange":{"post":{"tags":["Auth"],"summary":"Route Github Exchange","operationId":"createAuthGithubExchange","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"description":"Route Github Exchange. Public. No credential required. Errors use the standard envelope; branch on error.code."}},"/v1/auth/linear/config":{"get":{"tags":["Auth"],"summary":"Route Linear Config","operationId":"getAuthLinearConfig","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"description":"Route Linear Config. Public. No credential required. Errors use the standard envelope; branch on error.code."}},"/v1/auth/linear/exchange":{"post":{"tags":["Auth"],"summary":"Route Linear Exchange","operationId":"createAuthLinearExchange","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"description":"Route Linear Exchange. Public. No credential required. Errors use the standard envelope; branch on error.code."}},"/v1/auth/linear/refresh":{"post":{"tags":["Auth"],"summary":"Route Linear Refresh","operationId":"createAuthLinearRefresh","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"description":"Route Linear Refresh. Public. No credential required. Errors use the standard envelope; branch on error.code."}},"/v1/auth/link/google/config":{"get":{"tags":["Auth"],"summary":"Route Link Google Config","description":"What the CLI needs to build an authorization URL, and whether to bother.\n\n``capacity`` is reported rather than enforced. Google is the authority on\nits own cap and refuses new accounts once it is spent, while accounts that\nalready granted keep working — so blocking here would lock out exactly the\nusers Google would still admit. The CLI warns on it; Google decides.\n\nPublic. No credential required.","operationId":"getAuthLinkGoogleConfig","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/link/google/exchange":{"post":{"tags":["Auth"],"summary":"Route Link Google Exchange","operationId":"createAuthLinkGoogleExchange","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"description":"Route Link Google Exchange. Public. No credential required. Errors use the standard envelope; branch on error.code."}},"/v1/auth/link/google/refresh":{"post":{"tags":["Auth"],"summary":"Route Link Google Refresh","description":"Trade a refresh token for a fresh access token.\n\nNote this does *not* consult the closed-for-new-connections switch. Closing\nthe tap is about admitting new accounts; applying it here would break every\nconnection already in use, in the middle of whatever an agent was doing.\nRevocation is the per-account tool, and that one does apply.\n\nPublic. No credential required.","operationId":"createAuthLinkGoogleRefresh","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/link/assert":{"post":{"tags":["Auth"],"summary":"Route Assert","description":"Mint an assertion naming the signed-in person, for one endpoint, once.\n\nPublic. No credential required.","operationId":"createAuthLinkAssert","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/link/slack/config":{"get":{"tags":["Auth"],"summary":"Route Link Slack Config","description":"What the CLI needs to build an authorization URL, and whether to bother.\n\nNo ``capacity``. Google reports one because it caps an unverified app at 100\naccounts for the lifetime of the project; Slack has no equivalent limit on a\ndistributed app, and reporting a made-up ceiling would have the CLI warning\nabout a wall that is not there.\n\nPublic. No credential required.","operationId":"getAuthLinkSlackConfig","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/link/slack/exchange":{"post":{"tags":["Auth"],"summary":"Route Link Slack Exchange","operationId":"createAuthLinkSlackExchange","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"description":"Route Link Slack Exchange. Public. No credential required. Errors use the standard envelope; branch on error.code."}},"/v1/auth/link/slack/callback":{"get":{"tags":["Auth"],"summary":"Route Link Slack Callback","description":"Bounce Slack's redirect down to the CLI listening on loopback.\n\nStateless by construction: everything needed to complete the hop is in the\nquery string Slack sends, and the destination port rides in ``state``. This\nservice stores nothing, remembers nothing between the two legs, and cannot\ncomplete an authorisation on its own — it does not hold the code long enough\nto try, and the PKCE verifier that would be needed to redeem it never leaves\nthe machine that generated it.\n\nErrors are bounced too rather than rendered. ``access_denied`` is the\noperator declining in the browser, and the CLI already has a sentence for\nthat; swallowing it here would leave the CLI waiting out its five-minute\ntimeout for a callback that is never coming.\n\nPublic. No credential required.","operationId":"getAuthLinkSlackCallback","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/link/slack/refresh":{"post":{"tags":["Auth"],"summary":"Route Link Slack Refresh","description":"Trade a refresh token for a fresh access token.\n\nReachable only where token rotation is enabled on the Slack app, which it is\nnot by default and is not today: without it Slack issues a long-lived user\ntoken and no refresh token, so Lanes Link has nothing to send here. Built\nanyway because rotation is a switch in Slack's console, and the alternative\nis that turning it on breaks every connection at once with a 404.\n\nLike Google's, this does not consult the closed-for-new-connections switch.\nClosing the tap is about admitting new accounts; applying it here would\nbreak connections already in use, in the middle of whatever an agent was\ndoing.\n\nPublic. No credential required.","operationId":"createAuthLinkSlackRefresh","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/analytics/ga4/collect":{"post":{"tags":["Analytics"],"summary":"Route Ga4 Collect","operationId":"createAnalyticsGa4Collect","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"description":"Route Ga4 Collect. Public. No credential required. Errors use the standard envelope; branch on error.code."}},"/v1/forms":{"post":{"tags":["forms"],"summary":"Create Form","description":"Provision a form.\n\nAnonymous by default: the form is born ``unclaimed`` and the single-use\n``claim_url`` is ALWAYS returned in the response for the caller to hand to the\nuser. With one or more ``recipients`` the claim link is ADDITIONALLY emailed\nto the FIRST one and ``claim_email_sent_to`` is echoed.\n\nEvery call creates a NEW form: two identical requests are two independent\nforms. To make a retry safe (a timeout, a network blip), send an\n``Idempotency-Key`` header — repeating a call with the same key replays the\noriginal instead of creating a second form, answering ``200`` with\n``idempotent_replay: true`` and ``claim_url: null`` (the link is only ever\nreturned once; keep the one from the original response). The key is scoped to\nthe caller, so it never collides with anyone else's.\n\nWith a workspace API key as bearer\n(``Authorization: Bearer lfk_...``) the form is instead born CLAIMED into the\nkey's workspace via ``create_claimed_form``, which deliberately SKIPS the\nanonymous path's anti-abuse gates AND its idempotency replay (the caller is an\nauthenticated workspace, not an anonymous stranger; every keyed call creates a\nnew form). The keyed response carries ``claim_url: null``,\n``claim_email_sent_to: null`` and ``expires_at: null``; no claim email is sent,\nbut a recipient-verification email fires to each recipient (when given) unless\nit is already verified in the workspace. Any non-``lfk_`` bearer is ignored and\nfalls through to anonymous provisioning.\n\nCredential OPTIONAL. Works anonymously; a workspace API key (Authorization: Bearer lfk_...) changes the behaviour, see the description.","operationId":"createForms","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormCreateResponse"}}}},"200":{"description":"Idempotent replay — claim_url is null","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormCreateResponse"}}}},"422":{"description":"Validation failed. error.details[] names each offending field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limited. Read Retry-After, then the RateLimit fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{},{"workspaceApiKey":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Opaque client-generated key that makes a retry safe. Repeating a create with the same key replays the original response with idempotent_replay: true and status 200 instead of creating a second form.","schema":{"type":"string","maxLength":255}}]}},"/v1/forms/{form_id}":{"get":{"tags":["forms"],"summary":"Get Form","operationId":"getFormsByForm","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormDetailResponse"}}}},"422":{"description":"Validation failed. error.details[] names each offending field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"workspaceApiKey":[]},{"firebaseIdToken":[]}],"description":"Get Form. Requires a workspace API key (Bearer lfk_...) or a signed-in dashboard session. Errors use the standard envelope; branch on error.code."},"patch":{"tags":["forms"],"summary":"Update Form","operationId":"updateFormsByForm","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormPatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormDetailResponse"}}}},"422":{"description":"Validation failed. error.details[] names each offending field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"workspaceApiKey":[]},{"firebaseIdToken":[]}],"description":"Update Form. Requires a workspace API key (Bearer lfk_...) or a signed-in dashboard session. Errors use the standard envelope; branch on error.code."},"delete":{"tags":["dashboard"],"summary":"Delete Form","description":"Soft-delete a form the caller can access (404 otherwise). Sets\nstate=deleted + deleted_at; idempotent (an already-deleted form still 204s).\nThe public submission endpoint and management GET/PATCH then return 410.\n\nRequires a signed-in dashboard session (Firebase ID token). A workspace API key is NOT accepted here.","operationId":"deleteFormsByForm","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Form Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation failed. error.details[] names each offending field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}]}},"/v1/f/{form_id}":{"post":{"tags":["submissions"],"summary":"Create Submission","operationId":"createFByForm","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"responses":{"200":{"description":"The submission was accepted and stored.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"submission_id":{"type":"string","description":"Identifier of the stored submission."}},"required":["submission_id"]}}}},"422":{"description":"Validation failed. error.details[] names each offending field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"410":{"description":"The resource is no longer available.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limited. Read Retry-After, then the RateLimit fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{},{"workspaceApiKey":[]}],"description":"Create Submission. Credential OPTIONAL. Works anonymously; a workspace API key (Authorization: Bearer lfk_...) changes the behaviour, see the description. Errors use the standard envelope; branch on error.code.","requestBody":{"required":true,"description":"The submission, as a mapping of the form's field names to values. Accepts application/json, application/x-www-form-urlencoded, and multipart/form-data, so the same endpoint serves a fetch() call and a plain HTML <form>. Do not send the _gotcha honeypot field; it must stay empty or the submission is treated as spam.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"example":{"email":"person@example.com","message":"Hello"}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","additionalProperties":true}},"multipart/form-data":{"schema":{"type":"object","additionalProperties":true}}}}},"get":{"tags":["submissions"],"summary":"Get Public Form","description":"Public, unauthenticated read of a form's renderable shape, backing the\nhosted form page (`/forms/f/{id}`).\n\nReturns ONLY what a respondent's browser needs: name, field schema, and\nsubmission mode — no recipients, workflow, counters, origins, or secrets. A\ndeleted form is indistinguishable from a missing one (404); a frozen form is\n410 (closed), mirroring the submission route's state gate. Unclaimed and\nclaimed forms both render.\n\nCredential OPTIONAL. Works anonymously; a workspace API key (Authorization: Bearer lfk_...) changes the behaviour, see the description.","operationId":"getFByForm","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicFormResponse"}}}},"422":{"description":"Validation failed. error.details[] names each offending field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"410":{"description":"The resource is no longer available.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limited. Read Retry-After, then the RateLimit fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{},{"workspaceApiKey":[]}]},"options":{"tags":["submissions"],"summary":"Preflight Submission","description":"Explicit per-form CORS preflight. A global allowlist cannot answer it —\nthe allowed set is the form's own ``allowed_origins``.\n\nCredential OPTIONAL. Works anonymously; a workspace API key (Authorization: Bearer lfk_...) changes the behaviour, see the description.","operationId":"optionsFByForm","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation failed. error.details[] names each offending field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"410":{"description":"The resource is no longer available.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limited. Read Retry-After, then the RateLimit fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{},{"workspaceApiKey":[]}]}},"/v1/claim/{token}":{"get":{"tags":["claims"],"summary":"Claim Redirect","operationId":"getClaimByToken","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"description":"Claim Redirect. Public. The claim token in the path is the credential. Errors use the standard envelope; branch on error.code."},"post":{"tags":["claims"],"summary":"Claim Redeem","operationId":"createClaimByToken","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimRedeemResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Claim Redeem. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."}},"/v1/claim/{token}/preview":{"get":{"tags":["claims"],"summary":"Claim Preview","operationId":"getClaimByTokenPreview","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimPreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"description":"Claim Preview. Public. The claim token in the path is the credential. Errors use the standard envelope; branch on error.code."}},"/thanks/{form_id}":{"get":{"tags":["pages"],"summary":"Thanks","operationId":"getThanksByForm","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"description":"Thanks. Public. No credential required. Errors use the standard envelope; branch on error.code."}},"/v1/me":{"get":{"tags":["dashboard-auth"],"summary":"Get Me","operationId":"getMe","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Get Me. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."}},"/v1/workspaces/{workspace_id}/forms":{"get":{"tags":["dashboard"],"summary":"List Workspace Forms","description":"Every non-deleted form in a workspace the caller is a member of, each with\nits non-spam stored submission count — one query for the whole dashboard\noverview. 404 ``workspace_not_found`` if the caller is not an active member.\n\nRequires a signed-in user (Firebase ID token).","operationId":"getWorkspacesByWorkspaceForms","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FormListItem"},"title":"Response List Workspace Forms V1 Workspaces  Workspace Id  Forms Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}]},"post":{"tags":["dashboard"],"summary":"Create Workspace Form","description":"Create a form directly in the caller's workspace, born ``claimed`` (no claim\nemail). The authenticated counterpart to anonymous ``POST /v1/forms``: kept a\nseparate path so neither route juggles two auth modes. Born claimed, so no\nclaim link is issued or returned. 404 ``workspace_not_found`` if the caller is\nnot an active member.\n\nRequires a signed-in user (Firebase ID token).","operationId":"createWorkspacesByWorkspaceForms","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}]}},"/v1/forms/{form_id}/submissions":{"get":{"tags":["dashboard"],"summary":"List Submissions","description":"Paginated submissions for a claimed form the caller can access (404\notherwise). ``?format=csv`` streams a CSV export instead of JSON; ``is_spam``\nfilters both (None = all). Ordered newest first (created_at DESC, id DESC).\n\nRequires a signed-in dashboard session (Firebase ID token). A workspace API key is NOT accepted here.","operationId":"getFormsByFormSubmissions","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Form Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}},{"name":"is_spam","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Spam"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionListResponse"}}}},"422":{"description":"Validation failed. error.details[] names each offending field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}]}},"/v1/workspaces/{workspace_id}/api-keys":{"post":{"tags":["api-keys"],"summary":"Create Workspace Api Key","description":"Mint a workspace API key. The ``key`` in the response is the plaintext,\nreturned exactly once — it is never retrievable again. 429\n``api_key_limit_reached`` once the workspace has the maximum number of\nACTIVE (non-revoked) keys.\n\nRequires a signed-in user (Firebase ID token).","operationId":"createWorkspacesByWorkspaceApiKeys","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limited. Read Retry-After, then the RateLimit fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}]},"get":{"tags":["api-keys"],"summary":"List Workspace Api Keys","description":"The workspace's keys, oldest first, revoked ones included (rendered\nmuted client-side). Never the plaintext, never the hash.\n\nRequires a signed-in user (Firebase ID token).","operationId":"getWorkspacesByWorkspaceApiKeys","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyListItem"},"title":"Response List Workspace Api Keys V1 Workspaces  Workspace Id  Api Keys Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limited. Read Retry-After, then the RateLimit fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}]}},"/v1/workspaces/{workspace_id}/api-keys/{key_id}":{"delete":{"tags":["api-keys"],"summary":"Revoke Workspace Api Key","description":"Revoke a key (sets ``revoked_at``; the row is kept for the listing).\nIdempotent: revoking an already-revoked key still 204s. An unknown id or a\nkey belonging to another workspace is 404 ``api_key_not_found``.\n\nRequires a signed-in user (Firebase ID token).","operationId":"deleteWorkspacesByWorkspaceApiKeysByKey","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workspace Id"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limited. Read Retry-After, then the RateLimit fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}]}},"/v1/verify-email/{token}":{"get":{"tags":["recipients"],"summary":"Verify Email","operationId":"getVerifyEmailByToken","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"description":"Verify Email. Public. No credential required. Errors use the standard envelope; branch on error.code."}},"/v1/forms/{form_id}/recipients/resend-verification":{"post":{"tags":["recipients"],"summary":"Resend Verification","operationId":"createFormsByFormRecipientsResendVerification","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendVerificationRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendVerificationResponse"}}}},"422":{"description":"Validation failed. error.details[] names each offending field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"No such resource, or it is not visible to this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Resend Verification. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."}},"/v1/billing/checkout":{"post":{"tags":["billing"],"summary":"Start Checkout","operationId":"createBillingCheckout","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingRedirect"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Start Checkout. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."}},"/v1/billing/portal":{"post":{"tags":["billing"],"summary":"Open Portal","operationId":"createBillingPortal","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingRedirect"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Open Portal. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."}},"/v1/billing/usage":{"get":{"tags":["billing"],"summary":"Billing Usage","operationId":"getBillingUsage","parameters":[{"name":"workspace_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingUsageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Authenticated, but not permitted (or the browser Origin is not allowed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"firebaseIdToken":[]}],"description":"Billing Usage. Requires a signed-in user (Firebase ID token). Errors use the standard envelope; branch on error.code."}},"/v1/billing/webhook":{"post":{"tags":["billing"],"summary":"Stripe Webhook","operationId":"createBillingWebhook","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"413":{"description":"Request body exceeded the size cap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Unexpected server error. Retry with backoff and quote x-request-id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"description":"Stripe Webhook. Public. No credential required. Errors use the standard envelope; branch on error.code."}}},"components":{"schemas":{"ApiKeyCreateRequest":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"ApiKeyCreateRequest"},"ApiKeyCreatedResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"key":{"type":"string","title":"Key"},"key_prefix":{"type":"string","title":"Key Prefix"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","key","key_prefix","created_at"],"title":"ApiKeyCreatedResponse","description":"The create response — the ONLY place the plaintext ``key`` ever appears."},"ApiKeyListItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"}},"type":"object","required":["id","name","key_prefix","created_at","last_used_at","revoked_at"],"title":"ApiKeyListItem","description":"One row of the key listing. Revoked keys are included (``revoked_at``\nset) so the dashboard can render them muted."},"BillingLimits":{"properties":{"seats":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seats"},"max_forms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Forms"},"monthly_submissions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Submissions"},"allowed_origins_enabled":{"type":"boolean","title":"Allowed Origins Enabled"},"api_key_submission_auth_enabled":{"type":"boolean","title":"Api Key Submission Auth Enabled"},"email_forwarding_enabled":{"type":"boolean","title":"Email Forwarding Enabled"}},"type":"object","required":["seats","max_forms","monthly_submissions","allowed_origins_enabled","api_key_submission_auth_enabled","email_forwarding_enabled"],"title":"BillingLimits","description":"Mirrors ``kernel.billing.plans.PlanLimits`` (``None`` = unbounded)."},"BillingRedirect":{"properties":{"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"BillingRedirect","description":"A URL to redirect the browser to (Stripe Checkout or the billing portal)."},"BillingUsageNumbers":{"properties":{"forms_used":{"type":"integer","title":"Forms Used"},"submissions_used":{"type":"integer","title":"Submissions Used"},"seats_used":{"type":"integer","title":"Seats Used"}},"type":"object","required":["forms_used","submissions_used","seats_used"],"title":"BillingUsageNumbers"},"BillingUsageResponse":{"properties":{"plan":{"type":"string","title":"Plan"},"subscription_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Status"},"current_period_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Current Period End"},"cancel_at_period_end":{"type":"boolean","title":"Cancel At Period End"},"limits":{"$ref":"#/components/schemas/BillingLimits"},"usage":{"$ref":"#/components/schemas/BillingUsageNumbers"}},"type":"object","required":["plan","subscription_status","current_period_end","cancel_at_period_end","limits","usage"],"title":"BillingUsageResponse"},"CheckoutRequest":{"properties":{"workspace_id":{"type":"string","format":"uuid","title":"Workspace Id"},"plan":{"type":"string","enum":["free","pro","enterprise"],"title":"Plan","default":"pro"}},"type":"object","required":["workspace_id"],"title":"CheckoutRequest"},"ClaimPreviewResponse":{"properties":{"status":{"type":"string","enum":["claimable","already_claimed","deleted","invalid_or_expired"],"title":"Status"},"frozen":{"type":"boolean","title":"Frozen"},"form_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Form Id"},"form_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Form Name"},"claim_email_masked":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claim Email Masked"},"submissions_waiting":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Submissions Waiting"},"token_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Token Expires At"}},"type":"object","required":["status","frozen","form_id","form_name","claim_email_masked","submissions_waiting","token_expires_at"],"title":"ClaimPreviewResponse","description":"Public, non-consuming look at a claim link. Detail fields are null\nunless ``status`` is ``claimable``; ``frozen`` is true only for a claimable\ntoken on a frozen form (frozen forms ARE claimable — claiming restores\nthem). ``claim_email_masked`` never exposes the full address."},"ClaimRedeemResponse":{"properties":{"ok":{"type":"boolean","title":"Ok","default":true},"form_id":{"type":"string","format":"uuid","title":"Form Id"},"workspace_id":{"type":"string","format":"uuid","title":"Workspace Id"},"submissions_waiting":{"type":"integer","title":"Submissions Waiting"}},"type":"object","required":["form_id","workspace_id","submissions_waiting"],"title":"ClaimRedeemResponse","description":"Confirms a redeemed claim: the form now belongs to the caller."},"EmailAction":{"properties":{"type":{"type":"string","const":"email","title":"Type"},"enabled":{"type":"boolean","title":"Enabled","default":true},"to":{"items":{"type":"string","format":"email"},"type":"array","title":"To","default":[]}},"type":"object","required":["type"],"title":"EmailAction"},"FieldSpec":{"properties":{"name":{"type":"string","title":"Name"},"type":{"type":"string","enum":["text","email","textarea","number","checkbox","hidden"],"title":"Type"},"required":{"type":"boolean","title":"Required","default":false},"max_length":{"anyOf":[{"type":"integer","maximum":10000.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Max Length"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["name","type"],"title":"FieldSpec","description":"One field in a form's schema, as supplied by the caller."},"FormCounters":{"properties":{"submissions_stored":{"type":"integer","title":"Submissions Stored"},"spam_count":{"type":"integer","title":"Spam Count"},"unclaimed_remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Unclaimed Remaining"},"state":{"type":"string","title":"State"}},"type":"object","required":["submissions_stored","spam_count","unclaimed_remaining","state"],"title":"FormCounters","description":"Submission tallies for a form's detail view.\n\n``unclaimed_remaining`` is the headroom under the unclaimed cap (all stored\nrows, spam included, count against it) while the form is unclaimed, and\nNone for any other state (claimed OR frozen) — the cap only applies to\nunclaimed forms."},"FormCreateRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Name"},"recipients":{"items":{"type":"string","format":"email"},"type":"array","maxItems":5,"title":"Recipients"},"allowed_origins":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Allowed Origins","description":"Hostnames allowed to submit this form from a browser (e.g. 'example.com', '*.example.com'). Enforced only when the request carries a browser Origin header; it does NOT block server-side callers such as curl, which send no Origin. To require a credential on server-side / no-Origin submissions, set submission_auth to 'api_key'."},"schema":{"items":{"$ref":"#/components/schemas/FieldSpec"},"type":"array","maxItems":50,"minItems":1,"title":"Schema"},"forward_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Forward Email"},"store_submissions":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Store Submissions"},"workflow":{"anyOf":[{"items":{"oneOf":[{"$ref":"#/components/schemas/EmailAction"},{"$ref":"#/components/schemas/StoreAction"},{"$ref":"#/components/schemas/WebhookAction"}],"discriminator":{"propertyName":"type","mapping":{"email":"#/components/schemas/EmailAction","store":"#/components/schemas/StoreAction","webhook":"#/components/schemas/WebhookAction"}}},"type":"array"},{"type":"null"}],"title":"Workflow"},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","required":["schema"],"title":"FormCreateRequest","description":"Anonymous (and, in a later task, authenticated) form-creation payload."},"FormCreateResponse":{"properties":{"form_id":{"type":"string","format":"uuid","title":"Form Id"},"endpoint_url":{"type":"string","title":"Endpoint Url"},"hosted_url":{"type":"string","title":"Hosted Url"},"claim_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claim Url"},"state":{"type":"string","title":"State"},"claim_email_sent_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claim Email Sent To"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"limits":{"$ref":"#/components/schemas/Limits"},"workflow":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Workflow"},"forward_email":{"type":"boolean","title":"Forward Email"},"store_submissions":{"type":"boolean","title":"Store Submissions"},"idempotent_replay":{"type":"boolean","title":"Idempotent Replay","default":false}},"type":"object","required":["form_id","endpoint_url","hosted_url","claim_url","state","claim_email_sent_to","expires_at","limits","workflow","forward_email","store_submissions"],"title":"FormCreateResponse"},"FormDetailResponse":{"properties":{"form_id":{"type":"string","format":"uuid","title":"Form Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"state":{"type":"string","title":"State"},"submission_auth":{"type":"string","title":"Submission Auth"},"workspace_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workspace Id"},"allowed_origins":{"items":{"type":"string"},"type":"array","title":"Allowed Origins"},"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Schema"},"workflow":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Workflow"},"forward_email":{"type":"boolean","title":"Forward Email"},"store_submissions":{"type":"boolean","title":"Store Submissions"},"endpoint_url":{"type":"string","title":"Endpoint Url"},"hosted_url":{"type":"string","title":"Hosted Url"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"claimed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Claimed At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"counters":{"$ref":"#/components/schemas/FormCounters"},"unverified_recipients":{"items":{"type":"string"},"type":"array","title":"Unverified Recipients","default":[]}},"type":"object","required":["form_id","name","state","submission_auth","allowed_origins","schema","workflow","forward_email","store_submissions","endpoint_url","hosted_url","created_at","claimed_at","expires_at","counters"],"title":"FormDetailResponse","description":"The management view of a form."},"FormListItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"state":{"type":"string","title":"State"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"claimed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Claimed At"},"submission_count":{"type":"integer","title":"Submission Count"}},"type":"object","required":["id","name","state","created_at","updated_at","claimed_at","submission_count"],"title":"FormListItem","description":"One row of ``GET /v1/workspaces/{workspace_id}/forms``.\n``submission_count`` counts only non-spam stored submissions (matching the\nmanagement detail counters)."},"FormPatchRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Name"},"recipients":{"anyOf":[{"items":{"type":"string","format":"email"},"type":"array","maxItems":5},{"type":"null"}],"title":"Recipients"},"allowed_origins":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":20},{"type":"null"}],"title":"Allowed Origins","description":"Hostnames allowed to submit this form from a browser (e.g. 'example.com', '*.example.com'). Enforced only when the request carries a browser Origin header; it does NOT block server-side callers such as curl. Use submission_auth='api_key' to require a credential on server-side / no-Origin submissions."},"schema":{"anyOf":[{"items":{"$ref":"#/components/schemas/FieldSpec"},"type":"array","maxItems":50,"minItems":1},{"type":"null"}],"title":"Schema"},"submission_auth":{"anyOf":[{"type":"string","enum":["open","api_key"]},{"type":"null"}],"title":"Submission Auth","description":"Credential policy for server-side / no-Origin submissions. 'open' (default): accepted with no credential (browser submissions still use allowed_origins). 'api_key': the request must send 'Authorization: Bearer <lfk_...>'. Settable only after the form is claimed."},"forward_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Forward Email"},"store_submissions":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Store Submissions"},"workflow":{"anyOf":[{"items":{"oneOf":[{"$ref":"#/components/schemas/EmailAction"},{"$ref":"#/components/schemas/StoreAction"},{"$ref":"#/components/schemas/WebhookAction"}],"discriminator":{"propertyName":"type","mapping":{"email":"#/components/schemas/EmailAction","store":"#/components/schemas/StoreAction","webhook":"#/components/schemas/WebhookAction"}}},"type":"array"},{"type":"null"}],"title":"Workflow"}},"type":"object","title":"FormPatchRequest","description":"Partial update of a form's configuration.\n\nEvery field is optional; the route reads ``model_fields_set`` to tell an\nabsent field from one explicitly set (including set-to-null, which clears\n``name``). Validators mirror ``FormCreateRequest`` via the shared helpers,\nguarding None so an omitted field is left untouched."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"Limits":{"properties":{"unclaimed_max_submissions":{"type":"integer","title":"Unclaimed Max Submissions"}},"type":"object","required":["unclaimed_max_submissions"],"title":"Limits","description":"The provisioning limits echoed back to the caller."},"MeMembership":{"properties":{"workspace_id":{"type":"string","format":"uuid","title":"Workspace Id"},"workspace_name":{"type":"string","title":"Workspace Name"},"plan":{"type":"string","title":"Plan"},"role":{"type":"string","title":"Role"},"restricted":{"type":"boolean","title":"Restricted","default":false},"is_primary_admin":{"type":"boolean","title":"Is Primary Admin","default":false},"usage":{"anyOf":[{"$ref":"#/components/schemas/MeUsage"},{"type":"null"}]}},"type":"object","required":["workspace_id","workspace_name","plan","role"],"title":"MeMembership"},"MeResponse":{"properties":{"user":{"$ref":"#/components/schemas/MeUser"},"memberships":{"items":{"$ref":"#/components/schemas/MeMembership"},"type":"array","title":"Memberships"}},"type":"object","required":["user","memberships"],"title":"MeResponse","description":"The signed-in user and every workspace they belong to."},"MeUsage":{"properties":{"forms_used":{"type":"integer","title":"Forms Used"},"seats_used":{"type":"integer","title":"Seats Used"},"max_forms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Forms"},"seats":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seats"}},"type":"object","required":["forms_used","seats_used","max_forms","seats"],"title":"MeUsage","description":"Usage vs. limits for a restricted workspace — powers the owner banner\n(e.g. \"4/3 forms, 2/1 members\"). ``None`` limit means unbounded."},"MeUser":{"properties":{"uid":{"type":"string","title":"Uid"},"email":{"type":"string","title":"Email"}},"type":"object","required":["uid","email"],"title":"MeUser"},"PortalRequest":{"properties":{"workspace_id":{"type":"string","format":"uuid","title":"Workspace Id"}},"type":"object","required":["workspace_id"],"title":"PortalRequest"},"PublicFormResponse":{"properties":{"form_id":{"type":"string","format":"uuid","title":"Form Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"submission_auth":{"type":"string","title":"Submission Auth"},"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Schema"},"state":{"type":"string","title":"State"}},"type":"object","required":["form_id","name","submission_auth","schema","state"],"title":"PublicFormResponse","description":"The public, unauthenticated view of a form, backing the hosted renderer\nat `/forms/f/{id}`.\n\nDeliberately minimal: only what a respondent's browser needs to render and\nsubmit the form. It exposes NO recipients, workflow, counters, allowed\norigins, workspace, or timestamps."},"ResendVerificationRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ResendVerificationRequest"},"ResendVerificationResponse":{"properties":{"ok":{"type":"boolean","title":"Ok","default":true},"email":{"type":"string","title":"Email"},"reason":{"type":"string","enum":["sent","already_verified","throttled"],"title":"Reason"},"verification_sent":{"type":"boolean","title":"Verification Sent"}},"type":"object","required":["email","reason","verification_sent"],"title":"ResendVerificationResponse"},"StoreAction":{"properties":{"type":{"type":"string","const":"store","title":"Type"},"enabled":{"type":"boolean","title":"Enabled","default":true},"destination":{"type":"string","enum":["lanes","custom"],"title":"Destination","default":"lanes"}},"type":"object","required":["type"],"title":"StoreAction"},"SubmissionItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"extra":{"additionalProperties":true,"type":"object","title":"Extra"},"origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"},"is_spam":{"type":"boolean","title":"Is Spam"},"spam_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Spam Score"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"released":{"type":"boolean","title":"Released"}},"type":"object","required":["id","data","extra","origin","is_spam","spam_score","created_at","released"],"title":"SubmissionItem","description":"One submission in the paginated ``GET /v1/forms/{id}/submissions`` view."},"SubmissionListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SubmissionItem"},"type":"array","title":"Items"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"total":{"type":"integer","title":"Total"},"has_more":{"type":"boolean","title":"Has More"}},"type":"object","required":["items","page","page_size","total","has_more"],"title":"SubmissionListResponse","description":"A page of submissions. ``has_more`` is true when later pages exist."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebhookAction":{"properties":{"type":{"type":"string","const":"webhook","title":"Type"},"enabled":{"type":"boolean","title":"Enabled","default":false},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","required":["type"],"title":"WebhookAction"},"ErrorEnvelope":{"type":"object","title":"Error envelope","description":"The error shape returned by every domain endpoint. `code` is a stable identifier to branch on.","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"Stable machine-readable error identifier.","example":"submission_rate_limited"},"message":{"type":"string","description":"Human-readable explanation."},"docs_url":{"type":"string","description":"Where to read more about this error."},"details":{"type":"array","description":"Per-field validation reasons, on a 422.","items":{"type":"object","additionalProperties":true}}},"required":["code","message"]}},"required":["error"]}},"securitySchemes":{"workspaceApiKey":{"type":"http","scheme":"bearer","bearerFormat":"lfk_","description":"A workspace API key, created self-serve in the dashboard and sent as `Authorization: Bearer lfk_...`. Scoped to one workspace. Server-side only: it must never reach a browser. Keys carry no per-key scope selection today; see `/.well-known/oauth-protected-resource` for the capability vocabulary."},"firebaseIdToken":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"A Firebase ID token, the credential the signed-in dashboard uses. The account's email must be verified."}}},"servers":[{"url":"https://api.lanes.sh","description":"Lanes API"}],"tags":[{"name":"Activity","description":"Activity events."},{"name":"Analytics","description":"Client analytics proxy."},{"name":"api-keys","description":"Workspace API keys (lfk_), the server-side credential."},{"name":"Auth","description":"OAuth code exchange brokered on behalf of the desktop app."},{"name":"Beacons","description":"Presence beacons."},{"name":"billing","description":"Plans, checkout, and usage."},{"name":"claims","description":"Take ownership of an anonymously provisioned form."},{"name":"dashboard","description":"Workspace-scoped views for the signed-in dashboard."},{"name":"dashboard-auth","description":"Sign-in bootstrap for the dashboard."},{"name":"Drafts","description":"Per-workspace issue drafts."},{"name":"forms","description":"Provision and manage hosted form endpoints."},{"name":"Health","description":"Liveness probe. Public."},{"name":"Issues","description":"The issue board."},{"name":"pages","description":"Public HTML pages served by the API itself."},{"name":"Project Components","description":"Components an issue can be filed against."},{"name":"recipients","description":"Verify the addresses a form forwards to."},{"name":"Sessions","description":"Coding-agent sessions attached to issues."},{"name":"submissions","description":"Submit to a form endpoint, and read what was submitted."},{"name":"Workspace Members","description":"Membership and invitations."},{"name":"Workspace Messages","description":"In-workspace messages."},{"name":"Workspaces","description":"Workspaces, the top-level tenant."}],"externalDocs":{"description":"Lanes developer resources","url":"https://lanes.sh/developers"}}