{"openapi":"3.1.0","info":{"title":"surfpoland API","description":"\nREST API for the surfpoland federation platform — members, organisations, qualifications,\nnational teams, events and governance.\n\n**Conventions**\n* All responses use the `{ data, error, meta }` envelope.\n* Dates are ISO 8601 (`YYYY-MM-DD`); ids are UUIDs.\n* Authentication: send the session JWT (from `POST /auth/session`) in the\n  `X-User-Token` header. *(A custom header is used because Firebase Hosting\n  strips `Authorization` when proxying to Cloud Run.)*\n","version":"0.2.0"},"paths":{"/api/v0/organisations/{organisation_id}/ai-options":{"get":{"tags":["organisations"],"summary":"Get Ai Options","description":"Which models this organisation may pick from, and what it has spent.\n\nThe same payload the meeting assistant's own options endpoint returns, by\norganisation rather than by meeting — the meeting create dialog is choosing a\nmodel before any meeting exists. The list is the one the server validates a\nchoice against, so a picker cannot offer something the next request refuses.\n\nReadable by this organisation's own people and by federation admins — the\nsame rule its statute follows. It says nothing about any person, but it does\nsay what an association is paying for and how hard it is leaning on it,\nwhich is its own business rather than every signed-in user's.","operationId":"get_ai_options_api_v0_organisations__organisation_id__ai_options_get","parameters":[{"name":"organisation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Organisation Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_OrganisationAiOptionsRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/organisations":{"get":{"tags":["organisations"],"summary":"List Organisations","operationId":"list_organisations_api_v0_organisations_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100,"minimum":1},{"type":"null"}],"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"types","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Types"}},{"name":"disciplines","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Disciplines"}},{"name":"status","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Status"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"}},{"name":"order","in":"query","required":false,"schema":{"type":"string","default":"asc","title":"Order"}},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_Union_OrganisationListAdminRead__OrganisationPublicRead___"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["organisations"],"summary":"Create Organisation","operationId":"create_organisation_api_v0_organisations_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganisationPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_OrganisationRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/organisations/{organisation_id}/detail":{"get":{"tags":["organisations"],"summary":"Get Organisation Detail","operationId":"get_organisation_detail_api_v0_organisations__organisation_id__detail_get","parameters":[{"name":"organisation_id","in":"path","required":true,"schema":{"type":"string","title":"Organisation Id"}},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_OrganisationDetailRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/organisations/{organisation_id}":{"get":{"tags":["organisations"],"summary":"Get Organisation","operationId":"get_organisation_api_v0_organisations__organisation_id__get","parameters":[{"name":"organisation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Organisation Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_OrganisationRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["organisations"],"summary":"Update Organisation","operationId":"update_organisation_api_v0_organisations__organisation_id__put","parameters":[{"name":"organisation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Organisation Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganisationPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_OrganisationRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["organisations"],"summary":"Delete Organisation","operationId":"delete_organisation_api_v0_organisations__organisation_id__delete","parameters":[{"name":"organisation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Organisation Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/organisations/{organisation_id}/status":{"put":{"tags":["organisations"],"summary":"Set Organisation Status","description":"Publish or unpublish. Kept off the main payload deliberately: the detail\npages send a full-object PUT, so a shared field would let any edit reset the\nstatus by omission.","operationId":"set_organisation_status_api_v0_organisations__organisation_id__status_put","parameters":[{"name":"organisation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Organisation Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_OrganisationRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/persons":{"get":{"tags":["persons"],"summary":"List Persons","operationId":"list_persons_api_v0_persons_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100,"minimum":1},{"type":"null"}],"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"types","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Types"}},{"name":"active_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Active Type"}},{"name":"disciplines","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Disciplines"}},{"name":"status","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Status"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"}},{"name":"order","in":"query","required":false,"schema":{"type":"string","default":"asc","title":"Order"}},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_PersonPublicRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["persons"],"summary":"Create Person","operationId":"create_person_api_v0_persons_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_PersonRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/persons/{person_id}/consents":{"get":{"tags":["persons"],"summary":"List Person Consents","description":"Consent history for the sign-in account linked to this person, for the\nadmin person view. Consent is recorded per **account** (a person has 0..1),\nso this returns the linked account's append-only consent_events, newest\nfirst — or an empty list when the person has never signed in.\n`has_account` lets the UI explain an empty list (\"no linked account\").","operationId":"list_person_consents_api_v0_persons__person_id__consents_get","parameters":[{"name":"person_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_PersonConsentRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/persons/{person_id}/account":{"get":{"tags":["persons"],"summary":"Get Person Account","description":"The sign-in account(s) this person is linked to (via account_persons), with\nthe relationship, so the admin person view can cross-link to the account. A\nperson with no linked account returns an empty list.","operationId":"get_person_account_api_v0_persons__person_id__account_get","parameters":[{"name":"person_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_PersonAccountRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/persons/{person_id}/qualifications":{"get":{"tags":["persons"],"summary":"List Person Qualifications Public","description":"Public: returns minimal qualification info (no PII) for a person.","operationId":"list_person_qualifications_public_api_v0_persons__person_id__qualifications_get","parameters":[{"name":"person_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Person Id"}},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_PersonQualificationPublicRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/persons/{person_id}":{"get":{"tags":["persons"],"summary":"Get Person","operationId":"get_person_api_v0_persons__person_id__get","parameters":[{"name":"person_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_PersonRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["persons"],"summary":"Update Person","operationId":"update_person_api_v0_persons__person_id__put","parameters":[{"name":"person_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_PersonRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["persons"],"summary":"Delete Person","operationId":"delete_person_api_v0_persons__person_id__delete","parameters":[{"name":"person_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/persons/{person_id}/public":{"get":{"tags":["persons"],"summary":"Get Person Public","description":"Public person profile (lightweight shape, matching the public list item).\nAvailable for a consented person, or one visible via National Team /\nGovernance — so their detail screen opens even without consent. 404 otherwise\n(including for DRAFT people).","operationId":"get_person_public_api_v0_persons__person_id__public_get","parameters":[{"name":"person_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Person Id"}},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_PersonPublicRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/persons/{person_id}/restore":{"post":{"tags":["persons"],"summary":"Restore Person","description":"Bring an archived/anonymised person back into the ordinary lists.\n\nOnly the hiding is undone — `anonymized_at` is cleared and the row is visible\nagain, keeping the SAME id, so every reference that survived the delete\n(meetings, governance, national teams, qualifications, the ledger) is live once\nmore without any relinking.\n\nWhat the delete *removed* does not come back: contact details, photo,\ndisciplines, organisation memberships, account links and affiliations were\ndeleted rows, and an anonymised person's name was overwritten with a pseudonym.\nThe UI has to say so before asking to confirm — see the restore dialog.","operationId":"restore_person_api_v0_persons__person_id__restore_post","parameters":[{"name":"person_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_PersonRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/persons/{person_id}/deletion-preview":{"get":{"tags":["persons"],"summary":"Preview Person Deletion","description":"What DELETE /persons/{id} would actually do, without doing it.\n\n\"Delete\" only means delete when the person is referenced by nothing that has\nto be retained; otherwise the record is archived or anonymised. The admin\nconfirming needs to be told which, and what makes it so — hence the reason\ncodes (the UI turns them into a sentence each).","operationId":"preview_person_deletion_api_v0_persons__person_id__deletion_preview_get","parameters":[{"name":"person_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_PersonDeletionPreviewRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/persons/{person_id}/status":{"put":{"tags":["persons"],"summary":"Set Person Status","description":"Publish or unpublish. Kept off the main payload deliberately: the detail\npages send a full-object PUT, so a shared field would let any edit reset the\nstatus by omission.","operationId":"set_person_status_api_v0_persons__person_id__status_put","parameters":[{"name":"person_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_PersonRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/accounts":{"get":{"tags":["accounts"],"summary":"List Accounts","description":"Every sign-in account, newest first, with a summary of its linked persons\nand consent state. Small list (only people who actually log in).","operationId":"list_accounts_api_v0_accounts_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_AccountRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/accounts/linkable-minors":{"get":{"tags":["accounts"],"summary":"List Linkable Minors","description":"Orphaned minor persons that can be attached to a guardian account: under 18\n(DOB-derived) and not linked to any account. Optional name search.","operationId":"list_linkable_minors_api_v0_accounts_linkable_minors_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_LinkableMinorRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/accounts/linkable-persons":{"get":{"tags":["accounts"],"summary":"List Linkable Persons","description":"Persons that can become an account's main (SELF) profile: not linked to any\naccount yet — a person belongs to at most one. Unlike linkable-minors this does\nnot filter by age: an account holder is normally an adult, but a teenager with\ntheir own login is a legitimate case for an admin to set up. Optional name search.","operationId":"list_linkable_persons_api_v0_accounts_linkable_persons_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_LinkablePersonRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/accounts/{account_id}":{"get":{"tags":["accounts"],"summary":"Get Account","description":"Full account detail: base info + every linked person (SELF + managed minors).","operationId":"get_account_api_v0_accounts__account_id__get","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AccountRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["accounts"],"summary":"Delete Account","description":"Admin-delete a sign-in account. Removes the external auth identity *and* the\nlocal Account row, its consent log, and its person links (SELF + managed GUARDIAN\nlinks) — the linked Persons themselves are left intact, exactly like self-service\ndeletion (/me/account). Use to clear zombie accounts that never verified.\n\nThe external identity is deleted through the identity provider port\n(app/identity.py), so this call knows nothing about Firebase — swapping auth\nproviders touches only that module. The external delete runs first and is\nidempotent (an already-absent user is fine); if it fails (e.g. the provider is\nunreachable or the runtime lacks roles/firebaseauth.admin) we abort *before*\ntouching the DB, so the admin can retry rather than orphaning a live identity.\n\nGuard: an admin cannot delete their *own* account here (avoids self-lockout and\naccidental removal of the acting admin) — use Account Settings for that.","operationId":"delete_account_api_v0_accounts__account_id__delete","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/accounts/{account_id}/consents":{"get":{"tags":["accounts"],"summary":"List Account Consents","description":"This account's consent history (append-only, newest first) — its Terms/\nPrivacy acceptances plus any person-level consents it recorded.","operationId":"list_account_consents_api_v0_accounts__account_id__consents_get","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_AccountConsentRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/accounts/{account_id}/self":{"put":{"tags":["accounts"],"summary":"Set Self Person","description":"Set (or replace) the account's main profile — the SELF link, i.e. who the\naccount holder *is*. Used when the auto-link at first login found nothing (0 or\nmany persons share the address) or bound the wrong person.\n\nRepointing the existing link keeps it one row: the previously linked Person is\nleft untouched, it simply stops belonging to this account. Nothing is copied\nbetween profiles — the link is the only thing that moves.","operationId":"set_self_person_api_v0_accounts__account_id__self_put","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelfLinkPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AccountRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/accounts/{account_id}/managed/link":{"post":{"tags":["accounts"],"summary":"Link Managed Minor","description":"Attach an existing orphaned minor person to this account as a managed\n(GUARDIAN) profile. Rejects adults and already-linked persons. Records a\nguardian attestation with an admin source for the audit trail.","operationId":"link_managed_minor_api_v0_accounts__account_id__managed_link_post","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagedLinkPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AccountRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/accounts/{account_id}/managed":{"post":{"tags":["accounts"],"summary":"Create Managed Minor","description":"Create a new managed minor person and link it to this account (GUARDIAN).\nDOB must make the person under 18.","operationId":"create_managed_minor_api_v0_accounts__account_id__managed_post","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagedCreatePayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AccountRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/permissions/me":{"get":{"tags":["permissions"],"summary":"My Access","description":"The two derived inputs the policy layer reads, as this account sees them.\n\nNot admin-only: it is the caller's own access. The frontend uses it to hide\nwhat it would be pointless to offer — but it is a *hint*, never the check.\nEvery endpoint still authorises for itself server-side.","operationId":"my_access_api_v0_permissions_me_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MyAccessRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/permissions/admins":{"get":{"tags":["permissions"],"summary":"List Admins","description":"Every account holding federation.admin, oldest grant first.","operationId":"list_admins_api_v0_permissions_admins_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_FederationAdminRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["permissions"],"summary":"Grant Admin","description":"Grant federation.admin to another account. Idempotent.\n\nThe target must have a verified email: admin access is never handed to an\naddress nobody has proven they own.","operationId":"grant_admin_api_v0_permissions_admins_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantAdminPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_FederationAdminRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/permissions/admins/{account_id}":{"delete":{"tags":["permissions"],"summary":"Revoke Admin","description":"Remove federation.admin from an account.\n\nRefuses to remove your own (409 `cannot_revoke_self`) — an admin must not be\nable to lock themselves out of the panel — and refuses to remove the last one.","operationId":"revoke_admin_api_v0_permissions_admins__account_id__delete","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/organisation-persons":{"get":{"tags":["organisation-persons"],"summary":"List Organisation Persons","operationId":"list_organisation_persons_api_v0_organisation_persons_get","parameters":[{"name":"organisation_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organisation Id"}},{"name":"person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Person Id"}},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_OrganisationPersonRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["organisation-persons"],"summary":"Create Organisation Person","operationId":"create_organisation_person_api_v0_organisation_persons_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganisationPersonPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_OrganisationPersonRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/organisation-persons/{entry_id}":{"get":{"tags":["organisation-persons"],"summary":"Get Organisation Person","operationId":"get_organisation_person_api_v0_organisation_persons__entry_id__get","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entry Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_OrganisationPersonRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["organisation-persons"],"summary":"Update Organisation Person","operationId":"update_organisation_person_api_v0_organisation_persons__entry_id__put","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entry Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganisationPersonPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_OrganisationPersonRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["organisation-persons"],"summary":"Delete Organisation Person","operationId":"delete_organisation_person_api_v0_organisation_persons__entry_id__delete","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entry Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/qualifications":{"get":{"tags":["qualifications"],"summary":"List Qualifications","operationId":"list_qualifications_api_v0_qualifications_get","parameters":[{"name":"entity_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Type"}},{"name":"entity_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Entity Id"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"types","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Types"}},{"name":"tiers","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Tiers"}},{"name":"status","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Status"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"}},{"name":"order","in":"query","required":false,"schema":{"type":"string","default":"asc","title":"Order"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100,"minimum":1},{"type":"null"}],"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_QualificationResponse__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["qualifications"],"summary":"Create Qualification","operationId":"create_qualification_api_v0_qualifications_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualificationPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_QualificationResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/qualifications/{qualification_id}":{"put":{"tags":["qualifications"],"summary":"Update Qualification","operationId":"update_qualification_api_v0_qualifications__qualification_id__put","parameters":[{"name":"qualification_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Qualification Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualificationPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_QualificationResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["qualifications"],"summary":"Delete Qualification","operationId":"delete_qualification_api_v0_qualifications__qualification_id__delete","parameters":[{"name":"qualification_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Qualification Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/images/upload-url":{"post":{"tags":["images"],"summary":"Get Upload Url","operationId":"get_upload_url_api_v0_images_upload_url_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__images__UploadUrlRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_ImageUploadUrlRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/images":{"post":{"tags":["images"],"summary":"Save Image","operationId":"save_image_api_v0_images_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__images__SaveImageRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_ImageRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["images"],"summary":"List Images","operationId":"list_images_api_v0_images_get","parameters":[{"name":"entity_type","in":"query","required":true,"schema":{"enum":["organisation","person","governance_body","event"],"type":"string","title":"Entity Type"}},{"name":"entity_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Entity Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_ImageRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/images/{image_id}":{"delete":{"tags":["images"],"summary":"Delete Image","operationId":"delete_image_api_v0_images__image_id__delete","parameters":[{"name":"image_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Image Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/disciplines":{"get":{"tags":["disciplines"],"summary":"List Disciplines","operationId":"list_disciplines_api_v0_disciplines_get","parameters":[{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_DisciplineRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/organisations/{organisation_id}/disciplines":{"get":{"tags":["organisation-disciplines"],"summary":"List Organisation Disciplines","operationId":"list_organisation_disciplines_api_v0_organisations__organisation_id__disciplines_get","parameters":[{"name":"organisation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Organisation Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_str__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["organisation-disciplines"],"summary":"Add Organisation Discipline","operationId":"add_organisation_discipline_api_v0_organisations__organisation_id__disciplines_post","parameters":[{"name":"organisation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Organisation Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisciplineTagPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_OrganisationDisciplineRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/organisations/{organisation_id}/disciplines/{discipline_code}":{"delete":{"tags":["organisation-disciplines"],"summary":"Remove Organisation Discipline","operationId":"remove_organisation_discipline_api_v0_organisations__organisation_id__disciplines__discipline_code__delete","parameters":[{"name":"organisation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Organisation Id"}},{"name":"discipline_code","in":"path","required":true,"schema":{"type":"string","title":"Discipline Code"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/organisation-disciplines":{"get":{"tags":["organisation-disciplines"],"summary":"List All Organisation Disciplines","operationId":"list_all_organisation_disciplines_api_v0_organisation_disciplines_get","parameters":[{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_OrganisationDisciplineRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/persons/{person_id}/disciplines":{"get":{"tags":["person-disciplines"],"summary":"List Person Disciplines","operationId":"list_person_disciplines_api_v0_persons__person_id__disciplines_get","parameters":[{"name":"person_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_str__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["person-disciplines"],"summary":"Add Person Discipline","operationId":"add_person_discipline_api_v0_persons__person_id__disciplines_post","parameters":[{"name":"person_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisciplineTagPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_PersonDisciplineRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/persons/{person_id}/disciplines/{discipline_code}":{"delete":{"tags":["person-disciplines"],"summary":"Remove Person Discipline","operationId":"remove_person_discipline_api_v0_persons__person_id__disciplines__discipline_code__delete","parameters":[{"name":"person_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Person Id"}},{"name":"discipline_code","in":"path","required":true,"schema":{"type":"string","title":"Discipline Code"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/person-disciplines":{"get":{"tags":["person-disciplines"],"summary":"List All Person Disciplines","operationId":"list_all_person_disciplines_api_v0_person_disciplines_get","parameters":[{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_PersonDisciplineRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/socials":{"get":{"tags":["socials"],"summary":"List Socials","operationId":"list_socials_api_v0_socials_get","parameters":[{"name":"entity_type","in":"query","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"entity_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Entity Id"}},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_SocialRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["socials"],"summary":"Create Social","operationId":"create_social_api_v0_socials_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__socials__SocialPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_SocialRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/socials/{social_id}":{"patch":{"tags":["socials"],"summary":"Update Social","operationId":"update_social_api_v0_socials__social_id__patch","parameters":[{"name":"social_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Social Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocialPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_SocialRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["socials"],"summary":"Delete Social","operationId":"delete_social_api_v0_socials__social_id__delete","parameters":[{"name":"social_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Social Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/governance/public/bodies":{"get":{"tags":["governance"],"summary":"List Public Bodies","description":"All governance bodies with their current members (public profile view).\n\nExposes only public-safe fields: body name/type/description and each current\nmember's name, role and photo. Admin-only fields (notes, dates) are omitted.\n\nScoped to one association: `organisation_id` when given — every association\npublishes its own governance, not only the federation's — otherwise the\nfederation's main association (see federation_settings). Returns an empty\nlist when neither resolves.","operationId":"list_public_bodies_api_v0_governance_public_bodies_get","parameters":[{"name":"organisation_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Whose bodies; default: the main association","title":"Organisation Id"},"description":"Whose bodies; default: the main association"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_PublicBodyRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/governance/bodies":{"get":{"tags":["governance"],"summary":"List Bodies","operationId":"list_bodies_api_v0_governance_bodies_get","parameters":[{"name":"organisation_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter to one association's bodies","title":"Organisation Id"},"description":"Filter to one association's bodies"},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_GovernanceBodyRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["governance"],"summary":"Create Body","operationId":"create_body_api_v0_governance_bodies_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BodyCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_GovernanceBodyRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/governance/bodies/{body_id}":{"get":{"tags":["governance"],"summary":"Get Body","operationId":"get_body_api_v0_governance_bodies__body_id__get","parameters":[{"name":"body_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Body Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_GovernanceBodyRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["governance"],"summary":"Update Body","operationId":"update_body_api_v0_governance_bodies__body_id__put","parameters":[{"name":"body_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Body Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BodyUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_GovernanceBodyRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["governance"],"summary":"Delete Body","operationId":"delete_body_api_v0_governance_bodies__body_id__delete","parameters":[{"name":"body_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Body Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/governance/bodies/{body_id}/memberships":{"get":{"tags":["governance"],"summary":"List Memberships","operationId":"list_memberships_api_v0_governance_bodies__body_id__memberships_get","parameters":[{"name":"body_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Body Id"}},{"name":"active_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Active Only"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_GovernanceMembershipRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["governance"],"summary":"Create Membership","operationId":"create_membership_api_v0_governance_bodies__body_id__memberships_post","parameters":[{"name":"body_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Body Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_GovernanceMembershipRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/governance/bodies/{body_id}/current-members":{"get":{"tags":["governance"],"summary":"Get Current Members","operationId":"get_current_members_api_v0_governance_bodies__body_id__current_members_get","parameters":[{"name":"body_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Body Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_GovernanceMembershipRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/governance/memberships/{membership_id}":{"get":{"tags":["governance"],"summary":"Get Membership","operationId":"get_membership_api_v0_governance_memberships__membership_id__get","parameters":[{"name":"membership_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Membership Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_GovernanceMembershipRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["governance"],"summary":"Update Membership","operationId":"update_membership_api_v0_governance_memberships__membership_id__put","parameters":[{"name":"membership_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Membership Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_GovernanceMembershipRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["governance"],"summary":"Close Membership","description":"Soft-close: sets valid_to = today (Warsaw). Does NOT hard delete.","operationId":"close_membership_api_v0_governance_memberships__membership_id__delete","parameters":[{"name":"membership_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Membership Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/documents/upload-url":{"post":{"tags":["documents"],"summary":"Get Upload Url","operationId":"get_upload_url_api_v0_documents_upload_url_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__documents__UploadUrlRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_DocumentUploadUrlRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/documents/public":{"get":{"tags":["documents"],"summary":"List Public Documents","description":"Public document list — all documents, newest first, no type grouping.\n\nExposes only public-safe fields (title, date, file link); undated documents\nsort last. Matches the public governance page's flat, date-sorted card view.\n\nMeeting minutes are left out — they are published through the meetings\nsection, each in the context of its own meeting — unless `include_minutes`\nasks for them, which is the \"Uwzględnij protokoły zebrań\" toggle.\n\n`q` is a free-text filter matched case-insensitively against the title, the\ndocument date (as YYYY-MM-DD text) and the extracted document contents. The\ncontents themselves are never returned — search happens server-side.\n\nScoped to one association: `organisation_id` when given, otherwise the\nfederation's main association (see federation_settings). Returns an empty\nlist when neither resolves.","operationId":"list_public_documents_api_v0_documents_public_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"Free-text search over title, date and document contents","default":"","title":"Q"},"description":"Free-text search over title, date and document contents"},{"name":"include_minutes","in":"query","required":false,"schema":{"type":"boolean","description":"Also list the meeting minutes","default":false,"title":"Include Minutes"},"description":"Also list the meeting minutes"},{"name":"organisation_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Whose documents; default: the main association","title":"Organisation Id"},"description":"Whose documents; default: the main association"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100,"minimum":1},{"type":"null"}],"description":"Return at most this many (newest first)","title":"Limit"},"description":"Return at most this many (newest first)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_PublicDocumentRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/documents/{document_id}/text":{"get":{"tags":["documents"],"summary":"Get Document Text","description":"The document's extracted text — what it SAYS, rather than where the file is.\n\nThe lists search over this text (the `q` filter) but never return it, which\nleft it findable and unreadable. The assistant needs to read a document to\nanswer from it, and so does anyone else building on this API; the file itself\nis a signed URL and a PDF, which is no use to either.\n\nGated exactly as the listing is: the owning association's members and\nfederation staff. Extraction happens at upload, so this is a column read.","operationId":"get_document_text_api_v0_documents__document_id__text_get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Document Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_DocumentTextRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/documents":{"get":{"tags":["documents"],"summary":"List Documents","description":"The association's documents, newest first. Meeting minutes are left out\nunless `doc_types` asks for them — see DEFAULT_HIDDEN_DOC_TYPES.","operationId":"list_documents_api_v0_documents_get","parameters":[{"name":"organisation_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter to one association's documents","title":"Organisation Id"},"description":"Filter to one association's documents"},{"name":"doc_types","in":"query","required":false,"schema":{"type":"array","items":{"enum":["RESOLUTION","MEETING_MINUTES","OTHER"],"type":"string"},"description":"Only these types; default hides meeting minutes","default":[],"title":"Doc Types"},"description":"Only these types; default hides meeting minutes"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100,"minimum":1},{"type":"null"}],"description":"Return at most this many (newest first)","title":"Limit"},"description":"Return at most this many (newest first)"},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_DocumentRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["documents"],"summary":"Create Document","operationId":"create_document_api_v0_documents_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_DocumentRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/documents/{document_id}":{"put":{"tags":["documents"],"summary":"Update Document","operationId":"update_document_api_v0_documents__document_id__put","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Document Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentUpdatePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_DocumentRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["documents"],"summary":"Delete Document","operationId":"delete_document_api_v0_documents__document_id__delete","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Document Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/organisations/{organisation_id}/statute":{"get":{"tags":["statutes"],"summary":"Get Statute","description":"The association's statute, or `data: null` when it has none yet — an\nassociation without a statute is an ordinary state, not a 404.","operationId":"get_statute_api_v0_organisations__organisation_id__statute_get","parameters":[{"name":"organisation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Organisation Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_StatuteRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["statutes"],"summary":"Save Statute","description":"Create or replace the statute, and keep this text as a version.\n\nThe statute row is the text in force and the version is how it got there —\nboth are written here, so the newest version and the statute always agree.","operationId":"save_statute_api_v0_organisations__organisation_id__statute_put","parameters":[{"name":"organisation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Organisation Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatutePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_StatuteRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["statutes"],"summary":"Delete Statute","operationId":"delete_statute_api_v0_organisations__organisation_id__statute_delete","parameters":[{"name":"organisation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Organisation Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/organisations/{organisation_id}/statute/public":{"get":{"tags":["statutes"],"summary":"Get Public Statute","description":"The association's statute, for the public site. No authentication.\n\nA statute is a published document by nature — most federations already put\ntheirs on their own website — so it is open on the same terms as this\nassociation's bodies and documents, which carry no per-row visibility flag\neither. What is NOT public is its history: who amended what and when is\ngovernance's own record, so /versions and /diff stay behind require_auth.\n\nNor is where the text came from. `source_file_url` and `source_url` are\nworking notes — the PDF an admin uploaded, the page it was transcribed off —\nand they are dropped here rather than merely hidden by the page, so the\nendpoint cannot hand out a bucket link nothing on the public site shows.\nWhat the public reads is the statute, not its provenance.\n\n`data: null` when the association has none, as on the authenticated read.","operationId":"get_public_statute_api_v0_organisations__organisation_id__statute_public_get","parameters":[{"name":"organisation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Organisation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/organisations/{organisation_id}/statute/versions":{"get":{"tags":["statutes"],"summary":"List Statute Versions","description":"Every text this statute has been, newest first.\n\nWithout the bodies: the list is a table of dates, and a statute's text is\ntens of kilobytes each. One version is fetched when it is opened.","operationId":"list_statute_versions_api_v0_organisations__organisation_id__statute_versions_get","parameters":[{"name":"organisation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Organisation Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/organisations/{organisation_id}/statute/versions/{version_id}":{"get":{"tags":["statutes"],"summary":"Get Statute Version","description":"One version, with its text — what the statute said at that moment.","operationId":"get_statute_version_api_v0_organisations__organisation_id__statute_versions__version_id__get","parameters":[{"name":"organisation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Organisation Id"}},{"name":"version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Version Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_StatuteVersionRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/organisations/{organisation_id}/statute/versions/{version_id}/restore":{"post":{"tags":["statutes"],"summary":"Restore Statute Version","description":"Put a past version's text back in force.\n\nNothing is lost and nothing is rewritten: the text being replaced is already\nin the history, and the restore is itself a new version stamped now — so\nundoing a restore is the same single action, and the history reads as what\nactually happened rather than as a jump backwards in time.\n\nDone here rather than by the client PUTting the old text back, so the\nversion that lands is byte-for-byte the one that was chosen.","operationId":"restore_statute_version_api_v0_organisations__organisation_id__statute_versions__version_id__restore_post","parameters":[{"name":"organisation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Organisation Id"}},{"name":"version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Version Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_StatuteRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/organisations/{organisation_id}/statute/diff":{"get":{"tags":["statutes"],"summary":"Diff Statute Versions","description":"What changed between two versions of the statute.\n\nComputed here rather than in the browser: difflib is in the standard\nlibrary, and it saves shipping both full texts to the client to compare\nthem. The pair is given in the order it should be read — `from` is the\ntext being changed, `to` what it became. The diff itself lives in\nservices/textdiff.py, shared with the meeting assistant's change preview.","operationId":"diff_statute_versions_api_v0_organisations__organisation_id__statute_diff_get","parameters":[{"name":"organisation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Organisation Id"}},{"name":"from_version","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"From Version"}},{"name":"to_version","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"To Version"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_StatuteDiffRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/organisations/{organisation_id}/statute/import":{"post":{"tags":["statutes"],"summary":"Import Statute Pdf","description":"Start transcribing an uploaded statute PDF. Returns a job id to poll.\n\nSaves nothing: the finished job carries the Markdown, the caller reviews it\nand PUTs it. That review is the point — a transcription that dropped a\nclause must not be able to become the association's statute on its own.","operationId":"import_statute_pdf_api_v0_organisations__organisation_id__statute_import_post","parameters":[{"name":"organisation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Organisation Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatuteImportPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_StatuteImportJobStartedRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/organisations/{organisation_id}/statute/import-url":{"post":{"tags":["statutes"],"summary":"Import Statute Url","description":"Start reading the statute off a web page. Returns a job id to poll.\n\nMost federations already publish their statute as an ordinary page (PZSurf's\nis at /zwiazek/statut-polskiego-zwiazku-surfingu/), so this is usually the\nshortest way in. Like the PDF import it saves nothing.\n\nThe link is checked here, before the job starts, so a typo or a private\naddress comes back at once instead of after a poll.","operationId":"import_statute_url_api_v0_organisations__organisation_id__statute_import_url_post","parameters":[{"name":"organisation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Organisation Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatuteImportUrlPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_StatuteImportJobStartedRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/organisations/{organisation_id}/statute/import-jobs/{job_id}":{"get":{"tags":["statutes"],"summary":"Get Statute Import Job","description":"How far the import has got, and the Markdown once it is done.\n\n`stage` says what is happening now and `fraction` how far through it is —\nfor the transcription that is measured, not timed: characters produced\nagainst what the source should yield.","operationId":"get_statute_import_job_api_v0_organisations__organisation_id__statute_import_jobs__job_id__get","parameters":[{"name":"organisation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Organisation Id"}},{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_StatuteImportJobRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/public":{"get":{"tags":["meetings"],"summary":"List Public Meetings","description":"One association's meetings, newest first — `organisation_id` when given,\notherwise the federation's main association. Empty when neither resolves\n(same contract as /governance/public/bodies).\n\n`meta.total` is how many there are, `meta.count` how many came back: a page\nshowing the first few can say \"all 34\" without fetching 34. `meta.\norganisation_id` names the association that answered, so a caller that let\nthe main one be resolved for it can link on to that association's own pages.","operationId":"list_public_meetings_api_v0_meetings_public_get","parameters":[{"name":"organisation_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Whose meetings; default: the main association","title":"Organisation Id"},"description":"Whose meetings; default: the main association"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100,"minimum":1},{"type":"null"}],"description":"Return at most this many (newest first)","title":"Limit"},"description":"Return at most this many (newest first)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_PublicMeetingCardRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/public/{meeting_id}":{"get":{"tags":["meetings"],"summary":"Get Public Meeting","description":"One meeting's public record.\n\nEvery attendee is listed: attendance is a matter of record, and dropping the\nones without a published profile would misreport who was there. Only an\nACTIVE (published) person carries their id and photo, so the page links out\nto a profile exactly when there is a public one to link to.","operationId":"get_public_meeting_api_v0_meetings_public__meeting_id__get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_PublicMeetingRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings":{"get":{"tags":["meetings"],"summary":"List Meetings","operationId":"list_meetings_api_v0_meetings_get","parameters":[{"name":"organisation_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter to one association's meetings","title":"Organisation Id"},"description":"Filter to one association's meetings"},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_MeetingRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["meetings"],"summary":"Create Meeting","operationId":"create_meeting_api_v0_meetings_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/minutes-summary":{"get":{"tags":["meetings"],"summary":"Meeting Minutes Summary","description":"What the protokół will contain, without building it.\n\nRead by the dialog that closes a meeting: it reports what is going into the\ndocument — who was present, which sections will appear — before offering the\nfile. Same rows and same section rule as the .docx itself (they share\n`meeting_export.collect`), so it cannot promise something the file omits.","operationId":"meeting_minutes_summary_api_v0_meetings__meeting_id__minutes_summary_get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingMinutesSummaryRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/export.docx":{"get":{"tags":["meetings"],"summary":"Export Meeting Docx","description":"The meeting written back out as minutes (.docx) — the reverse of the\nimport. A Word file rather than a PDF because that is what Google Docs\nopens as an editable document.","operationId":"export_meeting_docx_api_v0_meetings__meeting_id__export_docx_get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/importable-documents":{"get":{"tags":["meetings"],"summary":"List Importable Documents","description":"The association's minutes documents, for the \"from meeting minutes\" import — every\nMEETING_MINUTES it holds, newest first, each saying whether it has already\nbeen turned into a meeting (picking such a one just opens that meeting).","operationId":"list_importable_documents_api_v0_meetings_importable_documents_get","parameters":[{"name":"organisation_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","description":"The association whose meeting minutes to list","title":"Organisation Id"},"description":"The association whose meeting minutes to list"},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_MeetingImportableDocumentRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/generate-from-prompt":{"post":{"tags":["meetings"],"summary":"Generate From Prompt","description":"Draft a meeting from a description, with the association's statute as context.\n\nThe third way to create a meeting, alongside by hand and from minutes. Unlike\nthose, this one looks forwards: it is given what the meeting is *for* and\nwrites the title and the agenda that the statute implies.\n\n`starts_at` is the user's, straight from the picker — the prompt is never\nallowed to decide when a meeting happens.\n\nReading a statute and several attachments and then drafting takes longer than\na proxied request may live, so this starts a job like the minutes import and\nthe client polls the same /import-jobs/{id}.","operationId":"generate_from_prompt_api_v0_meetings_generate_from_prompt_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateFromPrompt"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingGenerationStartedRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/generate-from-document":{"post":{"tags":["meetings"],"summary":"Generate From Document","description":"Create a whole meeting out of an uploaded minutes PDF (\"generate from meeting\nminutes\"). The document is uploaded through the normal /documents flow\nfirst — it arrives here already stored and text-extracted — and ends up\nattached to the meeting it produced.\n\nBest effort by design: whatever could not be distilled is simply absent (and\nnamed in `report`), so the user fills the gaps in on the meeting page.","operationId":"generate_from_document_api_v0_meetings_generate_from_document_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateFromDocument"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingGenerationStartedRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/import-jobs/{job_id}":{"get":{"tags":["meetings"],"summary":"Get Import Job","description":"Progress of a running import: how many passes are done, which landed last,\nand — once finished — the meeting itself.","operationId":"get_import_job_api_v0_meetings_import_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingImportJobRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/live":{"get":{"tags":["meetings"],"summary":"List Live Meetings","description":"LIVE meetings the caller can see: a federation admin sees all; anyone else\nsees the live meetings they're a participant of. Includes a live `present_count`\n(how many boards have checked in recently) so the dashboard can surface\nattendance.","operationId":"list_live_meetings_api_v0_meetings_live_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/votings/{voting_id}":{"get":{"tags":["meetings"],"summary":"Get Voting","description":"One ballot plus the little of its meeting the page needs to make sense of\nit — and `can_vote`, so the page offers the buttons the API would honour.","operationId":"get_voting_api_v0_meetings_votings__voting_id__get","parameters":[{"name":"voting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Voting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingVotingRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/votings/{voting_id}/votes":{"post":{"tags":["meetings"],"summary":"Cast Vote Standalone","description":"Cast from the ballot's own page. Same service call, same participants-only\ngate as voting from the meeting page — the short link is a way in, not a way\nround.","operationId":"cast_vote_standalone_api_v0_meetings_votings__voting_id__votes_post","parameters":[{"name":"voting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Voting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteCast"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingVotingRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}":{"get":{"tags":["meetings"],"summary":"Get Meeting","operationId":"get_meeting_api_v0_meetings__meeting_id__get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["meetings"],"summary":"Update Meeting","operationId":"update_meeting_api_v0_meetings__meeting_id__put","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["meetings"],"summary":"Delete Meeting","operationId":"delete_meeting_api_v0_meetings__meeting_id__delete","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/participants":{"get":{"tags":["meetings"],"summary":"List Participants","operationId":"list_participants_api_v0_meetings__meeting_id__participants_get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_MeetingParticipantRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["meetings"],"summary":"Add Participant","operationId":"add_participant_api_v0_meetings__meeting_id__participants_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParticipantCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingParticipantRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/candidates":{"get":{"tags":["meetings"],"summary":"List Participant Candidates","description":"The pool the add-participant picker draws from. Defaults to the host\nassociation's members; `scope=all` widens it to everyone, since a meeting is\nnot limited to the host's own people. Restricted to whoever may staff the\nmeeting — this is a directory of people, not public reading.","operationId":"list_participant_candidates_api_v0_meetings__meeting_id__candidates_get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"scope","in":"query","required":false,"schema":{"enum":["organisation","all"],"type":"string","default":"organisation","title":"Scope"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_MeetingParticipantCandidateRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/participants/order":{"put":{"tags":["meetings"],"summary":"Arrange Participants","description":"Apply the whole participant outline: the order of every row and which\ngroup each participant sits in. This is what a drag-and-drop drop sends —\none atomic call, so a participant never lands in a group without also\nlanding in a position.\n\nDeclared before `/participants/{participant_id}`: both are PUT, and \"order\"\nwould otherwise be parsed as a participant id (same as the agenda's).\n\nReturns the resulting list with the groups in `meta`, so the client can\nsettle on the server's version without a second round trip — a drag that\nempties an automatic group removes it, which the client cannot know.","operationId":"arrange_participants_api_v0_meetings__meeting_id__participants_order_put","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParticipantArrangement"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_MeetingParticipantRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/participants/{participant_id}":{"put":{"tags":["meetings"],"summary":"Update Participant","description":"Change a participant's meeting roles (chair / minute taker), the voting\nunit they sit in, and/or whether they turned up. Only the fields present in\nthe payload change, so taking the register never touches anybody's roles —\nand vice versa.","operationId":"update_participant_api_v0_meetings__meeting_id__participants__participant_id__put","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"participant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Participant Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParticipantUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingParticipantRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["meetings"],"summary":"Remove Participant","operationId":"remove_participant_api_v0_meetings__meeting_id__participants__participant_id__delete","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"participant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Participant Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/voting-groups":{"get":{"tags":["meetings"],"summary":"List Voting Groups","description":"The meeting's voting groups, plus (in `meta`) the organisations that are\nrepresented in the room but have no group — the pool the \"create a group for\nan organisation\" picker draws from.","operationId":"list_voting_groups_api_v0_meetings__meeting_id__voting_groups_get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_MeetingVotingGroupRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["meetings"],"summary":"Create Voting Group","description":"Create a group by hand — custom (a name of your own) or for one of the\norganisations in the room.","operationId":"create_voting_group_api_v0_meetings__meeting_id__voting_groups_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VotingGroupCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingVotingGroupRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/voting-groups/{group_id}":{"patch":{"tags":["meetings"],"summary":"Update Voting Group","description":"Rename a group, and/or state whether it is here as a whole. Only the\nfields present in the payload change; `attendance: null` puts it back to\nbeing read off the members.","operationId":"update_voting_group_api_v0_meetings__meeting_id__voting_groups__group_id__patch","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VotingGroupUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingVotingGroupRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["meetings"],"summary":"Delete Voting Group","description":"Remove a group. Its members stay in the meeting as individual voters.","operationId":"delete_voting_group_api_v0_meetings__meeting_id__voting_groups__group_id__delete","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/voting-groups/auto":{"post":{"tags":["meetings"],"summary":"Auto Group Participants","description":"Put every ungrouped participant back into their organisation's group — the\ndefault applied in one go. For meetings that predate voting groups, and for\nundoing a round of pulling people out.","operationId":"auto_group_participants_api_v0_meetings__meeting_id__voting_groups_auto_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_MeetingVotingGroupRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/agenda":{"get":{"tags":["meetings"],"summary":"List Agenda","operationId":"list_agenda_api_v0_meetings__meeting_id__agenda_get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_MeetingAgendaItemRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["meetings"],"summary":"Add Agenda Item","operationId":"add_agenda_item_api_v0_meetings__meeting_id__agenda_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgendaItemCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingAgendaItemRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/agenda/order":{"put":{"tags":["meetings"],"summary":"Reorder Agenda","operationId":"reorder_agenda_api_v0_meetings__meeting_id__agenda_order_put","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgendaReorder"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_MeetingAgendaItemRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/agenda/{item_id}":{"put":{"tags":["meetings"],"summary":"Update Agenda Item","operationId":"update_agenda_item_api_v0_meetings__meeting_id__agenda__item_id__put","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Item Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgendaItemUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingAgendaItemRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["meetings"],"summary":"Remove Agenda Item","operationId":"remove_agenda_item_api_v0_meetings__meeting_id__agenda__item_id__delete","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Item Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/notes":{"get":{"tags":["meetings"],"summary":"List Notes","operationId":"list_notes_api_v0_meetings__meeting_id__notes_get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_MeetingNoteRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["meetings"],"summary":"Add Note","operationId":"add_note_api_v0_meetings__meeting_id__notes_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingNoteRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/notes/{note_id}":{"put":{"tags":["meetings"],"summary":"Update Note","operationId":"update_note_api_v0_meetings__meeting_id__notes__note_id__put","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Note Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingNoteRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["meetings"],"summary":"Remove Note","operationId":"remove_note_api_v0_meetings__meeting_id__notes__note_id__delete","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Note Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/action-items":{"get":{"tags":["meetings"],"summary":"List Action Items","operationId":"list_action_items_api_v0_meetings__meeting_id__action_items_get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_MeetingActionItemRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["meetings"],"summary":"Add Action Item","operationId":"add_action_item_api_v0_meetings__meeting_id__action_items_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionItemCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingActionItemRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/action-items/{item_id}":{"put":{"tags":["meetings"],"summary":"Update Action Item","operationId":"update_action_item_api_v0_meetings__meeting_id__action_items__item_id__put","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Item Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionItemUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingActionItemRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["meetings"],"summary":"Remove Action Item","operationId":"remove_action_item_api_v0_meetings__meeting_id__action_items__item_id__delete","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Item Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/documents":{"get":{"tags":["meetings"],"summary":"List Documents","operationId":"list_documents_api_v0_meetings__meeting_id__documents_get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_MeetingDocumentRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["meetings"],"summary":"Attach Document","description":"Attach an association document to the meeting.\n\n`allow_closed` on purpose, and it is the whole point of the shelf: the signed\nprotokół arrives AFTER the record is frozen. Somebody closes the meeting,\nprints the .docx, gets it signed, scans it, and files the PDF here — days\nlater. A frozen record that cannot accept its own signed minutes would send\nthat person to the danger zone to reset the meeting, un-freezing everything\nto file one document.\n\nNothing about what the meeting SAYS changes here; the shelf is a list of\nfiles beside the record, not part of it.","operationId":"attach_document_api_v0_meetings__meeting_id__documents_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentAttach"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingDocumentRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/documents/{document_id}":{"delete":{"tags":["meetings"],"summary":"Detach Document","description":"Take a document off the meeting. Open on a closed meeting for the same\nreason attaching is: the alternative to undoing a mis-filed PDF would be\nresetting the whole meeting. The underlying file is untouched either way —\nthis only unlinks it.","operationId":"detach_document_api_v0_meetings__meeting_id__documents__document_id__delete","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"document_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Document Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/live":{"get":{"tags":["meetings"],"summary":"Get Live","description":"The live board, polled.\n\nWithout `since`: the full snapshot (initial load, or a client that wants to\nresynchronise from scratch). With `since`: only the events after that cursor,\nwhich is what a board asks for repeatedly while it is open. A caller too far\nbehind is handed a snapshot instead — same shape, and the client replaces its\nstate when it sees one.\n\nEvery call is also a **presence heartbeat**: opening this endpoint is what it\nmeans to be watching, so there is nothing to join and nothing to leave.\n\nRead access only — non-participant org members may watch the board but cannot\nvote.","operationId":"get_live_api_v0_meetings__meeting_id__live_get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Return only what happened after this seq","title":"Since"},"description":"Return only what happened after this seq"},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingLiveStateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/next-resolution-number":{"get":{"tags":["meetings"],"summary":"Get Next Resolution Number","description":"The suggested next resolution number for this meeting (global sequence,\nformatted for the meeting's month). Shown pre-filled and editable in the\ncreate form. Read access only.","operationId":"get_next_resolution_number_api_v0_meetings__meeting_id__next_resolution_number_get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_NextResolutionNumberRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/start":{"post":{"tags":["meetings"],"summary":"Start Meeting","operationId":"start_meeting_api_v0_meetings__meeting_id__start_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingLiveStateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/finish":{"post":{"tags":["meetings"],"summary":"Finish Meeting","operationId":"finish_meeting_api_v0_meetings__meeting_id__finish_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingLiveStateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/close":{"post":{"tags":["meetings"],"summary":"Close Meeting","description":"Freeze the record: ENDED → CLOSED. Every other write is refused afterwards\nuntil the meeting is reset.","operationId":"close_meeting_api_v0_meetings__meeting_id__close_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingLiveStateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/reset":{"post":{"tags":["meetings"],"summary":"Reset Meeting","description":"Put the meeting back to PLANNED, closing any open votings first. A\ndestructive lifecycle action (the danger zone), gated like start/finish —\nand the one write a CLOSED meeting still accepts, since it is the way out.","operationId":"reset_meeting_api_v0_meetings__meeting_id__reset_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingLiveStateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/resolutions":{"get":{"tags":["meetings"],"summary":"List Resolutions","description":"The meeting's uchwały, by number. A written record, so it is fetched like\nthe agenda or the notes — resolutions are not on the live stream.","operationId":"list_resolutions_api_v0_meetings__meeting_id__resolutions_get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_MeetingResolutionRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["meetings"],"summary":"Create Resolution","operationId":"create_resolution_api_v0_meetings__meeting_id__resolutions_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolutionCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingResolutionRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/resolutions/{resolution_id}":{"patch":{"tags":["meetings"],"summary":"Update Resolution","description":"Edit the uchwała: its text, its state, and which ballot it records.","operationId":"update_resolution_api_v0_meetings__meeting_id__resolutions__resolution_id__patch","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"resolution_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Resolution Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolutionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingResolutionRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["meetings"],"summary":"Remove Resolution","operationId":"remove_resolution_api_v0_meetings__meeting_id__resolutions__resolution_id__delete","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"resolution_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Resolution Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/votings":{"get":{"tags":["meetings"],"summary":"List Votings","description":"This meeting's ballots, oldest first. `state` filters to PENDING /\nIN_PROGRESS / DONE — what the page's state dropdown asks for.\n\nThe caller's own selections come with them, exactly as on the live board:\nthis is the same projection, fetched rather than polled.","operationId":"list_votings_api_v0_meetings__meeting_id__votings_get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only ballots in this state","title":"State"},"description":"Only ballots in this state"},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_MeetingVotingRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["meetings"],"summary":"Create Voting","operationId":"create_voting_api_v0_meetings__meeting_id__votings_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VotingCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingVotingRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/votings/{voting_id}":{"patch":{"tags":["meetings"],"summary":"Update Voting","operationId":"update_voting_api_v0_meetings__meeting_id__votings__voting_id__patch","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"voting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Voting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VotingUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingVotingRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["meetings"],"summary":"Remove Voting","operationId":"remove_voting_api_v0_meetings__meeting_id__votings__voting_id__delete","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"voting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Voting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/votings/{voting_id}/open":{"post":{"tags":["meetings"],"summary":"Open Voting","operationId":"open_voting_api_v0_meetings__meeting_id__votings__voting_id__open_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"voting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Voting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingVotingRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/votings/{voting_id}/close":{"post":{"tags":["meetings"],"summary":"Close Voting","description":"Finish a ballot. A no-objection one carries the chair's decision in the\nbody (`result`) — closing it is the decision.","operationId":"close_voting_api_v0_meetings__meeting_id__votings__voting_id__close_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"voting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Voting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/VotingClose"},{"type":"null"}],"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingVotingRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/meetings/{meeting_id}/votings/{voting_id}/votes":{"post":{"tags":["meetings"],"summary":"Cast Vote","operationId":"cast_vote_api_v0_meetings__meeting_id__votings__voting_id__votes_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Meeting Id"}},{"name":"voting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Voting Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteCast"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeetingVotingRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/tasks/public":{"get":{"tags":["tasks"],"summary":"List Public Tasks","description":"One association's published task market — the three board columns only.\n\n404s when the association hasn't published its board, so an unpublished board\nis indistinguishable from one that doesn't exist.","operationId":"list_public_tasks_api_v0_tasks_public_get","parameters":[{"name":"organisation_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","description":"Whose task market","title":"Organisation Id"},"description":"Whose task market"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_TaskRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/tasks/public/{task_id}":{"get":{"tags":["tasks"],"summary":"Get Public Task","description":"One task from a published board. Off-board tasks (backlog, archived) are\nnot published, so they 404 here even when the board is public.","operationId":"get_public_task_api_v0_tasks_public__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_TaskRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/tasks/board-settings":{"put":{"tags":["tasks"],"summary":"Update Board Settings","description":"Publish or unpublish an association's task market.","operationId":"update_board_settings_api_v0_tasks_board_settings_put","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_TaskBoardSettingsRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/tasks/summary":{"get":{"tags":["tasks"],"summary":"Task Summary","description":"Per-status counts for one association, plus whether the board is published\nand whether the caller may publish it. One call fills the association card's\nTask Market tile.","operationId":"task_summary_api_v0_tasks_summary_get","parameters":[{"name":"organisation_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","description":"Whose task market","title":"Organisation Id"},"description":"Whose task market"},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_TaskSummaryRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/tasks":{"get":{"tags":["tasks"],"summary":"List Tasks","description":"Every task of one association, board and off-board alike, in column order.\n\nThe board page draws its columns from this, and the list view filters the\nsame rows client-side (archived / not archived / backlog) — one fetch, two\nviews, no second round trip when the filter changes.","operationId":"list_tasks_api_v0_tasks_get","parameters":[{"name":"organisation_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","description":"Whose task market","title":"Organisation Id"},"description":"Whose task market"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Only these statuses; default: all","title":"Status"},"description":"Only these statuses; default: all"},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_TaskRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["tasks"],"summary":"Create Task","operationId":"create_task_api_v0_tasks_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_TaskRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/tasks/{task_id}":{"get":{"tags":["tasks"],"summary":"Get Task","operationId":"get_task_api_v0_tasks__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Task Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_TaskRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["tasks"],"summary":"Update Task","description":"Edit a task from the details dialog. Changing `status` here (the pill\npicker, which also offers Backlog and Archived) moves the card to the foot of\nits new column — the drag-and-drop path is PUT /tasks/{id}/move, which places\nit at a chosen index instead.","operationId":"update_task_api_v0_tasks__task_id__put","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Task Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_TaskRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["tasks"],"summary":"Delete Task","operationId":"delete_task_api_v0_tasks__task_id__delete","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Task Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/tasks/{task_id}/move":{"put":{"tags":["tasks"],"summary":"Move Task","description":"Drop a card into a column at a given index. Both the source and the target\ncolumn are renumbered 0..n, so `position` never drifts or collides.","operationId":"move_task_api_v0_tasks__task_id__move_put","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Task Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskMove"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_TaskRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/tasks/{task_id}/attachments/upload-url":{"post":{"tags":["tasks"],"summary":"Get Attachment Upload Url","description":"Signed PUT URL for a task attachment (GCS path `tasks/<task id>/...`).","operationId":"get_attachment_upload_url_api_v0_tasks__task_id__attachments_upload_url_post","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Task Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachmentUploadUrl"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_TaskAttachmentUploadUrlRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/tasks/{task_id}/attachments":{"post":{"tags":["tasks"],"summary":"Add Attachment","operationId":"add_attachment_api_v0_tasks__task_id__attachments_post","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Task Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachmentCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_TaskAttachmentRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/tasks/{task_id}/attachments/{attachment_id}":{"delete":{"tags":["tasks"],"summary":"Remove Attachment","operationId":"remove_attachment_api_v0_tasks__task_id__attachments__attachment_id__delete","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Task Id"}},{"name":"attachment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Attachment Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/federation-settings":{"get":{"tags":["federation"],"summary":"Read Federation Settings","operationId":"read_federation_settings_api_v0_federation_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_FederationSettingsRead_"}}}}}},"put":{"tags":["federation"],"summary":"Update Federation Settings","operationId":"update_federation_settings_api_v0_federation_settings_put","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FederationSettingsPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_FederationSettingsRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/associations":{"get":{"tags":["federation"],"summary":"List Association Orgs","description":"Organisations that are currently associations — the main-association picker's options.","operationId":"list_association_orgs_api_v0_associations_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_OrganisationRefRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/featured":{"get":{"tags":["featured"],"summary":"Read Featured","description":"The resolved spotlight for the home page, or null when none is set / the\nlinked entity isn't publicly visible. Admins also get draft-event previews.","operationId":"read_featured_api_v0_featured_get","parameters":[{"name":"organisation_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Whose spotlight; default: the main association","title":"Organisation Id"},"description":"Whose spotlight; default: the main association"},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_Union_FeaturedSpotlightRead__NoneType__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["featured"],"summary":"Update Featured","operationId":"update_featured_api_v0_featured_put","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeaturedPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_Union_FeaturedConfigRead__NoneType__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["featured"],"summary":"Delete Featured","operationId":"delete_featured_api_v0_featured_delete","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/featured/config":{"get":{"tags":["featured"],"summary":"Read Featured Config","description":"The raw stored featured row, for the admin edit dialog to prefill.","operationId":"read_featured_config_api_v0_featured_config_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_Union_FeaturedConfigRead__NoneType__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/auth/session":{"post":{"tags":["auth"],"summary":"Create Session","description":"Exchange a Firebase ID token for a durable session JWT (verified once).","operationId":"create_session_api_v0_auth_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_SessionRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/auth/pending":{"post":{"tags":["auth"],"summary":"Register Pending","description":"Record a just-registered (still-unverified) Firebase identity as a local\nAccount row so admins can see and manage sign-ups awaiting email verification.\n\nThe frontend calls this right after creating the Firebase user and sending the\nverification email, before it signs the unverified user out. It grants NOTHING:\nthe token's signature is verified but an unverified email is allowed, no session\nJWT is returned, no Person is auto-linked, and is_admin stays false (admin needs\na verified email). Once the user verifies and signs in, POST /auth/session\nupgrades this same row (keyed by firebase_uid) in place.","operationId":"register_pending_api_v0_auth_pending_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_PendingRegistrationRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/auth/me":{"get":{"tags":["auth"],"summary":"Me","description":"Validate the current session and return a freshly-minted token (sliding window),\nso active users stay signed in. Returns 401 if the session is invalid/expired.","operationId":"me_api_v0_auth_me_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_SessionRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/auth/consent":{"post":{"tags":["auth"],"summary":"Accept Consent","description":"Record the signed-in user's acceptance of the current Terms + Privacy\nPolicy (append-only, see app/consent.py). Idempotent by design: re-accepting\nsimply writes fresh rows. Returns the updated gate state.\n\nAn optional `analytics` flag records the user's separate, non-mandatory\nanalytics opt-in at the same time — but the Terms/Privacy acceptance is\nrecorded either way, so declining analytics never blocks the gate.","operationId":"accept_consent_api_v0_auth_consent_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ConsentPayload"},{"type":"null"}],"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_ConsentStateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["auth"],"summary":"List Consent","description":"Full consent history for the signed-in account (newest first). Read-only —\nthe append-only log itself is the record of truth.","operationId":"list_consent_api_v0_auth_consent_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_ConsentEventRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/auth/consent/analytics":{"post":{"tags":["auth"],"summary":"Set Analytics Consent","description":"Set or withdraw the signed-in user's optional analytics consent — the\nportal Settings toggle. Append-only; returns the resulting state.","operationId":"set_analytics_consent_api_v0_auth_consent_analytics_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyticsConsentPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AnalyticsConsentRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/ask":{"post":{"tags":["ask"],"summary":"Ask","operationId":"ask_api_v0_ask_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AskRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/assistant/options":{"get":{"tags":["assistant"],"summary":"Assistant Options","description":"What the panel needs to draw itself — and whether to exist.\n\n`organisations` empty means this account has no allowance anywhere, and the\nclient hides the assistant outright rather than offering a button that only\never refuses. That is the rule the user asked for: no quota, no assistant.","operationId":"assistant_options_api_v0_assistant_options_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AssistantOptionsRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/assistant/settings":{"put":{"tags":["assistant"],"summary":"Update Settings","description":"Change which allowance is spent, or which model is used.","operationId":"update_settings_api_v0_assistant_settings_put","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreadSettings"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AssistantSettingsRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/assistant/thread":{"get":{"tags":["assistant"],"summary":"Get Thread","description":"The conversation so far — what the panel draws when it opens.","operationId":"get_thread_api_v0_assistant_thread_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AssistantThreadRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["assistant"],"summary":"Clear Thread","description":"Start again. The messages go; which organisation pays and which model to\nuse are preferences, not part of a conversation, and stay.","operationId":"clear_thread_api_v0_assistant_thread_delete","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/assistant/messages":{"post":{"tags":["assistant"],"summary":"Send Message","description":"Ask. Returns a job id to poll — the model may go and read several things\nbefore answering, and the poll is the only way to narrate that while it\nhappens (the tool round trips run inside one call).\n\nWrites nothing whatever comes back, except the user's own message into the\nthread: a question that was asked was asked, whether or not it is answered.","operationId":"send_message_api_v0_assistant_messages_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantAsk"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AssistantJobStartedRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/assistant/jobs/{job_id}":{"get":{"tags":["assistant"],"summary":"Get Job","description":"Progress of a running message: which tool it is reading, then the plan.","operationId":"get_job_api_v0_assistant_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AssistantJobRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/assistant/insights":{"get":{"tags":["assistant"],"summary":"Assistant Insights","description":"What people keep asking the assistant — read as what the app fails to make\nobvious.\n\nA question asked ten times is not assistant traffic; it is a UI gap with a\nnumber attached. Somebody who has to ask \"jak dodać członka\" could not find\nthe button, and the cheapest fix is the button, not a better answer.\n\nGrouped by SHAPE, with names and numbers stripped, so this reports what is\nbeing asked without reporting who asked it or about whom — the same rule the\nrecipe cache follows, and for the same reason. Federation staff only: it\nspans every association's use.","operationId":"assistant_insights_api_v0_assistant_insights_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AssistantInsightsRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/assistant/apply":{"post":{"tags":["assistant"],"summary":"Apply Change","description":"Make ONE confirmed change.\n\nThe rights are checked here, not at proposal time, and against the live\nrows: the caller must be able to make this change by hand, and the meeting\nmay have moved since the plan was drawn — a stale handle fails rather than\nlanding on whatever row now holds it.","operationId":"apply_change_api_v0_assistant_apply_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyOne"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AssistantApplyRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/library/search":{"get":{"tags":["library"],"summary":"Search Library","description":"Search the statute (statut), regulations (regulaminy), resolutions\n(uchwały) and all other documents of the associations this user belongs to,\nand return the matching PASSAGES rather than whole texts. Use this for any\nquestion about what the rules say — what a body may decide, what majorities\nor attendance are required, what a regulation provides — instead of reading\na statute or a document whole.\n\nEach hit says which document or statute it came from, so the answer can be\nattributed and the reader can go to the source. Ranked best first: a passage\nmatching three of the query's words is likelier to be the one wanted than one\nmatching a single common word.\n\nScoped to what the caller may read — the associations they belong to, or all\nof them for federation staff.","operationId":"search_library_api_v0_library_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"description":"What to look for, in the documents' own words","title":"Q"},"description":"What to look for, in the documents' own words"},{"name":"organisation_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Only this association's texts","title":"Organisation Id"},"description":"Only this association's texts"},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_LibrarySearchRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/profile":{"get":{"tags":["me"],"summary":"Get My Profile","description":"Return a profile the caller may see: their own SELF profile by default, or a\nlinked person (managed minor) via ?person_id=. `email` is the account's sign-in\nidentity (unchanged by the switcher); the profile's own contact email lives in\nthe person payload. person=null when the SELF record doesn't exist yet.","operationId":"get_my_profile_api_v0_me_profile_get","parameters":[{"name":"person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MyProfileRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["me"],"summary":"Upsert My Profile","description":"Update basic contact fields. With ?person_id= edits a linked person (managed\nminor, blocked once they've aged out); without it, updates — or on first save\ncreates and SELF-links — the caller's own Person. Never touches type/qualifications.","operationId":"upsert_my_profile_api_v0_me_profile_put","parameters":[{"name":"person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfilePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_PersonRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/onboarding":{"get":{"tags":["me"],"summary":"Get My Onboarding","description":"The onboarding step keys this account has dismissed. Empty for new accounts.","operationId":"get_my_onboarding_api_v0_me_onboarding_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MyOnboardingRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["me"],"summary":"Set My Onboarding","description":"Replace the account's dismissed step set. Unknown keys are rejected so a\ntypo can't silently hide a step forever; order is normalised to ONBOARDING_STEPS.","operationId":"set_my_onboarding_api_v0_me_onboarding_put","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MyOnboardingRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/agenda":{"get":{"tags":["me"],"summary":"Get My Agenda","description":"Everything currently asking for the signed-in person, from wherever it\nlives — see services/agenda.py. Read-only and best-effort by nature: it owns\nno data of its own, it only points at data that does.","operationId":"get_my_agenda_api_v0_me_agenda_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/disciplines":{"post":{"tags":["me"],"summary":"Add My Discipline","operationId":"add_my_discipline_api_v0_me_disciplines_post","parameters":[{"name":"person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisciplineTagPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MyDisciplineTagRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/disciplines/{discipline_code}":{"delete":{"tags":["me"],"summary":"Remove My Discipline","operationId":"remove_my_discipline_api_v0_me_disciplines__discipline_code__delete","parameters":[{"name":"discipline_code","in":"path","required":true,"schema":{"type":"string","title":"Discipline Code"}},{"name":"person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/socials":{"get":{"tags":["me"],"summary":"List My Socials","operationId":"list_my_socials_api_v0_me_socials_get","parameters":[{"name":"person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_SocialRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["me"],"summary":"Create My Social","operationId":"create_my_social_api_v0_me_socials_post","parameters":[{"name":"person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__me__SocialPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_SocialRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/socials/{social_id}":{"patch":{"tags":["me"],"summary":"Update My Social","operationId":"update_my_social_api_v0_me_socials__social_id__patch","parameters":[{"name":"social_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Social Id"}},{"name":"person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocialPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_SocialRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["me"],"summary":"Delete My Social","operationId":"delete_my_social_api_v0_me_socials__social_id__delete","parameters":[{"name":"social_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Social Id"}},{"name":"person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/account":{"delete":{"tags":["me"],"summary":"Delete My Account","description":"Delete the caller's own login Account. The Firebase user is deleted\nclient-side by the signed-in user, so no admin credentials are needed here.\nIdempotent: returns 204 even if no account row exists.\n\nscope=\"account\" (default): remove ONLY the login — the account row and its\nconsent log. The linked Person(s) are left untouched.\n\nscope=\"full\": a full data-erasure request — additionally delete the caller's\nown profile and their managed minors via the GDPR deletion policy (hard delete,\nor anonymise/archive when audit/history records must be retained). See\napp/person_deletion.py.\n\nThe account's consent_events reference it (non-null FK, no DB cascade), so they\nmust be removed before the account or the delete hits a FK violation.","operationId":"delete_my_account_api_v0_me_account_delete","parameters":[{"name":"scope","in":"query","required":false,"schema":{"type":"string","default":"account","title":"Scope"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/person":{"delete":{"tags":["me"],"summary":"Delete My Profile","description":"Delete the caller's own profile (their SELF Person) plus their managed minors,\nwhile keeping the login account. A managed minor linked only to this account is\nremoved with it; one also linked to another guardian account is kept (only this\nlink is dropped). Each person is hard-deleted, or anonymised/archived when\naudit/history records must be retained. See app/person_deletion.py.","operationId":"delete_my_profile_api_v0_me_person_delete","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/managed":{"get":{"tags":["me"],"summary":"List Managed Persons","description":"The minors this account manages (parent/guardian).","operationId":"list_managed_persons_api_v0_me_managed_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_MyManagedPersonRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["me"],"summary":"Create Managed Person","description":"Register a managed minor under the caller's account. Requires the guardian\nattestation and a DOB that makes the person under 18 (adults must hold their\nown account — GDPR). Records the guardian attestation and, if opted in, a\npublication consent. The new Person starts unpublished (DRAFT).","operationId":"create_managed_person_api_v0_me_managed_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagedPersonCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MyManagedPersonRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/managed/{person_id}":{"delete":{"tags":["me"],"summary":"Delete Managed Person","description":"Remove a managed minor and their data (the guardian created it). Only the\naccount's own GUARDIAN-linked persons can be deleted here; SELF is untouched.","operationId":"delete_managed_person_api_v0_me_managed__person_id__delete","parameters":[{"name":"person_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/publication":{"get":{"tags":["me"],"summary":"Get Publication Consent","description":"Whether the given person (default SELF) is opted in to public display.","operationId":"get_publication_consent_api_v0_me_publication_get","parameters":[{"name":"person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MyPublicationConsentRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["me"],"summary":"Set Publication Consent","description":"Grant/withdraw consent to show a person publicly. The account holder sets it\nfor themselves (SELF) or for a managed minor still in their care. Append-only:\neach change writes a new consent_events row.","operationId":"set_publication_consent_api_v0_me_publication_put","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicationConsentPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MyPublicationConsentRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/image/upload-url":{"post":{"tags":["me"],"summary":"Get My Upload Url","operationId":"get_my_upload_url_api_v0_me_image_upload_url_post","parameters":[{"name":"person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__me__UploadUrlRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_ImageUploadUrlRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/image":{"post":{"tags":["me"],"summary":"Save My Image","operationId":"save_my_image_api_v0_me_image_post","parameters":[{"name":"person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__me__SaveImageRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_ImageRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/image/{image_id}":{"delete":{"tags":["me"],"summary":"Delete My Image","operationId":"delete_my_image_api_v0_me_image__image_id__delete","parameters":[{"name":"image_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Image Id"}},{"name":"person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/qualifications":{"get":{"tags":["me"],"summary":"List My Qualifications","description":"Every qualification the caller can see: their own, plus those of organisations\nthey actively administer.\n\nRead-only, like the rest of the portal's qualification views — qualifications stay\nadmin-issued (see _qualification_to_dict). The shape mirrors the admin list\n(entity_type / entity_id / entity_name) so the portal page can reuse the\nadmin list's filtering and sorting.\n\nScoped deliberately to ADMIN organisations: a plain MEMBER can see that an\norg exists but has no business reading its qualification and payment records.","operationId":"list_my_qualifications_api_v0_me_qualifications_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_MyQualificationRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/qualifications/checkout":{"post":{"tags":["me"],"summary":"Buy My Qualification","description":"Request a qualification of a person-allowed type → creates a PENDING qualification for\nadmin review. Paid tiers first go through Stripe Checkout (the webhook flips the\nqualification to APPROVED on payment); a free (0 PLN) tier is requested directly.\n\nWith ?person_id= a guardian requests it for a managed minor (blocked once the\nminor has aged out); otherwise it's the caller's own.","operationId":"buy_my_qualification_api_v0_me_qualifications_checkout_post","parameters":[{"name":"person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualificationCheckoutPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MyQualificationCheckoutRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/organisations":{"post":{"tags":["me"],"summary":"Create My Organisation","description":"Create an organisation and make the caller its first ADMIN member.\n\nOwnership in the portal is derived from ADMIN membership (see\nlist_my_organisations / _admin_org), so the caller must have a linked Person\nto become that admin — otherwise the new org would be immediately\ninaccessible to them.","operationId":"create_my_organisation_api_v0_me_organisations_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganisationPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MyOrganisationRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["me"],"summary":"List My Organisations","description":"Organisations the caller is an active member of, enriched for the list UI.\n\nIncludes plain MEMBER rows, not just ADMIN: the portal shows everything you\nbelong to, and marks which ones you can actually administer via `is_admin`.\nEvery write endpoint still goes through _admin_org, so a MEMBER row is\nread-only regardless of what the UI offers.","operationId":"list_my_organisations_api_v0_me_organisations_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_MyOrganisationSummaryRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/organisations/{org_id}":{"put":{"tags":["me"],"summary":"Update My Organisation","operationId":"update_my_organisation_api_v0_me_organisations__org_id__put","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganisationPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MyOrganisationRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["me"],"summary":"Delete My Organisation","description":"Delete an org the caller admins, with its media, members, qualifications, etc.\n\nRelies on the same cascade as the admin delete (delete_entity_images clears\nGCS objects + image rows; db.delete cascades the rest).","operationId":"delete_my_organisation_api_v0_me_organisations__org_id__delete","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/organisations/{org_id}/image/upload-url":{"post":{"tags":["me"],"summary":"Get My Org Upload Url","operationId":"get_my_org_upload_url_api_v0_me_organisations__org_id__image_upload_url_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__me__UploadUrlRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_ImageUploadUrlRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/organisations/{org_id}/image":{"post":{"tags":["me"],"summary":"Save My Org Image","operationId":"save_my_org_image_api_v0_me_organisations__org_id__image_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__me__SaveImageRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_ImageRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/organisations/{org_id}/image/{image_id}":{"delete":{"tags":["me"],"summary":"Delete My Org Image","operationId":"delete_my_org_image_api_v0_me_organisations__org_id__image__image_id__delete","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"image_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Image Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/organisations/{org_id}/disciplines":{"post":{"tags":["me"],"summary":"Add My Org Discipline","operationId":"add_my_org_discipline_api_v0_me_organisations__org_id__disciplines_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisciplineTagPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MyDisciplineTagRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/organisations/{org_id}/disciplines/{discipline_code}":{"delete":{"tags":["me"],"summary":"Remove My Org Discipline","operationId":"remove_my_org_discipline_api_v0_me_organisations__org_id__disciplines__discipline_code__delete","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"discipline_code","in":"path","required":true,"schema":{"type":"string","title":"Discipline Code"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/organisations/{org_id}/members":{"get":{"tags":["me"],"summary":"List My Org Members","operationId":"list_my_org_members_api_v0_me_organisations__org_id__members_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_MyOrganisationMemberRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["me"],"summary":"Add My Org Member","operationId":"add_my_org_member_api_v0_me_organisations__org_id__members_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgMemberPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MyOrganisationMemberRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/organisations/{org_id}/members/{membership_id}":{"patch":{"tags":["me"],"summary":"Update My Org Member","operationId":"update_my_org_member_api_v0_me_organisations__org_id__members__membership_id__patch","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"membership_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Membership Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgMemberPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MyOrganisationMemberRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["me"],"summary":"Delete My Org Member","operationId":"delete_my_org_member_api_v0_me_organisations__org_id__members__membership_id__delete","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"membership_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Membership Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/geocode":{"get":{"tags":["me"],"summary":"Geocode Preview","description":"Resolve an address to coordinates without saving anything.\n\nLets the create/edit forms show where an address lands before it is stored;\nsaving geocodes again server-side, so this is a preview, not the source of\ntruth. Signed-in only, because it proxies Nominatim and their usage policy\nasks us to keep volume low.","operationId":"geocode_preview_api_v0_me_geocode_get","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":300,"title":"Address"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_GeocodePreviewRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/persons":{"get":{"tags":["me"],"summary":"List Persons Minimal","description":"Minimal person list for the invite picker: id, name and avatar, no PII.\n\nThe photo is already public — the public people list and profiles serve the\nsame URL — so including it here exposes nothing new, and it saves the portal\nneeding the admin-only /images endpoint.","operationId":"list_persons_minimal_api_v0_me_persons_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_MinimalPersonRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/organisations/{org_id}/members/{membership_id}/accept":{"post":{"tags":["me"],"summary":"Accept Membership Request","description":"Org admin approves someone's request to join.","operationId":"accept_membership_request_api_v0_me_organisations__org_id__members__membership_id__accept_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"membership_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Membership Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MyOrganisationMemberRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/organisations/{org_id}/members/{membership_id}/reject":{"post":{"tags":["me"],"summary":"Reject Membership Request","description":"Org admin declines a request. The row stays until both sides dismiss it.","operationId":"reject_membership_request_api_v0_me_organisations__org_id__members__membership_id__reject_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"membership_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Membership Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MyOrganisationMemberRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/organisations/{org_id}/request":{"post":{"tags":["me"],"summary":"Request Membership","description":"Ask to join an organisation. Only published organisations can be asked.","operationId":"request_membership_api_v0_me_organisations__org_id__request_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MyOrganisationMemberRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/memberships/{membership_id}/accept":{"post":{"tags":["me"],"summary":"Accept My Invitation","description":"Person accepts an invitation to join.","operationId":"accept_my_invitation_api_v0_me_memberships__membership_id__accept_post","parameters":[{"name":"membership_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Membership Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MyOrganisationMemberRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/memberships/{membership_id}/reject":{"post":{"tags":["me"],"summary":"Reject My Invitation","description":"Person declines an invitation. The row stays until both sides dismiss it.","operationId":"reject_my_invitation_api_v0_me_memberships__membership_id__reject_post","parameters":[{"name":"membership_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Membership Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MyOrganisationMemberRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/memberships/{membership_id}":{"delete":{"tags":["me"],"summary":"Dismiss My Membership","description":"Remove a settled membership from the person's own list.\n\nOnly a REJECTED row can be dismissed this way — leaving an organisation is a\ndifferent action, and a pending one should be answered rather than hidden.","operationId":"dismiss_my_membership_api_v0_me_memberships__membership_id__delete","parameters":[{"name":"membership_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Membership Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/events":{"get":{"tags":["me"],"summary":"List My Events","description":"Events organised by any organisation the caller is an active ADMIN of.","operationId":"list_my_events_api_v0_me_events_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_MyEventRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["me"],"summary":"Create My Event","operationId":"create_my_event_api_v0_me_events_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MyEventRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/events/{event_id}":{"put":{"tags":["me"],"summary":"Update My Event","operationId":"update_my_event_api_v0_me_events__event_id__put","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Event Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MyEventRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["me"],"summary":"Delete My Event","operationId":"delete_my_event_api_v0_me_events__event_id__delete","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Event Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/events/{event_id}/image/upload-url":{"post":{"tags":["me"],"summary":"Get My Event Upload Url","operationId":"get_my_event_upload_url_api_v0_me_events__event_id__image_upload_url_post","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Event Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__me__UploadUrlRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_ImageUploadUrlRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/events/{event_id}/image":{"post":{"tags":["me"],"summary":"Save My Event Image","operationId":"save_my_event_image_api_v0_me_events__event_id__image_post","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Event Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__me__SaveImageRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_ImageRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/event-images/{image_id}":{"delete":{"tags":["me"],"summary":"Delete My Event Image","operationId":"delete_my_event_image_api_v0_me_event_images__image_id__delete","parameters":[{"name":"image_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Image Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/organisations/{org_id}/qualifications/checkout":{"post":{"tags":["me"],"summary":"Buy My Org Qualification","operationId":"buy_my_org_qualification_api_v0_me_organisations__org_id__qualifications_checkout_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgQualificationCheckoutPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MyQualificationCheckoutRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/qualification-prices":{"get":{"tags":["qualification-prices"],"summary":"List Qualification Prices","description":"Read the pricing catalog. Any signed-in user (admin Pricing tab + buy flows).","operationId":"list_qualification_prices_api_v0_qualification_prices_get","parameters":[{"name":"qualification_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Qualification Type"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_QualificationPriceRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["qualification-prices"],"summary":"Create Qualification Price","operationId":"create_qualification_price_api_v0_qualification_prices_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualificationPricePayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_QualificationPriceRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/qualification-prices/{price_id}":{"put":{"tags":["qualification-prices"],"summary":"Update Qualification Price","operationId":"update_qualification_price_api_v0_qualification_prices__price_id__put","parameters":[{"name":"price_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Price Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualificationPricePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_QualificationPriceRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["qualification-prices"],"summary":"Delete Qualification Price","operationId":"delete_qualification_price_api_v0_qualification_prices__price_id__delete","parameters":[{"name":"price_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Price Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/affiliations":{"get":{"tags":["affiliations"],"summary":"List Affiliations","operationId":"list_affiliations_api_v0_affiliations_get","parameters":[{"name":"person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Person Id"}},{"name":"target_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Target Id"}},{"name":"status","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100,"minimum":1},{"type":"null"}],"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_AffiliationRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["affiliations"],"summary":"Create Affiliation","description":"Grant an affiliation directly — no payment, no ledger row. Used for\nhonorary members and memberships paid outside the platform; the ledger stays\na record of money that actually moved through it.","operationId":"create_affiliation_api_v0_affiliations_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliationPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AffiliationRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/affiliations/{affiliation_id}/status":{"put":{"tags":["affiliations"],"summary":"Set Affiliation Status","description":"Suspend, reinstate or cancel. Status is a fact about this period of\nmembership, so it belongs on the row; a *renewal* is a new row instead.","operationId":"set_affiliation_status_api_v0_affiliations__affiliation_id__status_put","parameters":[{"name":"affiliation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Affiliation Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliationStatusPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AffiliationRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/affiliations/{affiliation_id}":{"delete":{"tags":["affiliations"],"summary":"Delete Affiliation","description":"Only for rows created in error. Ending a membership is a status change —\ndeleting it erases the history the join row exists to keep.","operationId":"delete_affiliation_api_v0_affiliations__affiliation_id__delete","parameters":[{"name":"affiliation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Affiliation Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/affiliations":{"get":{"tags":["affiliations"],"summary":"List My Affiliations","description":"Every affiliation held by the caller and their managed minors.","operationId":"list_my_affiliations_api_v0_me_affiliations_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_AffiliationRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/affiliations/checkout":{"post":{"tags":["affiliations"],"summary":"Buy My Affiliation","description":"Buy an affiliation with an association, for yourself or a managed minor.\n\nFree tiers (and the payments-disabled switch) skip Stripe and land ACTIVE\nstraight away: unlike a qualification, there is nothing for the federation to\nassess — the association set the price to zero on purpose. The purchase is\nstill written to the ledger, so \"my purchases\" is complete either way.","operationId":"buy_my_affiliation_api_v0_me_affiliations_checkout_post","parameters":[{"name":"person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Person Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliationCheckoutPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AffiliationCheckoutRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/affiliations/{affiliation_id}/cancel":{"post":{"tags":["affiliations"],"summary":"Cancel My Affiliation","description":"Abandon an affiliation that was never paid for. An ACTIVE one is not the\ncaller's to cancel — leaving an association is a conversation with it, and a\nrefund would be a ledger entry, not a delete.","operationId":"cancel_my_affiliation_api_v0_me_affiliations__affiliation_id__cancel_post","parameters":[{"name":"affiliation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Affiliation Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AffiliationRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/affiliation-prices":{"get":{"tags":["affiliations"],"summary":"List Affiliation Prices","description":"The full catalogue including retired tiers — for whoever administers it.","operationId":"list_affiliation_prices_api_v0_affiliation_prices_get","parameters":[{"name":"association_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Association Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_AffiliationPriceRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["affiliations"],"summary":"Create Affiliation Price","operationId":"create_affiliation_price_api_v0_affiliation_prices_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliationPricePayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AffiliationPriceRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/affiliation-prices/{price_id}":{"put":{"tags":["affiliations"],"summary":"Update Affiliation Price","description":"Edit a tier. Note this does **not** change what anyone already paid: the\namount on a sold affiliation lives in the ledger's snapshot, not here.","operationId":"update_affiliation_price_api_v0_affiliation_prices__price_id__put","parameters":[{"name":"price_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Price Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliationPricePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AffiliationPriceRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["affiliations"],"summary":"Delete Affiliation Price","operationId":"delete_affiliation_price_api_v0_affiliation_prices__price_id__delete","parameters":[{"name":"price_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Price Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/associations/{association_id}/affiliation-prices":{"get":{"tags":["affiliations"],"summary":"List Association Prices","description":"The tiers an association currently sells. Public: the /join checkout runs\nbefore anyone has signed in, so this cannot require a token. Only *active*\ntiers are exposed — a retired price is not an offer.","operationId":"list_association_prices_api_v0_associations__association_id__affiliation_prices_get","parameters":[{"name":"association_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Association Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_AffiliationPriceRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/associations/public":{"get":{"tags":["affiliations"],"summary":"List Public Associations","description":"Associations a person can affiliate with, each with its active tiers —\nenough for a picker without a round trip per association.\n\n`/associations/public`, not `/associations`: that path is already the admin\nmain-association picker (routers/federation.py). Same `/public` suffix the\ngovernance and documents routers use for their signed-out reads.","operationId":"list_public_associations_api_v0_associations_public_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_PublicAssociationRead__"}}}}}}},"/api/v0/transactions":{"get":{"tags":["transactions"],"summary":"List Transactions","operationId":"list_transactions_api_v0_transactions_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Status"}},{"name":"item_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Item Type"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100,"minimum":1},{"type":"null"}],"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_TransactionRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/transactions/summary":{"get":{"tags":["transactions"],"summary":"Transactions Summary","description":"Headline numbers for the admin ledger page. Net of refunds, because a\nrefund is a negative row — summing the column is the whole point.","operationId":"transactions_summary_api_v0_transactions_summary_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_TransactionSummaryRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/transactions/{transaction_id}/refund":{"post":{"tags":["transactions"],"summary":"Refund Transaction","description":"Record a refund. **Records** — it does not call Stripe.\n\nThe money is moved in the Stripe dashboard (or arrives here as a\n`charge.refunded` webhook); this endpoint is how a refund made outside the\napp enters the ledger. Keeping the two separate means the platform never\nholds the ability to move money out on its own.","operationId":"refund_transaction_api_v0_transactions__transaction_id__refund_post","parameters":[{"name":"transaction_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Transaction Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefundPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_TransactionRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/transactions":{"get":{"tags":["transactions"],"summary":"List My Transactions","description":"My purchases — matched on the account, plus anything bought for a person\nI hold (a guardian's payments for a managed minor).","operationId":"list_my_transactions_api_v0_me_transactions_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_TransactionRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/credentials":{"get":{"tags":["credentials"],"summary":"List My Credentials","description":"The wallet: qualifications and affiliations in one shape.","operationId":"list_my_credentials_api_v0_me_credentials_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_MyCredentialRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/me/credentials/{credential_id}/google-wallet":{"get":{"tags":["credentials"],"summary":"Google Wallet Status","description":"Whether this credential is already in a wallet — a read, with no side effects.\n\n`saved: null` means we could not tell (not set up, no pass created yet, or\nGoogle unreachable). The client shows that as \"don't know\" rather than \"not\nadded\", because Google can also take a moment to flag a fresh save.","operationId":"google_wallet_status_api_v0_me_credentials__credential_id__google_wallet_get","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Credential Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_GoogleWalletStatusRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["credentials"],"summary":"Add To Google Wallet","description":"A link that adds this credential to the caller's Google Wallet.\n\nPOST, not GET: it creates the pass on Google's side before handing back the\nlink. The GET above is the side-effect-free half.\n\n503 when the issuer account has not been set up — see app/services/wallet.py.","operationId":"add_to_google_wallet_api_v0_me_credentials__credential_id__google_wallet_post","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Credential Id"}},{"name":"origin","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_GoogleWalletSaveRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/verification/{credential_id}":{"get":{"tags":["verification"],"summary":"Verify Credential","description":"Verify a qualification or an affiliation by its id.\n\nBoth wallet cards carry a QR, so both resolve here; `kind` tells the page\nwhich it got. Qualification first — those are the ids already in circulation.","operationId":"verify_credential_api_v0_verification__credential_id__get","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Credential Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_VerificationRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/national-teams":{"get":{"tags":["national-teams"],"summary":"List National Teams","description":"List teams. Admins see all statuses; public sees ACTIVE and ARCHIVED (not DRAFT).\nThis matches the detail endpoint's public contract and lets the year selector\nshow past-season ARCHIVED rosters.\n\nAn ADMIN sees only the federations they administer. A public caller is not\nscoped here — it has no federation to be scoped to, and this endpoint's\npublic half is superseded by `GET /api/v0/public/orgs/{slug}/national-teams`,\nwhich takes the federation from the URL.","operationId":"list_national_teams_api_v0_national_teams_get","parameters":[{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"}},{"name":"discipline_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discipline Code"}},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_NationalTeamListRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["national-teams"],"summary":"Create National Team","operationId":"create_national_team_api_v0_national_teams_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NationalTeamCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_NationalTeamRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/national-teams/{team_id}":{"get":{"tags":["national-teams"],"summary":"Get National Team","description":"Return team detail with roster, ordered athletes-first.\nNon-admins receive 404 for DRAFT teams.","operationId":"get_national_team_api_v0_national_teams__team_id__get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Team Id"}},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_NationalTeamRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["national-teams"],"summary":"Update National Team","description":"Update a team's name and/or status (e.g. publish DRAFT -> ACTIVE).\nThe season year is a property of the Season — change it via PATCH /seasons.","operationId":"update_national_team_api_v0_national_teams__team_id__patch","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Team Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NationalTeamUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_NationalTeamRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["national-teams"],"summary":"Delete National Team","description":"Delete a team and its roster (members cascade via the relationship).","operationId":"delete_national_team_api_v0_national_teams__team_id__delete","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Team Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/national-teams/{team_id}/members":{"post":{"tags":["national-teams"],"summary":"Add National Team Member","operationId":"add_national_team_member_api_v0_national_teams__team_id__members_post","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Team Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NationalTeamMemberCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_NationalTeamMemberRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/seasons":{"get":{"tags":["national-teams"],"summary":"List Seasons","description":"List all seasons (newest first) with the number of teams in each.","operationId":"list_seasons_api_v0_seasons_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_SeasonRead__"}}}}}},"post":{"tags":["national-teams"],"summary":"Create Season","operationId":"create_season_api_v0_seasons_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeasonCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_SeasonRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/seasons/{season_id}":{"patch":{"tags":["national-teams"],"summary":"Update Season","operationId":"update_season_api_v0_seasons__season_id__patch","parameters":[{"name":"season_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Season Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeasonUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_SeasonRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["national-teams"],"summary":"Delete Season","description":"Delete a season and (via cascade) all its teams and their rosters.","operationId":"delete_season_api_v0_seasons__season_id__delete","parameters":[{"name":"season_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Season Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/national-team-members/{member_id}":{"patch":{"tags":["national-teams"],"summary":"Update National Team Member","operationId":"update_national_team_member_api_v0_national_team_members__member_id__patch","parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Member Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NationalTeamMemberUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_NationalTeamMemberRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["national-teams"],"summary":"Delete National Team Member","description":"Remove a member from a team.","operationId":"delete_national_team_member_api_v0_national_team_members__member_id__delete","parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Member Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/persons/{person_id}/national-teams":{"get":{"tags":["national-teams"],"summary":"Get Person National Teams","description":"Return national team memberships for a person, ordered by season desc.\nNon-admin callers (including unauthenticated public) have DRAFT teams excluded\nso that unpublished selections don't surface on the public person profile.\nAdmin callers (who send the session token) see all statuses including DRAFT\n— required by the admin PersonProfilePage add-to-team flow.","operationId":"get_person_national_teams_api_v0_persons__person_id__national_teams_get","parameters":[{"name":"person_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Person Id"}},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/events":{"get":{"tags":["events"],"summary":"List Events","operationId":"list_events_api_v0_events_get","parameters":[{"name":"event_type","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Event Type"}},{"name":"organiser_id","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","format":"uuid"},"default":[],"title":"Organiser Id"}},{"name":"start_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start From"}},{"name":"start_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start To"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"status","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Status"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"}},{"name":"order","in":"query","required":false,"schema":{"type":"string","default":"asc","title":"Order"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100,"minimum":1},{"type":"null"}],"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_EventRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["events"],"summary":"Create Event","operationId":"create_event_api_v0_events_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_EventRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/events/{event_id}":{"get":{"tags":["events"],"summary":"Get Event","operationId":"get_event_api_v0_events__event_id__get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Event Id"}},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_EventRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["events"],"summary":"Update Event","operationId":"update_event_api_v0_events__event_id__put","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Event Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_EventRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["events"],"summary":"Delete Event","operationId":"delete_event_api_v0_events__event_id__delete","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Event Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/events/{event_id}/forecast":{"get":{"tags":["events"],"summary":"Get Event Forecast","description":"Live current forecast for the event's (or overridden) location. Public for\nACTIVE events. 404 when forecast is off or no location is known; 503 when the\nupstream provider is momentarily unreachable.","operationId":"get_event_forecast_api_v0_events__event_id__forecast_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Event Id"}},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/events/{event_id}/status":{"put":{"tags":["events"],"summary":"Set Event Status","description":"Publish or unpublish. Kept off the main payload deliberately: the detail\npages send a full-object PUT, so a shared field would let any edit reset the\nstatus by omission.","operationId":"set_event_status_api_v0_events__event_id__status_put","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Event Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_EventRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/events/{event_id}/competition":{"get":{"tags":["competitions"],"summary":"Get Event Competition","operationId":"get_event_competition_api_v0_events__event_id__competition_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Event Id"}},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_CompetitionRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["competitions"],"summary":"Create Event Competition","operationId":"create_event_competition_api_v0_events__event_id__competition_post","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Event Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompetitionCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_CompetitionRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/competitions/{competition_id}":{"patch":{"tags":["competitions"],"summary":"Update Competition","operationId":"update_competition_api_v0_competitions__competition_id__patch","parameters":[{"name":"competition_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Competition Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompetitionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_CompetitionRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["competitions"],"summary":"Delete Competition","operationId":"delete_competition_api_v0_competitions__competition_id__delete","parameters":[{"name":"competition_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Competition Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/competitions/{competition_id}/divisions":{"get":{"tags":["competitions"],"summary":"List Divisions","operationId":"list_divisions_api_v0_competitions__competition_id__divisions_get","parameters":[{"name":"competition_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Competition Id"}},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_CompetitionDivisionRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["competitions"],"summary":"Create Division","operationId":"create_division_api_v0_competitions__competition_id__divisions_post","parameters":[{"name":"competition_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Competition Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DivisionCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_CompetitionDivisionRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/competitions/{competition_id}/officials":{"get":{"tags":["competitions"],"summary":"List Competition Officials","operationId":"list_competition_officials_api_v0_competitions__competition_id__officials_get","parameters":[{"name":"competition_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Competition Id"}},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_CompetitionOfficialRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["competitions"],"summary":"Add Competition Official","operationId":"add_competition_official_api_v0_competitions__competition_id__officials_post","parameters":[{"name":"competition_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Competition Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfficialCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_CompetitionOfficialRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/competition-divisions/{division_id}":{"get":{"tags":["competitions"],"summary":"Get Division","operationId":"get_division_api_v0_competition_divisions__division_id__get","parameters":[{"name":"division_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Division Id"}},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_CompetitionDivisionRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["competitions"],"summary":"Update Division","operationId":"update_division_api_v0_competition_divisions__division_id__patch","parameters":[{"name":"division_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Division Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DivisionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_CompetitionDivisionRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["competitions"],"summary":"Delete Division","operationId":"delete_division_api_v0_competition_divisions__division_id__delete","parameters":[{"name":"division_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Division Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/competition-divisions/{division_id}/entries":{"get":{"tags":["competitions"],"summary":"List Entries","operationId":"list_entries_api_v0_competition_divisions__division_id__entries_get","parameters":[{"name":"division_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Division Id"}},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_CompetitionEntryRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["competitions"],"summary":"Add Entry","operationId":"add_entry_api_v0_competition_divisions__division_id__entries_post","parameters":[{"name":"division_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Division Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DivisionEntryCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_CompetitionEntryRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/competition-divisions/{division_id}/officials":{"get":{"tags":["competitions"],"summary":"List Division Officials","description":"Effective officials for a division: its own set when overridden, otherwise\nthe competition's officials (inherited). `meta.overridden` tells the caller\nwhich mode it is in so the UI can offer Customize / Reset.","operationId":"list_division_officials_api_v0_competition_divisions__division_id__officials_get","parameters":[{"name":"division_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Division Id"}},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_CompetitionOfficialRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["competitions"],"summary":"Add Division Official","operationId":"add_division_official_api_v0_competition_divisions__division_id__officials_post","parameters":[{"name":"division_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Division Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfficialCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_CompetitionOfficialRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/competition-divisions/{division_id}/officials/override":{"post":{"tags":["competitions"],"summary":"Override Division Officials","description":"Switch a division to its own officials list, seeded from the competition's\ncurrent officials. Idempotent — a no-op if already overridden.","operationId":"override_division_officials_api_v0_competition_divisions__division_id__officials_override_post","parameters":[{"name":"division_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Division Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_CompetitionOfficialRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["competitions"],"summary":"Reset Division Officials","description":"Drop a division's own officials and revert to inheriting the competition's.\nReturns the (now inherited) list so the UI can refresh in place.","operationId":"reset_division_officials_api_v0_competition_divisions__division_id__officials_override_delete","parameters":[{"name":"division_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Division Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_CompetitionOfficialRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/competition-divisions/{division_id}/bracket":{"get":{"tags":["competitions"],"summary":"Get Bracket","operationId":"get_bracket_api_v0_competition_divisions__division_id__bracket_get","parameters":[{"name":"division_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Division Id"}},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["competitions"],"summary":"Delete Division Bracket","description":"Remove a division's bracket entirely (rounds cascade to heats + slots).\nGuarded like regenerate: once any heat has left PLANNED, require explicit\nconfirmation because recorded scores/results would be discarded.","operationId":"delete_division_bracket_api_v0_competition_divisions__division_id__bracket_delete","parameters":[{"name":"division_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Division Id"}},{"name":"confirm","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Confirm"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/competition-divisions/{division_id}/bracket/generate":{"post":{"tags":["competitions"],"summary":"Generate Division Bracket","operationId":"generate_division_bracket_api_v0_competition_divisions__division_id__bracket_generate_post","parameters":[{"name":"division_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Division Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BracketGenerate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/competition-division-entries/{entry_id}":{"patch":{"tags":["competitions"],"summary":"Update Entry","operationId":"update_entry_api_v0_competition_division_entries__entry_id__patch","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entry Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DivisionEntryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_CompetitionEntryRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["competitions"],"summary":"Delete Entry","operationId":"delete_entry_api_v0_competition_division_entries__entry_id__delete","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entry Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/competition-officials/{official_id}":{"patch":{"tags":["competitions"],"summary":"Update Competition Official","operationId":"update_competition_official_api_v0_competition_officials__official_id__patch","parameters":[{"name":"official_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Official Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfficialUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_CompetitionOfficialRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["competitions"],"summary":"Delete Competition Official","operationId":"delete_competition_official_api_v0_competition_officials__official_id__delete","parameters":[{"name":"official_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Official Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/competition-division-officials/{official_id}":{"patch":{"tags":["competitions"],"summary":"Update Division Official","operationId":"update_division_official_api_v0_competition_division_officials__official_id__patch","parameters":[{"name":"official_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Official Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfficialUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_CompetitionOfficialRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["competitions"],"summary":"Delete Division Official","operationId":"delete_division_official_api_v0_competition_division_officials__official_id__delete","parameters":[{"name":"official_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Official Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/competition-rounds/{round_id}":{"patch":{"tags":["competitions"],"summary":"Update Round","operationId":"update_round_api_v0_competition_rounds__round_id__patch","parameters":[{"name":"round_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Round Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoundUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_CompetitionRoundRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/competition-heats/{heat_id}/entries":{"post":{"tags":["competitions"],"summary":"Add Heat Entry","description":"Manually place a competitor into a heat (MVP item 4).","operationId":"add_heat_entry_api_v0_competition_heats__heat_id__entries_post","parameters":[{"name":"heat_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Heat Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeatEntryCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_CompetitionHeatEntryRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/competition-heats/{heat_id}/status":{"patch":{"tags":["competitions"],"summary":"Set Heat Status","operationId":"set_heat_status_api_v0_competition_heats__heat_id__status_patch","parameters":[{"name":"heat_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Heat Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeatStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/competition-heat-entries/{entry_id}":{"patch":{"tags":["competitions"],"summary":"Update Heat Entry","operationId":"update_heat_entry_api_v0_competition_heat_entries__entry_id__patch","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entry Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeatEntryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_CompetitionHeatEntryRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["competitions"],"summary":"Delete Heat Entry","operationId":"delete_heat_entry_api_v0_competition_heat_entries__entry_id__delete","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entry Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/competition-heat-entries/{entry_id}/waves":{"post":{"tags":["competitions"],"summary":"Add Wave","operationId":"add_wave_api_v0_competition_heat_entries__entry_id__waves_post","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entry Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/competition-waves/{wave_id}":{"delete":{"tags":["competitions"],"summary":"Delete Wave","operationId":"delete_wave_api_v0_competition_waves__wave_id__delete","parameters":[{"name":"wave_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Wave Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/competition-waves/{wave_id}/scores":{"put":{"tags":["competitions"],"summary":"Upsert Wave Score","description":"Set (score given) or clear (score null) one judge's score for a wave. The\njudge must be an official assigned to the division.","operationId":"upsert_wave_score_api_v0_competition_waves__wave_id__scores_put","parameters":[{"name":"wave_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Wave Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaveScoreUpsert"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/registration-prices":{"get":{"tags":["registrations"],"summary":"List Registration Prices","description":"Admin: every tier for an owner (including inactive), ordered.","operationId":"list_registration_prices_api_v0_registration_prices_get","parameters":[{"name":"owner_type","in":"query","required":true,"schema":{"enum":["division","event"],"type":"string","title":"Owner Type"}},{"name":"owner_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Owner Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_RegistrationPriceRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["registrations"],"summary":"Create Registration Price","operationId":"create_registration_price_api_v0_registration_prices_post","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistrationPricePayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_RegistrationPriceRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/registration-prices/public":{"get":{"tags":["registrations"],"summary":"Public Registration Prices","description":"Public: active tiers + the currently-resolved price for an owner. Hidden on\na DRAFT event. `current_price_id` is the tier a checkout would charge now.","operationId":"public_registration_prices_api_v0_registration_prices_public_get","parameters":[{"name":"owner_type","in":"query","required":true,"schema":{"enum":["division","event"],"type":"string","title":"Owner Type"}},{"name":"owner_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Owner Id"}},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_PublicRegistrationPricesRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/registration-prices/{price_id}":{"put":{"tags":["registrations"],"summary":"Update Registration Price","operationId":"update_registration_price_api_v0_registration_prices__price_id__put","parameters":[{"name":"price_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Price Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistrationPricePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_RegistrationPriceRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["registrations"],"summary":"Delete Registration Price","operationId":"delete_registration_price_api_v0_registration_prices__price_id__delete","parameters":[{"name":"price_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Price Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/registrations/checkout":{"post":{"tags":["registrations"],"summary":"Create Registration Checkout","description":"Public: resolve the current price for an owner and start a registration.\n\nMirrors qualifications.create_checkout. When payments are disabled or the price is\nfree, records the registration as PAID directly (no Stripe) so it lands in the\nadmin pending list; otherwise creates a Stripe Checkout session and a\nPENDING_PAYMENT row keyed by the session id (the webhook flips it to PAID).","operationId":"create_registration_checkout_api_v0_registrations_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_RegistrationCheckoutRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/registrations":{"get":{"tags":["registrations"],"summary":"List Registrations","description":"Admin: registrations, newest first. Filter by event, owner, and/or status.\nPENDING_PAYMENT rows are excluded by default (unpaid, possibly abandoned).","operationId":"list_registrations_api_v0_registrations_get","parameters":[{"name":"event_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Event Id"}},{"name":"owner_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["division","event"],"type":"string"},{"type":"null"}],"title":"Owner Type"}},{"name":"owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Owner Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_RegistrationRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/registrations/{registration_id}/confirm":{"post":{"tags":["registrations"],"summary":"Confirm Registration","description":"Admin: accept a PAID registration. For a division owner, links the given\nPerson and creates the startlist entry (CompetitionDivisionEntry); for an\nevent owner, optionally links a Person and just marks it CONFIRMED.","operationId":"confirm_registration_api_v0_registrations__registration_id__confirm_post","parameters":[{"name":"registration_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Registration Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_RegistrationRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/registrations/{registration_id}/cancel":{"post":{"tags":["registrations"],"summary":"Cancel Registration","description":"Admin: cancel a registration. Removes the linked startlist entry, if any.","operationId":"cancel_registration_api_v0_registrations__registration_id__cancel_post","parameters":[{"name":"registration_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Registration Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_RegistrationRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/organisations/{org_id}/sponsors":{"get":{"tags":["sponsors"],"summary":"List Org Sponsors","description":"All of an org's sponsors (admin) or only public ones (everyone else).","operationId":"list_org_sponsors_api_v0_organisations__org_id__sponsors_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_SponsorRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["sponsors"],"summary":"Create Org Sponsor","operationId":"create_org_sponsor_api_v0_organisations__org_id__sponsors_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SponsorPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_SponsorRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/sponsors/{sponsor_id}":{"patch":{"tags":["sponsors"],"summary":"Update Sponsor","operationId":"update_sponsor_api_v0_sponsors__sponsor_id__patch","parameters":[{"name":"sponsor_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Sponsor Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SponsorUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_SponsorRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sponsors"],"summary":"Delete Sponsor","operationId":"delete_sponsor_api_v0_sponsors__sponsor_id__delete","parameters":[{"name":"sponsor_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Sponsor Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/competitions/{competition_id}/sponsors":{"get":{"tags":["sponsors"],"summary":"List Competition Sponsors","description":"Sponsors chosen for a competition (full sponsor objects). Hidden from the\npublic while the parent event is DRAFT.","operationId":"list_competition_sponsors_api_v0_competitions__competition_id__sponsors_get","parameters":[{"name":"competition_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Competition Id"}},{"name":"x-user-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_SponsorRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["sponsors"],"summary":"Link Competition Sponsor","description":"Attach one of the event organiser's sponsors to the competition.","operationId":"link_competition_sponsor_api_v0_competitions__competition_id__sponsors_post","parameters":[{"name":"competition_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Competition Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkSponsorPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_SponsorRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/competitions/{competition_id}/sponsors/{sponsor_id}":{"patch":{"tags":["sponsors"],"summary":"Reorder Competition Sponsor","description":"Set a linked sponsor's position within the competition (drag-to-reorder).","operationId":"reorder_competition_sponsor_api_v0_competitions__competition_id__sponsors__sponsor_id__patch","parameters":[{"name":"competition_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Competition Id"}},{"name":"sponsor_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Sponsor Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderSponsorPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_CompetitionSponsorLinkRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sponsors"],"summary":"Unlink Competition Sponsor","operationId":"unlink_competition_sponsor_api_v0_competitions__competition_id__sponsors__sponsor_id__delete","parameters":[{"name":"competition_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Competition Id"}},{"name":"sponsor_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Sponsor Id"}},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/dashboard/summary":{"get":{"tags":["dashboard"],"summary":"Dashboard Summary","description":"Aggregate counts for every admin section. Admin-only (mirrors the nav).","operationId":"dashboard_summary_api_v0_dashboard_summary_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_DashboardRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/analytics/overview":{"get":{"tags":["analytics"],"summary":"Analytics Overview","description":"Cached headline metrics (active users, page views, top pages, device split,\ntop countries) over the last `days`. `available: False` when GA isn't reachable.","operationId":"analytics_overview_api_v0_analytics_overview_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":28,"title":"Days"}},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean","description":"Bypass the 10-minute cache.","default":false,"title":"Refresh"},"description":"Bypass the 10-minute cache."},{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AnalyticsOverviewRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/stats/ai-usage":{"get":{"tags":["stats"],"summary":"Get Ai Usage Report","description":"Every organisation with an AI allowance, and what it has spent this month.\n\n\"Eligible\" is not a flag on a row: an organisation is here because it holds\nan active ASSOCIATION qualification, because it has been granted units by\nhand, or because it has spent something — that last one so an association\nwhose qualification has just expired still shows the month it spent, rather\nthan vanishing from the report that would explain the bill.","operationId":"get_ai_usage_report_api_v0_stats_ai_usage_get","parameters":[{"name":"x-user-token","in":"header","required":true,"schema":{"type":"string","title":"X-User-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AiUsageReportRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/public/orgs":{"get":{"tags":["public"],"summary":"List Organisations","description":"Every publicly visible organisation, across the platform.","operationId":"list_organisations_api_v0_public_orgs_get","parameters":[{"name":"type","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Type"}},{"name":"discipline","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Discipline"}},{"name":"affiliated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Slug of the federation that licenses them","title":"Affiliated To"},"description":"Slug of the federation that licenses them"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"pl | en","title":"Lang"},"description":"pl | en"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_PublicOrganisationSummary__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/public/orgs/{slug}":{"get":{"tags":["public"],"summary":"Read Organisation","operationId":"read_organisation_api_v0_public_orgs__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"pl | en","title":"Lang"},"description":"pl | en"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_PublicOrganisationDetail_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/public/orgs/{slug}/affiliates":{"get":{"tags":["public"],"summary":"List Affiliates","description":"The organisations this one licenses.\n\nThere is no membership table behind this: an affiliation IS an active\nqualification issued by this organisation, so a club appears here exactly\nwhile its licence is valid.","operationId":"list_affiliates_api_v0_public_orgs__slug__affiliates_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"type","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Type"}},{"name":"discipline","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Discipline"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_PublicAffiliate__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/public/orgs/{slug}/events":{"get":{"tags":["public"],"summary":"List Events","description":"Events this organisation is connected to, with the nature of each\nconnection.\n\nTwo things it deliberately does:\n\n* An event whose TENANT is this organisation appears even with no junction\n  row, carrying `roles: []`. Suppressing it would hide a federation's own\n  event because nobody recorded who ran it.\n* `roles` is a list, so a patronage is distinguishable from an event the\n  organisation actually organised — which is the whole reason the junction\n  exists.","operationId":"list_events_api_v0_public_orgs__slug__events_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"role","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"organiser, co_organiser, sanctioning, patronage, host","default":[],"title":"Role"},"description":"organiser, co_organiser, sanctioning, patronage, host"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"To"}},{"name":"type","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Type"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_PublicEvent__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/public/orgs/{slug}/bodies":{"get":{"tags":["public"],"summary":"List Bodies","description":"Governance bodies with their CURRENT members.\n\nNames and offices publish on the public-task basis the privacy policy in\nforce states; photographs are consent-gated inside `serialise.public_people`.\n`member_count` is the length of the list, never the true size of the body.","operationId":"list_bodies_api_v0_public_orgs__slug__bodies_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_PublicGovernanceBody__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/public/orgs/{slug}/national-teams":{"get":{"tags":["public"],"summary":"List National Teams","description":"Squads and their rosters.\n\nRosters contain minors by definition — U10 to U18 is the point of a junior\nteam — so the minor rules in `serialise` are load-bearing here, not an edge\ncase.","operationId":"list_national_teams_api_v0_public_orgs__slug__national_teams_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"}},{"name":"discipline","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Discipline"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_PublicNationalTeam__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/public/orgs/{slug}/documents":{"get":{"tags":["public"],"summary":"List Documents","description":"The public shelf.\n\nNo `q`: the internal endpoint searches `documents.extracted_text`, and\nfull-text search over document contents for an unauthenticated caller is a\ndifferent feature with different risks.","operationId":"list_documents_api_v0_public_orgs__slug__documents_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"include_minutes","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Minutes"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_PublicDocument__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/public/orgs/{slug}/statute":{"get":{"tags":["public"],"summary":"Read Statute","description":"The association's statut, as Markdown.\n\n404 when there is none — an association without a statute on file is not an\nerror, but there is no resource to return and an empty body would be\nindistinguishable from a statute of no words.","operationId":"read_statute_api_v0_public_orgs__slug__statute_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_PublicStatute_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/public/orgs/{slug}/meetings":{"get":{"tags":["public"],"summary":"List Meetings","description":"The association's meetings, newest first.\n\nCards only. Who attended is a list of PEOPLE, and a list of people belongs\nbehind the rules in PublicPerson rather than in a summary — so this carries\n`participant_count` and the meeting's own id, and the detail is a separate\nrequest.","operationId":"list_meetings_api_v0_public_orgs__slug__meetings_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_PublicMeeting__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v0/public/orgs/{slug}/tasks":{"get":{"tags":["public"],"summary":"List Tasks","description":"The association's published task market.\n\n**404 when the board is not published**, not 403 and not an empty list: an\nunpublished board must be indistinguishable from an association that has\nnone, exactly as a DRAFT organisation is indistinguishable from a missing\none. Only the three board columns are ever published — the backlog and the\narchive are not a public work board.\n\nRate-limited with the person-bearing endpoints because a task can name its\nassignee.","operationId":"list_tasks_api_v0_public_orgs__slug__tasks_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_List_PublicTask__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhook":{"post":{"tags":["webhooks"],"summary":"Stripe Webhook","description":"Stripe events. Settles the ledger and activates what was paid for.","operationId":"stripe_webhook_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"tags":["ops"],"summary":"Health","description":"Liveness probe. Unversioned on purpose — ops endpoints don't move with the API.\n\nAlso the version endpoint. Both values are needed to identify a running\ndeploy: `version` is the release release-please tagged, `commit` is the sha\nthe image was built from. A release alone cannot identify a deploy, because\nimages are tagged by sha and a redeploy of the same release is routine.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AccountConsentRead":{"properties":{"id":{"type":"string","title":"Id"},"consent_type":{"type":"string","title":"Consent Type"},"granted":{"type":"boolean","title":"Granted"},"policy_version":{"type":"string","title":"Policy Version"},"source":{"type":"string","title":"Source"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","consent_type","granted","policy_version","source","created_at"],"title":"AccountConsentRead","description":"One append-only consent record for this account."},"AccountRead":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"email_verified":{"type":"boolean","title":"Email Verified"},"is_admin":{"type":"boolean","title":"Is Admin"},"provider":{"type":"string","title":"Provider"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"last_login_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Login At"},"needs_consent":{"type":"boolean","title":"Needs Consent"},"person_count":{"type":"integer","title":"Person Count"},"persons":{"anyOf":[{"items":{"$ref":"#/components/schemas/LinkedPersonRead"},"type":"array"},{"type":"null"}],"title":"Persons"},"self_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Self Name"},"managed_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Managed Count"}},"type":"object","required":["id","email","email_verified","is_admin","provider","created_at","last_login_at","needs_consent","person_count"],"title":"AccountRead","description":"An account, in one of TWO mutually exclusive shapes.\n\n`_account_dict(with_persons=...)` decides which: the detail endpoints send\n`persons`, the list endpoints send `self_name` and `managed_count` instead.\nAll three are therefore optional, and exactly one side is present in any\ngiven response — a client should not expect both.\n\n`needs_consent` is true while the account still owes a Terms/Privacy\nacceptance."},"ActionItemCreate":{"properties":{"description":{"type":"string","title":"Description"},"assignee_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignee Text"},"due_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due Text"},"agenda_item_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Agenda Item Id"}},"type":"object","required":["description"],"title":"ActionItemCreate","description":"A recorded task. `assignee_text`/`due_text` are the verbatim record; the\nserver resolves them to a Person / date best-effort (see the service).\n\nOnly `description` is required. An owner and a deadline are recorded when\nthey are known — a meeting routinely agrees that something needs doing\nbefore it agrees who does it."},"ActionItemUpdate":{"properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"assignee_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignee Text"},"due_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due Text"},"agenda_item_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Agenda Item Id"}},"type":"object","title":"ActionItemUpdate","description":"All optional — only the fields present in the payload are changed.\n\n`assignee_text` uses the sentinel, like `due_text`: present as null CLEARS\nthe owner, absent leaves it alone. That is what lets an edit take a name off\na task, now that a task may have none."},"AddressPayload":{"properties":{"address":{"type":"string","title":"Address"},"is_primary":{"type":"boolean","title":"Is Primary","default":false}},"type":"object","required":["address"],"title":"AddressPayload"},"AffiliationCheckoutPayload":{"properties":{"association_id":{"type":"string","format":"uuid","title":"Association Id"},"tier":{"type":"string","title":"Tier"},"valid_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Valid From"},"origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"}},"type":"object","required":["association_id","tier"],"title":"AffiliationCheckoutPayload"},"AffiliationCheckoutRead":{"properties":{"checkout_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checkout Url"},"affiliation_id":{"type":"string","title":"Affiliation Id"},"requested":{"type":"boolean","title":"Requested"}},"type":"object","required":["checkout_url","affiliation_id","requested"],"title":"AffiliationCheckoutRead","description":"`checkout_url` is null when AFFILIATION_PAYMENTS_ENABLED is off — the\naffiliation is then recorded as owed rather than charged, which is why\n`requested` is true either way."},"AffiliationPayload":{"properties":{"person_id":{"type":"string","format":"uuid","title":"Person Id"},"target_id":{"type":"string","format":"uuid","title":"Target Id"},"target_type":{"type":"string","title":"Target Type","default":"association"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"status":{"type":"string","title":"Status","default":"ACTIVE"},"valid_from":{"type":"string","format":"date","title":"Valid From"},"valid_to":{"type":"string","format":"date","title":"Valid To"}},"type":"object","required":["person_id","target_id","valid_from","valid_to"],"title":"AffiliationPayload","description":"Admin grant. Bypasses payment on purpose — an association may hand out an\nhonorary or already-paid-offline membership."},"AffiliationPricePayload":{"properties":{"association_id":{"type":"string","format":"uuid","title":"Association Id"},"tier":{"type":"string","title":"Tier"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"amount":{"type":"integer","title":"Amount"},"currency":{"type":"string","title":"Currency","default":"pln"},"duration_months":{"type":"integer","title":"Duration Months","default":12},"perks":{"anyOf":[{"items":{"type":"object"},"type":"array"},{"type":"null"}],"title":"Perks"},"active":{"type":"boolean","title":"Active","default":true},"display_order":{"type":"integer","title":"Display Order","default":0}},"type":"object","required":["association_id","tier","name","amount"],"title":"AffiliationPricePayload"},"AffiliationPriceRead":{"properties":{"id":{"type":"string","title":"Id"},"association_id":{"type":"string","title":"Association Id"},"tier":{"type":"string","title":"Tier"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"amount":{"type":"integer","title":"Amount"},"currency":{"type":"string","title":"Currency"},"duration_months":{"type":"integer","title":"Duration Months"},"perks":{"items":{},"type":"array","title":"Perks"},"active":{"type":"boolean","title":"Active"},"display_order":{"type":"integer","title":"Display Order"}},"type":"object","required":["id","association_id","tier","name","description","amount","currency","duration_months","perks","active","display_order"],"title":"AffiliationPriceRead","description":"One priced tier an association offers.\n\n`amount` is grosz. `perks` is a free-form JSON column — `p.perks or []` — so\nList[Any] is the accurate type, not a shrug: the platform must not describe\na perk schema it does not enforce, and insurance in particular may only ever\nbe descriptive text and a partner link.\n\n`duration_months` drives the affiliation window; 12 by default."},"AffiliationRead":{"properties":{"id":{"type":"string","title":"Id"},"person_id":{"type":"string","title":"Person Id"},"person_name":{"type":"string","title":"Person Name"},"target_type":{"type":"string","title":"Target Type"},"target_id":{"type":"string","title":"Target Id"},"target_name":{"type":"string","title":"Target Name"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"status":{"type":"string","title":"Status"},"state":{"type":"string","title":"State"},"valid_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Valid From"},"valid_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Valid To"}},"type":"object","required":["id","person_id","person_name","target_type","target_id","target_name","tier","status","state","valid_from","valid_to"],"title":"AffiliationRead","description":"A person's paid relationship with an association.\n\nNOT membership and NOT a vote — those stay with OrganisationPerson. `state`\nis derived at read time from the window and the status; `status` is what is\nstored. A renewal is a NEW row, never an edit of this one.\n\n`target_type` has exactly one permitted value today, \"association\"."},"AffiliationStatusPayload":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"AffiliationStatusPayload"},"AgendaItemCreate":{"properties":{"text":{"type":"string","title":"Text"},"resolution_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Resolution Id"},"link_target":{"anyOf":[{"type":"string","const":"PARTICIPANTS"},{"type":"null"}],"title":"Link Target"}},"type":"object","required":["text"],"title":"AgendaItemCreate"},"AgendaItemUpdate":{"properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"resolution_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Resolution Id"},"link_target":{"anyOf":[{"type":"string","const":"PARTICIPANTS"},{"type":"null"}],"title":"Link Target"}},"type":"object","title":"AgendaItemUpdate","description":"The point's text, the resolution it links to, and the part of the meeting\nit is about.\n\nBoth links use the sentinel: present in the payload (even as null) means\nchange it, so sending null unlinks. Absent leaves the link alone."},"AgendaReorder":{"properties":{"item_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Item Ids"}},"type":"object","required":["item_ids"],"title":"AgendaReorder"},"AiUsageOrganisationRead":{"properties":{"organisation_id":{"type":"string","title":"Organisation Id"},"name":{"type":"string","title":"Name"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"sources":{"items":{},"type":"array","title":"Sources"},"limit_units":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit Units"},"used_units":{"type":"integer","title":"Used Units"},"used_raw_tokens":{"type":"integer","title":"Used Raw Tokens"},"remaining_units":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remaining Units"}},"type":"object","required":["organisation_id","name","tier","sources","limit_units","used_units","used_raw_tokens","remaining_units"],"title":"AiUsageOrganisationRead","description":"One organisation's row in the AI usage report. Written out rather than\nleft as `list[dict]`: this is the substance of the report, and a schema that\nsays \"a list of anything\" describes nothing.\n\n`limit_units` and `remaining_units` are optional because an organisation with\nno derived allowance has no limit, and the remaining count is meaningless\nwithout one. `tier` is None when no association qualification earned it."},"AiUsageReportRead":{"properties":{"month_start":{"type":"string","title":"Month Start"},"enforced":{"type":"boolean","title":"Enforced"},"organisations":{"items":{"$ref":"#/components/schemas/AiUsageOrganisationRead"},"type":"array","title":"Organisations"},"federation":{"type":"object","title":"Federation"},"totals":{"type":"object","title":"Totals"}},"type":"object","required":["month_start","enforced","organisations","federation","totals"],"title":"AiUsageReportRead","description":"`enforced` is AI_QUOTA_ENFORCED; `month_start` is an isoformat date."},"AnalyticsConsentPayload":{"properties":{"granted":{"type":"boolean","title":"Granted"}},"type":"object","required":["granted"],"title":"AnalyticsConsentPayload"},"AnalyticsConsentRead":{"properties":{"analytics_consent":{"type":"boolean","title":"Analytics Consent"}},"type":"object","required":["analytics_consent"],"title":"AnalyticsConsentRead","description":"The optional analytics opt-in on its own — never bundled into the\nmandatory acceptance, which would breach GDPR Art. 7(4)."},"AnalyticsOverviewRead":{"properties":{"available":{"type":"boolean","title":"Available"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"console_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Console Url"}},"type":"object","required":["available","reason","console_url"],"title":"AnalyticsOverviewRead","description":"Whether GA4 reporting is wired up, and where to look if it is not.\n\n`available` is false when the property is unconfigured or the service\naccount cannot read it; `reason` says which, and `console_url` is null\nunless there is somewhere useful to send an admin. Shape confirmed against\na real response."},"ApplyOne":{"properties":{"meeting_id":{"type":"string","format":"uuid","title":"Meeting Id"},"change":{"type":"object","title":"Change"}},"type":"object","required":["meeting_id","change"],"title":"ApplyOne","description":"One confirmed change. One per call on purpose — the user accepts them\nindividually, and a call carrying the batch would let a client apply what\nthey rejected."},"ArrangementItem":{"properties":{"kind":{"type":"string","enum":["participant","group"],"title":"Kind"},"id":{"type":"string","format":"uuid","title":"Id"},"member_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Member Ids","default":[]}},"type":"object","required":["kind","id"],"title":"ArrangementItem","description":"One row of the meeting's top level: either a participant who votes for\nthemselves, or a voting group with its members in order."},"AskMessage":{"properties":{"role":{"type":"string","title":"Role"},"text":{"type":"string","title":"Text"}},"type":"object","required":["role","text"],"title":"AskMessage"},"AskPayload":{"properties":{"question":{"type":"string","maxLength":1000,"minLength":1,"title":"Question"},"lang":{"type":"string","title":"Lang","default":"pl"},"history":{"items":{"$ref":"#/components/schemas/AskMessage"},"type":"array","maxItems":20,"title":"History"}},"type":"object","required":["question"],"title":"AskPayload"},"AskRead":{"properties":{"answer":{"type":"string","title":"Answer"}},"type":"object","required":["answer"],"title":"AskRead","description":"`answer_question` is annotated `-> str`."},"AssistantApplyRead":{"properties":{"applied":{"items":{"type":"object"},"type":"array","title":"Applied"},"failed":{"items":{"type":"object"},"type":"array","title":"Failed"},"resolutions":{"items":{"type":"object"},"type":"array","title":"Resolutions"}},"type":"object","required":["applied","failed","resolutions"],"title":"AssistantApplyRead","description":"The result of applying ONE confirmed change.\n\nOne per call, deliberately: a client cannot apply what the user rejected.\nApply re-resolves every change against the live rows, so a stale handle\nFAILS rather than landing on whatever row now holds it — `failed` is that\noutcome, not an error."},"AssistantAsk":{"properties":{"message":{"type":"string","maxLength":8000,"minLength":1,"title":"Message"},"meeting_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Meeting Id"}},"type":"object","required":["message"],"title":"AssistantAsk"},"AssistantAskedShapeRead":{"properties":{"shape":{"type":"string","title":"Shape"},"times":{"type":"integer","title":"Times"}},"type":"object","required":["shape","times"],"title":"AssistantAskedShapeRead","description":"A question shape and how often it was asked."},"AssistantInsightsRead":{"properties":{"asked":{"items":{"$ref":"#/components/schemas/AssistantAskedShapeRead"},"type":"array","title":"Asked"},"distinct_questions":{"type":"integer","title":"Distinct Questions"},"total_questions":{"type":"integer","title":"Total Questions"},"recipes":{"items":{"$ref":"#/components/schemas/AssistantRecipeRead"},"type":"array","title":"Recipes"}},"type":"object","required":["asked","distinct_questions","total_questions","recipes"],"title":"AssistantInsightsRead","description":"What the assistant has been asked, for tuning."},"AssistantJobRead":{"properties":{"status":{"type":"string","title":"Status"},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage"},"plan":{"anyOf":[{},{"type":"null"}],"title":"Plan"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["status","stage","plan"],"title":"AssistantJobRead","description":"Progress of a turn. `plan` is the proposal — an answer, or changes as\nbefore/after pairs. It is NOT applied: POST /assistant/apply writes one\nconfirmed change at a time, and that review is the safety mechanism rather\nthan a courtesy.\n\n`code` and `message` appear only on the FAILURE branch, where `status` is\nset to \"error\" — a failed turn is reported through this same 200 payload\nrather than an HTTP error, because the client is polling a job. They were\nmissed on the first pass and the CI gate found them, which is the whole\npoint of deriving keys from every return path rather than the happy one."},"AssistantJobStartedRead":{"properties":{"job_id":{"type":"string","title":"Job Id"}},"type":"object","required":["job_id"],"title":"AssistantJobStartedRead","description":"A message is answered on a job, not inline."},"AssistantMessageRead":{"properties":{"id":{"type":"string","title":"Id"},"role":{"type":"string","title":"Role"},"content":{"type":"string","title":"Content"},"payload":{"anyOf":[{},{"type":"null"}],"title":"Payload"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","role","content","payload","created_at"],"title":"AssistantMessageRead","description":"One turn of the persisted conversation. `payload` carries the structured\nplan for an assistant turn and is null on a user message."},"AssistantOptionsRead":{"properties":{"organisations":{"items":{"type":"object"},"type":"array","title":"Organisations"},"organisation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organisation Id"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"quota":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Quota"}},"type":"object","required":["organisations","organisation_id","model","quota"],"title":"AssistantOptionsRead","description":"What the assistant can be pointed at, answered in ONE request because an\nempty `organisations` is what hides the launcher entirely — an assistant\nthat opens and then refuses every message is worse than none.\n\n`organisations` and `quota` come from the assistant service rather than a\nserialiser here, so they are typed as objects rather than named models:\nnothing in this repository can check a shape it does not build.\n\nWhich allowance is spent is the user's choice, from the organisations their\nperson ADMINS — belonging to a club is not authority to spend its budget,\nand a federation admin is not exempt."},"AssistantRecipeRead":{"properties":{"shape":{"type":"string","title":"Shape"},"reused":{"type":"integer","title":"Reused"},"route":{"items":{"type":"string"},"type":"array","title":"Route"}},"type":"object","required":["shape","reused","route"],"title":"AssistantRecipeRead","description":"A learned route: the shape, how often it was reused, and the API path\nsequence that answered it."},"AssistantSettingsRead":{"properties":{"organisation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organisation Id"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"}},"type":"object","required":["organisation_id","model"],"title":"AssistantSettingsRead","description":"The remembered thread settings. A stored organisation id is not a\npermission — it is re-checked on every message."},"AssistantThreadRead":{"properties":{"messages":{"items":{"$ref":"#/components/schemas/AssistantMessageRead"},"type":"array","title":"Messages"}},"type":"object","required":["messages"],"title":"AssistantThreadRead","description":"The whole rolling thread. Only its tail is ever sent to the model —\nthe rest is history for the person, since every turn re-sends everything."},"AttachmentCreate":{"properties":{"file_url":{"type":"string","title":"File Url"},"file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Name"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type"}},"type":"object","required":["file_url"],"title":"AttachmentCreate"},"AttachmentUploadUrl":{"properties":{"filename":{"type":"string","title":"Filename"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["filename","content_type"],"title":"AttachmentUploadUrl"},"BoardSettingsUpdate":{"properties":{"organisation_id":{"type":"string","format":"uuid","title":"Organisation Id"},"public":{"type":"boolean","title":"Public"}},"type":"object","required":["organisation_id","public"],"title":"BoardSettingsUpdate"},"BodyCreate":{"properties":{"organisation_id":{"type":"string","format":"uuid","title":"Organisation Id"},"name":{"type":"string","title":"Name"},"body_type":{"type":"string","enum":["BOARD","COMMITTEE"],"title":"Body Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["organisation_id","name","body_type"],"title":"BodyCreate"},"BodyUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"body_type":{"anyOf":[{"type":"string","enum":["BOARD","COMMITTEE"]},{"type":"null"}],"title":"Body Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","title":"BodyUpdate"},"BracketGenerate":{"properties":{"overrides":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Overrides"},"randomize":{"type":"boolean","title":"Randomize","default":false},"confirm":{"type":"boolean","title":"Confirm","default":false}},"type":"object","title":"BracketGenerate","description":"Optional per-stage heat-size overrides applied for this generation (they\nare persisted onto the competition's heat_size_config so a later regenerate\nreuses them). `randomize` shuffles the startlist order for this generation so\na regenerate produces a different draw (used by the Regenerate action)."},"CheckoutPayload":{"properties":{"owner_type":{"type":"string","enum":["division","event"],"title":"Owner Type"},"owner_id":{"type":"string","format":"uuid","title":"Owner Id"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"email":{"type":"string","title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"}},"type":"object","required":["owner_type","owner_id","first_name","last_name","email"],"title":"CheckoutPayload"},"CompetitionCreate":{"properties":{"heat_size_config":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Heat Size Config"},"default_format":{"type":"string","title":"Default Format","default":"BRACKET"},"default_scoring":{"type":"string","title":"Default Scoring","default":"JUDGED"}},"type":"object","title":"CompetitionCreate"},"CompetitionDivisionRead":{"properties":{"id":{"type":"string","title":"Id"},"competition_id":{"type":"string","title":"Competition Id"},"name":{"type":"string","title":"Name"},"discipline_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discipline Code"},"discipline_name_pl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discipline Name Pl"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender"},"format":{"type":"string","title":"Format"},"scoring":{"type":"string","title":"Scoring"},"display_order":{"type":"integer","title":"Display Order"},"entry_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Entry Count"},"withdrawn_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Withdrawn Count"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","competition_id","name","discipline_code","discipline_name_pl","category","gender","format","scoring","display_order","entry_count","withdrawn_count","created_at","updated_at"],"title":"CompetitionDivisionRead","description":"One division of a competition.\n\n`entry_count` counts what is RACING and `withdrawn_count` what is not — the\ndivisions list counts the field rather than the startlist, so a withdrawal\nchanges the second number and not the first."},"CompetitionEntryRead":{"properties":{"id":{"type":"string","title":"Id"},"division_id":{"type":"string","title":"Division Id"},"person_id":{"type":"string","title":"Person Id"},"person":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Person"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"},"status":{"type":"string","title":"Status"}},"type":"object","required":["id","division_id","person_id","person","seed","status"],"title":"CompetitionEntryRead","description":"A person entered in a division.\n\n`person` is typed `dict` rather than a model: it arrives as a PARAMETER\n(`person_summary`) supplied by each caller, so neither the analyser nor the\nCI gate can tell which serialiser filled it. Naming an unverifiable shape is\nhow the national_teams member bug happened."},"CompetitionHeatEntryRead":{"properties":{"id":{"type":"string","title":"Id"},"heat_id":{"type":"string","title":"Heat Id"},"person_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Person Id"},"person":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Person"},"lane":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lane"},"status":{"type":"string","title":"Status"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"}},"type":"object","required":["id","heat_id","person_id","person","lane","status"],"title":"CompetitionHeatEntryRead","description":"A surfer in a heat. `lane` is the jersey colour position.\n\n`seed` is sent when an entry is UPDATED and not when one is added, so it is\noptional here rather than required — the two endpoints genuinely return\ndifferent key sets from the same row.\n\n`person` is a parameter-supplied dict, as everywhere else in this router."},"CompetitionOfficialRead":{"properties":{"id":{"type":"string","title":"Id"},"person_id":{"type":"string","title":"Person Id"},"person":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Person"},"is_head":{"type":"boolean","title":"Is Head"},"display_order":{"type":"integer","title":"Display Order"},"source":{"type":"string","title":"Source"}},"type":"object","required":["id","person_id","person","is_head","display_order","source"],"title":"CompetitionOfficialRead","description":"A judge or official. `source` says whether the assignment came from the\ncompetition or was overridden on the division, which is what lets the UI\nshow an inherited panel differently from an explicit one.\n\n`person` is a parameter-supplied dict, as on the entry above."},"CompetitionRead":{"properties":{"id":{"type":"string","title":"Id"},"event_id":{"type":"string","title":"Event Id"},"status":{"type":"string","title":"Status"},"status_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Description"},"default_format":{"type":"string","title":"Default Format"},"default_scoring":{"type":"string","title":"Default Scoring"},"heat_size_config":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Heat Size Config"},"division_count":{"type":"integer","title":"Division Count"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","event_id","status","status_description","default_format","default_scoring","heat_size_config","division_count","created_at","updated_at"],"title":"CompetitionRead","description":"A competition attached to an event. One per event.\n\n`heat_size_config` is a free-form JSON column and `status_description` is\nderived text for the status chip. `division_count` is counted at read time."},"CompetitionRoundRead":{"properties":{"id":{"type":"string","title":"Id"},"round_number":{"type":"integer","title":"Round Number"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"heat_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Heat Size"},"advance_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Advance Count"}},"type":"object","required":["id","round_number","name","heat_size","advance_count"],"title":"CompetitionRoundRead","description":"One round of a bracket. `advance_count` is how many surfers progress from\neach heat, and `heat_size` how many surf together — the pair that decides\nthe shape of the next round."},"CompetitionSponsorLinkRead":{"properties":{"id":{"type":"string","title":"Id"},"organisation_id":{"type":"string","title":"Organisation Id"},"name":{"type":"string","title":"Name"},"url":{"type":"string","title":"Url"},"logo_url":{"type":"string","title":"Logo Url"},"is_public":{"type":"boolean","title":"Is Public"},"display_order":{"type":"integer","title":"Display Order"},"sponsor_id":{"type":"string","title":"Sponsor Id"}},"type":"object","required":["id","organisation_id","name","url","logo_url","is_public","display_order","sponsor_id"],"title":"CompetitionSponsorLinkRead","description":"A sponsor as it appears on a COMPETITION. Same fields as SponsorRead plus\n`sponsor_id`, which the reorder endpoint echoes back — the link row and the\nsponsor are different objects and only this endpoint exposes both ids."},"CompetitionUpdate":{"properties":{"heat_size_config":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Heat Size Config"},"default_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Format"},"default_scoring":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Scoring"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"status_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Description"}},"type":"object","title":"CompetitionUpdate"},"ConfirmPayload":{"properties":{"person_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Person Id"}},"type":"object","title":"ConfirmPayload"},"ConsentEventRead":{"properties":{"id":{"type":"string","title":"Id"},"consent_type":{"type":"string","title":"Consent Type"},"granted":{"type":"boolean","title":"Granted"},"policy_version":{"type":"string","title":"Policy Version"},"source":{"type":"string","title":"Source"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","consent_type","granted","policy_version","source","created_at"],"title":"ConsentEventRead","description":"One append-only consent record. Never mutated: a withdrawal is a new row\nwith granted=False."},"ConsentPayload":{"properties":{"analytics":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Analytics"}},"type":"object","title":"ConsentPayload"},"ConsentStateRead":{"properties":{"needs_consent":{"type":"boolean","title":"Needs Consent"},"analytics_consent":{"type":"boolean","title":"Analytics Consent"}},"type":"object","required":["needs_consent","analytics_consent"],"title":"ConsentStateRead","description":"Consent after accepting the Terms/Privacy gate."},"DashboardRead":{"properties":{"persons":{"type":"object","title":"Persons"},"organisations":{"type":"object","title":"Organisations"},"qualifications":{"type":"object","title":"Qualifications"},"events":{"type":"object","title":"Events"},"governance":{"type":"object","title":"Governance"},"nationalTeams":{"type":"object","title":"Nationalteams"}},"type":"object","required":["persons","organisations","qualifications","events","governance","nationalTeams"],"title":"DashboardRead","description":"Six independent count blocks, each its own shape. Left as `dict` rather\nthan six nested models: the dashboard is a display projection that changes\nwhenever a tile is added, so pinning each block would mean editing a model\nfor every tile without a consumer that benefits — nothing reads these\nbeyond drawing the card that owns them."},"DisciplineRead":{"properties":{"code":{"type":"string","title":"Code"},"parent_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Code"},"display_order":{"type":"integer","title":"Display Order"},"name_pl":{"type":"string","title":"Name Pl"}},"type":"object","required":["code","parent_code","display_order","name_pl"],"title":"DisciplineRead","description":"Types follow the disciplines table: code and parent_code are String(50),\nparent_code nullable (a root discipline has none), display_order Integer."},"DisciplineTagPayload":{"properties":{"discipline_code":{"type":"string","title":"Discipline Code"}},"type":"object","required":["discipline_code"],"title":"DisciplineTagPayload"},"DivisionCreate":{"properties":{"discipline_code":{"type":"string","title":"Discipline Code"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"scoring":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scoring"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","required":["discipline_code"],"title":"DivisionCreate"},"DivisionEntryCreate":{"properties":{"person_id":{"type":"string","format":"uuid","title":"Person Id"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"}},"type":"object","required":["person_id"],"title":"DivisionEntryCreate"},"DivisionEntryUpdate":{"properties":{"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"DivisionEntryUpdate"},"DivisionUpdate":{"properties":{"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"scoring":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scoring"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"display_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Display Order"}},"type":"object","title":"DivisionUpdate"},"DocumentAttach":{"properties":{"document_id":{"type":"string","format":"uuid","title":"Document Id"}},"type":"object","required":["document_id"],"title":"DocumentAttach"},"DocumentPayload":{"properties":{"organisation_id":{"type":"string","format":"uuid","title":"Organisation Id"},"title":{"type":"string","title":"Title"},"doc_type":{"type":"string","enum":["RESOLUTION","MEETING_MINUTES","OTHER"],"title":"Doc Type"},"doc_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Doc Date"},"file_url":{"type":"string","title":"File Url"},"file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Name"}},"type":"object","required":["organisation_id","title","doc_type","file_url"],"title":"DocumentPayload"},"DocumentRead":{"properties":{"id":{"type":"string","title":"Id"},"organisation_id":{"type":"string","title":"Organisation Id"},"title":{"type":"string","title":"Title"},"doc_type":{"type":"string","title":"Doc Type"},"doc_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Date"},"file_url":{"type":"string","title":"File Url"},"file_name":{"type":"string","title":"File Name"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","organisation_id","title","doc_type","doc_date","file_url","file_name","created_at"],"title":"DocumentRead","description":"The admin view of a document."},"DocumentTextRead":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"doc_type":{"type":"string","title":"Doc Type"},"text":{"type":"string","title":"Text"},"has_text":{"type":"boolean","title":"Has Text"}},"type":"object","required":["id","title","doc_type","text","has_text"],"title":"DocumentTextRead","description":"Extracted text, filled at upload so the assistant reads the text rather\nthan the PDF. `has_text` distinguishes an empty extraction from a document\nthat has not been processed."},"DocumentUpdatePayload":{"properties":{"title":{"type":"string","title":"Title"},"doc_type":{"type":"string","enum":["RESOLUTION","MEETING_MINUTES","OTHER"],"title":"Doc Type"},"doc_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Doc Date"}},"type":"object","required":["title","doc_type"],"title":"DocumentUpdatePayload","description":"Metadata-only update — the underlying PDF is not changed here."},"DocumentUploadUrlRead":{"properties":{"upload_url":{"type":"string","title":"Upload Url"},"public_url":{"type":"string","title":"Public Url"}},"type":"object","required":["upload_url","public_url"],"title":"DocumentUploadUrlRead","description":"A signed PUT target and the URL the file will have. The upload does not\npass through this API."},"Envelope_AccountRead_":{"properties":{"data":{"$ref":"#/components/schemas/AccountRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[AccountRead]"},"Envelope_AffiliationCheckoutRead_":{"properties":{"data":{"$ref":"#/components/schemas/AffiliationCheckoutRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[AffiliationCheckoutRead]"},"Envelope_AffiliationPriceRead_":{"properties":{"data":{"$ref":"#/components/schemas/AffiliationPriceRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[AffiliationPriceRead]"},"Envelope_AffiliationRead_":{"properties":{"data":{"$ref":"#/components/schemas/AffiliationRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[AffiliationRead]"},"Envelope_AiUsageReportRead_":{"properties":{"data":{"$ref":"#/components/schemas/AiUsageReportRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[AiUsageReportRead]"},"Envelope_AnalyticsConsentRead_":{"properties":{"data":{"$ref":"#/components/schemas/AnalyticsConsentRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[AnalyticsConsentRead]"},"Envelope_AnalyticsOverviewRead_":{"properties":{"data":{"$ref":"#/components/schemas/AnalyticsOverviewRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[AnalyticsOverviewRead]"},"Envelope_AskRead_":{"properties":{"data":{"$ref":"#/components/schemas/AskRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[AskRead]"},"Envelope_AssistantApplyRead_":{"properties":{"data":{"$ref":"#/components/schemas/AssistantApplyRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[AssistantApplyRead]"},"Envelope_AssistantInsightsRead_":{"properties":{"data":{"$ref":"#/components/schemas/AssistantInsightsRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[AssistantInsightsRead]"},"Envelope_AssistantJobRead_":{"properties":{"data":{"$ref":"#/components/schemas/AssistantJobRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[AssistantJobRead]"},"Envelope_AssistantJobStartedRead_":{"properties":{"data":{"$ref":"#/components/schemas/AssistantJobStartedRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[AssistantJobStartedRead]"},"Envelope_AssistantOptionsRead_":{"properties":{"data":{"$ref":"#/components/schemas/AssistantOptionsRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[AssistantOptionsRead]"},"Envelope_AssistantSettingsRead_":{"properties":{"data":{"$ref":"#/components/schemas/AssistantSettingsRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[AssistantSettingsRead]"},"Envelope_AssistantThreadRead_":{"properties":{"data":{"$ref":"#/components/schemas/AssistantThreadRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[AssistantThreadRead]"},"Envelope_CompetitionDivisionRead_":{"properties":{"data":{"$ref":"#/components/schemas/CompetitionDivisionRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[CompetitionDivisionRead]"},"Envelope_CompetitionEntryRead_":{"properties":{"data":{"$ref":"#/components/schemas/CompetitionEntryRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[CompetitionEntryRead]"},"Envelope_CompetitionHeatEntryRead_":{"properties":{"data":{"$ref":"#/components/schemas/CompetitionHeatEntryRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[CompetitionHeatEntryRead]"},"Envelope_CompetitionOfficialRead_":{"properties":{"data":{"$ref":"#/components/schemas/CompetitionOfficialRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[CompetitionOfficialRead]"},"Envelope_CompetitionRead_":{"properties":{"data":{"$ref":"#/components/schemas/CompetitionRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[CompetitionRead]"},"Envelope_CompetitionRoundRead_":{"properties":{"data":{"$ref":"#/components/schemas/CompetitionRoundRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[CompetitionRoundRead]"},"Envelope_CompetitionSponsorLinkRead_":{"properties":{"data":{"$ref":"#/components/schemas/CompetitionSponsorLinkRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[CompetitionSponsorLinkRead]"},"Envelope_ConsentStateRead_":{"properties":{"data":{"$ref":"#/components/schemas/ConsentStateRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[ConsentStateRead]"},"Envelope_DashboardRead_":{"properties":{"data":{"$ref":"#/components/schemas/DashboardRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[DashboardRead]"},"Envelope_DocumentRead_":{"properties":{"data":{"$ref":"#/components/schemas/DocumentRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[DocumentRead]"},"Envelope_DocumentTextRead_":{"properties":{"data":{"$ref":"#/components/schemas/DocumentTextRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[DocumentTextRead]"},"Envelope_DocumentUploadUrlRead_":{"properties":{"data":{"$ref":"#/components/schemas/DocumentUploadUrlRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[DocumentUploadUrlRead]"},"Envelope_EventRead_":{"properties":{"data":{"$ref":"#/components/schemas/EventRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[EventRead]"},"Envelope_FederationAdminRead_":{"properties":{"data":{"$ref":"#/components/schemas/FederationAdminRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[FederationAdminRead]"},"Envelope_FederationSettingsRead_":{"properties":{"data":{"$ref":"#/components/schemas/FederationSettingsRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[FederationSettingsRead]"},"Envelope_GeocodePreviewRead_":{"properties":{"data":{"$ref":"#/components/schemas/GeocodePreviewRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[GeocodePreviewRead]"},"Envelope_GoogleWalletSaveRead_":{"properties":{"data":{"$ref":"#/components/schemas/GoogleWalletSaveRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[GoogleWalletSaveRead]"},"Envelope_GoogleWalletStatusRead_":{"properties":{"data":{"$ref":"#/components/schemas/GoogleWalletStatusRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[GoogleWalletStatusRead]"},"Envelope_GovernanceBodyRead_":{"properties":{"data":{"$ref":"#/components/schemas/GovernanceBodyRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[GovernanceBodyRead]"},"Envelope_GovernanceMembershipRead_":{"properties":{"data":{"$ref":"#/components/schemas/GovernanceMembershipRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[GovernanceMembershipRead]"},"Envelope_ImageRead_":{"properties":{"data":{"$ref":"#/components/schemas/ImageRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[ImageRead]"},"Envelope_ImageUploadUrlRead_":{"properties":{"data":{"$ref":"#/components/schemas/ImageUploadUrlRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[ImageUploadUrlRead]"},"Envelope_LibrarySearchRead_":{"properties":{"data":{"$ref":"#/components/schemas/LibrarySearchRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[LibrarySearchRead]"},"Envelope_List_AccountConsentRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/AccountConsentRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[AccountConsentRead]]"},"Envelope_List_AccountRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/AccountRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[AccountRead]]"},"Envelope_List_AffiliationPriceRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/AffiliationPriceRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[AffiliationPriceRead]]"},"Envelope_List_AffiliationRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/AffiliationRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[AffiliationRead]]"},"Envelope_List_CompetitionDivisionRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/CompetitionDivisionRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[CompetitionDivisionRead]]"},"Envelope_List_CompetitionEntryRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/CompetitionEntryRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[CompetitionEntryRead]]"},"Envelope_List_CompetitionOfficialRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/CompetitionOfficialRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[CompetitionOfficialRead]]"},"Envelope_List_ConsentEventRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ConsentEventRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[ConsentEventRead]]"},"Envelope_List_DisciplineRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/DisciplineRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[DisciplineRead]]"},"Envelope_List_DocumentRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/DocumentRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[DocumentRead]]"},"Envelope_List_EventRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/EventRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[EventRead]]"},"Envelope_List_FederationAdminRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/FederationAdminRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[FederationAdminRead]]"},"Envelope_List_GovernanceBodyRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/GovernanceBodyRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[GovernanceBodyRead]]"},"Envelope_List_GovernanceMembershipRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/GovernanceMembershipRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[GovernanceMembershipRead]]"},"Envelope_List_ImageRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ImageRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[ImageRead]]"},"Envelope_List_LinkableMinorRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/LinkableMinorRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[LinkableMinorRead]]"},"Envelope_List_LinkablePersonRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/LinkablePersonRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[LinkablePersonRead]]"},"Envelope_List_MeetingActionItemRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MeetingActionItemRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[MeetingActionItemRead]]"},"Envelope_List_MeetingAgendaItemRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MeetingAgendaItemRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[MeetingAgendaItemRead]]"},"Envelope_List_MeetingDocumentRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MeetingDocumentRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[MeetingDocumentRead]]"},"Envelope_List_MeetingImportableDocumentRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MeetingImportableDocumentRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[MeetingImportableDocumentRead]]"},"Envelope_List_MeetingNoteRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MeetingNoteRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[MeetingNoteRead]]"},"Envelope_List_MeetingParticipantCandidateRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MeetingParticipantCandidateRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[MeetingParticipantCandidateRead]]"},"Envelope_List_MeetingParticipantRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MeetingParticipantRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[MeetingParticipantRead]]"},"Envelope_List_MeetingRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MeetingRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[MeetingRead]]"},"Envelope_List_MeetingResolutionRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MeetingResolutionRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[MeetingResolutionRead]]"},"Envelope_List_MeetingVotingGroupRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MeetingVotingGroupRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[MeetingVotingGroupRead]]"},"Envelope_List_MeetingVotingRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MeetingVotingRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[MeetingVotingRead]]"},"Envelope_List_MinimalPersonRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MinimalPersonRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[MinimalPersonRead]]"},"Envelope_List_MyCredentialRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MyCredentialRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[MyCredentialRead]]"},"Envelope_List_MyEventRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MyEventRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[MyEventRead]]"},"Envelope_List_MyManagedPersonRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MyManagedPersonRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[MyManagedPersonRead]]"},"Envelope_List_MyOrganisationMemberRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MyOrganisationMemberRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[MyOrganisationMemberRead]]"},"Envelope_List_MyOrganisationSummaryRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MyOrganisationSummaryRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[MyOrganisationSummaryRead]]"},"Envelope_List_MyQualificationRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MyQualificationRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[MyQualificationRead]]"},"Envelope_List_NationalTeamListRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/NationalTeamListRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[NationalTeamListRead]]"},"Envelope_List_OrganisationDisciplineRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/OrganisationDisciplineRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[OrganisationDisciplineRead]]"},"Envelope_List_OrganisationPersonRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/OrganisationPersonRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[OrganisationPersonRead]]"},"Envelope_List_OrganisationRefRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/OrganisationRefRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[OrganisationRefRead]]"},"Envelope_List_PersonAccountRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PersonAccountRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[PersonAccountRead]]"},"Envelope_List_PersonConsentRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PersonConsentRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[PersonConsentRead]]"},"Envelope_List_PersonDisciplineRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PersonDisciplineRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[PersonDisciplineRead]]"},"Envelope_List_PersonPublicRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PersonPublicRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[PersonPublicRead]]"},"Envelope_List_PersonQualificationPublicRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PersonQualificationPublicRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[PersonQualificationPublicRead]]"},"Envelope_List_PublicAffiliate__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicAffiliate"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[PublicAffiliate]]"},"Envelope_List_PublicAssociationRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicAssociationRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[PublicAssociationRead]]"},"Envelope_List_PublicBodyRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicBodyRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[PublicBodyRead]]"},"Envelope_List_PublicDocumentRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicDocumentRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[PublicDocumentRead]]"},"Envelope_List_PublicDocument__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicDocument"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[PublicDocument]]"},"Envelope_List_PublicEvent__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicEvent"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[PublicEvent]]"},"Envelope_List_PublicGovernanceBody__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicGovernanceBody"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[PublicGovernanceBody]]"},"Envelope_List_PublicMeetingCardRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicMeetingCardRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[PublicMeetingCardRead]]"},"Envelope_List_PublicMeeting__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicMeeting"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[PublicMeeting]]"},"Envelope_List_PublicNationalTeam__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicNationalTeam"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[PublicNationalTeam]]"},"Envelope_List_PublicOrganisationSummary__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicOrganisationSummary"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[PublicOrganisationSummary]]"},"Envelope_List_PublicTask__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicTask"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[PublicTask]]"},"Envelope_List_QualificationPriceRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/QualificationPriceRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[QualificationPriceRead]]"},"Envelope_List_QualificationResponse__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/QualificationResponse"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[QualificationResponse]]"},"Envelope_List_RegistrationPriceRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/RegistrationPriceRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[RegistrationPriceRead]]"},"Envelope_List_RegistrationRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/RegistrationRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[RegistrationRead]]"},"Envelope_List_SeasonRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SeasonRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[SeasonRead]]"},"Envelope_List_SocialRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SocialRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[SocialRead]]"},"Envelope_List_SponsorRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SponsorRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[SponsorRead]]"},"Envelope_List_TaskRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TaskRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[TaskRead]]"},"Envelope_List_TransactionRead__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TransactionRead"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[TransactionRead]]"},"Envelope_List_Union_OrganisationListAdminRead__OrganisationPublicRead___":{"properties":{"data":{"items":{"anyOf":[{"$ref":"#/components/schemas/OrganisationListAdminRead"},{"$ref":"#/components/schemas/OrganisationPublicRead"}]},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[Union[OrganisationListAdminRead, OrganisationPublicRead]]]"},"Envelope_List_str__":{"properties":{"data":{"items":{"type":"string"},"type":"array","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[List[str]]"},"Envelope_MeetingActionItemRead_":{"properties":{"data":{"$ref":"#/components/schemas/MeetingActionItemRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[MeetingActionItemRead]"},"Envelope_MeetingAgendaItemRead_":{"properties":{"data":{"$ref":"#/components/schemas/MeetingAgendaItemRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[MeetingAgendaItemRead]"},"Envelope_MeetingDocumentRead_":{"properties":{"data":{"$ref":"#/components/schemas/MeetingDocumentRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[MeetingDocumentRead]"},"Envelope_MeetingGenerationStartedRead_":{"properties":{"data":{"$ref":"#/components/schemas/MeetingGenerationStartedRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[MeetingGenerationStartedRead]"},"Envelope_MeetingImportJobRead_":{"properties":{"data":{"$ref":"#/components/schemas/MeetingImportJobRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[MeetingImportJobRead]"},"Envelope_MeetingLiveStateRead_":{"properties":{"data":{"$ref":"#/components/schemas/MeetingLiveStateRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[MeetingLiveStateRead]"},"Envelope_MeetingMinutesSummaryRead_":{"properties":{"data":{"$ref":"#/components/schemas/MeetingMinutesSummaryRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[MeetingMinutesSummaryRead]"},"Envelope_MeetingNoteRead_":{"properties":{"data":{"$ref":"#/components/schemas/MeetingNoteRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[MeetingNoteRead]"},"Envelope_MeetingParticipantRead_":{"properties":{"data":{"$ref":"#/components/schemas/MeetingParticipantRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[MeetingParticipantRead]"},"Envelope_MeetingRead_":{"properties":{"data":{"$ref":"#/components/schemas/MeetingRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[MeetingRead]"},"Envelope_MeetingResolutionRead_":{"properties":{"data":{"$ref":"#/components/schemas/MeetingResolutionRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[MeetingResolutionRead]"},"Envelope_MeetingVotingGroupRead_":{"properties":{"data":{"$ref":"#/components/schemas/MeetingVotingGroupRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[MeetingVotingGroupRead]"},"Envelope_MeetingVotingRead_":{"properties":{"data":{"$ref":"#/components/schemas/MeetingVotingRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[MeetingVotingRead]"},"Envelope_MyAccessRead_":{"properties":{"data":{"$ref":"#/components/schemas/MyAccessRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[MyAccessRead]"},"Envelope_MyDisciplineTagRead_":{"properties":{"data":{"$ref":"#/components/schemas/MyDisciplineTagRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[MyDisciplineTagRead]"},"Envelope_MyEventRead_":{"properties":{"data":{"$ref":"#/components/schemas/MyEventRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[MyEventRead]"},"Envelope_MyManagedPersonRead_":{"properties":{"data":{"$ref":"#/components/schemas/MyManagedPersonRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[MyManagedPersonRead]"},"Envelope_MyOnboardingRead_":{"properties":{"data":{"$ref":"#/components/schemas/MyOnboardingRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[MyOnboardingRead]"},"Envelope_MyOrganisationMemberRead_":{"properties":{"data":{"$ref":"#/components/schemas/MyOrganisationMemberRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[MyOrganisationMemberRead]"},"Envelope_MyOrganisationRead_":{"properties":{"data":{"$ref":"#/components/schemas/MyOrganisationRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[MyOrganisationRead]"},"Envelope_MyProfileRead_":{"properties":{"data":{"$ref":"#/components/schemas/MyProfileRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[MyProfileRead]"},"Envelope_MyPublicationConsentRead_":{"properties":{"data":{"$ref":"#/components/schemas/MyPublicationConsentRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[MyPublicationConsentRead]"},"Envelope_MyQualificationCheckoutRead_":{"properties":{"data":{"$ref":"#/components/schemas/MyQualificationCheckoutRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[MyQualificationCheckoutRead]"},"Envelope_NationalTeamMemberRead_":{"properties":{"data":{"$ref":"#/components/schemas/NationalTeamMemberRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[NationalTeamMemberRead]"},"Envelope_NationalTeamRead_":{"properties":{"data":{"$ref":"#/components/schemas/NationalTeamRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[NationalTeamRead]"},"Envelope_NextResolutionNumberRead_":{"properties":{"data":{"$ref":"#/components/schemas/NextResolutionNumberRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[NextResolutionNumberRead]"},"Envelope_NoneType_":{"properties":{"data":{"type":"null","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[NoneType]"},"Envelope_OrganisationAiOptionsRead_":{"properties":{"data":{"$ref":"#/components/schemas/OrganisationAiOptionsRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[OrganisationAiOptionsRead]"},"Envelope_OrganisationDetailRead_":{"properties":{"data":{"$ref":"#/components/schemas/OrganisationDetailRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[OrganisationDetailRead]"},"Envelope_OrganisationDisciplineRead_":{"properties":{"data":{"$ref":"#/components/schemas/OrganisationDisciplineRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[OrganisationDisciplineRead]"},"Envelope_OrganisationPersonRead_":{"properties":{"data":{"$ref":"#/components/schemas/OrganisationPersonRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[OrganisationPersonRead]"},"Envelope_OrganisationRead_":{"properties":{"data":{"$ref":"#/components/schemas/OrganisationRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[OrganisationRead]"},"Envelope_PendingRegistrationRead_":{"properties":{"data":{"$ref":"#/components/schemas/PendingRegistrationRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[PendingRegistrationRead]"},"Envelope_PersonDeletionPreviewRead_":{"properties":{"data":{"$ref":"#/components/schemas/PersonDeletionPreviewRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[PersonDeletionPreviewRead]"},"Envelope_PersonDisciplineRead_":{"properties":{"data":{"$ref":"#/components/schemas/PersonDisciplineRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[PersonDisciplineRead]"},"Envelope_PersonPublicRead_":{"properties":{"data":{"$ref":"#/components/schemas/PersonPublicRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[PersonPublicRead]"},"Envelope_PersonRead_":{"properties":{"data":{"$ref":"#/components/schemas/PersonRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[PersonRead]"},"Envelope_PublicMeetingRead_":{"properties":{"data":{"$ref":"#/components/schemas/PublicMeetingRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[PublicMeetingRead]"},"Envelope_PublicOrganisationDetail_":{"properties":{"data":{"$ref":"#/components/schemas/PublicOrganisationDetail"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[PublicOrganisationDetail]"},"Envelope_PublicRegistrationPricesRead_":{"properties":{"data":{"$ref":"#/components/schemas/PublicRegistrationPricesRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[PublicRegistrationPricesRead]"},"Envelope_PublicStatute_":{"properties":{"data":{"$ref":"#/components/schemas/PublicStatute"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[PublicStatute]"},"Envelope_QualificationPriceRead_":{"properties":{"data":{"$ref":"#/components/schemas/QualificationPriceRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[QualificationPriceRead]"},"Envelope_QualificationResponse_":{"properties":{"data":{"$ref":"#/components/schemas/QualificationResponse"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[QualificationResponse]"},"Envelope_RegistrationCheckoutRead_":{"properties":{"data":{"$ref":"#/components/schemas/RegistrationCheckoutRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[RegistrationCheckoutRead]"},"Envelope_RegistrationPriceRead_":{"properties":{"data":{"$ref":"#/components/schemas/RegistrationPriceRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[RegistrationPriceRead]"},"Envelope_RegistrationRead_":{"properties":{"data":{"$ref":"#/components/schemas/RegistrationRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[RegistrationRead]"},"Envelope_SeasonRead_":{"properties":{"data":{"$ref":"#/components/schemas/SeasonRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[SeasonRead]"},"Envelope_SessionRead_":{"properties":{"data":{"$ref":"#/components/schemas/SessionRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[SessionRead]"},"Envelope_SocialRead_":{"properties":{"data":{"$ref":"#/components/schemas/SocialRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[SocialRead]"},"Envelope_SponsorRead_":{"properties":{"data":{"$ref":"#/components/schemas/SponsorRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[SponsorRead]"},"Envelope_StatuteDiffRead_":{"properties":{"data":{"$ref":"#/components/schemas/StatuteDiffRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[StatuteDiffRead]"},"Envelope_StatuteImportJobRead_":{"properties":{"data":{"$ref":"#/components/schemas/StatuteImportJobRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[StatuteImportJobRead]"},"Envelope_StatuteImportJobStartedRead_":{"properties":{"data":{"$ref":"#/components/schemas/StatuteImportJobStartedRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[StatuteImportJobStartedRead]"},"Envelope_StatuteRead_":{"properties":{"data":{"$ref":"#/components/schemas/StatuteRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[StatuteRead]"},"Envelope_StatuteVersionRead_":{"properties":{"data":{"$ref":"#/components/schemas/StatuteVersionRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[StatuteVersionRead]"},"Envelope_TaskAttachmentRead_":{"properties":{"data":{"$ref":"#/components/schemas/TaskAttachmentRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[TaskAttachmentRead]"},"Envelope_TaskAttachmentUploadUrlRead_":{"properties":{"data":{"$ref":"#/components/schemas/TaskAttachmentUploadUrlRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[TaskAttachmentUploadUrlRead]"},"Envelope_TaskBoardSettingsRead_":{"properties":{"data":{"$ref":"#/components/schemas/TaskBoardSettingsRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[TaskBoardSettingsRead]"},"Envelope_TaskRead_":{"properties":{"data":{"$ref":"#/components/schemas/TaskRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[TaskRead]"},"Envelope_TaskSummaryRead_":{"properties":{"data":{"$ref":"#/components/schemas/TaskSummaryRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[TaskSummaryRead]"},"Envelope_TransactionRead_":{"properties":{"data":{"$ref":"#/components/schemas/TransactionRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[TransactionRead]"},"Envelope_TransactionSummaryRead_":{"properties":{"data":{"$ref":"#/components/schemas/TransactionSummaryRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[TransactionSummaryRead]"},"Envelope_Union_FeaturedConfigRead__NoneType__":{"properties":{"data":{"anyOf":[{"$ref":"#/components/schemas/FeaturedConfigRead"},{"type":"null"}]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[Union[FeaturedConfigRead, NoneType]]"},"Envelope_Union_FeaturedSpotlightRead__NoneType__":{"properties":{"data":{"anyOf":[{"$ref":"#/components/schemas/FeaturedSpotlightRead"},{"type":"null"}]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[Union[FeaturedSpotlightRead, NoneType]]"},"Envelope_VerificationRead_":{"properties":{"data":{"$ref":"#/components/schemas/VerificationRead"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"type":"object","title":"Meta","default":{}}},"type":"object","required":["data"],"title":"Envelope[VerificationRead]"},"EventCreate":{"properties":{"event_type":{"type":"string","title":"Event Type"},"organiser_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organiser Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"start_time":{"type":"string","format":"date-time","title":"Start Time"},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time"},"all_day":{"type":"boolean","title":"All Day","default":false},"location_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Name"},"location_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Address"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"price_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Amount"},"price_currency":{"type":"string","title":"Price Currency","default":"pln"},"external_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Url"},"registration_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registration Url"},"forecast_enabled":{"type":"boolean","title":"Forecast Enabled","default":false},"forecast_location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Forecast Location"},"forecast_mode":{"type":"string","title":"Forecast Mode","default":"AUTO"}},"type":"object","required":["event_type","name","start_time"],"title":"EventCreate"},"EventRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"status":{"type":"string","title":"Status","default":"DRAFT"},"event_type":{"type":"string","title":"Event Type"},"organiser_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organiser Id"},"organiser_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organiser Name"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"image_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Image Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"start_time":{"type":"string","format":"date-time","title":"Start Time"},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time"},"all_day":{"type":"boolean","title":"All Day","default":false},"location_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Name"},"location_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Address"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"price_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Amount"},"price_currency":{"type":"string","title":"Price Currency"},"external_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Url"},"registration_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registration Url"},"forecast_enabled":{"type":"boolean","title":"Forecast Enabled","default":false},"forecast_location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Forecast Location"},"forecast_latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Forecast Latitude"},"forecast_longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Forecast Longitude"},"forecast_mode":{"type":"string","title":"Forecast Mode","default":"AUTO"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","event_type","name","start_time","price_currency"],"title":"EventRead"},"EventUpdate":{"properties":{"event_type":{"type":"string","title":"Event Type"},"organiser_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organiser Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"start_time":{"type":"string","format":"date-time","title":"Start Time"},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time"},"all_day":{"type":"boolean","title":"All Day","default":false},"location_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Name"},"location_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Address"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"price_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Amount"},"price_currency":{"type":"string","title":"Price Currency","default":"pln"},"external_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Url"},"registration_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registration Url"},"forecast_enabled":{"type":"boolean","title":"Forecast Enabled","default":false},"forecast_location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Forecast Location"},"forecast_mode":{"type":"string","title":"Forecast Mode","default":"AUTO"}},"type":"object","required":["event_type","name","start_time"],"title":"EventUpdate"},"FeaturedConfigRead":{"properties":{"entity_type":{"type":"string","title":"Entity Type"},"entity_id":{"type":"string","title":"Entity Id"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"}},"type":"object","required":["entity_type","entity_id","image_url","title","content"],"title":"FeaturedConfigRead","description":"What an admin STORED, before resolution. Null when none is set."},"FeaturedPayload":{"properties":{"entity_type":{"type":"string","title":"Entity Type","default":"event"},"entity_id":{"type":"string","format":"uuid","title":"Entity Id"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"}},"type":"object","required":["entity_id"],"title":"FeaturedPayload"},"FeaturedSpotlightRead":{"properties":{"entity_type":{"type":"string","title":"Entity Type"},"entity_id":{"type":"string","title":"Entity Id"},"event_type":{"type":"string","title":"Event Type"},"link":{"type":"string","title":"Link"},"title":{"type":"string","title":"Title"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"}},"type":"object","required":["entity_type","entity_id","event_type","link","title","image_url"],"title":"FeaturedSpotlightRead","description":"The RESOLVED spotlight the home page draws — not the stored config.\nNull when nothing is set, or when the linked entity is not publicly\nvisible, which is why the payload is Optional rather than a 404."},"FederationAdminRead":{"properties":{"account_id":{"type":"string","title":"Account Id"},"email":{"type":"string","title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"granted_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Granted At"},"granted_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Granted By"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"is_self":{"type":"boolean","title":"Is Self"}},"type":"object","required":["account_id","email","name","granted_at","granted_by","note","is_self"],"title":"FederationAdminRead","description":"One account holding federation.admin.\n\n`name` is None when the account is not linked to a Person, `granted_by` when\nthe grant predates recording who made it, and `is_self` is what the UI uses\nto refuse revoking your own admin (409 cannot_revoke_self)."},"FederationSettingsPayload":{"properties":{"main_association_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Main Association Id"}},"type":"object","title":"FederationSettingsPayload"},"FederationSettingsRead":{"properties":{"main_association_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Main Association Id"},"main_association":{"anyOf":[{"$ref":"#/components/schemas/OrganisationRefRead"},{"type":"null"}]}},"type":"object","required":["main_association_id","main_association"],"title":"FederationSettingsRead","description":"`main_association` is None until an admin designates one, so both fields\nare optional together."},"GenerateFromDocument":{"properties":{"organisation_id":{"type":"string","format":"uuid","title":"Organisation Id"},"document_id":{"type":"string","format":"uuid","title":"Document Id"},"force":{"type":"boolean","title":"Force","default":false},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"}},"type":"object","required":["organisation_id","document_id"],"title":"GenerateFromDocument","description":"Build a meeting out of an already-uploaded minutes document.\n\nA document that already produced a meeting hands that meeting back rather\nthan importing twice (which also makes a timed-out request safe to retry).\n`force` is the user saying, from the UI, that they do want a second copy."},"GenerateFromPrompt":{"properties":{"organisation_id":{"type":"string","format":"uuid","title":"Organisation Id"},"prompt":{"type":"string","title":"Prompt"},"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"attachments":{"items":{"$ref":"#/components/schemas/PromptAttachment"},"type":"array","title":"Attachments","default":[]},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"}},"type":"object","required":["organisation_id","prompt","starts_at"],"title":"GenerateFromPrompt","description":"Draft a meeting from a description, with the association's statute as context.\n\n`starts_at` comes from the picker, never from the prompt: when a meeting\nhappens is a commitment someone is making, not something to infer from prose.\nEverything else on the meeting is drafted."},"GeocodePreviewRead":{"properties":{"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"}},"type":"object","required":["latitude","longitude"],"title":"GeocodePreviewRead","description":"Best-effort coordinates for a typed address, so the user can see the pin\nbefore saving. Both null when the address could not be geocoded — a failure\nhides the pin rather than blocking the save."},"GoogleWalletSaveRead":{"properties":{"save_url":{"type":"string","title":"Save Url"}},"type":"object","required":["save_url"],"title":"GoogleWalletSaveRead","description":"The signed \"add to Google Wallet\" link. The pass barcode points back at\nour own /verify/{id}, so a scan always reads current state from us rather\nthan the copy on the phone."},"GoogleWalletStatusRead":{"properties":{"configured":{"type":"boolean","title":"Configured"},"saved":{"type":"boolean","title":"Saved"}},"type":"object","required":["configured","saved"],"title":"GoogleWalletStatusRead","description":"`configured` is false when GOOGLE_WALLET_ISSUER_ID is unset — the issuer\naccount is created by hand in the Google console and cannot be provisioned\nfrom code, so the feature is simply off rather than broken."},"GovernanceBodyRead":{"properties":{"id":{"type":"string","title":"Id"},"organisation_id":{"type":"string","title":"Organisation Id"},"name":{"type":"string","title":"Name"},"body_type":{"type":"string","title":"Body Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"active_member_count":{"type":"integer","title":"Active Member Count"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","organisation_id","name","body_type","description","active_member_count","created_at","updated_at"],"title":"GovernanceBodyRead","description":"A body in the admin view. Owned by an association — an organisation\nholding an ASSOCIATION qualification — and names are unique per\nassociation. Carries counts rather than members; the memberships endpoints\nserve those."},"GovernanceMembershipRead":{"properties":{"id":{"type":"string","title":"Id"},"body_id":{"type":"string","title":"Body Id"},"person":{"$ref":"#/components/schemas/GovernancePersonRead"},"roles":{"items":{"type":"string"},"type":"array","title":"Roles"},"valid_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Valid From"},"valid_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Valid To"},"source_event_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Event Id"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","body_id","person","roles","valid_from","valid_to","source_event_id","notes","is_active","created_at","updated_at"],"title":"GovernanceMembershipRead","description":"A person's seat on a body over a validity window.\n\n`is_active` is derived from that window, not stored. `source_event_id`\npoints at the meeting that elected them, when there was one."},"GovernancePersonRead":{"properties":{"id":{"type":"string","title":"Id"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"}},"type":"object","required":["id","first_name","last_name","image_url"],"title":"GovernancePersonRead","description":"The person behind a governance seat. The SAME four fields in both the\npublic body listing and the admin membership — verified against\nGET /governance/public/bodies, whose members[0].person carried exactly\n{id, first_name, last_name, image_url}."},"GrantAdminPayload":{"properties":{"account_id":{"type":"string","format":"uuid","title":"Account Id"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["account_id"],"title":"GrantAdminPayload"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HeatEntryCreate":{"properties":{"person_id":{"type":"string","format":"uuid","title":"Person Id"},"lane":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lane"}},"type":"object","required":["person_id"],"title":"HeatEntryCreate"},"HeatEntryUpdate":{"properties":{"person_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Person Id"},"lane":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lane"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"}},"type":"object","title":"HeatEntryUpdate"},"HeatStatusUpdate":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"HeatStatusUpdate"},"ImageRead":{"properties":{"id":{"type":"string","title":"Id"},"entity_type":{"type":"string","title":"Entity Type"},"entity_id":{"type":"string","title":"Entity Id"},"url":{"type":"string","title":"Url"},"is_primary":{"type":"boolean","title":"Is Primary"},"uploaded_at":{"type":"string","title":"Uploaded At"}},"type":"object","required":["id","entity_type","entity_id","url","is_primary","uploaded_at"],"title":"ImageRead","description":"Types follow the images table. `uploaded_at` is a Date column sent as\nisoformat, so it is a str on the wire, not a date."},"ImageUploadUrlRead":{"properties":{"upload_url":{"type":"string","title":"Upload Url"},"public_url":{"type":"string","title":"Public Url"}},"type":"object","required":["upload_url","public_url"],"title":"ImageUploadUrlRead","description":"A signed PUT target and the public URL the object will have once the\nbrowser has uploaded to it. The upload does not go through this API."},"LibraryPassageRead":{"properties":{"score":{"type":"number","title":"Score"},"position":{"type":"integer","title":"Position"},"text":{"type":"string","title":"Text"},"kind":{"type":"string","title":"Kind"},"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"organisation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organisation"},"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"}},"type":"object","required":["score","position","text","kind","id","title"],"title":"LibraryPassageRead","description":"One ranked passage. `services/passages.rank` builds\n{score, position, text} and merges the caller's `source` dict over it, so\nthe source fields below are part of the same flat object.\n\n`doc_type` is documents-only — a statute source does not set it — and\n`organisation` is None when the owning organisation has no name resolved."},"LibrarySearchRead":{"properties":{"passages":{"items":{"$ref":"#/components/schemas/LibraryPassageRead"},"type":"array","title":"Passages"},"searched":{"type":"integer","title":"Searched"},"more":{"type":"boolean","title":"More","default":false},"nothing_matched":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Nothing Matched"},"outline":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Outline"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["passages","searched"],"title":"LibrarySearchRead","description":"The last three fields are injected only when nothing matched, which is why\nthey are optional rather than always present: the endpoint then returns the\ndocument outline instead of passages, so an answer can say what it read."},"LinkSponsorPayload":{"properties":{"sponsor_id":{"type":"string","format":"uuid","title":"Sponsor Id"}},"type":"object","required":["sponsor_id"],"title":"LinkSponsorPayload"},"LinkableMinorRead":{"properties":{"person_id":{"type":"string","title":"Person Id"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"date_of_birth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date Of Birth"}},"type":"object","required":["person_id","first_name","last_name","date_of_birth"],"title":"LinkableMinorRead","description":"A minor with no guardian yet, offered for linking."},"LinkablePersonRead":{"properties":{"person_id":{"type":"string","title":"Person Id"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"date_of_birth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date Of Birth"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","required":["person_id","first_name","last_name","date_of_birth","email"],"title":"LinkablePersonRead","description":"A person not yet claimed as anyone's SELF. Carries the email so an admin\ncan match it to the account being linked."},"LinkedPersonRead":{"properties":{"person_id":{"type":"string","title":"Person Id"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"date_of_birth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date Of Birth"},"relationship":{"type":"string","title":"Relationship"},"is_minor":{"type":"boolean","title":"Is Minor"}},"type":"object","required":["person_id","first_name","last_name","date_of_birth","relationship","is_minor"],"title":"LinkedPersonRead","description":"A person linked to an account. `relationship` is SELF or GUARDIAN — an\naccount has at most one SELF and any number of managed minors."},"ManagedCreatePayload":{"properties":{"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"date_of_birth":{"type":"string","format":"date","title":"Date Of Birth"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"}},"type":"object","required":["first_name","last_name","date_of_birth"],"title":"ManagedCreatePayload"},"ManagedLinkPayload":{"properties":{"person_id":{"type":"string","format":"uuid","title":"Person Id"}},"type":"object","required":["person_id"],"title":"ManagedLinkPayload"},"ManagedPersonCreate":{"properties":{"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"date_of_birth":{"type":"string","format":"date","title":"Date Of Birth"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"guardian_attestation":{"type":"boolean","title":"Guardian Attestation"},"publication_consent":{"type":"boolean","title":"Publication Consent","default":false}},"type":"object","required":["first_name","last_name","date_of_birth","guardian_attestation"],"title":"ManagedPersonCreate","description":"Register a managed minor under the caller's account (parent/guardian).\nDOB is required and must make the person under 18; the guardian attestation\nmust be affirmed. Publication is a separate, optional opt-in."},"ManagedPersonRead":{"properties":{"person_id":{"type":"string","title":"Person Id"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"date_of_birth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date Of Birth"},"is_minor":{"type":"boolean","title":"Is Minor"},"aging_out_on":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aging Out On"}},"type":"object","required":["person_id","first_name","last_name","date_of_birth","is_minor","aging_out_on"],"title":"ManagedPersonRead","description":"A minor this account manages. `aging_out_on` is the date the minor turns\nof age and the management link lapses — null when not applicable."},"MeetingActionItemRead":{"properties":{"id":{"type":"string","title":"Id"},"agenda_item_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agenda Item Id"},"description":{"type":"string","title":"Description"},"assignee_person_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignee Person Id"},"assignee_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignee Text"},"due_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due Date"},"due_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due Text"},"position":{"type":"integer","title":"Position"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"}},"type":"object","required":["id","agenda_item_id","description","assignee_person_id","assignee_text","due_date","due_text","position","task_id"],"title":"MeetingActionItemRead","description":"Something a meeting agreed needs doing.\n\n`assignee_text` is nullable on purpose: a meeting routinely agrees that\nsomething must happen before it agrees who does it, and an unowned task is\nrecorded unowned rather than given an invented owner. `task_id` links to the\ntask-market card when one was raised from it."},"MeetingAgendaItemRead":{"properties":{"id":{"type":"string","title":"Id"},"position":{"type":"integer","title":"Position"},"text":{"type":"string","title":"Text"},"link_target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link Target"},"resolution":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Resolution"}},"type":"object","required":["id","position","text","link_target","resolution"],"title":"MeetingAgendaItemRead","description":"One line on the agenda — the SPINE of a meeting. Notes, resolutions and\naction items cross-reference it by nullable agenda_item_id rather than\nhanging off it, so an item can be deleted without taking them with it.\n\n`resolution` is the uchwała written from this point, when one was."},"MeetingCreate":{"properties":{"organisation_id":{"type":"string","format":"uuid","title":"Organisation Id"},"title":{"type":"string","title":"Title"},"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"ends_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ends At"},"location_mode":{"anyOf":[{"type":"string","enum":["REMOTE","ONSITE"]},{"type":"null"}],"title":"Location Mode"},"meet_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meet Url"},"location_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Address"},"participant_person_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Participant Person Ids","default":[]},"document_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Document Ids","default":[]}},"type":"object","required":["organisation_id","title","starts_at"],"title":"MeetingCreate"},"MeetingDocumentRead":{"properties":{"id":{"type":"string","title":"Id"},"organisation_id":{"type":"string","title":"Organisation Id"},"title":{"type":"string","title":"Title"},"doc_type":{"type":"string","title":"Doc Type"},"doc_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Date"},"file_url":{"type":"string","title":"File Url"},"file_name":{"type":"string","title":"File Name"}},"type":"object","required":["id","organisation_id","title","doc_type","doc_date","file_url","file_name"],"title":"MeetingDocumentRead","description":"A document attached to a meeting."},"MeetingGenerationStartedRead":{"properties":{"job_id":{"type":"string","title":"Job Id"},"steps":{"items":{"type":"object"},"type":"array","title":"Steps"},"meeting":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Meeting"},"report":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Report"}},"type":"object","required":["job_id","steps"],"title":"MeetingGenerationStartedRead","description":"Both meeting-generation routes start a JOB rather than working inline —\nthe minutes import runs six passes and the statute-backed agenda draft takes\nseconds, either of which would sit near the 60s Hosting cap.\n\n`steps` is what the progress UI draws. `meeting` and `report` appear on the\ndocument route, which can finish quickly enough to return its result."},"MeetingImportJobRead":{"properties":{"status":{"type":"string","title":"Status"},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage"},"done":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Done"},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"meeting":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Meeting"},"report":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Report"}},"type":"object","required":["status","stage","done","total","message","meeting","report"],"title":"MeetingImportJobRead","description":"Progress of a meeting generation. `done`/`total` drive the bar, `stage`\nnames the current pass, and `meeting` is filled once there is one."},"MeetingImportableDocumentRead":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"doc_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Date"},"meeting_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meeting Id"}},"type":"object","required":["id","title","doc_date","meeting_id"],"title":"MeetingImportableDocumentRead","description":"A minutes document that can be turned into a meeting. `meeting_id` is set\nwhen one has already been created from it, which is what stops the same\nminutes being imported twice."},"MeetingLiveStateRead":{"properties":{"type":{"type":"string","title":"Type"},"seq":{"type":"integer","title":"Seq"},"meeting":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Meeting"},"votings":{"items":{"type":"object"},"type":"array","title":"Votings"},"present":{"items":{"type":"object"},"type":"array","title":"Present"},"me":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Me"},"my_voting_unit":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"My Voting Unit"},"participant_count":{"type":"integer","title":"Participant Count"},"voting_unit_count":{"type":"integer","title":"Voting Unit Count"},"events":{"anyOf":[{"items":{"type":"object"},"type":"array"},{"type":"null"}],"title":"Events"}},"type":"object","required":["type","seq","meeting","votings","present","me","my_voting_unit","participant_count","voting_unit_count"],"title":"MeetingLiveStateRead","description":"The live board's state, polled with ?since=<seq>.\n\n`seq` is the cursor: the client sends back the last one it saw and receives\nonly what happened after it. `type` distinguishes a full snapshot from a\ndelta.\n\n`meeting`, `votings`, `present`, `me` and `my_voting_unit` are typed as\nplain objects rather than models. They are assembled by the live layer\nrather than by a serialiser in this module, so nothing here can check their\nshape — and a live board is the last place to publish a guess, since a\nwrong ballot shape would misreport how a vote turned out."},"MeetingMinutesSummaryRead":{"properties":{"filename":{"type":"string","title":"Filename"},"quorum":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Quorum"},"counts":{"type":"object","title":"Counts"},"participants":{"items":{"type":"object"},"type":"array","title":"Participants"},"sections":{"items":{"type":"object"},"type":"array","title":"Sections"}},"type":"object","required":["filename","quorum","counts","participants","sections"],"title":"MeetingMinutesSummaryRead","description":"A preview of the .docx protokół before it is generated. `counts` and\n`sections` describe what the document will contain; `quorum` is answered\nfrom attendance at the time it is asked."},"MeetingNoteRead":{"properties":{"id":{"type":"string","title":"Id"},"agenda_item_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agenda Item Id"},"heading":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Heading"},"body_md":{"type":"string","title":"Body Md"},"position":{"type":"integer","title":"Position"}},"type":"object","required":["id","agenda_item_id","heading","body_md","position"],"title":"MeetingNoteRead","description":"The PROSE of what was said — the przebieg spotkania. Distinct from an\nagenda item, which is a line on the LIST of what a meeting covers."},"MeetingParticipantCandidateRead":{"properties":{"id":{"type":"string","title":"Id"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"organisations":{"items":{"type":"object"},"type":"array","title":"Organisations"}},"type":"object","required":["id","first_name","last_name","image_url","organisations"],"title":"MeetingParticipantCandidateRead","description":"Someone who could be invited. `organisations` is shown so the chair can\ntell two people of the same name apart."},"MeetingParticipantOrganisationRead":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"}},"type":"object","required":["id","name","logo_url"],"title":"MeetingParticipantOrganisationRead","description":"An organisation a participant belongs to, shown beside their name so the\nroom can see who is represented."},"MeetingParticipantPersonRead":{"properties":{"id":{"type":"string","title":"Id"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"organisations":{"items":{"$ref":"#/components/schemas/MeetingParticipantOrganisationRead"},"type":"array","title":"Organisations"}},"type":"object","required":["id","first_name","last_name","image_url","organisations"],"title":"MeetingParticipantPersonRead","description":"The person behind a seat, denormalised onto the participant row."},"MeetingParticipantRead":{"properties":{"id":{"type":"string","title":"Id"},"person":{"$ref":"#/components/schemas/MeetingParticipantPersonRead"},"roles":{"items":{"type":"string"},"type":"array","title":"Roles"},"attendance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attendance"},"display_order":{"type":"integer","title":"Display Order"},"voting_group":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Voting Group"}},"type":"object","required":["id","person","roles","attendance","display_order","voting_group"],"title":"MeetingParticipantRead","description":"Someone attending. `attendance` moves during a live meeting and is what\n`present_count` and the quorum answer are computed from.\n\n`voting_group` is the block this participant votes with, when they are in\none — a group typically stands for a member organisation."},"MeetingRead":{"properties":{"id":{"type":"string","title":"Id"},"organisation_id":{"type":"string","title":"Organisation Id"},"title":{"type":"string","title":"Title"},"status":{"type":"string","title":"Status"},"starts_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Starts At"},"ends_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ends At"},"location_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Mode"},"location_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Address"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"meet_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meet Url"},"quorum":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Quorum"},"participant_count":{"type":"integer","title":"Participant Count"},"present_count":{"type":"integer","title":"Present Count"},"document_count":{"type":"integer","title":"Document Count"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"can_edit":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Edit"},"can_vote":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Vote"},"can_administer":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Administer"}},"type":"object","required":["id","organisation_id","title","status","starts_at","ends_at","location_mode","location_address","latitude","longitude","meet_url","quorum","participant_count","present_count","document_count","created_at","updated_at"],"title":"MeetingRead","description":"A meeting in the admin and portal views.\n\n`participant_count` and `present_count` are counted at read time;\n`present_count` moves during a live meeting as people mark attendance.\n`quorum` is not a count — it is the meeting's own yes/no statement that it\nwas quorate, since what constitutes a quorum is the association's statute."},"MeetingResolutionRead":{"properties":{"id":{"type":"string","title":"Id"},"meeting_id":{"type":"string","title":"Meeting Id"},"agenda_item_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agenda Item Id"},"resolution_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Number"},"question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"adoption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Adoption"},"votings":{"items":{"type":"object"},"type":"array","title":"Votings"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","meeting_id","agenda_item_id","resolution_number","question","content","adoption","votings","created_at"],"title":"MeetingResolutionRead","description":"An uchwała — the record WRITTEN FROM a ballot, after the meeting.\n\nIt has no state and shows no vote: a resolution that exists is valid,\nbecause you write one up when a vote carried. The counts and options\nbelonged to the BALLOT, which `votings` links back to.\n\n`adoption` records HOW it passed when the minutes said so. `agenda_item_id`\nis nullable — an uchwała need not belong to an agenda point."},"MeetingUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"ends_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ends At"},"status":{"anyOf":[{"type":"string","enum":["PLANNED","LIVE","ENDED","CLOSED","CANCELLED"]},{"type":"null"}],"title":"Status"},"location_mode":{"anyOf":[{"type":"string","enum":["REMOTE","ONSITE"]},{"type":"null"}],"title":"Location Mode"},"meet_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meet Url"},"location_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Address"},"quorum":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Quorum"}},"type":"object","title":"MeetingUpdate","description":"All optional — inline field saves, like GovernanceBody."},"MeetingVotingGroupRead":{"properties":{"id":{"type":"string","title":"Id"},"organisation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organisation Id"},"name":{"type":"string","title":"Name"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"member_count":{"type":"integer","title":"Member Count"},"attendance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attendance"},"origin":{"type":"string","title":"Origin"},"display_order":{"type":"integer","title":"Display Order"}},"type":"object","required":["id","organisation_id","name","logo_url","member_count","attendance","origin","display_order"],"title":"MeetingVotingGroupRead","description":"A block of participants that votes together — typically a member\norganisation. `origin` says whether the group was derived automatically or\narranged by hand, and `attendance` is its aggregate state."},"MeetingVotingRead":{"properties":{"id":{"type":"string","title":"Id"},"meeting_id":{"type":"string","title":"Meeting Id"},"agenda_item_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agenda Item Id"},"kind":{"type":"string","title":"Kind"},"question":{"type":"string","title":"Question"},"options":{"items":{"type":"object"},"type":"array","title":"Options"},"is_multi":{"type":"boolean","title":"Is Multi"},"max_choices":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Choices"},"state":{"type":"string","title":"State"},"position":{"type":"integer","title":"Position"},"result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result"},"tally":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Tally"},"objections":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Objections"},"winners":{"anyOf":[{"items":{"type":"object"},"type":"array"},{"type":"null"}],"title":"Winners"},"winner_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Count"},"tied_at_cut":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Tied At Cut"},"total_voters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Voters"},"my_votes":{"anyOf":[{"items":{"type":"object"},"type":"array"},{"type":"null"}],"title":"My Votes"},"my_vote_cast_by":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"My Vote Cast By"},"recorded":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Recorded"},"resolution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Id"},"created_by_person_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Person Id"},"opened_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Opened At"},"closed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Closed At"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"can_edit":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Edit"},"can_vote":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Vote"},"meeting":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Meeting"},"my_voting_unit":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"My Voting Unit"}},"type":"object","required":["id","meeting_id","agenda_item_id","kind","question","options","is_multi","max_choices","state","position","result","tally","objections","winners","winner_count","tied_at_cut","total_voters","my_votes","my_vote_cast_by","recorded","resolution_id","created_by_person_id","opened_at","closed_at","created_at"],"title":"MeetingVotingRead","description":"A BALLOT — the question a meeting answers, not the uchwała written from\nit afterwards. The two are separate records on purpose: a meeting votes on\nwhatever it needs to, and only some of those votes are later written up.\n\n`kind` is VOTE or NO_OBJECTION, and they behave differently in a way a\nclient must respect:\n\n  a VOTE's split stays HIDDEN while it runs. `tally` fills in when it\n  closes.\n\n  a NO_OBJECTION is a statement read to the room, carried unless somebody\n  speaks up. Its `objections` are counted IN THE OPEN while it runs, because\n  objecting in a meeting is a public act and the chair must see it to\n  decide. There is no timer — somebody taps — and `result` carries the\n  chair's decision on close.\n\nA ballot that has left PENDING is LOCKED: never edited, never deleted.\n\n`tally`, `options`, `my_votes`, `winners`, `meeting` and `my_voting_unit`\nare typed as plain objects. They are assembled by the live layer rather\nthan a serialiser here, and a ballot is the one object in this domain where\npublishing a guessed shape could misreport how a vote turned out.\n\n`can_vote`, `meeting` and `my_voting_unit` appear only on the standalone\nballot page (`/v/{id}` behind the QR code the chair pastes into the chat),\nwhich is why they are optional: access there splits, and anyone who may\nREAD the meeting sees the ballot while only PARTICIPANTS may cast."},"MembershipCreate":{"properties":{"person_id":{"type":"string","format":"uuid","title":"Person Id"},"roles":{"items":{"type":"string"},"type":"array","title":"Roles","default":[]},"valid_from":{"type":"string","format":"date","title":"Valid From"},"valid_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Valid To"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["person_id","valid_from"],"title":"MembershipCreate"},"MembershipStatus":{"type":"string","enum":["active","INVITED","REQUESTED","REJECTED"],"title":"MembershipStatus","description":"Lifecycle of a Person's membership of an Organisation.\n\n`active` keeps its historic lowercase value: a dozen queries filter on it,\nand the pending/rejected states must simply not match those."},"MembershipUpdate":{"properties":{"roles":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Roles"},"valid_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Valid From"},"valid_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Valid To"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"MembershipUpdate"},"MinimalPersonRead":{"properties":{"id":{"type":"string","title":"Id"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"}},"type":"object","required":["id","first_name","last_name","image_url"],"title":"MinimalPersonRead","description":"Just enough to draw a person picker."},"MyAccessRead":{"properties":{"is_admin":{"type":"boolean","title":"Is Admin"},"affiliate_of":{"items":{"type":"string"},"type":"array","title":"Affiliate Of"},"capabilities":{"items":{"type":"string"},"type":"array","title":"Capabilities"}},"type":"object","required":["is_admin","affiliate_of","capabilities"],"title":"MyAccessRead","description":"What the signed-in account may do.\n\n`affiliate_of` is the associations this account is AFFILIATED with, which is\nnot membership and grants no vote — see app/permissions.py. `capabilities`\nis the qualification types held right now, derived rather than stored."},"MyCredentialRead":{"properties":{"id":{"type":"string","title":"Id"},"kind":{"type":"string","title":"Kind"},"holder_kind":{"type":"string","title":"Holder Kind"},"holder_id":{"type":"string","title":"Holder Id"},"holder_name":{"type":"string","title":"Holder Name"},"holder_photo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Holder Photo Url"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"tier_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier Name"},"status":{"type":"string","title":"Status"},"state":{"type":"string","title":"State"},"valid_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Valid From"},"valid_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Valid To"},"renewable":{"type":"boolean","title":"Renewable"},"perks":{"items":{},"type":"array","title":"Perks"}},"type":"object","required":["id","kind","holder_kind","holder_id","holder_name","holder_photo_url","type","title","tier","tier_name","status","state","valid_from","valid_to","renewable","perks"],"title":"MyCredentialRead","description":"The wallet: qualifications and affiliations in ONE shape, which is the\npoint — a member should not have to know which kind a card is to read it.\n\n`kind` is QUALIFICATION or AFFILIATION and is what to switch on. `type` is\nset only on a qualification, `title` only on an affiliation (the association\nit is with). `state` is derived at read time from the window and the status;\n`status` is what is stored.\n\nShape confirmed against a real response."},"MyDisciplineTagRead":{"properties":{"discipline_code":{"type":"string","title":"Discipline Code"}},"type":"object","required":["discipline_code"],"title":"MyDisciplineTagRead","description":"The tag just added. Explicit tagging only: a parent discipline code does\nnot imply its children."},"MyEventRead":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"event_type":{"type":"string","title":"Event Type"},"status":{"type":"string","title":"Status"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"organiser_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organiser Id"},"organiser_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organiser Name"},"start_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Time"},"end_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Time"},"all_day":{"type":"boolean","title":"All Day"},"location_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Name"},"location_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Address"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"price_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Amount"},"price_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price Currency"},"external_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Url"},"registration_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registration Url"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"image_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Id"},"forecast_enabled":{"type":"boolean","title":"Forecast Enabled"},"forecast_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Forecast Mode"},"forecast_location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Forecast Location"},"forecast_latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Forecast Latitude"},"forecast_longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Forecast Longitude"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name","event_type","status","description","organiser_id","organiser_name","start_time","end_time","all_day","location_name","location_address","latitude","longitude","price_amount","price_currency","external_url","registration_url","image_url","image_id","forecast_enabled","forecast_mode","forecast_location","forecast_latitude","forecast_longitude","created_at","updated_at"],"title":"MyEventRead","description":"An event this person organises, in the portal.\n\nThe forecast columns are all optional together: a forecast is opt-in per\nevent, `forecast_mode` AUTO drops the swell block inland, and\n`forecast_location` overrides the event's own coordinates when the surf\nspot is not where the registration desk is.\n\n`price_amount` is grosz. `organiser_name` is resolved for display; the id is\nthe link."},"MyManagedPersonRead":{"properties":{"person_id":{"type":"string","title":"Person Id"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"date_of_birth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date Of Birth"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"is_minor":{"type":"boolean","title":"Is Minor"},"turns_18_on":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Turns 18 On"},"aging_out_on":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aging Out On"},"publication_consent":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Publication Consent"}},"type":"object","required":["person_id","first_name","last_name","date_of_birth","email","phone","image_url","is_minor","turns_18_on","aging_out_on","publication_consent"],"title":"MyManagedPersonRead","description":"A minor this account manages, in the portal's own view.\n\n`turns_18_on` and `aging_out_on` are both here and are not duplicates: the\nfirst is the birthday, the second the date the management link actually\nlapses. `publication_consent` is a separate optional opt-in, never bundled\ninto the mandatory Terms acceptance."},"MyOnboardingRead":{"properties":{"dismissed":{"items":{"type":"string"},"type":"array","title":"Dismissed"}},"type":"object","required":["dismissed"],"title":"MyOnboardingRead","description":"Which onboarding steps this account has dismissed. The dashboard opens\nthe dialog once per sign-in until every step key is dismissed."},"MyOrganisationMemberRead":{"properties":{"id":{"type":"string","title":"Id"},"person_id":{"type":"string","title":"Person Id"},"person_name":{"type":"string","title":"Person Name"},"permission":{"type":"string","title":"Permission"},"roles":{"items":{"type":"string"},"type":"array","title":"Roles"},"joined_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Joined At"},"status":{"type":"string","title":"Status"}},"type":"object","required":["id","person_id","person_name","permission","roles","joined_at","status"],"title":"MyOrganisationMemberRead","description":"A membership row as the portal shows it.\n\n`permission` is MEMBER or ADMIN and is what decides authority; `roles` is\nwhat the person DOES in the club and grants nothing. `status` carries the\ninvitation/request lifecycle, which is why the accept and reject endpoints\nreturn this same shape rather than a bare acknowledgement."},"MyOrganisationRead":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","title":"Status"},"name":{"type":"string","title":"Name"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"addresses":{"items":{"type":"object"},"type":"array","title":"Addresses"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"types":{"items":{"type":"string"},"type":"array","title":"Types"},"type_status":{"type":"object","title":"Type Status"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","status","name","slug","addresses","email","phone","types","type_status","website_url","description","notes","created_at","updated_at"],"title":"MyOrganisationRead","description":"An organisation as its own admin sees it in the portal — the same shape\nthe admin console gets, including `notes`, because an org admin manages\ntheir own record."},"MyOrganisationSummaryRead":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"status":{"type":"string","title":"Status"},"is_admin":{"type":"boolean","title":"Is Admin"},"membership_status":{"type":"string","title":"Membership Status"},"membership_id":{"type":"string","title":"Membership Id"},"pending_requests":{"type":"integer","title":"Pending Requests"},"addresses":{"items":{"type":"object"},"type":"array","title":"Addresses"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"types":{"items":{"type":"string"},"type":"array","title":"Types"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"member_count":{"type":"integer","title":"Member Count"},"disciplines":{"items":{"type":"object"},"type":"array","title":"Disciplines"}},"type":"object","required":["id","name","status","is_admin","membership_status","membership_id","pending_requests","addresses","email","phone","types","image_url","member_count","disciplines"],"title":"MyOrganisationSummaryRead","description":"An organisation this person belongs to, with THEIR relationship to it.\n\n`is_admin`, `membership_status`, `membership_id` and `pending_requests`\ndescribe the caller's standing, not the organisation — which is why this is\na different shape from every other organisation model. `pending_requests` is\nwhat puts the badge on the portal nav.\n\nShape confirmed against a real response."},"MyProfileRead":{"properties":{"person":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Person"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"image":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Image"},"disciplines":{"items":{"type":"object"},"type":"array","title":"Disciplines"},"socials":{"items":{"type":"object"},"type":"array","title":"Socials"},"qualifications":{"items":{"type":"object"},"type":"array","title":"Qualifications"}},"type":"object","required":["person","email","image","disciplines","socials","qualifications"],"title":"MyProfileRead","description":"The portal's own profile view: the person plus everything hung off them.\n\nEvery nested value is a plain object because each is assembled by a\ndifferent part of the app — `person` is the profile row, `image` the primary\nmedia, and the three lists come from their own routers. Naming models here\nwould claim shapes this handler does not build."},"MyPublicationConsentRead":{"properties":{"person_id":{"type":"string","title":"Person Id"},"granted":{"type":"boolean","title":"Granted"}},"type":"object","required":["person_id","granted"],"title":"MyPublicationConsentRead","description":"The publication/image opt-in for one person — a genuinely OPTIONAL\nconsent, kept as its own consent_type and never bundled into the mandatory\nTerms acceptance."},"MyQualificationCheckoutRead":{"properties":{"checkout_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checkout Url"},"requested":{"type":"boolean","title":"Requested"}},"type":"object","required":["checkout_url","requested"],"title":"MyQualificationCheckoutRead","description":"`checkout_url` is null when QUALIFICATION_PAYMENTS_ENABLED is off — the\nqualification is then recorded as owed rather than charged, and `requested`\nis what tells the client it was still registered.\n\nBuying one creates it PENDING for admin review: it is an APPLICATION as well\nas a purchase."},"MyQualificationRead":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","title":"Type"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"status":{"type":"string","title":"Status"},"valid_from":{"type":"string","title":"Valid From"},"valid_to":{"type":"string","title":"Valid To"},"stripe_payment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Payment Id"},"entity_type":{"type":"string","title":"Entity Type"},"entity_id":{"type":"string","title":"Entity Id"},"entity_name":{"type":"string","title":"Entity Name"}},"type":"object","required":["id","type","tier","status","valid_from","valid_to","stripe_payment_id","entity_type","entity_id","entity_name"],"title":"MyQualificationRead","description":"A qualification held by this person or by an organisation they admin.\n\nCarries the polymorphic target (`entity_type`/`entity_id`) and its resolved\n`entity_name`, so the portal can list a person's own and their clubs' in one\nplace. Shape confirmed against a real response."},"NationalTeamCreate":{"properties":{"season_id":{"type":"string","format":"uuid","title":"Season Id"},"discipline_code":{"type":"string","title":"Discipline Code"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"status":{"type":"string","title":"Status","default":"DRAFT"}},"type":"object","required":["season_id","discipline_code"],"title":"NationalTeamCreate"},"NationalTeamLightMemberRead":{"properties":{"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"role":{"type":"string","title":"Role"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories"}},"type":"object","required":["first_name","last_name","role","categories"],"title":"NationalTeamLightMemberRead","description":"A member as the TEAM LIST sends them — four fields, built by\n`_light_members_by_team` in two queries so the list can be searched and\nfiltered without loading a person summary per member.\n\nThis is NOT NationalTeamMemberRead. Confirmed against the live API: the\npublic list returns exactly {first_name, last_name, role, categories}, with\nno id, no person_id and no nested person."},"NationalTeamListRead":{"properties":{"id":{"type":"string","title":"Id"},"season_id":{"type":"string","title":"Season Id"},"season_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Season Year"},"discipline_code":{"type":"string","title":"Discipline Code"},"discipline_name_pl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discipline Name Pl"},"name":{"type":"string","title":"Name"},"status":{"type":"string","title":"Status"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"member_count":{"type":"integer","title":"Member Count"},"members":{"items":{"$ref":"#/components/schemas/NationalTeamLightMemberRead"},"type":"array","title":"Members"}},"type":"object","required":["id","season_id","season_year","discipline_code","discipline_name_pl","name","status","created_at","updated_at","member_count","members"],"title":"NationalTeamListRead","description":"A team on the LIST. Carries light members.\n\nTwo models rather than one with an optional/union `members` because the\nlist and the detail genuinely return different objects, and a single model\nwould promise the list's callers an id and a nested person that are not\nthere. The AST gate cannot catch that — it verifies TOP-LEVEL keys only, so\na wrong nested model passes it. This split came from reading a real\nresponse, which is the only thing that would have found it."},"NationalTeamMemberCreate":{"properties":{"person_id":{"type":"string","format":"uuid","title":"Person Id"},"role":{"type":"string","title":"Role"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories","default":[]}},"type":"object","required":["person_id","role"],"title":"NationalTeamMemberCreate"},"NationalTeamMemberRead":{"properties":{"id":{"type":"string","title":"Id"},"national_team_id":{"type":"string","title":"National Team Id"},"person_id":{"type":"string","title":"Person Id"},"role":{"type":"string","title":"Role"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"person":{"$ref":"#/components/schemas/TeamPersonSummaryRead"}},"type":"object","required":["id","national_team_id","person_id","role","categories","created_at","updated_at","person"],"title":"NationalTeamMemberRead","description":"A member as the DETAIL endpoint and the member mutations send them —\nthe full row plus a denormalised person summary."},"NationalTeamMemberUpdate":{"properties":{"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"categories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Categories"}},"type":"object","title":"NationalTeamMemberUpdate"},"NationalTeamRead":{"properties":{"id":{"type":"string","title":"Id"},"season_id":{"type":"string","title":"Season Id"},"season_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Season Year"},"discipline_code":{"type":"string","title":"Discipline Code"},"discipline_name_pl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discipline Name Pl"},"name":{"type":"string","title":"Name"},"status":{"type":"string","title":"Status"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"member_count":{"type":"integer","title":"Member Count"},"members":{"anyOf":[{"items":{"$ref":"#/components/schemas/NationalTeamMemberRead"},"type":"array"},{"type":"null"}],"title":"Members"}},"type":"object","required":["id","season_id","season_year","discipline_code","discipline_name_pl","name","status","created_at","updated_at","member_count"],"title":"NationalTeamRead","description":"A team from the DETAIL, create and update endpoints. Carries full\nmembers; `members` is absent entirely on update, which passes no member\ndata at all."},"NationalTeamUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"NationalTeamUpdate"},"NextResolutionNumberRead":{"properties":{"number":{"type":"string","title":"Number"}},"type":"object","required":["number"],"title":"NextResolutionNumberRead","description":"The next free uchwała number for this meeting's association."},"NoteCreate":{"properties":{"heading":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Heading"},"body_md":{"type":"string","title":"Body Md"},"agenda_item_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Agenda Item Id"}},"type":"object","required":["body_md"],"title":"NoteCreate","description":"A block of discussion prose. `body_md` is Markdown; `heading` optional."},"NoteUpdate":{"properties":{"heading":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Heading"},"body_md":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Md"},"agenda_item_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Agenda Item Id"}},"type":"object","title":"NoteUpdate","description":"All optional — only the fields present in the payload are changed."},"OfficialCreate":{"properties":{"person_id":{"type":"string","format":"uuid","title":"Person Id"},"is_head":{"type":"boolean","title":"Is Head","default":false}},"type":"object","required":["person_id"],"title":"OfficialCreate"},"OfficialUpdate":{"properties":{"is_head":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Head"},"display_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Display Order"}},"type":"object","title":"OfficialUpdate"},"OnboardingPayload":{"properties":{"dismissed":{"items":{"type":"string"},"type":"array","title":"Dismissed"}},"type":"object","required":["dismissed"],"title":"OnboardingPayload","description":"The full set of onboarding step keys the account has dismissed. The client\nsends the whole desired list (not a delta), so a single PUT covers both\ndismissing one card and skipping the rest."},"OrgMemberPatch":{"properties":{"permission":{"anyOf":[{"type":"string","enum":["MEMBER","ADMIN"]},{"type":"null"}],"title":"Permission"},"roles":{"anyOf":[{"items":{"type":"string","enum":["ATHLETE","COACH","STAFF"]},"type":"array"},{"type":"null"}],"title":"Roles"}},"type":"object","title":"OrgMemberPatch"},"OrgMemberPayload":{"properties":{"person_id":{"type":"string","format":"uuid","title":"Person Id"},"permission":{"type":"string","enum":["MEMBER","ADMIN"],"title":"Permission","default":"MEMBER"},"roles":{"items":{"type":"string","enum":["ATHLETE","COACH","STAFF"]},"type":"array","title":"Roles","default":[]}},"type":"object","required":["person_id"],"title":"OrgMemberPayload"},"OrgQualificationCheckoutPayload":{"properties":{"type":{"type":"string","enum":["CLUB","SCHOOL"],"title":"Type"},"tier":{"type":"string","title":"Tier"},"valid_from":{"type":"string","format":"date","title":"Valid From"},"origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"}},"type":"object","required":["type","tier","valid_from"],"title":"OrgQualificationCheckoutPayload"},"OrganisationAddressRead":{"properties":{"id":{"type":"string","title":"Id"},"address":{"type":"string","title":"Address"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"is_primary":{"type":"boolean","title":"Is Primary"},"display_order":{"type":"integer","title":"Display Order"}},"type":"object","required":["id","address","latitude","longitude","is_primary","display_order"],"title":"OrganisationAddressRead","description":"One of an organisation's addresses. Verified against the live public\nlisting: exactly these six fields, with `label` NOT serialised despite\nexisting on the table."},"OrganisationAiOptionsRead":{"properties":{"models":{"items":{"type":"object"},"type":"array","title":"Models"},"default_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Model"},"model_weights":{"type":"object","title":"Model Weights"},"limit_units":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit Units"},"used_units":{"type":"integer","title":"Used Units"},"used_raw_tokens":{"type":"integer","title":"Used Raw Tokens"},"remaining_units":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remaining Units"},"sources":{"items":{"type":"object"},"type":"array","title":"Sources"},"enforced":{"type":"boolean","title":"Enforced"}},"type":"object","required":["models","default_model","model_weights","limit_units","used_units","used_raw_tokens","remaining_units","sources","enforced"],"title":"OrganisationAiOptionsRead","description":"An organisation's AI allowance and the models it may spend it on.\n\nThe allowance is EARNED, not configured — derived from an active ASSOCIATION\nqualification — so `limit_units` is null when nothing entitles it and\n`sources` says what did. Units are TOKENS WEIGHTED by model cost, because a\nplain token limit would let an association spend many times its allowance\njust by choosing a better model.\n\nEvery entitled organisation may reach every model; what differs is how much\nit may spend."},"OrganisationDetailRead":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","title":"Status"},"name":{"type":"string","title":"Name"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"addresses":{"items":{"type":"object"},"type":"array","title":"Addresses"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"types":{"items":{"type":"string"},"type":"array","title":"Types"},"type_status":{"type":"object","title":"Type Status"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"image_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Id"},"members":{"items":{"type":"object"},"type":"array","title":"Members"},"qualifications":{"items":{"type":"object"},"type":"array","title":"Qualifications"},"disciplines":{"items":{"type":"object"},"type":"array","title":"Disciplines"},"socials":{"items":{"type":"object"},"type":"array","title":"Socials"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","status","name","slug","addresses","email","phone","types","type_status","website_url","description","notes","image_url","image_id","members","qualifications","disciplines","socials","created_at","updated_at"],"title":"OrganisationDetailRead","description":"The full organisation page: the admin record plus everything attached.\n\nThe nested lists are plain objects for the reason the public meeting is —\nmembers, qualifications, disciplines and socials are each built by their own\nserialiser and the shapes here are not the ones those routers send at top\nlevel. Naming their models would promise fields this endpoint does not\ninclude."},"OrganisationDisciplineRead":{"properties":{"organisation_id":{"type":"string","title":"Organisation Id"},"discipline_code":{"type":"string","title":"Discipline Code"}},"type":"object","required":["organisation_id","discipline_code"],"title":"OrganisationDisciplineRead","description":"The join row itself. The per-organisation listing below returns bare discipline\ncodes instead — `Envelope[List[str]]`, no model — because that endpoint sends\na scalar list, and inventing an object to wrap a string would describe a\npayload the API does not send."},"OrganisationDisciplineTagRead":{"properties":{"code":{"type":"string","title":"Code"},"name_pl":{"type":"string","title":"Name Pl"}},"type":"object","required":["code","name_pl"],"title":"OrganisationDisciplineTagRead","description":"A discipline tag as an organisation carries it — code plus the Polish\nname, resolved for display."},"OrganisationListAdminRead":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","title":"Status"},"name":{"type":"string","title":"Name"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"addresses":{"items":{"$ref":"#/components/schemas/OrganisationAddressRead"},"type":"array","title":"Addresses"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"types":{"items":{"type":"string"},"type":"array","title":"Types"},"type_status":{"type":"object","title":"Type Status"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","status","name","slug","addresses","email","phone","types","type_status","website_url","description","notes","image_url","created_at","updated_at"],"title":"OrganisationListAdminRead","description":"An organisation as the ADMIN listing sends it — the full record plus the\nlogo the list draws. Shape confirmed against a real response."},"OrganisationPayload":{"properties":{"name":{"type":"string","title":"Name"},"addresses":{"items":{"$ref":"#/components/schemas/AddressPayload"},"type":"array","title":"Addresses"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["name","addresses"],"title":"OrganisationPayload"},"OrganisationPersonPayload":{"properties":{"organisation_id":{"type":"string","format":"uuid","title":"Organisation Id"},"person_id":{"type":"string","format":"uuid","title":"Person Id"},"permission":{"$ref":"#/components/schemas/Permission","default":"MEMBER"},"roles":{"items":{"type":"string","enum":["ATHLETE","COACH","STAFF"]},"type":"array","title":"Roles","default":[]},"joined_at":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Joined At"},"status":{"$ref":"#/components/schemas/MembershipStatus","default":"active"}},"type":"object","required":["organisation_id","person_id"],"title":"OrganisationPersonPayload"},"OrganisationPersonRead":{"properties":{"id":{"type":"string","title":"Id"},"organisation_id":{"type":"string","title":"Organisation Id"},"person_id":{"type":"string","title":"Person Id"},"permission":{"$ref":"#/components/schemas/Permission"},"roles":{"items":{"type":"string","enum":["ATHLETE","COACH","STAFF"]},"type":"array","title":"Roles"},"joined_at":{"type":"string","title":"Joined At"},"status":{"$ref":"#/components/schemas/MembershipStatus"}},"type":"object","required":["id","organisation_id","person_id","permission","roles","joined_at","status"],"title":"OrganisationPersonRead","description":"The shape `_to_dict` below produces. Named `...Read` to complete the\nCreate/Update/Read triad already used across app/schemas/.\n\nThe str-typed ids and `joined_at` are not laziness: `_to_dict` sends\n`str(m.id)` and `joined_at.isoformat()`, so the wire really is strings and\nthe model must say so. Declaring `UUID`/`date` here would describe a payload\nthe API does not send."},"OrganisationPublicRead":{"properties":{"id":{"type":"string","title":"Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"name":{"type":"string","title":"Name"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"addresses":{"items":{"$ref":"#/components/schemas/OrganisationAddressRead"},"type":"array","title":"Addresses"},"types":{"items":{"type":"string"},"type":"array","title":"Types"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"member_count":{"type":"integer","title":"Member Count"},"disciplines":{"items":{"$ref":"#/components/schemas/OrganisationDisciplineTagRead"},"type":"array","title":"Disciplines"},"socials":{"items":{"$ref":"#/components/schemas/OrganisationSocialRead"},"type":"array","title":"Socials"}},"type":"object","required":["id","slug","name","image_url","addresses","types","email","phone","website_url","description","member_count","disciplines","socials"],"title":"OrganisationPublicRead","description":"An organisation as the PUBLIC browse list sends it.\n\nA different object from the admin shape, not a subset: it adds\n`member_count`, `disciplines` and `socials`, and omits `status`, `notes`,\n`type_status` and the timestamps. `member_count` is derived at query time.\nShape confirmed against a real response."},"OrganisationRead":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","title":"Status"},"name":{"type":"string","title":"Name"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"addresses":{"items":{"$ref":"#/components/schemas/OrganisationAddressRead"},"type":"array","title":"Addresses"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"types":{"items":{"type":"string"},"type":"array","title":"Types"},"type_status":{"type":"object","title":"Type Status"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","status","name","slug","addresses","email","phone","types","type_status","website_url","description","notes","created_at","updated_at"],"title":"OrganisationRead","description":"An organisation as `_to_dict` builds it — the ADMIN shape, used by the\nsingle-organisation endpoints.\n\n`types` is DERIVED from the qualifications held, never stored, and\n`type_status` carries the state behind each. `notes` is admin-internal and\nis deliberately absent from every public shape; `description` is the\npublic-facing blurb."},"OrganisationRefRead":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"OrganisationRefRead","description":"The minimal organisation reference `_org_ref` builds. One model rather\nthan two near-identical ones: the settings endpoint and the association\npicker return the same pair, and a generated client should see one type."},"OrganisationSocialRead":{"properties":{"platform":{"type":"string","title":"Platform"},"url":{"type":"string","title":"Url"}},"type":"object","required":["platform","url"],"title":"OrganisationSocialRead","description":"A social link on an organisation: two fields, not the full Social row."},"ParticipantArrangement":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ArrangementItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"ParticipantArrangement","description":"The participant outline as the client currently draws it — every group and\nevery participant of the meeting, in order, each participant appearing\nexactly once (at the top level or under one group).\n\nOne payload for both moves a drag can make: it says where each row sits AND\nwhich group each participant belongs to, so a drop is a single atomic call\nrather than a move followed by a reorder."},"ParticipantCreate":{"properties":{"person_id":{"type":"string","format":"uuid","title":"Person Id"},"roles":{"items":{"type":"string"},"type":"array","title":"Roles","default":[]},"voting_group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Voting Group Id"}},"type":"object","required":["person_id"],"title":"ParticipantCreate"},"ParticipantUpdate":{"properties":{"roles":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Roles"},"voting_group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Voting Group Id"},"attendance":{"anyOf":[{"type":"string","enum":["PRESENT","ABSENT"]},{"type":"null"}],"title":"Attendance"}},"type":"object","title":"ParticipantUpdate","description":"What can change about a seated participant: the roles they hold at this\nmeeting, the voting unit they sit in, and whether they turned up. All\noptional — only the fields present in the payload change, and a null is a\nreal value in two of them: `voting_group_id: null` means \"take them out of\ntheir group; they vote for themselves\", and `attendance: null` means \"unsay\nit\", back to no register taken for this person."},"PendingRegistrationRead":{"properties":{"account_id":{"type":"string","title":"Account Id"},"email":{"type":"string","title":"Email"},"email_verified":{"type":"boolean","title":"Email Verified"}},"type":"object","required":["account_id","email","email_verified"],"title":"PendingRegistrationRead","description":"The unverified account created on the password path, before the emailed\nverification link is used."},"Permission":{"type":"string","enum":["MEMBER","ADMIN"],"title":"Permission","description":"A Person's permission level within an Organisation (who can administer it)."},"PersonAccountRead":{"properties":{"account_id":{"type":"string","title":"Account Id"},"email":{"type":"string","title":"Email"},"is_admin":{"type":"boolean","title":"Is Admin"},"relationship":{"type":"string","title":"Relationship"}},"type":"object","required":["account_id","email","is_admin","relationship"],"title":"PersonAccountRead","description":"An account linked to this person. `relationship` is SELF or GUARDIAN."},"PersonConsentRead":{"properties":{"id":{"type":"string","title":"Id"},"consent_type":{"type":"string","title":"Consent Type"},"granted":{"type":"boolean","title":"Granted"},"policy_version":{"type":"string","title":"Policy Version"},"source":{"type":"string","title":"Source"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","consent_type","granted","policy_version","source","created_at"],"title":"PersonConsentRead","description":"One append-only consent record reached via the person."},"PersonDeletionPreviewRead":{"properties":{"action":{"type":"string","title":"Action"},"reasons":{"items":{"type":"string"},"type":"array","title":"Reasons"}},"type":"object","required":["action","reasons"],"title":"PersonDeletionPreviewRead","description":"What deleting this person would actually do.\n\n`action` is DELETE or ANONYMISE — a person referenced by records that must\nbe kept cannot be removed, so the row is anonymised instead. `reasons` says\nwhich references forced that, which is what the confirmation dialog shows."},"PersonDisciplineRead":{"properties":{"person_id":{"type":"string","title":"Person Id"},"discipline_code":{"type":"string","title":"Discipline Code"}},"type":"object","required":["person_id","discipline_code"],"title":"PersonDisciplineRead","description":"The join row itself. The per-person listing below returns bare discipline\ncodes instead — `Envelope[List[str]]`, no model — because that endpoint sends\na scalar list, and inventing an object to wrap a string would describe a\npayload the API does not send."},"PersonPayload":{"properties":{"first_name":{"type":"string","title":"First Name","default":""},"last_name":{"type":"string","title":"Last Name","default":""},"date_of_birth":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Of Birth"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"}},"type":"object","title":"PersonPayload","description":"A person needs *a* name — which of the two fields carries it is not ours\nto dictate. Plenty of people are recorded from a single name (a minutes\nattendee, a contact a club gave by first name only), so either field alone is\nenough and everything else is optional. Only a nameless person is refused."},"PersonPublicRead":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"types":{"items":{"type":"string"},"type":"array","title":"Types"}},"type":"object","required":["id","name","image_url","types"],"title":"PersonPublicRead","description":"A person as the PUBLIC directory sends them: four fields and no contact\ndetails. `name` is already combined — the public shape does not expose\nfirst/last separately, and there is no date of birth, email or phone."},"PersonQualificationPublicRead":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","title":"Type"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"status":{"type":"string","title":"Status"},"valid_from":{"type":"string","title":"Valid From"},"valid_to":{"type":"string","title":"Valid To"}},"type":"object","required":["id","type","tier","status","valid_from","valid_to"],"title":"PersonQualificationPublicRead","description":"A qualification on the public profile — no stripe_payment_id and no\nentity linkage, unlike the admin shape."},"PersonRead":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","title":"Status"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"date_of_birth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date Of Birth"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"types":{"items":{"type":"string"},"type":"array","title":"Types"},"type_status":{"type":"object","title":"Type Status"},"archived":{"type":"boolean","title":"Archived"},"archived_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Archived Reason"}},"type":"object","required":["id","status","first_name","last_name","date_of_birth","email","phone","types","type_status","archived","archived_reason"],"title":"PersonRead","description":"A person in the admin view.\n\n`types` is DERIVED from the qualifications held, never stored — there is no\nstandalone role attribute — and `type_status` carries the state behind each.\n\n`archived` means the row survived a delete because records referencing it\nhad to be kept; `archived_reason` says which policy applied, which is what\ndecides whether restoring can bring the real name back.\n\nThere is no consent field here on purpose: consent is captured per ACCOUNT,\nnot on the profile."},"ProfilePayload":{"properties":{"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"date_of_birth":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Of Birth"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"}},"type":"object","required":["first_name","last_name"],"title":"ProfilePayload","description":"Basic contact fields. `email` is the person's own contact email — it is\nindependent of the account's sign-in email, so it is editable here. The\nperson's type is derived from their qualifications, not set here."},"PromptAttachment":{"properties":{"file_url":{"type":"string","title":"File Url"},"file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Name"}},"type":"object","required":["file_url"],"title":"PromptAttachment","description":"A file already uploaded to GCS, handed to the draft as extra context."},"PublicAddress":{"properties":{"address":{"type":"string","title":"Address"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"is_primary":{"type":"boolean","title":"Is Primary"}},"type":"object","required":["address","latitude","longitude","is_primary"],"title":"PublicAddress","description":"One of an organisation's addresses. Full street address, because an\norganisation's registered seat is a public registry fact — unlike a person's,\nwhich is never exposed anywhere in this API."},"PublicAffiliate":{"properties":{"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"name":{"type":"string","title":"Name"},"types":{"items":{"type":"string"},"type":"array","title":"Types"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"disciplines":{"items":{"type":"string"},"type":"array","title":"Disciplines"},"qualifications":{"items":{"$ref":"#/components/schemas/PublicAffiliationHeld"},"type":"array","title":"Qualifications"}},"type":"object","required":["slug","name","types","image_url","city","disciplines","qualifications"],"title":"PublicAffiliate","description":"An organisation affiliated to a federation. **One row per organisation.**\n\nIt used to be one row per QUALIFICATION, so a club holding CLUB, SCHOOL and\nASSOCIATION from the same federation appeared three times in its list of\nmembers. On a public page that reads as a bug, and a consumer would have had\nto group the rows itself.\n\n`qualifications` is deliberately not the same thing as the inherited\n`types`. `types` is what this organisation IS — derived from every active\nqualification it holds, whoever issued it. `qualifications` is what it holds\nFROM the federation being asked about, which with two federations is a\nstrictly smaller set. Collapsing them would have been correct only while one\nfederation existed.\n\n`tier` is absent from both: it is the commercial relationship between the\nclub and the federation, and a short step from what was paid."},"PublicAffiliationHeld":{"properties":{"type":{"type":"string","title":"Type"},"valid_to":{"type":"string","title":"Valid To"}},"type":"object","required":["type","valid_to"],"title":"PublicAffiliationHeld","description":"One credential this organisation holds FROM the federation being asked\nabout — not every credential it holds."},"PublicAffiliationRef":{"properties":{"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"name":{"type":"string","title":"Name"},"type":{"type":"string","title":"Type"},"valid_to":{"type":"string","title":"Valid To"}},"type":"object","required":["slug","name","type","valid_to"],"title":"PublicAffiliationRef","description":"A federation that licenses this organisation — the affiliation seen from\nthe affiliate's side."},"PublicAssociationRead":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"tiers":{"items":{"$ref":"#/components/schemas/AffiliationPriceRead"},"type":"array","title":"Tiers"}},"type":"object","required":["id","name","description","tiers"],"title":"PublicAssociationRead","description":"An association a person may affiliate with, with its active tiers.\n\n`tiers` is safe to name as AffiliationPriceRead: it is built by the SAME\n`_price_to_dict` the prices endpoints use, and the CI gate verifies that\nserialiser's keys where it is the top-level payload. That transitive basis\nis the reason this is not the national_teams mistake, where two DIFFERENT\nserialisers produced similarly-named member objects.\n\n(No association in production currently has a tier, so a live response could\nnot confirm it — hence the reasoning above rather than a fetched sample.)"},"PublicBodyMemberRead":{"properties":{"id":{"type":"string","title":"Id"},"roles":{"items":{"type":"string"},"type":"array","title":"Roles"},"person":{"$ref":"#/components/schemas/GovernancePersonRead"}},"type":"object","required":["id","roles","person"],"title":"PublicBodyMemberRead","description":"A seat as the PUBLIC body listing sends it: three fields.\n\nDeliberately NOT GovernanceMembershipRead. The live endpoint returns\n{id, roles, person} with no body_id, no window and no notes — naming the\nfull membership here would promise eight fields that are never sent, which\nis the mistake made and caught in national_teams."},"PublicBodyRead":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"body_type":{"type":"string","title":"Body Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"member_count":{"type":"integer","title":"Member Count"},"members":{"items":{"$ref":"#/components/schemas/PublicBodyMemberRead"},"type":"array","title":"Members"}},"type":"object","required":["id","name","body_type","description","image_url","member_count","members"],"title":"PublicBodyRead","description":"A governance body on the public home page — the main association's\nbodies, resolved server-side from federation_settings."},"PublicDocument":{"properties":{"title":{"type":"string","title":"Title"},"doc_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Date"},"file_url":{"type":"string","title":"File Url"},"file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Name"}},"type":"object","required":["title","doc_date","file_url","file_name"],"title":"PublicDocument","description":"A published governance document.\n\n`extracted_text` is never here. It holds the entire content of every\ngovernance PDF, exists so the AI assistant and the search filter need not\nreparse a file, and has no public endpoint."},"PublicDocumentRead":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"doc_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Date"},"file_url":{"type":"string","title":"File Url"},"file_name":{"type":"string","title":"File Name"}},"type":"object","required":["id","title","doc_date","file_url","file_name"],"title":"PublicDocumentRead","description":"The public shelf: deliberately fewer fields than the admin listing —\nno organisation_id, no doc_type, no created_at."},"PublicEvent":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"event_type":{"type":"string","title":"Event Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"start_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Time"},"end_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Time"},"all_day":{"type":"boolean","title":"All Day"},"location_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Name"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"external_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Url"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"roles":{"items":{"type":"string"},"type":"array","title":"Roles"},"organisers":{"items":{"$ref":"#/components/schemas/PublicEventOrganiser"},"type":"array","title":"Organisers"}},"type":"object","required":["id","name","event_type","description","start_time","end_time","all_day","location_name","latitude","longitude","external_url","image_url","roles","organisers"],"title":"PublicEvent","description":"An event, with the nature of this organisation's connection to it.\n\n`roles` is a LIST and may be empty. A list because one organisation can be\nhost *and* co-organiser; possibly empty because an event whose tenant is this\norganisation still belongs on its page even when nobody filled in the\njunction. This is what lets a consumer render a patronage differently from an\nevent the federation actually ran.\n\nNo price, no registration URL, no status: commerce is not public in v1."},"PublicEventOrganiser":{"properties":{"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"name":{"type":"string","title":"Name"},"role":{"type":"string","title":"Role"}},"type":"object","required":["slug","name","role"],"title":"PublicEventOrganiser","description":"One organisation's part in an event."},"PublicGovernanceBody":{"properties":{"name":{"type":"string","title":"Name"},"body_type":{"type":"string","title":"Body Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"members":{"items":{"$ref":"#/components/schemas/PublicPerson"},"type":"array","title":"Members"},"member_count":{"type":"integer","title":"Member Count"}},"type":"object","required":["name","body_type","description","members","member_count"],"title":"PublicGovernanceBody","description":"A body and its CURRENT members.\n\n`member_count` is `len(members)` and never the true size of the body. A body\nof nine listing four people with `member_count: 9` would disclose that five\nof them are missing from the list, and why."},"PublicMeeting":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"starts_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Starts At"},"ends_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ends At"},"status":{"type":"string","title":"Status"},"location_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Mode"},"location_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Address"},"participant_count":{"type":"integer","title":"Participant Count"},"document_count":{"type":"integer","title":"Document Count"}},"type":"object","required":["id","title","starts_at","ends_at","status","location_mode","location_address","participant_count","document_count"],"title":"PublicMeeting","description":"One meeting in the public record — enough for a card, plus the id needed\nto link on to it.\n\n`participant_count` and `document_count` are counts rather than lists: who\nattended is a list of people, and a list of people belongs behind the rules\nin `PublicPerson`, not in a summary card."},"PublicMeetingCardRead":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"status":{"type":"string","title":"Status"},"starts_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Starts At"},"ends_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ends At"},"location_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Mode"},"location_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Address"},"participant_count":{"type":"integer","title":"Participant Count"},"document_count":{"type":"integer","title":"Document Count"}},"type":"object","required":["id","title","status","starts_at","ends_at","location_mode","location_address","participant_count","document_count"],"title":"PublicMeetingCardRead","description":"A meeting on the public list — deliberately fewer fields than\nMeetingRead: no organisation_id, no meet_url, no coordinates and no quorum.\nA public reader is told a meeting happened, not how to join it."},"PublicMeetingRead":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"status":{"type":"string","title":"Status"},"starts_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Starts At"},"ends_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ends At"},"location_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Mode"},"location_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Address"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"quorum":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Quorum"},"voting_unit_count":{"type":"integer","title":"Voting Unit Count"},"participants":{"items":{"type":"object"},"type":"array","title":"Participants"},"voting_groups":{"items":{"type":"object"},"type":"array","title":"Voting Groups"},"agenda":{"items":{"type":"object"},"type":"array","title":"Agenda"},"votings":{"items":{"type":"object"},"type":"array","title":"Votings"},"notes":{"items":{"type":"object"},"type":"array","title":"Notes"},"resolutions":{"items":{"type":"object"},"type":"array","title":"Resolutions"},"action_items":{"items":{"type":"object"},"type":"array","title":"Action Items"},"documents":{"items":{"type":"object"},"type":"array","title":"Documents"}},"type":"object","required":["id","title","status","starts_at","ends_at","location_mode","location_address","latitude","longitude","quorum","voting_unit_count","participants","voting_groups","agenda","votings","notes","resolutions","action_items","documents"],"title":"PublicMeetingRead","description":"A meeting on the public site.\n\nIt carries the SAME sections as the signed-in page, in the same order, and\nthe reading half of the same components draws them — so the two records can\nno longer describe one meeting differently.\n\nWhat the public payload still withholds is not content but a way IN:\n`meet_url` is absent, because a published link to a board's video call is an\nopen door, and `organisation_id` because nothing here needs it.\n\nThe nested lists stay typed as plain objects. Most are now built by the very\nserialisers the authenticated endpoints use, but `participants` and the\nballots are trimmed for publication (an unpublished person keeps their name\nand loses their id and photo; a ballot loses `created_by_person_id`), so a\nshared model would promise fields this endpoint does not send. That is the\nnational_teams mistake, and this is where it would recur."},"PublicNationalTeam":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"year":{"type":"integer","title":"Year"},"discipline":{"type":"string","title":"Discipline"},"members":{"items":{"$ref":"#/components/schemas/PublicPerson"},"type":"array","title":"Members"},"member_count":{"type":"integer","title":"Member Count"}},"type":"object","required":["name","year","discipline","members","member_count"],"title":"PublicNationalTeam","description":"A squad and its roster. `member_count` as in PublicGovernanceBody."},"PublicOrganisationDetail":{"properties":{"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"name":{"type":"string","title":"Name"},"types":{"items":{"type":"string"},"type":"array","title":"Types"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"disciplines":{"items":{"type":"string"},"type":"array","title":"Disciplines"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"addresses":{"items":{"$ref":"#/components/schemas/PublicAddress"},"type":"array","title":"Addresses"},"socials":{"items":{"$ref":"#/components/schemas/PublicSocial"},"type":"array","title":"Socials"},"affiliated_to":{"items":{"$ref":"#/components/schemas/PublicAffiliationRef"},"type":"array","title":"Affiliated To"}},"type":"object","required":["slug","name","types","image_url","city","disciplines","description","website_url","email","phone","addresses","socials","affiliated_to"],"title":"PublicOrganisationDetail","description":"One organisation.\n\n`email`/`phone` are the organisation's own published contact details. See\ndocs/api/public-v0.md §4.9 for the known limitation: nothing in the schema\ndistinguishes `kontakt@klub.pl` from a named person's private address."},"PublicOrganisationSummary":{"properties":{"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"name":{"type":"string","title":"Name"},"types":{"items":{"type":"string"},"type":"array","title":"Types"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"disciplines":{"items":{"type":"string"},"type":"array","title":"Disciplines"}},"type":"object","required":["slug","name","types","image_url","city","disciplines"],"title":"PublicOrganisationSummary","description":"An organisation in a list.\n\nNo `id`: the UUID is an internal handle and `slug` is the public one.\nNo `member_count`: an aggregate of natural persons per club, across every\nclub, is a dataset about people even though nobody is named."},"PublicPerson":{"properties":{"display_name":{"type":"string","title":"Display Name"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"role":{"type":"string","title":"Role"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories"}},"type":"object","required":["display_name","image_url","role","categories"],"title":"PublicPerson","description":"The ONLY shape in which a natural person appears in this API.\n\nFour fields, always nested inside a named governance body or national-team\nroster — never the top-level resource of any endpoint, because there is no\npublic roster of a federation's people.\n\n**No `id`.** A stable per-person identifier across responses is the join key\nthat turns two endpoints into a profile.\n\n**No date of birth and no age, ever.** `categories` are values *assigned* on\nthe roster (`national_team_members.categories`), not derived from a birth\ndate, so the public API never reads `persons.date_of_birth` for output. It\nreads it for exactly one thing: deciding whether this person is a minor.\n\n**Minor unless known adult.** Unknown date of birth means minor: the\nalternative treats everyone with incomplete data as an adult, which is\nbackwards for a federation whose rosters are full of juniors. A minor gets\nan abbreviated surname and never a photograph.\n\n`image_url` is consent-gated for everybody (docs/api/public-v0.md §3.2). The\nname and the office are not — they publish on the public-task basis the\nprivacy policy in force already states."},"PublicRegistrationPricesRead":{"properties":{"owner_type":{"type":"string","title":"Owner Type"},"owner_id":{"type":"string","title":"Owner Id"},"tiers":{"items":{"$ref":"#/components/schemas/RegistrationPriceRead"},"type":"array","title":"Tiers"},"current_price":{"anyOf":[{"$ref":"#/components/schemas/RegistrationPriceRead"},{"type":"null"}]}},"type":"object","required":["owner_type","owner_id","tiers","current_price"],"title":"PublicRegistrationPricesRead","description":"What the public entry page needs: every active tier, and which one\napplies right now.\n\n`tiers` and `current_price` are both built by the SAME `_price_to_dict` the\nprice endpoints use, and the gate verifies that serialiser's keys where it\nis the top-level payload — the transitive basis this phase uses when no live\ninstance exists to fetch. `current_price` is null when no tier currently\napplies."},"PublicSocial":{"properties":{"platform":{"type":"string","title":"Platform"},"url":{"type":"string","title":"Url"}},"type":"object","required":["platform","url"],"title":"PublicSocial"},"PublicStatute":{"properties":{"title":{"type":"string","title":"Title"},"body_md":{"type":"string","title":"Body Md"},"adopted_on":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Adopted On"},"source_file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source File Url"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"}},"type":"object","required":["title","body_md","adopted_on","source_file_url","source_url"],"title":"PublicStatute","description":"An association's *statut*, as the public reads it.\n\nThe Markdown body is the point — a statute is READ on the page, not\ndownloaded, which is why it is not a `documents` row in the first place.\n`source_file_url` is the signed PDF we hold in GCS when there is one, and\n`source_url` a page on the open web it was transcribed from; both are\nprovenance, and either may be absent.\n\nNo `id` and no `organisation_id`: there is exactly one statute per\nassociation and the caller already named the association in the URL."},"PublicTask":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"type":"string","title":"Status"},"due_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due Date"},"estimate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estimate"},"is_assigned":{"type":"boolean","title":"Is Assigned"},"assignee":{"anyOf":[{"$ref":"#/components/schemas/PublicPerson"},{"type":"null"}]}},"type":"object","required":["id","title","description","status","due_date","estimate","is_assigned","assignee"],"title":"PublicTask","description":"One card from a published task market.\n\nPublished at all only when the association has opened its board\n(`organisations.task_board_public`) — a work board is internal until\nsomebody decides otherwise — and then only the three board columns, never\nthe backlog or the archive.\n\n`assignee` follows the same rule as everywhere else a person appears, and\n`is_assigned` is why it is a separate field: a task whose assignee withheld\nconsent comes back with `assignee: null` and `is_assigned: true`. The work\nis public, the person is not — and without the flag the board would look\nlike nobody had picked the task up."},"PublicationConsentPayload":{"properties":{"person_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Person Id"},"granted":{"type":"boolean","title":"Granted"}},"type":"object","required":["granted"],"title":"PublicationConsentPayload","description":"Grant or withdraw consent to show a person on the public site. person_id\ndefaults to the caller's own SELF profile; a managed minor's id is allowed."},"QualificationCheckoutPayload":{"properties":{"type":{"type":"string","enum":["ATHLETE","TRAINER","INSTRUCTOR","STAFF"],"title":"Type"},"tier":{"type":"string","title":"Tier"},"valid_from":{"type":"string","format":"date","title":"Valid From"},"origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"}},"type":"object","required":["type","tier","valid_from"],"title":"QualificationCheckoutPayload","description":"Request a qualification of a person-allowed type, valid one year from valid_from.\nPaid tiers go through Stripe; a free (0 PLN) tier is requested directly."},"QualificationPayload":{"properties":{"entity_type":{"type":"string","title":"Entity Type"},"entity_id":{"type":"string","format":"uuid","title":"Entity Id"},"type":{"type":"string","title":"Type"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"status":{"$ref":"#/components/schemas/QualificationStatus"},"valid_from":{"type":"string","format":"date","title":"Valid From"},"valid_to":{"type":"string","format":"date","title":"Valid To"},"stripe_payment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Payment Id"}},"type":"object","required":["entity_type","entity_id","type","status","valid_from","valid_to"],"title":"QualificationPayload"},"QualificationPricePayload":{"properties":{"qualification_type":{"type":"string","enum":["ATHLETE","TRAINER","INSTRUCTOR","STAFF","OFFICIAL","CLUB","SCHOOL","ASSOCIATION","FEDERATION"],"title":"Qualification Type"},"tier":{"type":"string","title":"Tier"},"name":{"type":"string","title":"Name"},"amount":{"type":"integer","title":"Amount"},"currency":{"type":"string","title":"Currency","default":"pln"},"active":{"type":"boolean","title":"Active","default":true},"display_order":{"type":"integer","title":"Display Order","default":0}},"type":"object","required":["qualification_type","tier","name","amount"],"title":"QualificationPricePayload"},"QualificationPriceRead":{"properties":{"id":{"type":"string","title":"Id"},"qualification_type":{"type":"string","title":"Qualification Type"},"tier":{"type":"string","title":"Tier"},"name":{"type":"string","title":"Name"},"amount":{"type":"integer","title":"Amount"},"currency":{"type":"string","title":"Currency"},"active":{"type":"boolean","title":"Active"},"display_order":{"type":"integer","title":"Display Order"}},"type":"object","required":["id","qualification_type","tier","name","amount","currency","active","display_order"],"title":"QualificationPriceRead","description":"One priced tier. Types follow the qualification_prices table.\n\n`amount` is an int because prices are stored in minor units (grosz), not\ndecimal currency — a float here would invite rounding into money."},"QualificationResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"entity_type":{"type":"string","title":"Entity Type"},"entity_id":{"type":"string","format":"uuid","title":"Entity Id"},"entity_name":{"type":"string","title":"Entity Name"},"type":{"type":"string","title":"Type"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"status":{"$ref":"#/components/schemas/QualificationStatus"},"valid_from":{"type":"string","format":"date","title":"Valid From"},"valid_to":{"type":"string","format":"date","title":"Valid To"},"stripe_payment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Payment Id"}},"type":"object","required":["id","entity_type","entity_id","entity_name","type","status","valid_from","valid_to"],"title":"QualificationResponse"},"QualificationStatus":{"type":"string","enum":["PENDING","APPROVED","ACTIVE","EXPIRED","SUSPENDED","REJECTED"],"title":"QualificationStatus"},"RefundPayload":{"properties":{"amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Amount"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","title":"RefundPayload"},"RegistrationCheckoutRead":{"properties":{"checkout_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checkout Url"},"registered":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Registered"}},"type":"object","required":["checkout_url"],"title":"RegistrationCheckoutRead","description":"`checkout_url` is null when REGISTRATION_PAYMENTS_ENABLED is off — the\nentry is recorded as owed rather than charged, and `registered` is sent true\non that branch only."},"RegistrationPricePayload":{"properties":{"owner_type":{"type":"string","enum":["division","event"],"title":"Owner Type"},"owner_id":{"type":"string","format":"uuid","title":"Owner Id"},"name":{"type":"string","title":"Name"},"amount":{"type":"integer","title":"Amount"},"currency":{"type":"string","title":"Currency","default":"pln"},"condition_type":{"type":"string","title":"Condition Type","default":"DEFAULT"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"ends_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ends At"},"max_seats":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Seats"},"active":{"type":"boolean","title":"Active","default":true},"display_order":{"type":"integer","title":"Display Order","default":0}},"type":"object","required":["owner_type","owner_id","name","amount"],"title":"RegistrationPricePayload"},"RegistrationPriceRead":{"properties":{"id":{"type":"string","title":"Id"},"owner_type":{"type":"string","title":"Owner Type"},"owner_id":{"type":"string","title":"Owner Id"},"name":{"type":"string","title":"Name"},"amount":{"type":"integer","title":"Amount"},"currency":{"type":"string","title":"Currency"},"condition_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condition Type"},"starts_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Starts At"},"ends_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ends At"},"max_seats":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Seats"},"active":{"type":"boolean","title":"Active"},"display_order":{"type":"integer","title":"Display Order"}},"type":"object","required":["id","owner_type","owner_id","name","amount","currency","condition_type","starts_at","ends_at","max_seats","active","display_order"],"title":"RegistrationPriceRead","description":"One priced entry tier for an event or competition.\n\n`amount` is grosz. `condition_type` selects the rule that decides whether a\ntier applies; `starts_at`/`ends_at` bound an early-bird window and\n`max_seats` caps it. All three are null on an unconditional tier."},"RegistrationRead":{"properties":{"id":{"type":"string","title":"Id"},"owner_type":{"type":"string","title":"Owner Type"},"owner_id":{"type":"string","title":"Owner Id"},"event_id":{"type":"string","title":"Event Id"},"person_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Person Id"},"registrant_first_name":{"type":"string","title":"Registrant First Name"},"registrant_last_name":{"type":"string","title":"Registrant Last Name"},"registrant_email":{"type":"string","title":"Registrant Email"},"registrant_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registrant Phone"},"price_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price Id"},"amount":{"type":"integer","title":"Amount"},"currency":{"type":"string","title":"Currency"},"status":{"type":"string","title":"Status"},"stripe_payment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Payment Id"},"division_entry_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Division Entry Id"},"person":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Person"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","owner_type","owner_id","event_id","person_id","registrant_first_name","registrant_last_name","registrant_email","registrant_phone","price_id","amount","currency","status","stripe_payment_id","division_entry_id","person","created_at"],"title":"RegistrationRead","description":"One entry. The registrant fields are a SNAPSHOT taken at entry time and\nare kept even when `person_id` is null — a public entrant need not have a\nPerson, and an erasure that nulls the link must not erase the entry list.\n\n`person` is typed `dict` deliberately, not as a model. It arrives as a\nPARAMETER supplied by each caller, so neither the analyser nor the CI gate\ncan tell which serialiser filled it — and naming a shape nobody can verify\nis how the national_teams member bug happened."},"ReorderSponsorPayload":{"properties":{"display_order":{"type":"integer","title":"Display Order"}},"type":"object","required":["display_order"],"title":"ReorderSponsorPayload"},"ResolutionCreate":{"properties":{"question":{"type":"string","title":"Question"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"resolution_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Number"},"agenda_item_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Agenda Item Id"},"voting_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Voting Id"}},"type":"object","required":["question"],"title":"ResolutionCreate","description":"A resolution is WRITTEN — it never runs a ballot of its own (see\nVotingCreate for that), and it has no state: an uchwała that exists is valid.\n`voting_id` names the voting it was written up from, when there was one."},"ResolutionUpdate":{"properties":{"question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"resolution_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Number"}},"type":"object","title":"ResolutionUpdate","description":"Hand-edits to a resolution: its text, its number, and which voting it\nrecords. All optional — only the fields present in the payload change.\n\n`content` and `resolution_number` use the sentinel: present as null clears\nthem; absent leaves them alone. Which ballots this uchwała records is set on\nthe ballots — several can point at one."},"RoundUpdate":{"properties":{"heat_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Heat Size"},"advance_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Advance Count"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","title":"RoundUpdate"},"SeasonCreate":{"properties":{"year":{"type":"integer","title":"Year"}},"type":"object","required":["year"],"title":"SeasonCreate"},"SeasonRead":{"properties":{"id":{"type":"string","title":"Id"},"year":{"type":"integer","title":"Year"},"team_count":{"type":"integer","title":"Team Count"}},"type":"object","required":["id","year","team_count"],"title":"SeasonRead","description":"A selection year. `team_count` is derived at read time, never stored."},"SeasonUpdate":{"properties":{"year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"}},"type":"object","title":"SeasonUpdate"},"SelfLinkPayload":{"properties":{"person_id":{"type":"string","format":"uuid","title":"Person Id"}},"type":"object","required":["person_id"],"title":"SelfLinkPayload"},"SessionRead":{"properties":{"token":{"type":"string","title":"Token"},"email":{"type":"string","title":"Email"},"expires_at":{"type":"integer","title":"Expires At"},"is_admin":{"type":"boolean","title":"Is Admin"},"account_id":{"type":"string","title":"Account Id"},"person_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Person Id"},"managed":{"items":{"$ref":"#/components/schemas/ManagedPersonRead"},"type":"array","title":"Managed"},"analytics_consent":{"type":"boolean","title":"Analytics Consent"},"needs_consent":{"type":"boolean","title":"Needs Consent"}},"type":"object","required":["token","email","expires_at","is_admin","account_id","person_id","managed","analytics_consent","needs_consent"],"title":"SessionRead","description":"What /auth/session and /auth/me both return.\n\n`expires_at` is epoch seconds, not a date string — mint_session_token is\nannotated `-> tuple[str, int]`. `person_id` is null for an account not yet\nlinked to a Person. `needs_consent` drives the blocking Terms/Privacy gate;\n`analytics_consent` is the SEPARATE, optional opt-in and is false until the\nuser grants it."},"SessionRequest":{"properties":{"firebase_id_token":{"type":"string","title":"Firebase Id Token"}},"type":"object","required":["firebase_id_token"],"title":"SessionRequest"},"SocialPatch":{"properties":{"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","title":"SocialPatch"},"SocialRead":{"properties":{"id":{"type":"string","title":"Id"},"entity_type":{"type":"string","title":"Entity Type"},"entity_id":{"type":"string","title":"Entity Id"},"platform":{"type":"string","title":"Platform"},"url":{"type":"string","title":"Url"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","entity_type","entity_id","platform","url","created_at","updated_at"],"title":"SocialRead","description":"Types follow the socials table and `_to_dict` below: ids are sent as\nstr(), and the timestamps as isoformat or None (both columns are nullable)."},"SponsorPayload":{"properties":{"name":{"type":"string","title":"Name"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"is_public":{"type":"boolean","title":"Is Public","default":false},"display_order":{"type":"integer","title":"Display Order","default":0}},"type":"object","required":["name"],"title":"SponsorPayload"},"SponsorRead":{"properties":{"id":{"type":"string","title":"Id"},"organisation_id":{"type":"string","title":"Organisation Id"},"name":{"type":"string","title":"Name"},"url":{"type":"string","title":"Url"},"logo_url":{"type":"string","title":"Logo Url"},"is_public":{"type":"boolean","title":"Is Public"},"display_order":{"type":"integer","title":"Display Order"}},"type":"object","required":["id","organisation_id","name","url","logo_url","is_public","display_order"],"title":"SponsorRead","description":"One sponsor. The same shape serves both an organisation's sponsors and a\ncompetition's — `organisation_id` is the owning organisation either way."},"SponsorUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"is_public":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Public"},"display_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Display Order"}},"type":"object","title":"SponsorUpdate"},"StatusPayload":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"StatusPayload"},"StatuteDiffRead":{"properties":{"from":{"$ref":"#/components/schemas/StatuteVersionRead"},"to":{"$ref":"#/components/schemas/StatuteVersionRead"},"hunks":{"items":{},"type":"array","title":"Hunks"},"added":{"type":"integer","title":"Added"},"removed":{"type":"integer","title":"Removed"},"identical":{"type":"boolean","title":"Identical"},"truncated":{"type":"boolean","title":"Truncated"}},"type":"object","required":["from","to","hunks","added","removed","identical","truncated"],"title":"StatuteDiffRead","description":"A comparison of two revisions.\n\n`from` and `to` are Python keywords, so they are declared with aliases —\nwithout these the schema would advertise `from_` and `to_`, which the API\ndoes not send. `populate_by_name` keeps the Python-side names usable.\n\n`identical` exists because two versions can differ in title or adoption date\nwith the same text, and the dialog should say so rather than show nothing."},"StatuteImportJobRead":{"properties":{"status":{"type":"string","title":"Status"},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage"},"fraction":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fraction"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"degraded":{"type":"boolean","title":"Degraded"},"body_md":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Md"},"source_file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source File Url"},"source_file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source File Name"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"}},"type":"object","required":["status","stage","fraction","message","code","degraded","body_md","source_file_url","source_file_name","source_url"],"title":"StatuteImportJobRead","description":"Progress of a transcription.\n\n`fraction` is MEASURED, not timed — characters produced over what the\nsource's visible text should yield. `degraded` marks a provider failure that\nfell back to the source's raw text: never present that as a finished\ntranscription."},"StatuteImportJobStartedRead":{"properties":{"job_id":{"type":"string","title":"Job Id"}},"type":"object","required":["job_id"],"title":"StatuteImportJobStartedRead","description":"Neither import runs inline: transcribing the PZSurf statute takes ~56s\nagainst Hosting's 60s cap, so both start a job and the client polls."},"StatuteImportPayload":{"properties":{"file_url":{"type":"string","title":"File Url"},"file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Name"}},"type":"object","required":["file_url"],"title":"StatuteImportPayload","description":"A PDF already uploaded through /documents/upload-url, to transcribe."},"StatuteImportUrlPayload":{"properties":{"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"StatuteImportUrlPayload","description":"A page on the web that publishes the statute, to read and transcribe."},"StatutePayload":{"properties":{"title":{"type":"string","title":"Title","default":""},"body_md":{"type":"string","title":"Body Md","default":""},"adopted_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Adopted On"},"source_file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source File Url"},"source_file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source File Name"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"}},"type":"object","title":"StatutePayload","description":"The whole statute, written at once — there is only ever one of them, so a\nsave replaces the text rather than patching it."},"StatuteRead":{"properties":{"id":{"type":"string","title":"Id"},"organisation_id":{"type":"string","title":"Organisation Id"},"title":{"type":"string","title":"Title"},"body_md":{"type":"string","title":"Body Md"},"adopted_on":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Adopted On"},"source_file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source File Url"},"source_file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source File Name"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","organisation_id","title","body_md","adopted_on","source_file_url","source_file_name","source_url","created_at","updated_at"],"title":"StatuteRead","description":"An association's statut — one editable Markdown text per association,\ndeliberately NOT a documents row: the shelf is PDFs to download, a statute\nis read on the page and amended in place.\n\n`source_file_url` is a PDF we hold in GCS; `source_url` is a page on the\nopen web we do not control. Two independent columns, because a statute can\nhave come from either or neither."},"StatuteVersionRead":{"properties":{"id":{"type":"string","title":"Id"},"version_at":{"type":"string","title":"Version At"},"title":{"type":"string","title":"Title"},"adopted_on":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Adopted On"},"source_file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source File Url"},"source_file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source File Name"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"body_md":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Md"},"is_current":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Current"}},"type":"object","required":["id","version_at","title","adopted_on","source_file_url","source_file_name","source_url"],"title":"StatuteVersionRead","description":"One revision. `body_md` is only sent when the caller asked for a single\nversion — `_version_to_dict(body=...)` omits it from listings, where sending\nevery historical text would be pointless weight. `is_current` is set on the\nnewest row of a listing and on nothing else: it is what lets the history\nmark the text in force without comparing bodies."},"TaskAssigneeRead":{"properties":{"id":{"type":"string","title":"Id"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"}},"type":"object","required":["id","first_name","last_name","image_url"],"title":"TaskAssigneeRead","description":"The person a card is assigned to. Null on an unassigned card, which is\nwhy `assignee` is Optional and `is_assigned` exists as a plain flag."},"TaskAttachmentRead":{"properties":{"id":{"type":"string","title":"Id"},"file_url":{"type":"string","title":"File Url"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type"},"kind":{"type":"string","title":"Kind"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","file_url","file_name","content_type","kind","created_at"],"title":"TaskAttachmentRead","description":"A file on a card. Uploaded straight to GCS via a signed URL, so\n`file_url` is a bucket address and never passes through this API."},"TaskAttachmentUploadUrlRead":{"properties":{"upload_url":{"type":"string","title":"Upload Url"},"public_url":{"type":"string","title":"Public Url"}},"type":"object","required":["upload_url","public_url"],"title":"TaskAttachmentUploadUrlRead","description":"A signed PUT target and the URL the file will have once uploaded."},"TaskBoardSettingsRead":{"properties":{"organisation_id":{"type":"string","title":"Organisation Id"},"public":{"type":"boolean","title":"Public"}},"type":"object","required":["organisation_id","public"],"title":"TaskBoardSettingsRead","description":"Whether an organisation's board is published publicly."},"TaskCreate":{"properties":{"organisation_id":{"type":"string","format":"uuid","title":"Organisation Id"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"type":"string","enum":["BACKLOG","TODO","IN_PROGRESS","DONE","ARCHIVED"],"title":"Status","default":"TODO"},"assignee_person_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Assignee Person Id"},"due_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Due Date"},"estimate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estimate"},"source_action_item_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Source Action Item Id"}},"type":"object","required":["organisation_id","title"],"title":"TaskCreate"},"TaskMove":{"properties":{"status":{"type":"string","enum":["BACKLOG","TODO","IN_PROGRESS","DONE","ARCHIVED"],"title":"Status"},"position":{"type":"integer","title":"Position","default":0}},"type":"object","required":["status"],"title":"TaskMove","description":"A drag-and-drop landing: which column, and where in it. `position` is the\nindex the card was dropped at; the server clamps it and renumbers the column."},"TaskRead":{"properties":{"id":{"type":"string","title":"Id"},"organisation_id":{"type":"string","title":"Organisation Id"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"type":"string","title":"Status"},"position":{"type":"integer","title":"Position"},"estimate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estimate"},"due_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due Date"},"is_assigned":{"type":"boolean","title":"Is Assigned"},"assignee_person_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignee Person Id"},"assignee":{"anyOf":[{"$ref":"#/components/schemas/TaskAssigneeRead"},{"type":"null"}]},"source_action_item_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Action Item Id"},"attachments":{"items":{"$ref":"#/components/schemas/TaskAttachmentRead"},"type":"array","title":"Attachments"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","organisation_id","title","description","status","position","estimate","due_date","is_assigned","assignee_person_id","assignee","source_action_item_id","attachments","created_at","updated_at"],"title":"TaskRead","description":"A card on the task market.\n\n`source_action_item_id` points back at the meeting action item this card was\ncreated from, when it came from one — the market and a meeting's own action\nitems are separate records, deliberately.\n\n`assignee_person_id` and `assignee` carry the same fact at different depths:\nthe id is always there when assigned, the object only when the person could\nbe resolved."},"TaskSummaryRead":{"properties":{"public":{"type":"boolean","title":"Public"},"can_publish":{"type":"boolean","title":"Can Publish"},"counts":{"type":"object","title":"Counts"}},"type":"object","required":["public","can_publish","counts"],"title":"TaskSummaryRead","description":"Board headline. `counts` is keyed by status, so it stays a dict — adding\na status must not require editing a model. `can_publish` reflects the\ncaller, not the board."},"TaskUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"anyOf":[{"type":"string","enum":["BACKLOG","TODO","IN_PROGRESS","DONE","ARCHIVED"]},{"type":"null"}],"title":"Status"},"assignee_person_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Assignee Person Id"},"due_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Due Date"},"estimate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estimate"}},"type":"object","title":"TaskUpdate","description":"Every field optional — the dialog saves whichever ones changed.\n\n`assignee_person_id` and `due_date` are genuinely nullable (unassigning is a\nreal edit), so callers clear them by sending an explicit null; a field simply\nleft out of the body is untouched. That distinction is why the router works\noff `model_dump(exclude_unset=True)` rather than dropping Nones."},"TeamPersonSummaryRead":{"properties":{"id":{"type":"string","title":"Id"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"club_names":{"items":{"type":"string"},"type":"array","title":"Club Names"},"socials":{"items":{},"type":"array","title":"Socials"}},"type":"object","required":["id","first_name","last_name","image_url","club_names","socials"],"title":"TeamPersonSummaryRead","description":"The person behind a membership, denormalised for the roster card so the\nclient needs no second request. `club_names` and `socials` are already\npublic via the person profile."},"ThreadSettings":{"properties":{"organisation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organisation Id"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"}},"type":"object","title":"ThreadSettings","description":"Which allowance to spend, and which model. Stored on the thread so the\nchoice survives a reload."},"TransactionItemRead":{"properties":{"id":{"type":"string","title":"Id"},"item_type":{"type":"string","title":"Item Type"},"item_id":{"type":"string","title":"Item Id"},"description":{"type":"string","title":"Description"},"unit_amount":{"type":"integer","title":"Unit Amount"},"quantity":{"type":"integer","title":"Quantity"},"amount":{"type":"integer","title":"Amount"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["id","item_type","item_id","description","unit_amount","quantity","amount","currency"],"title":"TransactionItemRead","description":"One line on a purchase. `unit_amount` and `amount` are grosz (minor\nunits), as everywhere money is handled here."},"TransactionRead":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","title":"Status"},"refunded":{"type":"boolean","title":"Refunded"},"is_refund":{"type":"boolean","title":"Is Refund"},"refunds_transaction_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refunds Transaction Id"},"amount_total":{"type":"integer","title":"Amount Total"},"currency":{"type":"string","title":"Currency"},"buyer_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Buyer Email"},"buyer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Buyer Name"},"person_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Person Id"},"stripe_checkout_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Checkout Session Id"},"stripe_payment_intent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Payment Intent Id"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"paid_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paid At"},"items":{"items":{"$ref":"#/components/schemas/TransactionItemRead"},"type":"array","title":"Items"}},"type":"object","required":["id","status","refunded","is_refund","refunds_transaction_id","amount_total","currency","buyer_email","buyer_name","person_id","stripe_checkout_session_id","stripe_payment_intent_id","created_at","paid_at","items"],"title":"TransactionRead","description":"One row in the purchase ledger.\n\n`refunded` is DERIVED, never stored: a settled row is never rewritten, so a\nrefund is a new negative row pointing back at the original. `is_refund` says\nwhich side of that pair this row is.\n\n`amount_total` is grosz and is negative on a refund. buyer_email/buyer_name\nare nullable snapshots kept even after an erasure nulls the links, because a\nreceipt without a buyer is not a receipt. person_id is null for a public\nbuyer (the /join flow, an event registration)."},"TransactionSummaryRead":{"properties":{"paid_count":{"type":"integer","title":"Paid Count"},"refund_count":{"type":"integer","title":"Refund Count"},"pending_count":{"type":"integer","title":"Pending Count"},"net_amount":{"type":"integer","title":"Net Amount"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["paid_count","refund_count","pending_count","net_amount","currency"],"title":"TransactionSummaryRead","description":"Headline numbers for the admin ledger. `net_amount` sums the column, so\nit is already net of refunds — that is the point of storing a refund as a\nnegative row. `currency` falls back to \"pln\" when there is nothing paid."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerificationRead":{"properties":{"id":{"type":"string","title":"Id"},"kind":{"type":"string","title":"Kind"},"entity_kind":{"type":"string","title":"Entity Kind"},"holder_name":{"type":"string","title":"Holder Name"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"tier_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier Name"},"valid_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Valid From"},"valid_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Valid To"},"status":{"type":"string","title":"Status"},"is_valid":{"type":"boolean","title":"Is Valid"},"target_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Name"}},"type":"object","required":["id","kind","entity_kind","holder_name","type","tier","tier_name","valid_from","valid_to","status","is_valid"],"title":"VerificationRead","description":"One scanned credential, for the public verification page.\n\nThe endpoint serves two kinds — a qualification and an affiliation — and this\nis the union of both. They differ in exactly one field: `target_name` is the\nassociation an affiliation belongs to and is absent for a qualification,\nwhich has no target. `type` is None on the affiliation branch.\n\n`kind` says which one it is, and is the field to switch on."},"VoteCast":{"properties":{"option_ids":{"items":{"type":"string"},"type":"array","title":"Option Ids","default":[]}},"type":"object","title":"VoteCast","description":"The voter's selected option ids. The service enforces one option for a\nsingle-choice voting (and `max_choices` for a multi-choice one), refuses an\nempty selection (a vote is final, so there is nothing to retract) and refuses\na second vote from a unit that has already cast one."},"VotingClose":{"properties":{"result":{"anyOf":[{"type":"string","enum":["ACCEPTED","REJECTED"]},{"type":"null"}],"title":"Result"}},"type":"object","title":"VotingClose","description":"Closing a ballot. A NO_OBJECTION one needs the chair's decision — closing\nit IS the decision, taken in front of however many objections were raised —\nand a VOTE takes none: its result is the counts."},"VotingCreate":{"properties":{"question":{"type":"string","title":"Question"},"kind":{"type":"string","enum":["VOTE","NO_OBJECTION"],"title":"Kind","default":"VOTE"},"agenda_item_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Agenda Item Id"},"options":{"items":{"$ref":"#/components/schemas/VotingOptionIn"},"type":"array","title":"Options","default":[]},"is_multi":{"type":"boolean","title":"Is Multi","default":false},"max_choices":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Choices"},"winner_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Count"}},"type":"object","required":["question"],"title":"VotingCreate","description":"A ballot to put to the meeting. Send no options to get the three standard\nbuckets (za / przeciw / wstrzymał się) — the overwhelmingly common case.\n\n`max_choices` caps a multi-choice ballot (\"pick up to two\"); it is meaningless\nfor a single-choice one, where the cap is always one.\n\n`kind=\"NO_OBJECTION\"` is the other sort entirely — a statement carried unless\nsomebody objects. It takes no options (the server gives it the single\n\"Sprzeciw\" one) and no choice rules; there is nothing to choose."},"VotingGroupCreate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"organisation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organisation Id"}},"type":"object","title":"VotingGroupCreate","description":"A group made by hand. Give an `organisation_id` for a group that votes for\nan organisation (name defaults to the organisation's), or just a `name` for a\ncustom one — a key of the user's own (\"Zarząd\", \"Goście\")."},"VotingGroupUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"attendance":{"anyOf":[{"type":"string","enum":["PRESENT","ABSENT"]},{"type":"null"}],"title":"Attendance"}},"type":"object","title":"VotingGroupUpdate","description":"A group's name and whether it is here. Which organisation it votes for is\nfixed at creation (delete it and make another one to change that).\n\nBoth optional, and `attendance` uses the sentinel: present as null means \"go\nback to reading it off the members\", which is not the same as absent."},"VotingOptionIn":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"label":{"type":"string","title":"Label"},"eligible":{"type":"boolean","title":"Eligible","default":true}},"type":"object","required":["label"],"title":"VotingOptionIn","description":"One selectable option. `id` is optional on input — the service assigns a\nstable slug when omitted, so clients can just send labels.\n\n`eligible=False` is an option that can be CHOSEN but cannot WIN — an\nabstention, and whatever else a ballot offers as a way of declining to pick\none of the real answers. It is counted and shown like any other; it is simply\nnever a winner. See VOTE_OPTIONS, where the standard abstention is one."},"VotingUpdate":{"properties":{"question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question"},"agenda_item_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Agenda Item Id"},"options":{"anyOf":[{"items":{"$ref":"#/components/schemas/VotingOptionIn"},"type":"array"},{"type":"null"}],"title":"Options"},"is_multi":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Multi"},"max_choices":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Choices"},"winner_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Count"},"recorded_tally":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Recorded Tally"},"resolution_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Resolution Id"}},"type":"object","title":"VotingUpdate","description":"Edits to a prepared ballot. Only the fields present change; the service\nrefuses to touch the question or the options of one people have voted in —\nchanging what was asked after the fact would rewrite the record."},"WaveScoreUpsert":{"properties":{"judge_person_id":{"type":"string","format":"uuid","title":"Judge Person Id"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"}},"type":"object","required":["judge_person_id"],"title":"WaveScoreUpsert","description":"Set (or clear) one judge's score for a wave. score=None removes it."},"app__routers__documents__UploadUrlRequest":{"properties":{"filename":{"type":"string","title":"Filename"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["filename","content_type"],"title":"UploadUrlRequest"},"app__routers__images__SaveImageRequest":{"properties":{"entity_type":{"type":"string","enum":["organisation","person","governance_body","event"],"title":"Entity Type"},"entity_id":{"type":"string","format":"uuid","title":"Entity Id"},"url":{"type":"string","title":"Url"},"is_primary":{"type":"boolean","title":"Is Primary","default":true}},"type":"object","required":["entity_type","entity_id","url"],"title":"SaveImageRequest"},"app__routers__images__UploadUrlRequest":{"properties":{"entity_type":{"type":"string","enum":["organisation","person","governance_body","event","sponsor","featured"],"title":"Entity Type"},"entity_id":{"type":"string","format":"uuid","title":"Entity Id"},"filename":{"type":"string","title":"Filename"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["entity_type","entity_id","filename","content_type"],"title":"UploadUrlRequest"},"app__routers__me__SaveImageRequest":{"properties":{"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"SaveImageRequest"},"app__routers__me__SocialPayload":{"properties":{"platform":{"type":"string","title":"Platform"},"url":{"type":"string","title":"Url"}},"type":"object","required":["platform","url"],"title":"SocialPayload"},"app__routers__me__UploadUrlRequest":{"properties":{"filename":{"type":"string","title":"Filename"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["filename","content_type"],"title":"UploadUrlRequest"},"app__routers__socials__SocialPayload":{"properties":{"entity_type":{"type":"string","title":"Entity Type"},"entity_id":{"type":"string","format":"uuid","title":"Entity Id"},"platform":{"type":"string","title":"Platform"},"url":{"type":"string","title":"Url"}},"type":"object","required":["entity_type","entity_id","platform","url"],"title":"SocialPayload"}}},"tags":[{"name":"auth","description":"Sign-in: exchanges a Firebase ID token for a session JWT."},{"name":"me","description":"The signed-in user's own profile, memberships and qualification requests."},{"name":"permissions","description":"Who holds federation admin — explicit, revocable grants."},{"name":"persons","description":"People in the federation. A person's *type* is derived from the qualifications they hold."},{"name":"organisations","description":"Member organisations. Their *type* (club/school) is derived from their qualifications."},{"name":"organisation-persons","description":"Membership links between a person and an organisation."},{"name":"qualifications","description":"Annual qualifications for people and organisations — the source of truth for an entity's type."},{"name":"qualification-prices","description":"Price tiers per qualification type."},{"name":"affiliations","description":"Paid affiliations between a person and an association, and the tiers each association sells."},{"name":"credentials","description":"The signed-in user's wallet: qualifications and affiliations in one shape."},{"name":"transactions","description":"The purchase ledger — one record of every purchase, whatever was bought."},{"name":"verification","description":"Public qualification verification (the target of the QR code)."},{"name":"national-teams","description":"National team squads, seasons and rosters."},{"name":"events","description":"Competitions, camps and courses."},{"name":"competitions","description":"Competition setup: divisions, startlists and generated brackets on a competition-type event."},{"name":"registrations","description":"Paid event/division registration with tiered pricing (public checkout + admin pending list)."},{"name":"sponsors","description":"Organisation-owned sponsors, picked per competition."},{"name":"governance","description":"Governance bodies and their memberships."},{"name":"documents","description":"Governance documents (resolutions, minutes)."},{"name":"statutes","description":"An association's statute — one editable Markdown text, importable from a PDF."},{"name":"tasks","description":"An association's Task Market — its work board, backlog and archive."},{"name":"federation","description":"Federation-wide settings, incl. the main association."},{"name":"featured","description":"The spotlight item shown on the public home page hero."},{"name":"disciplines","description":"Discipline lookup tree, and the tags on people/organisations."},{"name":"organisation-disciplines","description":"Disciplines tagged to an organisation."},{"name":"person-disciplines","description":"Disciplines tagged to a person."},{"name":"socials","description":"Social links for people and organisations."},{"name":"images","description":"Polymorphic media (logos, photos) stored in GCS."},{"name":"dashboard","description":"Aggregated counts for the admin landing page."},{"name":"ask","description":"AI assistant over the database (read-only, tool-backed)."},{"name":"analytics","description":"Headline GA4 metrics for the admin Dashboard (Data API, read-only)."},{"name":"stats","description":"Federation-wide reports for the admin panel (read-only aggregates)."},{"name":"ops","description":"Operational endpoints. Unversioned — they never move with the API version."}]}