{"openapi":"3.1.0","info":{"title":"KleioBase API","version":"1.0.0","description":"Read and write your KleioBase research data.\n\nAuthenticate with an API key: `Authorization: Bearer kb_live_...`. API access needs a paid plan. A read key can call GET endpoints; a read_write key is needed for everything else.\n\nConventions\n- Lists take `limit` (default 25, max 100) and an opaque `cursor`, and return `{ data, next_cursor }`.\n- Errors are `{ error: { code, message, request_id, details? } }`. The set of codes is open.\n- Every response has `API-Version` and `Request-Id` headers. A 429 also has `Retry-After`.\n- Writes accept an optional `Idempotency-Key` header (1-255 characters, kept 24 hours). The same key with the same request replays the original response (same request_id, headers are not replayed). The same key with a different request is a 409. A 402, a 409 conflict, a 422 or a 429 changes nothing and does not use up the key: the same Idempotency-Key can be reused for the retry. Uploads are not idempotent.\n- Deleting a person, merging people and accepting a match are single requests. Every check runs first, so a refused request changes nothing.\n- Bulk requests take at most 100 ids and are all or nothing: if any id is not in the workspace, the request is a 404 and nothing changes.\n- Processing a record is asynchronous: POST .../process returns 202, then poll GET .../records/{record_id}. GEDCOM imports and exports work the same way: start (202), then poll the job.\n- Dates are GEDCOM-style strings as stored (for example \"ABT 1890\"), plus a derived integer `year` where available."},"servers":[{"url":"https://kleiobase.com/api/v1"}],"security":[{"apiKey":[]}],"tags":[{"name":"Meta","description":"The API's own description: this OpenAPI document, readable without a key."},{"name":"Workspaces","description":"List, create, rename, archive and restore your workspaces. Every other resource lives under one."},{"name":"People","description":"Read, create, edit, merge, unmerge and delete the people in a workspace; read a person's timeline, close family, tree and expected records; add and remove relatives."},{"name":"Families","description":"Read and create families, edit a couple's status or events, and add or remove partners and children."},{"name":"Records","description":"Upload a record, run AI extraction, review and confirm the result, link or unlink people, and move records to the Trash."},{"name":"Trash","description":"Trashed people and records: list, restore or permanently delete them."},{"name":"Places","description":"Places derived from a workspace's people and confirmed records: list them, read one with its people and events, and get place-name suggestions."},{"name":"Events","description":"Dated life events derived from people's facts, filterable by person and year."},{"name":"Conflicts","description":"Conflicting facts in a workspace, computed on demand: resolve a person's competing birth families, or fold spelling variants of a fact into one value."},{"name":"Matches","description":"Suggested duplicate people: review them, then accept (merge) or reject. A group of duplicates can be merged in one request."},{"name":"Findings","description":"Research findings the app has detected, such as gaps: read, resolve or dismiss."},{"name":"Folders","description":"Folders for people and records: list, create, rename, move and delete them, and move items into one."},{"name":"Tags","description":"Tags for people and records: list, create, rename, recolour and delete them, and add or remove them on many items at once."},{"name":"Search","description":"Search a workspace's people, records and places, as the app's search box."},{"name":"Notifications","description":"The notifications the app shows in a workspace: list them, count the unread ones, and mark them read."},{"name":"Health","description":"The tree health score of a workspace, its pillars and suggested quick wins."},{"name":"Conversations","description":"Past Research Companion conversations: read them with their messages and attached files, rename or delete them. Nothing can be sent through the API."},{"name":"GEDCOM","description":"Import a GEDCOM file into a workspace, and export a workspace as GEDCOM. Both run in the background: start, then poll the job."}],"paths":{"/openapi.json":{"get":{"tags":["Meta"],"summary":"This document","description":"Public. No API key needed. Rate limited per IP.","security":[],"responses":{"200":{"description":"The OpenAPI 3.1 document.","content":{"application/json":{"schema":{"type":"object"}}}},"429":{"description":"Rate limit exceeded.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces":{"get":{"tags":["Workspaces"],"summary":"List workspaces","description":"Workspaces the key's owner owns. Not paginated: next_cursor is always null.","responses":{"200":{"description":"Workspaces.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceList"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["Workspaces"],"summary":"Create a workspace","description":"Your plan's limit on active workspaces applies (archived workspaces do not count). Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceCreate"}}}},"responses":{"201":{"description":"The created workspace.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Workspace"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required). Also: the plan's workspace limit is reached (details has limit, used and plan).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}":{"patch":{"tags":["Workspaces"],"summary":"Rename a workspace","description":"Archived workspaces can be renamed too. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceRename"}}}},"responses":{"200":{"description":"The renamed workspace.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Workspace"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/archive":{"post":{"tags":["Workspaces"],"summary":"Archive a workspace","description":"An archived workspace is read-only: reads work, writes return 409, and it does not count toward your plan's workspace limit. Nothing is deleted. Restore it with POST .../restore. Archiving a workspace that is already archived changes nothing. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"}}}},"responses":{"200":{"description":"Archived.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency-Key was reused with a different request, or a request with it is still in progress. Also: the default workspace can't be archived.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/restore":{"post":{"tags":["Workspaces"],"summary":"Restore an archived workspace","description":"Your plan's limit on active workspaces is checked again. Restoring a workspace that is not archived changes nothing. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"}}}},"responses":{"200":{"description":"Restored.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required). Also: the plan's workspace limit is reached (details has limit, used and plan).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/people":{"get":{"tags":["People"],"summary":"List people","description":"Each person carries folder_id and tag_ids.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"},{"name":"q","in":"query","required":false,"description":"Name search (accent-insensitive, max 200 characters).","schema":{"type":"string"}},{"name":"folder_id","in":"query","required":false,"description":"Only people in this folder.","schema":{"type":"string","format":"uuid"}},{"name":"tag_id","in":"query","required":false,"description":"Only people with this tag.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"A page of people.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonList"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: folder_id or tag_id is not in this workspace.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid limit, cursor, q, folder_id or tag_id, or folder_id is a folder of records.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["People"],"summary":"Create a person","description":"Matching for the new person is queued, never run inline. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonWrite"}}}},"responses":{"201":{"description":"The created person.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Person"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required). Also: the plan's person limit is reached.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/people/{person_id}":{"get":{"tags":["People"],"summary":"Get a person","description":"The person plus the ids of their families and linked records.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/PersonId"}],"responses":{"200":{"description":"The person.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonDetail"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The person does not exist, is in Trash, or is in another workspace.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["People"],"summary":"Update a person","description":"At least one field is required. Pending matches are re-scored; new match candidates are found by the scheduled run. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/PersonId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonWrite"}}}},"responses":{"200":{"description":"The updated person.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Person"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The person does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["People"],"summary":"Move a person to Trash","description":"No body. The person can be restored with POST .../trash/restore. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/PersonId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Moved to Trash.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The person does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/people/delete":{"post":{"tags":["People"],"summary":"Move many people to Trash","description":"All or nothing: every id must be a live person in this workspace, or nothing is moved. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkIds"}}}},"responses":{"200":{"description":"Moved to Trash.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkTrashed"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: A person does not exist, is not visible, or is already in Trash.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: Invalid body: 1 to 100 UUIDs.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/people/{person_id}/timeline":{"get":{"tags":["People"],"summary":"Get a person's timeline","description":"Dated entries first (ascending), then undated. Not paginated.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/PersonId"}],"responses":{"200":{"description":"Timeline entries.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimelineResponse"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The person does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/people/{person_id}/merge":{"post":{"tags":["People"],"summary":"Merge two people","description":"The path person is the survivor; other_person_id is absorbed into it. To undo it, send the returned match_id to POST .../people/{person_id}/unmerge. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/PersonId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergeExecute"}}}},"responses":{"200":{"description":"Merged. Returns the surviving person.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonMerged"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: A person does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: Same person twice, a man and a woman, or a field_choices side with no value.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/people/{person_id}/family":{"get":{"tags":["People"],"summary":"Get a person's parents, partners and children","description":"Each relative comes with the family it is linked through. A partner entry with person_id null is a family the person heads alone.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/PersonId"}],"responses":{"200":{"description":"The person's close family.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FamilyContext"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The person does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/people/{person_id}/tree":{"get":{"tags":["People"],"summary":"Get tree data from a person","description":"People, families (unions) and the edges between them, walked from the person. Data only, no layout.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/PersonId"},{"name":"direction","in":"query","required":false,"description":"ancestors, descendants or both (default both).","schema":{"type":"string","enum":["ancestors","descendants","both"],"default":"both"}},{"name":"depth","in":"query","required":false,"description":"Generations to walk, 1 to 8 (default 4).","schema":{"type":"integer","minimum":1,"maximum":8,"default":4}},{"name":"parents","in":"query","required":false,"description":"For a person with more than one set of parents, which family to climb: comma-separated person_id.family_id pairs. Malformed pairs are ignored.","schema":{"type":"string"}}],"responses":{"200":{"description":"The tree data.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonTree"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The person does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid direction or depth.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/people/{person_id}/expected-records":{"get":{"tags":["People"],"summary":"List records a person should have","description":"Open research targets (for example a census the person should appear in), highest priority first.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/PersonId"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"A page of expected records.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpectedRecordList"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The person does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid limit or cursor.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/people/{person_id}/relatives":{"post":{"tags":["People"],"summary":"Add a relative","description":"Link the person to a partner, parent, child, sibling or associate: an existing person (person_id) or a new one created in the same request (new_person). Same rules as the app, including the plan's person limit. Matching is queued, never run inline. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/PersonId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelativeAdd"}}}},"responses":{"200":{"description":"Linked to an existing person.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelativeAdded"}}}},"201":{"description":"A new person was created and linked.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelativeAdded"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required). Also: the plan's person limit is reached (details: limit, used, plan).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: A person or the family does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress. Also: The family's partner or parent slot is already taken.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: Invalid body, a field sent for the wrong type, a person linked to themselves, or a link the family rules refuse.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["People"],"summary":"Remove a relationship","description":"The people are not deleted. Removing a link that does not exist changes nothing. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/PersonId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelativeRemove"}}}},"responses":{"200":{"description":"Removed.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: A person does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: Invalid body, or the same person twice.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/people/{person_id}/unmerge":{"post":{"tags":["People"],"summary":"Undo a merge","description":"The path person must be the merge's survivor. A group merge is undone as a whole. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/PersonId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Unmerge"}}}},"responses":{"200":{"description":"Unmerged.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnmergeResult"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The match does not exist, is not visible, or the person is not its survivor.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress. Also: The match is not a merge (nothing to unmerge).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/expected-records/{expected_record_id}":{"patch":{"tags":["People"],"summary":"Dismiss an expected record","description":"{ dismissed: true } is the only change allowed. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/ExpectedRecordId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpectedRecordPatch"}}}},"responses":{"200":{"description":"Dismissed.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The expected record does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/families":{"get":{"tags":["Families"],"summary":"List families","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"A page of families.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FamilyList"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid limit or cursor.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["Families"],"summary":"Create a family","description":"1-2 partner_ids are required; children are optional. At least two people in total. The 201 body carries warnings when an extra child could not be attached. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FamilyCreate"}}}},"responses":{"201":{"description":"The created family.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FamilyCreated"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required). Also: the plan's person limit is reached.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: A person does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/families/{family_id}":{"get":{"tags":["Families"],"summary":"Get a family","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/FamilyId"}],"responses":{"200":{"description":"The family.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Family"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The family does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["Families"],"summary":"Edit a couple's status or event","description":"Set the relationship status, one family event, or both. Setting the same event again replaces it. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/FamilyId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FamilyPatch"}}}},"responses":{"200":{"description":"The updated family.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Family"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The family does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: Invalid body, an empty body, or EVEN without a type.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/families/{family_id}/members":{"post":{"tags":["Families"],"summary":"Add a partner or child","description":"Matching is queued, never run inline. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/FamilyId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FamilyMemberAdd"}}}},"responses":{"200":{"description":"The updated family.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Family"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The family or person does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress. Also: The person is already in the family, or the partner slot is taken.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: Invalid body, or pedigree sent for a partner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["Families"],"summary":"Remove a partner or child","description":"People are not deleted. If removing the last partner leaves an empty family, the family is removed and the response is {ok, family_deleted, id}. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/FamilyId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FamilyMemberRemove"}}}},"responses":{"200":{"description":"The updated family, or a family_deleted notice.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Family"},{"$ref":"#/components/schemas/FamilyDeleted"}]}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The family does not exist, or the person is not in that role in it.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/records":{"get":{"tags":["Records"],"summary":"List records","description":"Each record carries folder_id and tag_ids. Use ids to poll a batch of records in one read.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"},{"name":"status","in":"query","required":false,"description":"Filter by status.","schema":{"type":"string","enum":["pending","processing","review","confirmed","failed"]}},{"name":"folder_id","in":"query","required":false,"description":"Only records in this folder.","schema":{"type":"string","format":"uuid"}},{"name":"tag_id","in":"query","required":false,"description":"Only records with this tag.","schema":{"type":"string","format":"uuid"}},{"name":"ids","in":"query","required":false,"description":"Only these records: 1 to 50 comma-separated record ids. Ids not in the workspace are left out.","schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}(,[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}){0,49}$"}}],"responses":{"200":{"description":"A page of records.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordList"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: folder_id or tag_id is not in this workspace.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid limit, cursor, status, folder_id, tag_id or ids, or folder_id is a folder of people.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["Records"],"summary":"Upload a record","description":"Multipart upload of a JPG or PNG. The record is created as pending; call POST .../process next. Uploads are NOT idempotent: a retry creates another record, and Idempotency-Key is ignored. Counts against both the request and the upload rate limits.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary","description":"JPG or PNG image."},"source_text":{"type":"string","description":"Optional text transcription of the image."},"source_text_layout":{"type":"string","description":"Optional layout hint for source_text."}}}}}},"responses":{"201":{"description":"The created record, in pending.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Record"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Not multipart, no valid file, wrong type or size, or other upload checks failed.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After. Also: the upload burst limit was hit.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/records/{record_id}":{"get":{"tags":["Records"],"summary":"Get a record","description":"Poll this after POST .../process until status is review or failed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/RecordId"}],"responses":{"200":{"description":"The record.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Record"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The record does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["Records"],"summary":"Edit a record's title or type","description":"At least one of title and record_type. There is no date field: dates live in the extraction. Changing record_type returns 409 while the record is processing. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/RecordId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordPatch"}}}},"responses":{"200":{"description":"The updated record.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Record"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The record does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress. Also: The record type cannot change while the record is processing.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["Records"],"summary":"Move a record to Trash","description":"No body. The record can be restored with POST .../trash/restore. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/RecordId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Moved to Trash.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The record does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress. Also: The record is still being processed.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/records/delete":{"post":{"tags":["Records"],"summary":"Move many records to Trash","description":"All or nothing: every id must be a live record in this workspace and none may be processing, or nothing is moved. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkIds"}}}},"responses":{"200":{"description":"Moved to Trash.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkTrashed"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: A record does not exist, is not visible, or is already in Trash.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress. Also: A record is still being processed.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: Invalid body: 1 to 100 UUIDs.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/trash":{"get":{"tags":["Trash"],"summary":"List the Trash","description":"Newest deletion first.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"},{"name":"type","in":"query","required":false,"description":"people or records (default both).","schema":{"type":"string","enum":["people","records"]}}],"responses":{"200":{"description":"A page of trashed items.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrashList"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid limit, cursor or type.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/trash/restore":{"post":{"tags":["Trash"],"summary":"Restore from Trash","description":"At least one id, at most 100 in total. All or nothing: every id must be in this workspace's Trash. A restored person brings their trashed linked records back with them. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrashIds"}}}},"responses":{"200":{"description":"Restored.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrashRestored"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: An item does not exist, is not visible, or is not in Trash.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: Invalid body.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/trash/delete":{"post":{"tags":["Trash"],"summary":"Permanently delete from Trash","description":"Cannot be undone. Only items already in Trash: at least one id, at most 100 in total. All or nothing: every id must be in this workspace's Trash. Record image files are deleted too. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrashIds"}}}},"responses":{"200":{"description":"Deleted.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrashDeleted"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: An item does not exist, is not visible, or is not in Trash.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress. Also: A person still has people merged into them who are not in the request (details.merged_person_ids). Nothing is deleted.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: Invalid body.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/records/{record_id}/image":{"get":{"tags":["Records"],"summary":"Get a signed image URL","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/RecordId"},{"name":"variant","in":"query","required":false,"description":"original (default): the uploaded file. thumbnail: the stored 1000 px WebP preview.","schema":{"type":"string","enum":["original","thumbnail"]}}],"responses":{"200":{"description":"A signed URL valid for 5 minutes.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordImage"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The record does not exist or is not visible, or (variant=thumbnail) it has no stored thumbnail.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid variant.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/records/{record_id}/process":{"post":{"tags":["Records"],"summary":"Start AI extraction","description":"Asynchronous. Returns 202 once credits are charged; the extraction then runs in the background. Poll GET .../records/{record_id} until status is review or failed. A 409 'already being processed' can last up to about 35 minutes after a crashed run, until the cleanup sweep recovers it. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/RecordId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordProcess"}}}},"responses":{"202":{"description":"Processing started.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordProcessAccepted"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Not enough credits. details has used, limit, credits_remaining and shortfall.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The record does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress. Also: The record is not in a processable state, or it is already being processed.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After. Also: too many records are processing at once.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/records/{record_id}/extraction":{"get":{"tags":["Records"],"summary":"Get the extraction","description":"For review before confirm, and still readable after it.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/RecordId"}],"responses":{"200":{"description":"The stored extraction.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractionResponse"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The record does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The record has no extraction yet (pending, processing or failed).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["Records"],"summary":"Replace the extraction","description":"Send the whole edited extraction. Nothing is created until you confirm. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/RecordId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractionPatch"}}}},"responses":{"200":{"description":"The stored extraction.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractionResponse"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The record does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress. Also: The record is not in review.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/records/{record_id}/confirm":{"post":{"tags":["Records"],"summary":"Confirm a reviewed record","description":"Creates people, links and families from the stored extraction. Without an Idempotency-Key, a retry after success returns 409 because the record is already confirmed. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/RecordId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Confirmed. Returns the linked people.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordConfirmed"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required). Also: confirming would exceed the plan's person limit (details has used, limit, attempted).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The record does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress. Also: The record is not in review, or it has no extraction.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/records/{record_id}/people":{"post":{"tags":["Records"],"summary":"Link a person to a record","description":"Matching is queued, never run inline. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/RecordId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordLink"}}}},"responses":{"201":{"description":"Linked.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordLinked"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The record or person does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress. Also: The person is already linked to this record.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["Records"],"summary":"Unlink a person from a record","description":"Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/RecordId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordUnlink"}}}},"responses":{"200":{"description":"Unlinked.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The record or person does not exist, or they are not linked.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/places":{"get":{"tags":["Places"],"summary":"List places","description":"Derived from people and confirmed records. Ordered by name. A place's id is stable and opaque. coordinates come from the geocode cache only: a list never geocodes, so a place not geocoded yet has null coordinates.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"},{"name":"q","in":"query","required":false,"description":"Place name filter (max 200 characters).","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of places.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceList"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid limit, cursor or q.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/places/{place_id}":{"get":{"tags":["Places"],"summary":"Get a place","description":"The place, who is connected to it and the events there. When the place is not in the geocode cache yet it is geocoded once now, which also counts against the app's geocoding rate limit (429 with Retry-After when it is reached). coordinates is null when the place cannot be found on the map.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/PlaceId"}],"responses":{"200":{"description":"The place.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceDetail"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The place id is invalid or the place is not in this workspace.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/places/suggestions":{"get":{"tags":["Places"],"summary":"Suggest place names","description":"Place names already used in the workspace that match q, as the app's place field suggests them: matches at the start of a word first. At most 20. Not paginated: next_cursor is always null.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"name":"q","in":"query","required":false,"description":"What was typed so far (1 to 100 characters). Matching ignores case and accents.","schema":{"type":"string"}}],"responses":{"200":{"description":"Suggestions.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceSuggestionList"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"q is missing or longer than 100 characters.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/events":{"get":{"tags":["Events"],"summary":"List events","description":"Derived from people's dated facts; events have no ids. In v1 date and record_id are always null; use year.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"},{"name":"person_id","in":"query","required":false,"description":"Only events of this person.","schema":{"type":"string","format":"uuid"}},{"name":"year_from","in":"query","required":false,"description":"First year, 4 digits.","schema":{"type":"string","pattern":"^\\d{4}$"}},{"name":"year_to","in":"query","required":false,"description":"Last year, 4 digits.","schema":{"type":"string","pattern":"^\\d{4}$"}}],"responses":{"200":{"description":"A page of events.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventList"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid limit, cursor, person_id or year.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/conflicts":{"get":{"tags":["Conflicts"],"summary":"List conflicts","description":"Computed on demand. Not paginated: next_cursor is always null.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"}],"responses":{"200":{"description":"Conflicts.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictList"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/conflicts/resolve":{"post":{"tags":["Conflicts"],"summary":"Resolve a birth-family conflict","description":"For a person with more than one birth family. keep_family keeps family_id as the birth family and marks the others adopted; change_pedi sets pedigree on the link to family_id. Returns the person's conflicts after the change. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictResolve"}}}},"responses":{"200":{"description":"The person's conflicts still open after the change (an empty list when none remain).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictList"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The person does not exist or is not visible, or family_id is not one of their parent families.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: Invalid body (pedigree is required for change_pedi).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/conflicts/fact-variants/resolve":{"post":{"tags":["Conflicts"],"summary":"Resolve spelling variants of a fact","description":"Folds folded_values into keep_value (kept as alternate wordings, so no source loses its evidence) and/or keeps pin_values apart as genuinely different facts. Returns the person's conflicts after the change. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactVariantsResolve"}}}},"responses":{"200":{"description":"The person's conflicts still open after the change (an empty list when none remain).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictList"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The person does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: Invalid body, keep_value not recorded under that label, or the person's limit of kept-apart groups is reached.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/matches":{"get":{"tags":["Matches"],"summary":"List pending match suggestions","description":"A page can be shorter than limit when matches with a trashed person are dropped. Keep following next_cursor.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"A page of pending matches.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchList"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid limit or cursor.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/matches/{match_id}/reject":{"post":{"tags":["Matches"],"summary":"Reject a match","description":"The pair is not suggested again. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/MatchId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"}}}},"responses":{"200":{"description":"Rejected.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The match does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress. Also: The match is already resolved.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/matches/{match_id}/accept":{"post":{"tags":["Matches"],"summary":"Accept a match (merge)","description":"Merges the match's two people. The body is optional; survivor_id defaults to person_a_id. To undo it, send the returned match_id to POST .../people/{person_id}/unmerge with the survivor in the path. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/MatchId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchAcceptExecute"}}}},"responses":{"200":{"description":"Merged. Returns the surviving person.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchAccepted"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The match does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress. Also: The match is already resolved, or one of its people is gone.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: survivor_id is not one of the match's two people, or a man and a woman.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/matches/merge-group":{"post":{"tags":["Matches"],"summary":"Merge a group of duplicates","description":"Merge every other person in person_ids into survivor_id, as one undoable group: unmerging any of the returned match_ids restores the whole group. If a later person cannot be merged, the earlier merges stand and that person is listed in failed. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergeGroup"}}}},"responses":{"200":{"description":"Merged.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergeGroupResult"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: A person does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: Fewer than 2 or more than 20 people, survivor_id not in person_ids, or a man and a woman.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/findings":{"get":{"tags":["Findings"],"summary":"List findings","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"},{"name":"status","in":"query","required":false,"description":"Filter by status (lowercase letters and underscores).","schema":{"type":"string"}},{"name":"type","in":"query","required":false,"description":"Filter by finding type.","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of findings.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingList"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid limit, cursor, status or type.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/findings/{finding_id}":{"get":{"tags":["Findings"],"summary":"Get a finding","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/FindingId"}],"responses":{"200":{"description":"The finding.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Finding"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The finding does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/findings/{finding_id}/resolve":{"post":{"tags":["Findings"],"summary":"Resolve a finding","description":"The optional note is stored but not returned in v1. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/FindingId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingResolve"}}}},"responses":{"200":{"description":"Resolved.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The finding does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress. Also: The finding is not active.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/findings/{finding_id}/dismiss":{"post":{"tags":["Findings"],"summary":"Dismiss a finding","description":"A dismissed finding is not created again. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/FindingId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"}}}},"responses":{"200":{"description":"Dismissed.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The finding does not exist or is not visible.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress. Also: The finding is not active.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/folders":{"get":{"tags":["Folders"],"summary":"List folders","description":"A flat list; build the tree from parent_id. People and records have separate folder trees. Not paginated: next_cursor is always null.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"name":"kind","in":"query","required":false,"description":"Only folders of people or of records.","schema":{"type":"string","enum":["people","records"]}}],"responses":{"200":{"description":"Folders.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderList"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid kind.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["Folders"],"summary":"Create a folder","description":"Folders nest up to 10 levels; a workspace has at most 500. Names are unique among siblings, ignoring case. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderCreate"}}}},"responses":{"201":{"description":"The created folder.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Folder"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: parent_id is not a folder in this workspace.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress. Also: a sibling folder already has this name.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: Invalid name, a parent of the other kind, too deep, or the folder limit is reached.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/folders/{folder_id}":{"patch":{"tags":["Folders"],"summary":"Rename or move a folder","description":"parent_id null moves it to the top level. The counts in the response are 0; GET folders has them. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/FolderId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderPatch"}}}},"responses":{"200":{"description":"The folder.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Folder"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The folder or parent_id is not a folder in this workspace.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress. Also: a sibling folder already has this name.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: Invalid body, a parent of the other kind, too deep, or a move into the folder itself or one of its own subfolders.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["Folders"],"summary":"Delete a folder","description":"Only the folder is deleted: its subfolders and items move up into its parent (or to the top level). Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/FolderId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Deleted.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The folder is not in this workspace.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/folders/{folder_id}/items":{"post":{"tags":["Folders"],"summary":"Move items into a folder","description":"1 to 100 ids of kind. An item is in at most one folder, so it leaves its current folder. All or nothing: every id must be a person or record of that kind in this workspace and not in Trash. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/FolderId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderItems"}}}},"responses":{"200":{"description":"Moved.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderItemsMoved"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The folder, or one of the items, is not in this workspace (or the item is in Trash).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: Invalid body, or kind does not match the folder.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/folders/unfile":{"post":{"tags":["Folders"],"summary":"Move items to the top level","description":"Takes 1 to 100 people or records out of their folder, as Top level in the app's Move to folder. An item already at the top level stays there. All or nothing: every id must be a person or record of that kind in this workspace and not in Trash. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderItems"}}}},"responses":{"200":{"description":"Moved.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderItemsMoved"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: One of the items is not in this workspace (or is in Trash).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: Invalid body.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/tags":{"get":{"tags":["Tags"],"summary":"List tags","description":"By name. Not paginated: next_cursor is always null.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"}],"responses":{"200":{"description":"Tags.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagList"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["Tags"],"summary":"Create a tag","description":"A workspace has at most 200 tags. Tags are shared by people and records. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagCreate"}}}},"responses":{"201":{"description":"The created tag.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tag"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress. Also: a tag with this name already exists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: Invalid name or colour, or the tag limit is reached.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/tags/{tag_id}":{"patch":{"tags":["Tags"],"summary":"Rename or recolour a tag","description":"The counts in the response are 0; GET tags has them. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/TagId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagPatch"}}}},"responses":{"200":{"description":"The tag.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tag"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The tag is not in this workspace.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress. Also: a tag with this name already exists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: Invalid body.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["Tags"],"summary":"Delete a tag","description":"The tag comes off every person and record that had it. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/TagId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Deleted.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: The tag is not in this workspace.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/tags/apply":{"post":{"tags":["Tags"],"summary":"Add or remove tags on items","description":"1 to 100 ids of kind, up to 50 tag ids in add and in remove. Adding a tag an item already has changes nothing. All or nothing: every item must be in this workspace and not in Trash, and every tag must be in this workspace. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagApply"}}}},"responses":{"200":{"description":"Applied.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagsApplied"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: One of the items or tags is not in this workspace (or the item is in Trash).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: Invalid body, neither add nor remove, or the same tag in both.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/search":{"get":{"tags":["Search"],"summary":"Search","description":"People by name, birth place or birth date; records by title, file name, type, event place or date, or a matched person; places on records. Up to 5 people, 5 records and 3 places.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"name":"q","in":"query","required":false,"description":"1 to 200 characters. Names match ignoring case, accents and punctuation.","schema":{"type":"string"}}],"responses":{"200":{"description":"Results.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResults"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"q is missing or longer than 200 characters.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/notifications":{"get":{"tags":["Notifications"],"summary":"List notifications","description":"Newest first: this workspace's notifications plus account-wide ones (for example about credits), which appear in every workspace. At most 50 per page, whatever limit asks for. Keep following next_cursor.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"},{"name":"unread","in":"query","required":false,"description":"true for unread only.","schema":{"type":"string","enum":["true","false"]}}],"responses":{"200":{"description":"A page of notifications.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationList"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid limit, cursor or unread.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/notifications/unread-count":{"get":{"tags":["Notifications"],"summary":"Count unread notifications","parameters":[{"$ref":"#/components/parameters/WorkspaceId"}],"responses":{"200":{"description":"The count.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnreadCount"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/notifications/read":{"post":{"tags":["Notifications"],"summary":"Mark notifications read","description":"Send { ids } (1 to 100) or { all: true }. With ids, all or nothing: every id must be a notification of this workspace (or account-wide); one already read is fine. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationsRead"}}}},"responses":{"200":{"description":"Marked.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationsMarked"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: One of the ids is not a notification visible in this workspace.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: Invalid body.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/health":{"get":{"tags":["Health"],"summary":"Get the tree health score","description":"A recently computed score is reused; an older one is recomputed now, as on the app's dashboard. All fields are null (and quick_wins empty) while the workspace has no people, or when the score could not be computed this time.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"}],"responses":{"200":{"description":"The score.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/health/refresh":{"post":{"tags":["Health"],"summary":"Recompute the tree health score","description":"Recomputes and stores the score now. Same response as GET .../health. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyBody"}}}},"responses":{"200":{"description":"The score.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/conversations":{"get":{"tags":["Conversations"],"summary":"List conversations","description":"Newest first by updated_at, as the app lists them. A conversation that gets a new message or a new title moves to the front, so it can appear again on a later page.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"A page of conversations.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationList"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid limit or cursor.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/conversations/{conversation_id}":{"get":{"tags":["Conversations"],"summary":"Get a conversation with its messages","description":"One page of messages, oldest first (limit and cursor page the messages). Messages are as the user saw them: what they sent and the companion's replies, the people and records each reply cites, and the files and knowledge base items each message carried. The companion's internal working (its reasoning, tool calls, summaries) is not included.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/ConversationId"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"The conversation and a page of messages.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationDetail"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: the conversation is not in this workspace.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid limit or cursor.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["Conversations"],"summary":"Rename a conversation","description":"Only the title can be changed. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/ConversationId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationPatch"}}}},"responses":{"200":{"description":"The conversation.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Conversation"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: the conversation is not in this workspace.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: Invalid body.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["Conversations"],"summary":"Delete a conversation","description":"Deletes the conversation, its messages and its attached files, as deleting it in the app does. It cannot be undone. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/ConversationId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Deleted.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: the conversation is not in this workspace.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/conversations/{conversation_id}/files/{file_id}":{"get":{"tags":["Conversations"],"summary":"Get a download URL for an attached file","description":"A signed URL for the file as it was uploaded. It works for 5 minutes; ask again for a new one.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/ConversationId"},{"$ref":"#/components/parameters/FileId"}],"responses":{"200":{"description":"The signed URL.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationFileUrl"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: the conversation is not in this workspace, or the file is not attached to it.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/gedcom/imports":{"post":{"tags":["GEDCOM"],"summary":"Upload a GEDCOM file to import","description":"Starts reading the file in the background; nothing is added to the workspace yet. Poll GET .../gedcom/imports/{import_id} until status is awaiting_confirmation, check the analysis and the plan limit check, then confirm. Counts against the upload rate limit as well. Not idempotent: a retry uploads the file again.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary","description":"A .ged file (up to 75 MB), or a .gdz (GEDZIP) archive up to 300 MB. A GEDZIP archive named .zip is accepted too."}}}}}},"responses":{"202":{"description":"The import job, analyzing.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GedcomImportStarted"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Not multipart, no file, not a .ged, .gdz or .zip file, or the file is too large.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/gedcom/imports/{import_id}":{"get":{"tags":["GEDCOM"],"summary":"Get a GEDCOM import","description":"Poll this after uploading. When awaiting_confirmation, `analysis` describes the file and the cap_check fields say whether each import mode fits the plan's person limit. When completed, `result` says what was added.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/ImportId"}],"responses":{"200":{"description":"The import job.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GedcomImport"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: the import is not in this workspace.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["GEDCOM"],"summary":"Cancel a GEDCOM import","description":"Cancels an import that is awaiting confirmation, as cancelling the preview in the app does: nothing is added to the workspace and the uploaded file is deleted. The status becomes cancelled. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/ImportId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Cancelled.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: the import is not in this workspace.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress. Also: the import is not awaiting confirmation (still analyzing, already confirmed, failed, cancelled or expired).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/gedcom/imports/{import_id}/confirm":{"post":{"tags":["GEDCOM"],"summary":"Confirm a GEDCOM import","description":"Adds the people, families and sources to the workspace in the background, as confirming the import in the app does. Poll GET .../gedcom/imports/{import_id} until completed. Counts against the upload rate limit as well. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/ImportId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GedcomImportConfirm"}}}},"responses":{"202":{"description":"Importing.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GedcomImportStarted"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required). Also: the import would pass the plan's person limit (details: limit, used, needed, plan), or mode changed needs the Researcher plan or above.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: the import is not in this workspace.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The workspace is archived (writes are refused). Also: Idempotency-Key was reused with a different request, or a request with it is still in progress. Also: the import is not awaiting confirmation (still analyzing, already confirmed, failed, cancelled or expired), or its file is no longer available.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: Invalid body.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/gedcom/exports":{"post":{"tags":["GEDCOM"],"summary":"Export the workspace as GEDCOM","description":"Builds the file in the background. Poll GET .../gedcom/exports/{export_id} until ready for a download URL. No email is sent. One export at a time per account. Archived workspaces can be exported. Replays of an Idempotency-Key return the original body and request_id; headers are not replayed.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GedcomExportCreate"}}}},"responses":{"202":{"description":"The export job, queued.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GedcomExportStarted"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan, or the key is read-only (a read_write key is required).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency-Key was reused with a different request, or a request with it is still in progress. Also: an export is already being prepared.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed. A bad Idempotency-Key (1-255 characters) is also a 422. Also: Invalid body.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/gedcom/exports/{export_id}":{"get":{"tags":["GEDCOM"],"summary":"Get a GEDCOM export","description":"When ready, `download` has a signed URL that works for 5 minutes; poll again for a new one. Finished exports are deleted after 7 days.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"},{"$ref":"#/components/parameters/ExportId"}],"responses":{"200":{"description":"The export job.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GedcomExport"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner. Also: the export is not in this workspace.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/workspaces/{workspace_id}/gedcom/exports/redaction-preview":{"get":{"tags":["GEDCOM"],"summary":"Preview who redact_living hides","description":"The people whose details an export with redact_living leaves out, by the same rule the export uses.","parameters":[{"$ref":"#/components/parameters/WorkspaceId"}],"responses":{"200":{"description":"The people that would be hidden.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GedcomRedactionPreview"}}}},"401":{"description":"Missing, malformed, unknown or revoked API key.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The account has no paid plan.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The workspace does not exist or is not visible to this key's owner.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait the number of seconds in Retry-After.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected error. Retry later and quote request_id if it persists.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"A KleioBase API key (kb_live_...)."}},"schemas":{"BulkIds":{"type":"object","properties":{"ids":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["ids"],"additionalProperties":false},"BulkTrashed":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"ids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"The ids moved to the Trash (all of the ones sent)."}},"required":["ok","ids"]},"Conflict":{"type":"object","properties":{"type":{"type":"string"},"person_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"related_person_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"family_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"details":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":["number","string","null"]}}},"required":["type","person_id","related_person_id","family_id","details"]},"ConflictList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Conflict"}},"next_cursor":{"description":"Pass as ?cursor to get the next page. Null on the last page.","type":["string","null"]}},"required":["data","next_cursor"]},"ConflictResolve":{"oneOf":[{"type":"object","properties":{"action":{"type":"string","const":"keep_family"},"person_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"family_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"One of the person's parent families."}},"required":["action","person_id","family_id"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","const":"change_pedi"},"person_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"family_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"One of the person's parent families."},"pedigree":{"type":"string","enum":["adopted","foster","other"],"description":"The person's relationship to that family."}},"required":["action","person_id","family_id","pedigree"],"additionalProperties":false}]},"Conversation":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"title":{"type":"string"},"created_at":{"type":"string"},"updated_at":{"type":"string","description":"Changes when a message is added or the conversation is renamed."},"message_count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Messages the user sees in the conversation (their own and the companion's replies)."}},"required":["id","title","created_at","updated_at","message_count"]},"ConversationAttachedItem":{"type":"object","properties":{"type":{"type":"string","enum":["record","person","match","conflict","finding"]},"id":{"type":"string","description":"The item's id, for GET .../records/{id}, .../people/{id}, .../matches or .../findings/{id}. A conflict's id is an opaque key, not a UUID; GET .../conflicts lists the conflicts that are still open."}},"required":["type","id"]},"ConversationAttachment":{"type":"object","properties":{"file_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Pass to GET .../conversations/{conversation_id}/files/{file_id} for a download URL."},"filename":{"type":"string"},"mime_type":{"type":"string","description":"image/jpeg, image/png, image/webp or application/pdf."}},"required":["file_id","filename","mime_type"]},"ConversationCitation":{"type":"object","properties":{"type":{"type":"string","enum":["person","record"]},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["type","id"]},"ConversationDetail":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"title":{"type":"string"},"created_at":{"type":"string"},"updated_at":{"type":"string","description":"Changes when a message is added or the conversation is renamed."},"message_count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Messages the user sees in the conversation (their own and the companion's replies)."},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ConversationMessage"},"description":"One page of messages, oldest first."},"next_cursor":{"description":"Pass as ?cursor to get the next page of messages. Null on the last page.","type":["string","null"]}},"required":["id","title","created_at","updated_at","message_count","messages","next_cursor"]},"ConversationFileUrl":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"Signed URL of the attached file, as the user uploaded it."},"expires_at":{"type":"string","description":"The URL stops working at this time (5 minutes after issue)."}},"required":["url","expires_at"]},"ConversationList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Conversation"}},"next_cursor":{"description":"Pass as ?cursor to get the next page. Null on the last page.","type":["string","null"]}},"required":["data","next_cursor"]},"ConversationMessage":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"role":{"type":"string","enum":["user","assistant"],"description":"user: what the user sent. assistant: the companion's reply."},"text":{"type":"string","description":"The message as the user saw it, in Markdown. In replies, people and records are cited as links such as [Person: Name](/knowledge-base/people/{id}); `citations` lists their ids."},"citations":{"type":"array","items":{"$ref":"#/components/schemas/ConversationCitation"},"description":"People and records cited in a reply, each once. Empty for user messages."},"attachments":{"type":"array","items":{"$ref":"#/components/schemas/ConversationAttachment"},"description":"Files the user attached to this message."},"attached_items":{"type":"array","items":{"$ref":"#/components/schemas/ConversationAttachedItem"},"description":"Knowledge base items (records, people, matches, conflicts, findings) the user attached to this message, each once. Empty for replies."},"created_at":{"type":"string"}},"required":["id","role","text","citations","attachments","attached_items","created_at"]},"ConversationPatch":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200,"description":"1 to 200 characters after trimming."}},"required":["title"],"additionalProperties":false},"EmptyBody":{"type":"object","properties":{},"additionalProperties":false},"ErrorResponse":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"Machine-readable code: unauthorized, forbidden, not_found, validation_failed, conflict, insufficient_credits, rate_limited, internal_error. The set is open: new codes may be added."},"message":{"type":"string","description":"Human-readable message."},"request_id":{"type":"string","description":"Same value as the Request-Id header. Quote it when contacting support."},"details":{"description":"Extra context, for example the validation issues on a 422."}},"required":["code","message","request_id"]}},"required":["error"]},"Event":{"type":"object","properties":{"kind":{"type":"string"},"date":{"description":"Always null in v1; use year.","type":["string","null"]},"year":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"place":{"type":["string","null"]},"person_ids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"record_id":{"description":"Always null in v1.","type":["string","null"]},"label":{"type":"string"}},"required":["kind","date","year","place","person_ids","record_id","label"]},"EventList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Event"}},"next_cursor":{"description":"Pass as ?cursor to get the next page. Null on the last page.","type":["string","null"]}},"required":["data","next_cursor"]},"ExpectedRecord":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"person_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"kind":{"type":"string","description":"census, military or vital."},"record_type":{"type":"string"},"jurisdiction":{"type":"string"},"sub_jurisdiction":{"type":["string","null"]},"year_from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"year_to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"label":{"type":"string"},"detail":{"type":["string","null"]},"demoted":{"type":"boolean"},"priority":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Higher first."}},"required":["id","person_id","kind","record_type","jurisdiction","sub_jurisdiction","year_from","year_to","label","detail","demoted","priority"]},"ExpectedRecordList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ExpectedRecord"}},"next_cursor":{"description":"Pass as ?cursor to get the next page. Null on the last page.","type":["string","null"]}},"required":["data","next_cursor"]},"ExpectedRecordPatch":{"type":"object","properties":{"dismissed":{"type":"boolean","const":true}},"required":["dismissed"],"additionalProperties":false},"Extraction":{"type":"object","properties":{"individuals":{"maxItems":1000,"type":"array","items":{"type":"object","properties":{"_id":{"type":"string","maxLength":100},"role":{"type":"string","enum":["CHIL","CLERGY","FATH","FRIEND","GODP","HUSB","MOTH","MULTIPLE","NGHBR","OFFICIATOR","PARENT","SPOU","WIFE","WITN","OTHER"]},"names":{"maxItems":100,"type":"array","items":{"type":"object","properties":{"given":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"surname":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"surname_prefix":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"prefix":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"suffix":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"nickname":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"type":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}]}},"additionalProperties":{}}},"sex":{"type":"string","enum":["M","F","X","U"]},"birth":{"anyOf":[{"type":"object","properties":{"date":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"place":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"age":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"cause":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"notes":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"death":{"anyOf":[{"type":"object","properties":{"date":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"place":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"age":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"cause":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"notes":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"burial":{"anyOf":[{"type":"object","properties":{"date":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"place":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"age":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"cause":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"notes":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"christening":{"anyOf":[{"type":"object","properties":{"date":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"place":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"age":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"cause":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"notes":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"cremation":{"anyOf":[{"type":"object","properties":{"date":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"place":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"age":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"cause":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"notes":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"residence":{"anyOf":[{"type":"object","properties":{"date":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"place":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"age":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"cause":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"notes":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"occupation":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"occupation_date":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"religion":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"notes":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"gedcom_facts":{"maxItems":500,"type":"array","items":{"type":"object","properties":{"tag":{"type":"string","maxLength":100},"value":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"date":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"place":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"age":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"type":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"notes":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"did_not_occur":{"type":["boolean","null"]}},"required":["tag"],"additionalProperties":{}}},"custom_fields":{"maxItems":500,"type":"array","items":{"type":"object","properties":{"label":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"value":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]}},"additionalProperties":{}}},"family_refs":{"maxItems":500,"type":"array","items":{"type":"string","maxLength":100}},"asso_refs":{"maxItems":500,"type":"array","items":{"type":"object","properties":{"ref":{"type":"string","maxLength":100},"role":{"type":"string","enum":["CHIL","CLERGY","FATH","FRIEND","GODP","HUSB","MOTH","MULTIPLE","NGHBR","OFFICIATOR","PARENT","SPOU","WIFE","WITN","OTHER"]},"phrase":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]}},"required":["ref","role"],"additionalProperties":{}}},"disabled":{"type":["boolean","null"]},"name_confidence":{"anyOf":[{"type":"string","enum":["high","medium","low"]},{"type":"null"}]}},"required":["_id","role","names","sex","asso_refs"],"additionalProperties":{}}},"families":{"maxItems":1000,"type":"array","items":{"type":"object","properties":{"_id":{"type":"string","maxLength":100},"husband_ref":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}]},"wife_ref":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}]},"children_refs":{"maxItems":500,"type":"array","items":{"type":"object","properties":{"ref":{"type":"string","maxLength":100},"pedi":{"anyOf":[{"type":"string","enum":["ADOPTED","BIRTH","FOSTER","SEALING","OTHER"]},{"type":"null"}]}},"required":["ref"],"additionalProperties":{}}},"marriage":{"anyOf":[{"type":"object","properties":{"date":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"place":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"age":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"cause":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"notes":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"marriage_type":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"divorce":{"anyOf":[{"type":"object","properties":{"date":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"place":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"age":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"cause":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"notes":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"gedcom_facts":{"maxItems":500,"type":"array","items":{"type":"object","properties":{"tag":{"type":"string","maxLength":100},"value":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"date":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"place":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"age":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"type":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"notes":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"did_not_occur":{"type":["boolean","null"]}},"required":["tag"],"additionalProperties":{}}}},"required":["_id","children_refs"],"additionalProperties":{}}},"record_type":{"anyOf":[{"type":"string","enum":["BIRT","MARR","DEAT","CENS","IMMI","EMIG","MILI","NATU","PROB","WILL","LETT","OTHR"]},{"type":"null"}]},"event":{"anyOf":[{"type":"object","properties":{"date":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"place":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"age":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"cause":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"notes":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"display_name":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"transcription_original":{"anyOf":[{"type":"string","maxLength":500000},{"type":"null"}]},"transcription_literal":{"anyOf":[{"type":"string","maxLength":500000},{"type":"null"}]},"translation_english":{"anyOf":[{"type":"string","maxLength":500000},{"type":"null"}]},"document_facts":{"maxItems":1000,"type":"array","items":{"type":"object","properties":{"tag":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}]},"value":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]}},"additionalProperties":{}}},"extraction_reliability":{"anyOf":[{"type":"string","enum":["high","low"]},{"type":"null"}]}},"required":["individuals","families"],"additionalProperties":{}},"ExtractionPatch":{"type":"object","properties":{"extraction":{"$ref":"#/components/schemas/Extraction"}},"required":["extraction"],"additionalProperties":false},"ExtractionResponse":{"type":"object","properties":{"record_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"extraction":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}],"description":"The stored extraction (see the Extraction schema), or null when nothing is stored."}},"required":["record_id","extraction"]},"FactVariantsResolve":{"type":"object","properties":{"person_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"label":{"type":"string","minLength":1,"maxLength":500,"description":"The fact label, for example occupation."},"keep_value":{"type":"string","minLength":1,"maxLength":500},"folded_values":{"maxItems":50,"type":"array","items":{"type":"string","minLength":1,"maxLength":500}},"pin_values":{"maxItems":50,"type":"array","items":{"type":"string","minLength":1,"maxLength":500}}},"required":["person_id","label","keep_value","folded_values"],"additionalProperties":false},"Family":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"workspace_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"partners":{"maxItems":2,"type":"array","items":{"type":"object","properties":{"person_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"role":{"type":"string","enum":["husband","wife"]}},"required":["person_id","role"]}},"children":{"type":"array","items":{"type":"object","properties":{"person_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"pedigree":{"type":["string","null"]}},"required":["person_id","pedigree"]}},"marriage":{"type":"object","properties":{"date":{"description":"The marriage date as GEDCOM date text (for example \"12 MAY 1892\" or \"ABT 1890\"). \"Y\" means the marriage happened but its date is unknown; null means no marriage is recorded.","type":["string","null"]},"year":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"place":{"type":["string","null"]},"type":{"type":["string","null"]}},"required":["date","year","place","type"]},"divorce":{"type":"object","properties":{"date":{"description":"The divorce date as GEDCOM date text (for example \"12 MAY 1892\" or \"ABT 1890\"). \"Y\" means the divorce happened but its date is unknown; null means no divorce is recorded.","type":["string","null"]},"year":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"place":{"type":["string","null"]}},"required":["date","year","place"]},"created_at":{"type":"string"}},"required":["id","workspace_id","partners","children","marriage","divorce","created_at"]},"FamilyContext":{"type":"object","properties":{"parents":{"type":"array","items":{"type":"object","properties":{"person_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"family_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"pedigree":{"description":"GEDCOM pedigree of the child link (ADOPTED, FOSTER, SEALING, OTHER, or BIRTH); null = biological.","type":["string","null"]}},"required":["person_id","family_id","pedigree"]}},"partners":{"type":"array","items":{"type":"object","properties":{"person_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"The other partner. Null when the family has no second partner recorded, or the other partner is in Trash."},"family_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"anyOf":[{"type":"string","enum":["married","civil","religious","partnership","engaged","separated","annulled","divorced"]},{"type":"null"}],"description":"The couple's relationship status as recorded; null when none is."}},"required":["person_id","family_id","status"]}},"children":{"type":"array","items":{"type":"object","properties":{"person_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"family_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"pedigree":{"description":"GEDCOM pedigree of the child link (ADOPTED, FOSTER, SEALING, OTHER, or BIRTH); null = biological.","type":["string","null"]}},"required":["person_id","family_id","pedigree"]}}},"required":["parents","partners","children"]},"FamilyCreate":{"type":"object","properties":{"partner_ids":{"minItems":1,"maxItems":2,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"child_ids":{"maxItems":50,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"marriage_date":{"type":"string","maxLength":100},"marriage_place":{"type":"string","maxLength":300}},"required":["partner_ids"],"additionalProperties":false},"FamilyCreated":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"workspace_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"partners":{"maxItems":2,"type":"array","items":{"type":"object","properties":{"person_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"role":{"type":"string","enum":["husband","wife"]}},"required":["person_id","role"]}},"children":{"type":"array","items":{"type":"object","properties":{"person_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"pedigree":{"type":["string","null"]}},"required":["person_id","pedigree"]}},"marriage":{"type":"object","properties":{"date":{"description":"The marriage date as GEDCOM date text (for example \"12 MAY 1892\" or \"ABT 1890\"). \"Y\" means the marriage happened but its date is unknown; null means no marriage is recorded.","type":["string","null"]},"year":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"place":{"type":["string","null"]},"type":{"type":["string","null"]}},"required":["date","year","place","type"]},"divorce":{"type":"object","properties":{"date":{"description":"The divorce date as GEDCOM date text (for example \"12 MAY 1892\" or \"ABT 1890\"). \"Y\" means the divorce happened but its date is unknown; null means no divorce is recorded.","type":["string","null"]},"year":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"place":{"type":["string","null"]}},"required":["date","year","place"]},"created_at":{"type":"string"},"warnings":{"description":"Present only when a child could not be attached.","type":"array","items":{"type":"string"}}},"required":["id","workspace_id","partners","children","marriage","divorce","created_at"]},"FamilyDeleted":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"family_deleted":{"type":"boolean","const":true},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["ok","family_deleted","id"]},"FamilyList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Family"}},"next_cursor":{"description":"Pass as ?cursor to get the next page. Null on the last page.","type":["string","null"]}},"required":["data","next_cursor"]},"FamilyMemberAdd":{"type":"object","properties":{"person_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"role":{"type":"string","enum":["partner","child"]},"pedigree":{"type":"string","enum":["birth","adopted","foster","step"]}},"required":["person_id","role"],"additionalProperties":false},"FamilyMemberRemove":{"type":"object","properties":{"person_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"role":{"type":"string","enum":["partner","child"]}},"required":["person_id","role"],"additionalProperties":false},"FamilyPatch":{"type":"object","properties":{"status":{"description":"The couple's relationship status.","type":"string","enum":["married","civil","religious","partnership","engaged","separated","annulled","divorced"]},"event":{"description":"Set one couple event. Setting the same tag (and type) again replaces it.","type":"object","properties":{"tag":{"type":"string","enum":["ANUL","CENS","DIV","DIVF","ENGA","EVEN","MARR","MARB","MARC","MARL","MARS"],"description":"GEDCOM family event tag. MARR and DIV set the marriage / divorce; others are stored as events. EVEN needs a type."},"date":{"description":"Omitted = cleared.","anyOf":[{"type":"string","maxLength":300},{"type":"null"}]},"place":{"description":"Omitted = cleared.","anyOf":[{"type":"string","maxLength":300},{"type":"null"}]},"type":{"description":"Descriptor; required for EVEN.","anyOf":[{"type":"string","maxLength":300},{"type":"null"}]},"marriage_type":{"description":"MARR only.","anyOf":[{"type":"string","maxLength":300},{"type":"null"}]}},"required":["tag"],"additionalProperties":false}},"additionalProperties":false},"Finding":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string"},"status":{"type":"string"},"severity":{"type":"string"},"title":{"type":"string"},"description":{"type":["string","null"]},"person_ids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"record_id":{"type":["string","null"]},"dismissed":{"type":"boolean"},"created_at":{"type":"string"},"resolved_at":{"type":["string","null"]}},"required":["id","type","status","severity","title","description","person_ids","record_id","dismissed","created_at","resolved_at"]},"FindingList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Finding"}},"next_cursor":{"description":"Pass as ?cursor to get the next page. Null on the last page.","type":["string","null"]}},"required":["data","next_cursor"]},"FindingResolve":{"type":"object","properties":{"note":{"description":"Optional resolution note (max 2000 characters, newlines allowed). Stored with the finding; not returned by the API in v1.","type":"string","maxLength":2000}},"additionalProperties":false},"Folder":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"parent_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"The folder this one sits in. Null at the top level."},"kind":{"type":"string","enum":["people","records"],"description":"What the folder holds, or what the ids are: people or records."},"name":{"type":"string"},"item_count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"People or records directly in this folder (not in Trash)."},"child_count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Folders directly inside this one."}},"required":["id","parent_id","kind","name","item_count","child_count"]},"FolderCreate":{"type":"object","properties":{"kind":{"type":"string","enum":["people","records"],"description":"What the folder holds, or what the ids are: people or records."},"name":{"type":"string","description":"1 to 100 characters after trimming."},"parent_id":{"description":"Create it inside this folder (same kind). Omit or null for the top level.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["kind","name"],"additionalProperties":false},"FolderItems":{"type":"object","properties":{"kind":{"type":"string","enum":["people","records"],"description":"What the folder holds, or what the ids are: people or records."},"ids":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["kind","ids"],"additionalProperties":false},"FolderItemsMoved":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"moved":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"How many items were moved."}},"required":["ok","moved"]},"FolderList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Folder"}},"next_cursor":{"description":"Pass as ?cursor to get the next page. Null on the last page.","type":["string","null"]}},"required":["data","next_cursor"]},"FolderPatch":{"type":"object","properties":{"name":{"description":"1 to 100 characters after trimming.","type":"string"},"parent_id":{"description":"Move it inside this folder. Null moves it to the top level.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"additionalProperties":false},"GedcomCapCheck":{"type":"object","properties":{"allowed":{"type":"boolean","description":"false: importing this many people would pass the plan's person limit, and confirm is refused."},"needed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"People this import would add."},"used":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"People the account already has."},"limit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"The plan's person limit. Null when unlimited."},"remaining":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"People that can still be added. Null when unlimited."}},"required":["allowed","needed","used","limit","remaining"]},"GedcomExport":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"type":"string","enum":["queued","generating","ready","failed"],"description":"queued -> generating -> ready, or failed."},"version":{"type":"string"},"format":{"type":"string","enum":["ged","gdz"]},"filename":{"type":"string","description":"The download's base name; the file is <filename>.<format>."},"redact_living":{"type":"boolean"},"file_size_bytes":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Set when ready."},"warnings":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Details the export had to change or leave out, for example for GEDCOM 5.5.1. Set when ready."},"error":{"description":"Why it failed, when status is failed.","type":["string","null"]},"download":{"anyOf":[{"$ref":"#/components/schemas/GedcomExportDownload"},{"type":"null"}],"description":"Set only when ready."},"created_at":{"type":"string"},"completed_at":{"type":["string","null"]}},"required":["id","status","version","format","filename","redact_living","file_size_bytes","warnings","error","download","created_at","completed_at"]},"GedcomExportCreate":{"type":"object","properties":{"version":{"description":"GEDCOM version to write. Default 7.0.18.","type":"string","enum":["7.0.18","5.5.1"]},"format":{"description":"ged (default): the tree as text. gdz: a GEDZIP archive with the record images.","type":"string","enum":["ged","gdz"]},"filename":{"description":"Base name for the downloaded file, without extension. Unsafe characters are removed. Default kleiobase-export.","type":"string","maxLength":255},"redact_living":{"description":"Leave out the details of living people (default false). GET .../gedcom/exports/redaction-preview lists who that is.","type":"boolean"}},"additionalProperties":false},"GedcomExportDownload":{"type":"object","properties":{"url":{"type":"string","description":"Signed download URL. It works for 5 minutes; poll again for a new one."},"expires_at":{"type":"string"}},"required":["url","expires_at"]},"GedcomExportStarted":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Poll GET .../gedcom/exports/{export_id}."},"status":{"type":"string","enum":["queued","generating","ready","failed"]}},"required":["id","status"]},"GedcomImport":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"type":"string","enum":["analyzing","awaiting_confirmation","importing","completed","failed","cancelled","expired"],"description":"analyzing -> awaiting_confirmation -> (confirm) importing -> completed. failed when the file could not be read or the import broke; cancelled when cancelled in the app; expired when it was never confirmed (the uploaded file is then deleted)."},"file_name":{"type":["string","null"]},"progress":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"0-100 while analyzing."},"analysis":{"anyOf":[{"$ref":"#/components/schemas/GedcomImportAnalysis"},{"type":"null"}],"description":"What the file holds. Set from awaiting_confirmation on; null while analyzing, after a failure, and once completed."},"cap_check":{"anyOf":[{"$ref":"#/components/schemas/GedcomCapCheck"},{"type":"null"}],"description":"The plan limit check for mode all. Null until analyzed."},"cap_check_skip":{"anyOf":[{"$ref":"#/components/schemas/GedcomCapCheck"},{"type":"null"}],"description":"The plan limit check for mode skip."},"cap_check_changed":{"anyOf":[{"$ref":"#/components/schemas/GedcomCapCheck"},{"type":"null"}],"description":"The plan limit check for mode changed."},"can_import_changes":{"type":"boolean","description":"Whether the plan allows mode changed (Researcher and above)."},"result":{"anyOf":[{"$ref":"#/components/schemas/GedcomImportResult"},{"type":"null"}],"description":"What was imported. Set only when completed."},"error":{"description":"Why it failed, when status is failed.","type":["string","null"]},"created_at":{"type":"string"},"completed_at":{"type":["string","null"]}},"required":["id","status","file_name","progress","analysis","cap_check","cap_check_skip","cap_check_changed","can_import_changes","result","error","created_at","completed_at"]},"GedcomImportAnalysis":{"type":"object","properties":{"detected_version":{"description":"The GEDCOM version the file declares, for example 5.5.1 or 7.0.","type":["string","null"]},"people":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"families":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sources":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Source (SOUR) records in the file. They are not imported: an import adds people and families only."},"events":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"media":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Images bundled in a .gdz archive. 0 for a .ged file."},"existing_people":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"People in the file who are already in this workspace (from an earlier import)."},"changed_people":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Of existing_people, how many changed in the file since they were last imported."},"warnings":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Problems found while reading the file. The import can still go ahead."},"notes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Routine conversion notes."}},"required":["detected_version","people","families","sources","events","media","existing_people","changed_people","warnings","notes"]},"GedcomImportConfirm":{"type":"object","properties":{"mode":{"description":"all (default): import everyone in the file. skip: leave out people already in the workspace. changed: like skip, but also import the existing people who changed in the file (Researcher plan and above).","type":"string","enum":["all","skip","changed"]}},"additionalProperties":false},"GedcomImportResult":{"type":"object","properties":{"people":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"People added."},"families":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Families added."},"sources":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Always 0: source (SOUR) records are not imported."},"media":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"skipped_people":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"People not added because they were already in the workspace (mode skip or changed)."}},"required":["people","families","sources","media","skipped_people"]},"GedcomImportStarted":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Poll GET .../gedcom/imports/{import_id}."},"status":{"type":"string","enum":["analyzing","awaiting_confirmation","importing","completed","failed","cancelled","expired"]}},"required":["id","status"]},"GedcomRedactionPreview":{"type":"object","properties":{"living_people":{"type":"array","items":{"type":"object","properties":{"person_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"}},"required":["person_id","name"]},"description":"People whose details an export with redact_living leaves out."},"total_people":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"People in the workspace (the export includes all of them)."}},"required":["living_people","total_people"]},"Health":{"type":"object","properties":{"overall":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"0 to 100. Null when the workspace has no people yet."},"band":{"anyOf":[{"type":"string","enum":["Fair","Good","Very Good","Excellent"]},{"type":"null"}]},"pillars":{"anyOf":[{"type":"object","properties":{"completeness":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"consistency":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"connectedness":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["completeness","consistency","connectedness"]},{"type":"null"}]},"percentile":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Share of KleioBase trees scoring lower. Null until enough trees have a score."},"quick_wins":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The finding id."},"title":{"type":"string"}},"required":["id","title"]}}},"required":["id","title","items"]},"description":"Suggested next steps, biggest expected improvement first. Each item is an active finding."},"computed_at":{"description":"When the score was last computed.","type":["string","null"]}},"required":["overall","band","pillars","percentile","quick_wins","computed_at"]},"Match":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"person_a_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"person_b_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"confidence":{"type":"string"},"score":{"type":["number","null"]},"status":{"type":"string","const":"pending"},"created_at":{"type":"string"}},"required":["id","person_a_id","person_b_id","confidence","score","status","created_at"]},"MatchAcceptExecute":{"type":"object","properties":{"survivor_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"field_choices":{"$ref":"#/components/schemas/MergeFieldChoices"}},"additionalProperties":false},"MatchAccepted":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"match_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"survivor":{"$ref":"#/components/schemas/Person"}},"required":["ok","match_id","survivor"]},"MatchList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Match"}},"next_cursor":{"description":"Pass as ?cursor to get the next page. Null on the last page.","type":["string","null"]}},"required":["data","next_cursor"]},"MergeExecute":{"type":"object","properties":{"other_person_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"field_choices":{"$ref":"#/components/schemas/MergeFieldChoices"}},"required":["other_person_id"],"additionalProperties":false},"MergeFieldChoices":{"type":"object","propertyNames":{"type":"string","enum":["given_name","surname","birth_date","birth_place","death_date","death_place","gender","maiden_name","occupation","religion","burial_date","burial_place","christening_date","christening_place","death_cause","name_prefix","name_suffix","surname_prefix","nickname"]},"additionalProperties":{"type":"string","enum":["survivor","absorbed"]}},"MergeGroup":{"type":"object","properties":{"person_ids":{"minItems":2,"maxItems":20,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Everyone in the group, survivor included: 2 to 20 distinct people."},"survivor_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The person the others are merged into. Must be in person_ids."}},"required":["person_ids","survivor_id"],"additionalProperties":false},"MergeGroupResult":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"survivor":{"$ref":"#/components/schemas/Person"},"merged_person_ids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"match_ids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"One per merged person. Unmerging any one of them undoes the whole group."},"failed":{"type":"array","items":{"type":"object","properties":{"person_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"reason":{"type":"string"}},"required":["person_id","reason"]},"description":"People that could not be merged after at least one merge succeeded. Usually empty."}},"required":["ok","survivor","merged_person_ids","match_ids","failed"]},"Notification":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","description":"For example record_processed, match_found, research_finding, system. The set is open."},"title":{"type":"string"},"body":{"type":"string"},"link_path":{"description":"The app page the notification points to, as a path (for example /knowledge-base/people/...). Null when there is none.","type":["string","null"]},"read_at":{"type":["string","null"]},"created_at":{"type":"string"}},"required":["id","type","title","body","link_path","read_at","created_at"]},"NotificationList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Notification"}},"next_cursor":{"description":"Pass as ?cursor to get the next page. Null on the last page.","type":["string","null"]}},"required":["data","next_cursor"]},"NotificationsMarked":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"marked":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"How many notifications changed from unread to read."}},"required":["ok","marked"]},"NotificationsRead":{"anyOf":[{"type":"object","properties":{"ids":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["ids"],"additionalProperties":false},{"type":"object","properties":{"all":{"type":"boolean","const":true}},"required":["all"],"additionalProperties":false}]},"Ok":{"type":"object","properties":{"ok":{"type":"boolean","const":true}},"required":["ok"]},"Person":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"workspace_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"given_name":{"type":["string","null"]},"surname":{"type":["string","null"]},"maiden_name":{"type":["string","null"]},"name_prefix":{"type":["string","null"]},"name_suffix":{"type":["string","null"]},"surname_prefix":{"type":["string","null"]},"title":{"type":["string","null"]},"nickname":{"type":["string","null"]},"display_name":{"type":"string"},"gender":{"anyOf":[{"type":"string","enum":["M","F","X","U"]},{"type":"null"}]},"birth":{"type":"object","properties":{"date":{"type":["string","null"]},"year":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"place":{"type":["string","null"]}},"required":["date","year","place"]},"christening":{"type":"object","properties":{"date":{"type":["string","null"]},"year":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"place":{"type":["string","null"]}},"required":["date","year","place"]},"death":{"type":"object","properties":{"date":{"type":["string","null"]},"year":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"place":{"type":["string","null"]},"cause":{"type":["string","null"]}},"required":["date","year","place","cause"]},"burial":{"type":"object","properties":{"date":{"type":["string","null"]},"year":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"place":{"type":["string","null"]}},"required":["date","year","place"]},"occupation":{"type":["string","null"]},"religion":{"type":["string","null"]},"living_status":{"type":["string","null"]},"notes":{"type":["string","null"]},"created_at":{"type":"string"},"folder_id":{"description":"The folder the person is in (null: none). Returned by GET .../people.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"tag_ids":{"description":"Ids of the person's tags. Returned by GET .../people.","type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["id","workspace_id","given_name","surname","maiden_name","name_prefix","name_suffix","surname_prefix","title","nickname","display_name","gender","birth","christening","death","burial","occupation","religion","living_status","notes","created_at"]},"PersonDetail":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"workspace_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"given_name":{"type":["string","null"]},"surname":{"type":["string","null"]},"maiden_name":{"type":["string","null"]},"name_prefix":{"type":["string","null"]},"name_suffix":{"type":["string","null"]},"surname_prefix":{"type":["string","null"]},"title":{"type":["string","null"]},"nickname":{"type":["string","null"]},"display_name":{"type":"string"},"gender":{"anyOf":[{"type":"string","enum":["M","F","X","U"]},{"type":"null"}]},"birth":{"type":"object","properties":{"date":{"type":["string","null"]},"year":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"place":{"type":["string","null"]}},"required":["date","year","place"]},"christening":{"type":"object","properties":{"date":{"type":["string","null"]},"year":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"place":{"type":["string","null"]}},"required":["date","year","place"]},"death":{"type":"object","properties":{"date":{"type":["string","null"]},"year":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"place":{"type":["string","null"]},"cause":{"type":["string","null"]}},"required":["date","year","place","cause"]},"burial":{"type":"object","properties":{"date":{"type":["string","null"]},"year":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"place":{"type":["string","null"]}},"required":["date","year","place"]},"occupation":{"type":["string","null"]},"religion":{"type":["string","null"]},"living_status":{"type":["string","null"]},"notes":{"type":["string","null"]},"created_at":{"type":"string"},"folder_id":{"description":"The folder the person is in (null: none). Returned by GET .../people.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"tag_ids":{"description":"Ids of the person's tags. Returned by GET .../people.","type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"family_ids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"record_ids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["id","workspace_id","given_name","surname","maiden_name","name_prefix","name_suffix","surname_prefix","title","nickname","display_name","gender","birth","christening","death","burial","occupation","religion","living_status","notes","created_at","family_ids","record_ids"]},"PersonList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Person"}},"next_cursor":{"description":"Pass as ?cursor to get the next page. Null on the last page.","type":["string","null"]}},"required":["data","next_cursor"]},"PersonMerged":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"match_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The merge's match. Pass it to POST /people/{id}/unmerge to undo the merge."},"survivor":{"$ref":"#/components/schemas/Person"}},"required":["ok","match_id","survivor"]},"PersonSummary":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"display_name":{"type":"string"},"given_name":{"type":["string","null"]},"surname":{"type":["string","null"]},"maiden_name":{"type":["string","null"]},"gender":{"anyOf":[{"type":"string","enum":["M","F","X","U"]},{"type":"null"}]},"birth":{"type":"object","properties":{"date":{"type":["string","null"]},"year":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"place":{"type":["string","null"]}},"required":["date","year","place"]}},"required":["id","display_name","given_name","surname","maiden_name","gender","birth"]},"PersonTree":{"type":"object","properties":{"root_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"nodes":{"type":"array","items":{"type":"object","properties":{"person_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"sex":{"anyOf":[{"type":"string","enum":["M","F","X","U"]},{"type":"null"}]},"birth_year":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"death_year":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["person_id","name","sex","birth_year","death_year"]}},"unions":{"type":"array","items":{"type":"object","properties":{"family_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"partner_ids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Partners of this family that are in the tree."}},"required":["family_id","partner_ids"]}},"edges":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"to":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["partner","child"],"description":"partner: from a person to a family (union) they head. child: from a family to its child."}},"required":["from","to","type"]}},"truncated":{"type":"boolean","description":"True when depth cut off relatives that exist beyond it."}},"required":["root_id","nodes","unions","edges","truncated"]},"PersonWrite":{"type":"object","properties":{"given_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"surname":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"maiden_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"nickname":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"gender":{"anyOf":[{"type":"string","enum":["M","F","X","U"]},{"type":"null"}]},"birth_date":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}]},"birth_place":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}]},"death_date":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}]},"death_place":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}]},"occupation":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}]},"religion":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"notes":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}]}},"additionalProperties":false},"Place":{"type":"object","properties":{"id":{"type":"string","description":"Stable, opaque id of the place. Use it with GET .../places/{place_id}."},"name":{"type":"string"},"coordinates":{"anyOf":[{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"}},"required":["lat","lng"]},{"type":"null"}],"description":"From the geocode cache. Null when the place has not been geocoded yet or could not be found."},"people":{"type":"array","items":{"type":"object","properties":{"person_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"context":{"type":"string"}},"required":["person_id","context"]}}},"required":["id","name","coordinates","people"]},"PlaceDetail":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"coordinates":{"anyOf":[{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"}},"required":["lat","lng"]},{"type":"null"}],"description":"From the geocode cache. Null when the place has not been geocoded yet or could not be found."},"people":{"type":"array","items":{"type":"object","properties":{"person_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"role":{"type":"string","enum":["birth","death","event"]}},"required":["person_id","role"]},"description":"Who is connected to the place: born there, died there, or part of an event there."},"events":{"type":"array","items":{"$ref":"#/components/schemas/Event"},"description":"Dated events at this place, ordered by year."}},"required":["id","name","coordinates","people","events"]},"PlaceList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Place"}},"next_cursor":{"description":"Pass as ?cursor to get the next page. Null on the last page.","type":["string","null"]}},"required":["data","next_cursor"]},"PlaceSuggestion":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]},"PlaceSuggestionList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PlaceSuggestion"}},"next_cursor":{"description":"Pass as ?cursor to get the next page. Null on the last page.","type":["string","null"]}},"required":["data","next_cursor"]},"Record":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"workspace_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"type":"string","enum":["pending","processing","review","confirmed","failed"]},"title":{"type":"string"},"original_filename":{"type":"string"},"record_type":{"type":["string","null"]},"file_type":{"type":"string"},"transcription":{"type":"object","properties":{"original":{"type":["string","null"]},"translated":{"type":["string","null"]}},"required":["original","translated"]},"created_at":{"type":"string"},"updated_at":{"type":"string"},"folder_id":{"description":"The folder the record is in (null: none). Returned by GET .../records.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"tag_ids":{"description":"Ids of the record's tags. Returned by GET .../records.","type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["id","workspace_id","status","title","original_filename","record_type","file_type","transcription","created_at","updated_at"]},"RecordConfirmed":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"person_ids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"People linked to the record after confirming."}},"required":["ok","person_ids"]},"RecordImage":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"Signed URL of the original image."},"expires_at":{"type":"string","description":"The URL stops working at this time (5 minutes after issue)."}},"required":["url","expires_at"]},"RecordLink":{"type":"object","properties":{"person_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"role":{"type":"string","enum":["CHIL","CLERGY","FATH","FRIEND","GODP","HUSB","MOTH","MULTIPLE","NGHBR","OFFICIATOR","PARENT","SPOU","WIFE","WITN","OTHER"]}},"required":["person_id"],"additionalProperties":false},"RecordLinked":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"record_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"person_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["ok","record_id","person_id"]},"RecordList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Record"}},"next_cursor":{"description":"Pass as ?cursor to get the next page. Null on the last page.","type":["string","null"]}},"required":["data","next_cursor"]},"RecordPatch":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"record_type":{"type":"string","enum":["birth","marriage","death","census","immigration","emigration","military","naturalization","probate","will","letter","other"]}},"additionalProperties":false},"RecordProcess":{"type":"object","properties":{"deep":{"type":"boolean"}},"additionalProperties":false},"RecordProcessAccepted":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"type":"string","const":"processing"}},"required":["id","status"]},"RecordSummary":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"title":{"type":"string"},"original_filename":{"type":"string"},"record_type":{"type":["string","null"]},"status":{"type":"string","enum":["pending","processing","review","confirmed","failed"]}},"required":["id","title","original_filename","record_type","status"]},"RecordUnlink":{"type":"object","properties":{"person_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["person_id"],"additionalProperties":false},"RelativeAdd":{"type":"object","properties":{"type":{"type":"string","enum":["partner","parent","child","sibling","associate"],"description":"The relative's role relative to the path person: partner, parent, child, sibling or associate."},"person_id":{"description":"An existing person in this workspace. Exactly one of person_id and new_person.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"new_person":{"description":"Create this person first, in the same request. Exactly one of person_id and new_person.","$ref":"#/components/schemas/PersonWrite"},"family_id":{"description":"partner: fill the empty partner slot of this family instead of creating a new one. parent: the family to join (modes join, replace-join, add-as-coparent).","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"mode":{"description":"parent only. join, replace-join and add-as-coparent need family_id. Default create-bridge (adds an Unknown co-parent; counts against the person limit); new-single adds the parent alone.","type":"string","enum":["join","new-single","create-bridge","replace-join","replace-bridge","add-as-coparent"]},"status":{"description":"partner only: the couple's relationship status.","type":"string","enum":["married","civil","religious","partnership","engaged","separated","annulled","divorced"]},"pedigree":{"description":"parent only: how the path person is the parent's child.","type":"string","enum":["birth","adopted","foster","other"]},"role":{"description":"associate only (required): the GEDCOM association role, e.g. WITN, GODP, FRIEND, OTHER.","type":"string","enum":["CHIL","CLERGY","FATH","FRIEND","GODP","HUSB","MOTH","MULTIPLE","NGHBR","OFFICIATOR","PARENT","SPOU","WIFE","WITN","OTHER"]},"role_phrase":{"description":"associate only: required when role is OTHER.","type":"string","maxLength":200},"replace":{"description":"Change an existing link to person_id in place: the new link is added, then this one removed (one request).","type":"object","properties":{"type":{"type":"string","enum":["partner","parent","child","associate"]},"role":{"description":"Required when replacing an associate link: the role to replace.","type":"string","enum":["CHIL","CLERGY","FATH","FRIEND","GODP","HUSB","MOTH","MULTIPLE","NGHBR","OFFICIATOR","PARENT","SPOU","WIFE","WITN","OTHER"]}},"required":["type"],"additionalProperties":false}},"required":["type"],"additionalProperties":false},"RelativeAdded":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"person_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The relative: the person_id sent, or the id of the person created from new_person."}},"required":["ok","person_id"]},"RelativeRemove":{"type":"object","properties":{"person_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["partner","parent","child","sibling","associate"]}},"required":["person_id","type"],"additionalProperties":false},"SearchResults":{"type":"object","properties":{"people":{"type":"array","items":{"$ref":"#/components/schemas/PersonSummary"},"description":"Up to 5, best match first."},"records":{"type":"array","items":{"$ref":"#/components/schemas/RecordSummary"},"description":"Up to 5, best match first."},"places":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"]},"description":"Up to 3 record event places. A place used only on records that are not confirmed yet has no GET .../places/{place_id} until one is confirmed (404)."}},"required":["people","records","places"]},"Tag":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"color":{"type":"string","description":"Hex colour, for example #4f46e5."},"person_count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"People with this tag (not in Trash)."},"record_count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Records with this tag (not in Trash)."}},"required":["id","name","color","person_count","record_count"]},"TagApply":{"type":"object","properties":{"kind":{"type":"string","enum":["people","records"],"description":"What the folder holds, or what the ids are: people or records."},"ids":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"add":{"description":"Tag ids to add.","maxItems":50,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"remove":{"description":"Tag ids to remove.","maxItems":50,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["kind","ids"],"additionalProperties":false},"TagCreate":{"type":"object","properties":{"name":{"type":"string","description":"1 to 50 characters after trimming. Unique in the workspace, ignoring case."},"color":{"type":"string","description":"Hex colour: #rgb or #rrggbb."}},"required":["name","color"],"additionalProperties":false},"TagList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Tag"}},"next_cursor":{"description":"Pass as ?cursor to get the next page. Null on the last page.","type":["string","null"]}},"required":["data","next_cursor"]},"TagPatch":{"type":"object","properties":{"name":{"type":"string"},"color":{"type":"string"}},"additionalProperties":false},"TagsApplied":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"added":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Tag assignments created (an existing one is not counted)."},"removed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Tag assignments removed."}},"required":["ok","added","removed"]},"TimelineEntry":{"type":"object","properties":{"kind":{"type":"string"},"date":{"type":["string","null"]},"year":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"place":{"type":["string","null"]},"person_ids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"record_id":{"type":["string","null"]},"label":{"type":"string"}},"required":["kind","date","year","place","person_ids","record_id","label"]},"TimelineResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TimelineEntry"}}},"required":["data"]},"TrashDeleted":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"deleted_person_ids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"deleted_record_ids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["ok","deleted_person_ids","deleted_record_ids"]},"TrashIds":{"type":"object","properties":{"people_ids":{"maxItems":100,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"record_ids":{"maxItems":100,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"additionalProperties":false},"TrashItem":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["person","record"]},"name":{"type":"string"},"deleted_at":{"description":"When it was moved to the Trash.","type":["string","null"]}},"required":["id","type","name","deleted_at"]},"TrashList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TrashItem"}},"next_cursor":{"description":"Pass as ?cursor to get the next page. Null on the last page.","type":["string","null"]}},"required":["data","next_cursor"]},"TrashRestored":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"restored_person_ids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"restored_record_ids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Every record brought back: the ones asked for plus the trashed records linked to a restored person."}},"required":["ok","restored_person_ids","restored_record_ids"]},"Unmerge":{"type":"object","properties":{"match_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The merged match: match_id from a merge, an accepted match, or a group merge."}},"required":["match_id"],"additionalProperties":false},"UnmergeResult":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"restored_person_ids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Everyone the unmerge brought back: the whole group for a group merge, otherwise the merge's two people."}},"required":["ok","restored_person_ids"]},"UnreadCount":{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["count"]},"Workspace":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"is_default":{"type":"boolean"},"archived":{"type":"boolean","description":"Archived workspaces are read-only: reads work, writes return 409."},"created_at":{"type":"string"}},"required":["id","name","is_default","archived","created_at"]},"WorkspaceCreate":{"type":"object","properties":{"name":{"type":"string","description":"Workspace name, 1 to 80 characters after trimming spaces."}},"required":["name"],"additionalProperties":false},"WorkspaceList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Workspace"}},"next_cursor":{"description":"Pass as ?cursor to get the next page. Null on the last page.","type":["string","null"]}},"required":["data","next_cursor"]},"WorkspaceRename":{"type":"object","properties":{"name":{"type":"string","description":"Workspace name, 1 to 80 characters after trimming spaces."}},"required":["name"],"additionalProperties":false}},"parameters":{"WorkspaceId":{"name":"workspace_id","in":"path","required":true,"description":"The workspace (project) id.","schema":{"type":"string","format":"uuid"}},"PersonId":{"name":"person_id","in":"path","required":true,"description":"The person id.","schema":{"type":"string","format":"uuid"}},"FamilyId":{"name":"family_id","in":"path","required":true,"description":"The family id.","schema":{"type":"string","format":"uuid"}},"RecordId":{"name":"record_id","in":"path","required":true,"description":"The record id.","schema":{"type":"string","format":"uuid"}},"MatchId":{"name":"match_id","in":"path","required":true,"description":"The match id.","schema":{"type":"string","format":"uuid"}},"FindingId":{"name":"finding_id","in":"path","required":true,"description":"The finding id.","schema":{"type":"string","format":"uuid"}},"ExpectedRecordId":{"name":"expected_record_id","in":"path","required":true,"description":"The expected record id.","schema":{"type":"string","format":"uuid"}},"FolderId":{"name":"folder_id","in":"path","required":true,"description":"The folder id.","schema":{"type":"string","format":"uuid"}},"TagId":{"name":"tag_id","in":"path","required":true,"description":"The tag id.","schema":{"type":"string","format":"uuid"}},"ConversationId":{"name":"conversation_id","in":"path","required":true,"description":"The Research Companion conversation id.","schema":{"type":"string","format":"uuid"}},"FileId":{"name":"file_id","in":"path","required":true,"description":"The id of a file attached to a message (attachments[].file_id).","schema":{"type":"string","format":"uuid"}},"ImportId":{"name":"import_id","in":"path","required":true,"description":"The GEDCOM import id, from POST .../gedcom/imports.","schema":{"type":"string","format":"uuid"}},"ExportId":{"name":"export_id","in":"path","required":true,"description":"The GEDCOM export id, from POST .../gedcom/exports.","schema":{"type":"string","format":"uuid"}},"PlaceId":{"name":"place_id","in":"path","required":true,"description":"The place id, as returned by GET .../places or GET .../search. Opaque.","schema":{"type":"string"}},"Limit":{"name":"limit","in":"query","required":false,"description":"Page size. Default 25, max 100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},"Cursor":{"name":"cursor","in":"query","required":false,"description":"The next_cursor of the previous page. Opaque.","schema":{"type":"string"}},"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"description":"Makes the write safe to retry (1-255 characters, kept 24 hours). Same key and same request replays the original response; a different request with the same key is a 409.","schema":{"type":"string","minLength":1,"maxLength":255}}},"headers":{"ApiVersion":{"description":"The API major version.","schema":{"type":"string","example":"1"}},"RequestId":{"description":"Unique id of this request. Quote it when contacting support.","schema":{"type":"string"}},"RetryAfter":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}},"IdempotentReplayed":{"description":"true when the response is a replay of an earlier request with the same Idempotency-Key.","schema":{"type":"string","enum":["true"]}}}}}