{"openapi":"3.1.0","info":{"title":"QuickData API","description":"Multifamily rent rolls (xlsx, xls, csv, pdf) into fixed-schema JSON with a unit mix summary, and T12 operating statements into categorized monthly line items with a category summary - both checked against the document's own printed figures. Authenticate with `Authorization: Bearer <your API key>`. The guide is at /docs.","version":"1.0"},"servers":[{"url":"https://data.quickdata.ai"}],"paths":{"/v1/extract":{"post":{"summary":"Extract","description":"Extract a rent roll (multipart field `file`: xlsx, xlsm, xls, csv or pdf, up to 25 MB). Returns `rows` (one per\nunit), `unit_mix` and `report` (status ok / needs_review / failed, and the checks against the document's own\nfigures). Optional: `reference` (your own id for the document: echoed in the result and kept in your usage log)\nand `metadata` (a small JSON object, echoed). A workbook's tab: `sheet` names the tab to read; `ask_sheet=true`\nanswers 409 `several_rent_rolls` with `sheets` (one tab per rent roll) when the workbook holds more than one, instead\nof reading the first (nothing is counted; send the file again with `sheet`). The header X-QD-Customer carries your\nown id for the customer the document is for (kept with its usage entry: see /docs#customers); X-QD-Workspace names\nthe workspace it is read for. Every document that is read is counted; one that cannot be read is not. See /docs.","operationId":"extract_v1_extract_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_extract_v1_extract_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RentRollResult"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Extraction"],"parameters":[{"name":"X-QD-Workspace","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace this call works in: its id (ws_...) or your own id for it. Without it: the key's own workspace, else the default one."}]}},"/v1/extract/{doc_type}":{"post":{"summary":"Extract Typed","description":"Extract a document by type: `rent_roll` (same as /v1/extract), `t12` (an operating statement: the last 12\nmonths of line items, each with its category and your custom category, the category summary and the checks\nagainst the document's own EGI, total operating expenses and NOI), or `auto` (the type is detected from the file;\nthe result says which in `detected`; with `expected` = `rent_roll` or `t12`, that type is kept unless the file is\nplainly the other). One document each; `reference`, `metadata`, `sheet`, `ask_sheet` (a rent roll's) and the\nX-QD-Workspace header as for /v1/extract. See /docs.","operationId":"extract_typed_v1_extract__doc_type__post","parameters":[{"name":"doc_type","in":"path","required":true,"schema":{"type":"string","title":"Doc Type"}},{"name":"X-QD-Workspace","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace this call works in: its id (ws_...) or your own id for it. Without it: the key's own workspace, else the default one."}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_extract_typed_v1_extract__doc_type__post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Extraction"]}},"/v1/usage":{"get":{"summary":"Usage List","description":"Your documents, newest first: file, type, rows, status, whether it was billed, seconds, and where it came from\n(workspace, your customer id, your reference, key, member). Filters: `customer` (the id you sent in X-QD-Customer),\n`workspace` (id or your own id for it), `reference`, `member` (a member's id), `start` and `end` (YYYY-MM-DD or\nunix seconds; `end` is exclusive). An entry whose details were cleared, or never recorded (no document retention),\nhas no file name, rows or reference; it keeps its customer id, which is how the document is counted.","operationId":"usage_list_v1_usage_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}},{"name":"workspace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace"}},{"name":"reference","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End"}},{"name":"member","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"customer","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UsageEntry"}}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Usage"]}},"/v1/usage/summary":{"get":{"summary":"Usage Summary","description":"Documents counted per `group_by`: workspace (default), customer (the id you sent in X-QD-Customer), reference, key,\nmember, source, doc_type, day or month. Each line has documents, billed, free, cached, failed and needs_review\n(`cached`: documents from when the service kept results, until 2026-10, that were served from its cache and not\nbilled; none since). The same filters as /v1/usage. This is what a company reads to bill its own customers:\n`group_by=customer` gives a line for each of them, the busiest first (documents sent without an id are the line\nwhose `customer` is null). With many lines: `limit` and `offset` page through them, `q` keeps the lines whose\ncustomer, reference or workspace contains it; `total_lines` says how many there are, and `totals` covers them all.","operationId":"usage_summary_v1_usage_summary_get","parameters":[{"name":"group_by","in":"query","required":false,"schema":{"type":"string","default":"workspace","title":"Group By"}},{"name":"workspace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace"}},{"name":"reference","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End"}},{"name":"member","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"customer","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageSummary"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Usage"]}},"/v1/usage/daily":{"get":{"summary":"Usage Daily","description":"Documents per day over the last `days` days.","operationId":"usage_daily_v1_usage_daily_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Usage"]}},"/v1/usage.csv":{"get":{"summary":"Usage Csv","description":"Your document log as CSV (the same filters as /v1/usage).","operationId":"usage_csv_v1_usage_csv_get","parameters":[{"name":"workspace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace"}},{"name":"reference","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End"}},{"name":"member","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"customer","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Usage"]}},"/v1/usage/summary.csv":{"get":{"summary":"Usage Summary Csv","description":"The counts of /v1/usage/summary as CSV, a line for each customer id unless another `group_by` is named (the\nsame filters). What a company opens in a spreadsheet to bill its own customers for a month.","operationId":"usage_summary_csv_v1_usage_summary_csv_get","parameters":[{"name":"group_by","in":"query","required":false,"schema":{"type":"string","default":"customer","title":"Group By"}},{"name":"workspace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace"}},{"name":"reference","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End"}},{"name":"member","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"customer","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Usage"]}},"/v1/usage/clear":{"post":{"summary":"Usage Clear","description":"Clear the document log (an owner, or an organization key). Every entry keeps its count line (when, the type,\nthe status, how it was charged), so the invoices still add up, and loses what says which document it was: the\nfile name, row count, reference and review reasons. With it go the records and held results of jobs that have\nended, what was sent to your webhook endpoints, and every document saved for your organization because it could\nnot be read or needed review (the file and everything read from it). It cannot be undone. The activity log keeps\none line saying who cleared and how much.","operationId":"usage_clear_v1_usage_clear_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogCleared"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Usage"]}},"/v1/export/xlsx":{"post":{"summary":"Export Xlsx","description":"Turn an extraction result into an .xlsx download: a rent roll ({rows, report}) or a T12 (the T12 result as\nreturned: {doc_type: \"t12\", columns, period, rows, summary, report}) in the QuickData T12 worksheet.","operationId":"export_xlsx_v1_export_xlsx_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Extraction"]}},"/v1/t12/categories":{"get":{"summary":"T12 Categories","description":"The categories a T12 line can take: the standard ones by block (Total Rental Revenue, Total Other Income, Total\nOperating Expenses), with your custom categories under their parents. With a workspace (the X-QD-Workspace header,\nor a workspace key): the list that workspace's T12s are read with (`inherited` says whether it is the\norganization's).","operationId":"t12_categories_v1_t12_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Categories"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["T12 categories"],"parameters":[{"name":"X-QD-Workspace","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace this call works in: its id (ws_...) or your own id for it. Without it: the key's own workspace, else the default one."}]},"put":{"summary":"T12 Categories Put","description":"Replace your custom T12 categories: {\"custom\": [{\"name\": \"Electricity\", \"parent\": \"Utilities\",\n\"description\": \"optional: what belongs here\"}]}. Each sits under one standard category; a line marked with it\ncounts in its own row and in its parent's block total. Up to 60. With a workspace (the X-QD-Workspace header): that\nworkspace's own list; {\"inherit\": true} makes it follow the organization's again.","operationId":"t12_categories_put_v1_t12_categories_put","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoriesUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Categories"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["T12 categories"],"parameters":[{"name":"X-QD-Workspace","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace this call works in: its id (ws_...) or your own id for it. Without it: the key's own workspace, else the default one."}]}},"/v1/settings":{"get":{"summary":"Get Settings","description":"Your extraction settings. non_revenue_vacant (default true): model, employee, office and down units are counted\nvacant; false: vacant unless the rent roll marks the unit occupied and its own occupied count needs it. With a\nworkspace (the X-QD-Workspace header, or a workspace key): the settings that workspace's documents are read\nwith. screener: the account's own Deal Screener defaults, when it set some (GET /v1/screener/defaults has\nQuickData's beside them).","operationId":"get_settings_v1_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Settings"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Settings"],"parameters":[{"name":"X-QD-Workspace","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace this call works in: its id (ws_...) or your own id for it. Without it: the key's own workspace, else the default one."}]},"put":{"summary":"Put Settings","description":"Change your settings: {\"non_revenue_vacant\": true | false}, and/or {\"screener\": {\"assumptions\", \"targets\",\n\"state_taxes\"}} (the Deal Screener's defaults, in full: what is left out follows QuickData's). With a workspace (the\nX-QD-Workspace header): that workspace's own; {\"inherit\": true} makes it follow the organization's again.","operationId":"put_settings_v1_settings_put","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Settings"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Settings"],"parameters":[{"name":"X-QD-Workspace","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace this call works in: its id (ws_...) or your own id for it. Without it: the key's own workspace, else the default one."}]}},"/v1/samples":{"get":{"summary":"List Samples","description":"The built-in samples, rent rolls and T12s (their results are free: POST /v1/extract/sample/{id}).","operationId":"list_samples_v1_samples_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Samples"]}},"/v1/extract/sample/{sample_id}":{"post":{"summary":"Extract Sample","description":"One of the built-in samples: the result that ships with the service, free, not counted against the account.","operationId":"extract_sample_v1_extract_sample__sample_id__post","parameters":[{"name":"sample_id","in":"path","required":true,"schema":{"type":"string","title":"Sample Id"}},{"name":"verify","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Verify"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Samples"]}},"/v1/me":{"get":{"summary":"Me","description":"Your plan and status, free documents left, documents this period and the estimated charge; and who is asking:\nthe organization, your role in it, and the workspace this call works in.","operationId":"me_v1_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Account"],"parameters":[{"name":"X-QD-Workspace","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace this call works in: its id (ws_...) or your own id for it. Without it: the key's own workspace, else the default one."}]}},"/v1/api-access":{"post":{"summary":"Api Access","description":"A company on seats switches its API access on or off: {\"on\": true | false}. On: $99 a month with 100\ndocuments, then $1 each, on the same invoice; keys, clients and webhooks become available. Off: it works until\nthe end of the billing period already charged for, then stops (at once when nothing was charged for it yet).\nAn API account's plan is the API itself: this does not apply to it.","operationId":"api_access_v1_api_access_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiAccessUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiAccess"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Account"]}},"/v1/organization":{"get":{"tags":["Organization"],"summary":"Get Organization","description":"Your organization: its name, the brand on its upload pages and downloads, its plan and limits, and how its\ndocuments are handled. A workspace key and a member get its name, brand and data handling only.","operationId":"get_organization_v1_organization_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Organization"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"tags":["Organization"],"summary":"Patch Organization","description":"Change the organization's `name`, or its `brand_name`: the name shown on upload pages and in Excel downloads in\nplace of QuickData (\"\" for no name at all, null for QuickData). An owner can also set `no_document_retention` (true or\nfalse). True: from now on no file name, row count or reference of a document is recorded (the usage log keeps a\ncount line), no document is saved when it cannot be read or needs review, the record of a job is deleted a day after\nit ended (its result waits to be collected as always), and a webhook delivery's once it was made. What was recorded before stays\nuntil the log is cleared (POST /v1/usage/clear).","operationId":"patch_organization_v1_organization_patch","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Organization"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/workspaces":{"get":{"tags":["Workspaces"],"summary":"List Workspaces","description":"The workspaces you can work in: one per client (a provider) or per team (an enterprise). Owners, admins and\norganization keys see all of them.","operationId":"list_workspaces_v1_workspaces_get","parameters":[{"name":"include_archived","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Archived"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Workspace"}}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Workspaces"],"summary":"Create Workspace","description":"Create a workspace: {\"name\": \"Acme Capital\", \"external_id\": \"your own id for it\" (optional, unique),\n\"daily_limit\": documents per rolling 24 hours (optional)}. Optionally with its own `settings` and `t12_categories`\n(as PUT /v1/settings and PUT /v1/t12/categories take them); without, it follows the organization's. From then\non, name it in the X-QD-Workspace header (by `id` or by your `external_id`), or give it a key of its own.","operationId":"create_workspace_v1_workspaces_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Workspace"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/workspaces/{workspace}":{"get":{"tags":["Workspaces"],"summary":"Get Workspace","description":"One workspace, by its id or by your own id for it, with the settings and T12 categories its documents are read\nwith (`inherited`: it follows the organization's).","operationId":"get_workspace_v1_workspaces__workspace__get","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","title":"Workspace"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Workspace"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"tags":["Workspaces"],"summary":"Patch Workspace","description":"Change a workspace: `name`, `external_id`, `daily_limit` (null: no limit of its own), `status` (\"archived\" stops\nextraction for it and revokes its keys; \"active\" reopens it).","operationId":"patch_workspace_v1_workspaces__workspace__patch","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","title":"Workspace"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Workspace"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Workspaces"],"summary":"Delete Workspace","description":"Archive a workspace: extraction stops for it and its keys are revoked. Its usage stays in your log, and it can be\nreopened (PATCH status \"active\").","operationId":"delete_workspace_v1_workspaces__workspace__delete","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","title":"Workspace"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Workspace"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/members":{"get":{"tags":["Members"],"summary":"List Members","description":"The people in the organization: email, role (owner, admin, member), the workspaces they can work in, whether\nthey have signed in yet, and how many documents each has read since `since` (YYYY-MM-DD or unix seconds; default:\nthe start of this month, UTC). In a company on seats, `seat` is true for each person who has joined: those are\nthe seats it pays for.","operationId":"list_members_v1_members_get","parameters":[{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Member"}}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Members"],"summary":"Add Member","description":"Ask a person to join: {\"email\": ..., \"role\": \"member\" | \"admin\" | \"owner\", \"workspaces\": \"all\" or a list of\nworkspace ids (members only)}. They are sent an email, and become a member (status `active`) when they sign in\nwith that address and accept; until then the status is `invited`. Only an owner can add an owner. Several people\nat once: {\"emails\": [...]} with the same role for all; the answer is then {\"invited\": [...], \"skipped\": [{\"email\",\n\"reason\"}]}. In a company on seats a person costs nothing until they join.","operationId":"add_member_v1_members_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/Member"},{"$ref":"#/components/schemas/MembersInvited"}]}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/members/{member_id}/invite":{"post":{"tags":["Members"],"summary":"Invite Again","description":"Send the invitation email again to someone who has not answered yet.","operationId":"invite_again_v1_members__member_id__invite_post","parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteSent"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/members/{member_id}":{"patch":{"tags":["Members"],"summary":"Patch Member","description":"Change a member's `role`, the `workspaces` they can work in (\"all\" or a list), or their `name`. Only an owner can\nmake or unmake an owner; an organization always keeps one.","operationId":"patch_member_v1_members__member_id__patch","parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Member"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Members"],"summary":"Remove Member","description":"Remove a person: they are signed out, and the API keys they created for themselves stop working. An owner or\nadmin may also have created organization or workspace keys, which they saw once: `keys_created` lists the ones\nthat still work, and `revoke_created_keys=true` revokes them in the same call (whatever uses them stops working).","operationId":"remove_member_v1_members__member_id__delete","parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}},{"name":"revoke_created_keys","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Revoke Created Keys"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberRemoved"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/members/me":{"delete":{"tags":["Members"],"summary":"Leave Organization","description":"Leave the organization yourself: you are signed out and the API keys you created for yourself stop working.\nAn organization keeps at least one owner, so its only owner cannot leave.","operationId":"leave_organization_v1_members_me_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberRemoved"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/keys":{"get":{"tags":["API keys"],"summary":"List Keys","description":"API keys (prefix, name, scope, workspace, created, last used, revoked). Owners, admins and organization keys\nsee every key; a member sees their own.","operationId":"list_keys_v1_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiKey"}}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["API keys"],"summary":"Make Key","description":"Create an API key (query parameters, or a JSON body: {\"name\": ..., \"workspace\": ...}). The key is in the\nresponse once; store it securely. Without `workspace` it is an organization key: it works in any workspace (named by\nthe X-QD-Workspace header) and manages the organization; only an owner can create one. With `workspace` it works\nin that workspace only: the key to hand to that client's integration. A member's key is their own and stops\nworking when they leave; an owner or admin gets one of their own with `personal` true (the documents it reads\nare that person's). In a company on seats, organization and workspace keys need API access to be switched on,\nand a person who names neither a workspace nor a `scope` gets a key of their own: `scope` \"organization\" asks for\nthe company's. (So whatever a signed-in person's program makes for itself, what it reads is that person's.)","operationId":"make_key_v1_keys_post","parameters":[{"name":"name","in":"query","required":false,"schema":{"type":"string","default":"Default","title":"Name"}},{"name":"workspace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace"}},{"name":"personal","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Personal"}},{"name":"scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewApiKey"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyCreate"}}}}}},"/v1/keys/{key_id}":{"delete":{"tags":["API keys"],"summary":"Drop Key","description":"Revoke an API key: anything using it stops working immediately.","operationId":"drop_key_v1_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/keys/{key_id}/replace":{"post":{"tags":["API keys"],"summary":"Replace Key","description":"Replace an API key: a new key with the same name and the same reach is made (it is in the response once), and\nthe old one stops working in the same step. For a key that may have been seen by someone who should not have it.\nTo change keys with no interruption instead, create a second key, move your software to it, then revoke the first.","operationId":"replace_key_v1_keys__key_id__replace_post","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewApiKey"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks":{"get":{"tags":["Webhooks"],"summary":"List Webhooks","description":"Your webhook endpoints.","operationId":"list_webhooks_v1_webhooks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Webhooks"],"summary":"Create Webhook","description":"Register an endpoint: {\"url\": \"https://...\", \"events\": [\"job.completed\", \"job.failed\", \"batch.completed\"]\n(default: all), \"workspace\": only that workspace's events (optional), \"description\": ...}. The answer carries the\nendpoint's `secret`, which signs every delivery (the QD-Signature header).","operationId":"create_webhook_v1_webhooks_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks/{webhook_id}":{"get":{"tags":["Webhooks"],"summary":"Get Webhook","description":"One endpoint, with its signing secret.","operationId":"get_webhook_v1_webhooks__webhook_id__get","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"tags":["Webhooks"],"summary":"Patch Webhook","description":"Change an endpoint: `url`, `events`, `active` (false pauses it), `description`; {\"roll_secret\": true} issues a\nnew signing secret (returned once here).","operationId":"patch_webhook_v1_webhooks__webhook_id__patch","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Webhooks"],"summary":"Delete Webhook","description":"Remove an endpoint (and its delivery history).","operationId":"delete_webhook_v1_webhooks__webhook_id__delete","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks/{webhook_id}/test":{"post":{"tags":["Webhooks"],"summary":"Test Webhook","description":"Send a `webhook.test` event to the endpoint now, signed like any other, and report how it answered.","operationId":"test_webhook_v1_webhooks__webhook_id__test_post","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookTest"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks/{webhook_id}/deliveries":{"get":{"tags":["Webhooks"],"summary":"Webhook Deliveries","description":"What was sent to an endpoint in the last 7 days: the event, when, how many tries, how it was answered.","operationId":"webhook_deliveries_v1_webhooks__webhook_id__deliveries_get","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDelivery"}}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/audit-log":{"get":{"tags":["Organization"],"summary":"Audit Log","description":"The organization's activity log, newest first: who (a member, or a key) did what (invited a member, created or\nrevoked a key, created or archived a workspace, changed settings, a held document deleted). `before`: an entry's\nid, for the next page.","operationId":"audit_log_v1_audit_log_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Before"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AuditEntry"}}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/held-documents":{"get":{"tags":["Organization"],"summary":"Held Documents","description":"The documents QuickData is holding for your organization: only ones that could not be read, or whose result\nneeds review, are saved, so the cause can be found and fixed. Each is deleted (the file and everything read from\nit) once that is done, and no later than `deleted_no_later_than`. An empty list means nothing of yours is held.","operationId":"held_documents_v1_held_documents_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HeldDocument"}}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/jobs":{"post":{"tags":["Jobs"],"summary":"Submit Job","description":"Queue one document and answer at once with its job id. Send the file (multipart `file`) or a link to it\n(`file_url`, as a form field or in a JSON body; a Dropbox or Google Drive share link works). `doc_type` is `auto`\n(default), `rent_roll` or `t12`; `reference` and `metadata` are yours and come back with the result. Then poll\nGET /v1/jobs/{job_id}, or register a webhook and be told. An `Idempotency-Key` header makes a retry of the same\nrequest return the same job instead of a second one.","operationId":"submit_job_v1_jobs_post","responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"The document (xlsx, xlsm, xls, csv, pdf; up to 25 MB)"},"file_url":{"type":"string","description":"Instead of `file`: a link the service can download it from"},"filename":{"type":"string","description":"With `file_url`: the file's name with its real extension, when the link does not end in one"},"doc_type":{"type":"string","enum":["auto","rent_roll","t12"],"default":"auto"},"reference":{"type":"string","description":"Your own id for the document (up to 200 characters)"},"metadata":{"type":"string","description":"A small JSON object of your own, echoed in the result and in webhooks"},"verify":{"type":"boolean","default":true}}}},"application/json":{"schema":{"type":"object","required":["file_url"],"properties":{"file_url":{"type":"string"},"filename":{"type":"string"},"doc_type":{"type":"string","default":"auto"},"reference":{"type":"string"},"metadata":{"type":"object"},"verify":{"type":"boolean","default":true}}}}}},"parameters":[{"name":"X-QD-Workspace","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace this call works in: its id (ws_...) or your own id for it. Without it: the key's own workspace, else the default one."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Any string of yours: a retry with the same one returns the job already created (for 24 hours)."}]},"get":{"tags":["Jobs"],"summary":"List Jobs","description":"Your jobs, newest first, without their results. Filters: `status` (queued, processing, done, failed,\nwaiting_upload), `batch` (a batch id), `workspace`.","operationId":"list_jobs_v1_jobs_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"batch","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Batch"}},{"name":"workspace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Job"}}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/jobs/{job_id}":{"get":{"tags":["Jobs"],"summary":"Get Job","description":"A job's status (waiting_upload, queued, processing, done, failed, expired) and, once it has ended and while its\nresult is held, the result (the same an extract call returns) with signed Excel and JSON download links.","operationId":"get_job_v1_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"include_rows","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Rows"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Jobs"],"summary":"Delete Job","description":"Remove a job's result now, instead of leaving it to wait out its time. The job's record (file name, status,\ntimes) stays in your list. A job that is still waiting or being read cannot be deleted.","operationId":"delete_job_v1_jobs__job_id__delete","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/jobs/{job_id}/result.{fmt}":{"get":{"tags":["Jobs"],"summary":"Job Download","description":"A job's result as Excel (result.xlsx) or JSON (result.json): with the signed `t` from the job's download\nlinks, or with your API key. Available while the result is held.","operationId":"job_download_v1_jobs__job_id__result__fmt__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"fmt","in":"path","required":true,"schema":{"type":"string","title":"Fmt"}},{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/batches":{"post":{"tags":["Batches"],"summary":"Submit Batch","description":"Queue several documents at once (up to 50): files (multipart, repeat the field `files`) and/or links\n(`file_urls`: a JSON list of links, or of {\"url\", \"filename\", \"reference\"}). Each becomes a job of its own; the\nanswer has the batch's id and every job's. `reference` and `metadata` apply to the batch and its jobs. Then poll\nGET /v1/batches/{batch_id}, or take the `batch.completed` webhook. Each document counts against your limits like any\nother.","operationId":"submit_batch_v1_batches_post","responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Batch"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"files":{"type":"array","items":{"type":"string","format":"binary"},"description":"The documents (repeat the field; up to 50)"},"file_urls":{"type":"string","description":"A JSON list of links, or of {\"url\", \"filename\", \"reference\"}"},"doc_type":{"type":"string","enum":["auto","rent_roll","t12"],"default":"auto"},"reference":{"type":"string","description":"Your own id for the batch; each job carries it unless a link names its own"},"metadata":{"type":"string"},"verify":{"type":"boolean","default":true}}}},"application/json":{"schema":{"type":"object","required":["file_urls"],"properties":{"file_urls":{"type":"array","items":{"oneOf":[{"type":"string"},{"type":"object","properties":{"url":{"type":"string"},"filename":{"type":"string"},"reference":{"type":"string"}}}]}},"doc_type":{"type":"string","default":"auto"},"reference":{"type":"string"},"metadata":{"type":"object"},"verify":{"type":"boolean","default":true}}}}}},"parameters":[{"name":"X-QD-Workspace","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace this call works in: its id (ws_...) or your own id for it. Without it: the key's own workspace, else the default one."}]},"get":{"tags":["Batches"],"summary":"List Batches","description":"Your batches, newest first, with their counts.","operationId":"list_batches_v1_batches_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Batch"}}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/batches/{batch_id}":{"get":{"tags":["Batches"],"summary":"Get Batch","description":"A batch: `status` (processing, completed), the counts, and each job with its file, status and result status.\nFetch a job's result with GET /v1/jobs/{job_id}; `downloads.zip` is every held result in one file.","operationId":"get_batch_v1_batches__batch_id__get","parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Batch"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/batches/{batch_id}/results.zip":{"get":{"tags":["Batches"],"summary":"Batch Zip","description":"Every held result of a batch in one zip: an Excel workbook per document (`format=json` for JSON, `both` for\nboth). With the signed `t` from the batch's download link, or with your API key.","operationId":"batch_zip_v1_batches__batch_id__results_zip_get","parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}},{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"xlsx","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/uploads":{"post":{"tags":["Upload links"],"summary":"Create Upload Link","description":"A page where someone (a client, a colleague, a user in a chat app) drops a document for your account:\ndoc_type `auto` (default: a rent roll or a T12, detected from the file), `rent_roll` or `t12`. The link works for\n30 minutes. With `max_files` above 1 (up to 50) the page takes several files and the answer has a `batch_id`\ninstead of a `job_id`. `reference` is yours and comes back with the results. The page carries your organization's\nbrand name. Each document is read on upload and counted like any other; poll GET /v1/jobs/{job_id} (or\nGET /v1/batches/{batch_id}), or take the webhook.","operationId":"create_upload_link_v1_uploads_post","parameters":[{"name":"verify","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Verify"}},{"name":"doc_type","in":"query","required":false,"schema":{"type":"string","default":"auto","title":"Doc Type"}},{"name":"max_files","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Max Files"}},{"name":"reference","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference"}},{"name":"X-QD-Workspace","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace this call works in: its id (ws_...) or your own id for it. Without it: the key's own workspace, else the default one."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadLink"}}}},"422":{"description":"A field is missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/addin":{"get":{"summary":"Addin Info","description":"The Excel add-in release customers get now: its version, size, SHA-256 and notes, and the oldest version that\nmay still be used (`min_supported_version`, \"\" for none). The add-in's update check: compare `version` with the\nrunning one, number by number, and offer `url` when it is higher; never offer a lower one. `{\"available\": false}`\nwhile nothing is published. Signed in (the add-in's or the console's session) or with an API key.","operationId":"addin_info_v1_addin_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddinRelease"}}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Excel add-in"]}},"/download/excel-add-in":{"get":{"summary":"Addin Download","description":"The Excel add-in release customers get now, as a file, for anyone: no sign-in is needed (David, 2026-10-13:\n\"make the download link public\"; using the add-in still takes a sign-in with an Excel Add-In seat). Each download\nis counted, with the customer when signed in (the add-in's or the console's session, or an API key). Without a\nsign-in, one address may download it up to 30 times an hour. Check the file's size and SHA-256 against\nGET /v1/addin before installing it.","operationId":"addin_download_download_excel_add_in_get","responses":{"200":{"description":"The installer, as a file (Content-Length; X-QD-Addin-Version and X-QD-Addin-SHA256 name what it is)","content":{"application/octet-stream":{}}},"400":{"description":"The request is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key or person may not do that","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such thing in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"A limit was reached: see `code` and the Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Excel add-in"]}}},"components":{"schemas":{"Body_extract_typed_v1_extract__doc_type__post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"verify":{"type":"boolean","title":"Verify","default":true},"expected":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected"},"reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference"},"metadata":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metadata"},"sheet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheet"},"ask_sheet":{"type":"boolean","title":"Ask Sheet","default":false}},"type":"object","required":["file"],"title":"Body_extract_typed_v1_extract__doc_type__post"},"Body_extract_v1_extract_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"verify":{"type":"boolean","title":"Verify","default":true},"reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference"},"metadata":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metadata"},"sheet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheet"},"ask_sheet":{"type":"boolean","title":"Ask Sheet","default":false}},"type":"object","required":["file"],"title":"Body_extract_v1_extract_post"},"Error":{"type":"object","properties":{"detail":{"description":"What happened, in words (for a 422: the list of fields that are wrong)","anyOf":[{"type":"string"},{"type":"array","items":{"type":"object","additionalProperties":true}}]},"code":{"type":"string","description":"The cause, for a program. One of: invalid_request, unauthorized, invalid_api_key, session_expired, access_removed, payment_failed, account_inactive, forbidden, workspace_forbidden, workspace_archived, not_found, workspace_not_found, job_not_found, batch_not_found, key_not_found, member_not_found, webhook_not_found, result_not_available, unknown_document_type, external_id_taken, member_exists, last_owner, limit_reached, job_not_finished, link_used, link_expired, file_too_large, unsupported_file_type, batch_too_large, file_url_unreachable, rate_limited, too_many_in_flight, daily_limit_reached, workspace_limit_reached, queue_full, processing_error, upstream_unavailable, unavailable, at_capacity, conflict, no_account, api_access_off, excel_plan_required. New codes may be added."}},"required":["detail","code"],"description":"Every error has this shape"},"Unit":{"type":"object","properties":{"unit_num":{"type":"string"},"unit_type":{"type":"string"},"sqft":{"type":"string"},"br":{"type":"string"},"bath":{"type":"string"},"tenant":{"type":"string"},"move_in":{"type":"string"},"move_out":{"type":"string"},"lease_start":{"type":"string"},"lease_end":{"type":"string"},"rent_market":{"type":"string"},"rent_tenant":{"type":"string"},"rent_gov_subsidy":{"type":"string"},"rent_total":{"type":"string"},"is_mtm":{"type":"string"},"mtm_charge":{"type":"string"},"model_employee_down_unit":{"type":"string"},"occupancy":{"type":"string","enum":["OCC","VAC",""]},"other_charges":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"amount":{"type":"string"}}}}},"description":"One unit of a rent roll. Every value is a string ('' when the document has none); dates are YYYY-MM-DD; money is a plain number.","additionalProperties":true},"Report":{"type":"object","properties":{"status":{"type":"string","enum":["ok","needs_review","failed"],"description":"failed: nothing could be read (not billed)"},"file":{"anyOf":[{"type":"string"},{"type":"null"}]},"format":{"anyOf":[{"type":"string"},{"type":"null"}]},"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}]},"elapsed_s":{"anyOf":[{"type":"number"},{"type":"null"}]},"error":{"anyOf":[{"type":"string"},{"type":"null"}]},"validation":{"type":"object","properties":{"passed":{"type":"boolean"},"review_reasons":{"type":"array","items":{"type":"string"}},"checks":{"type":"array","items":{"type":"object","properties":{"check":{"type":"string"},"extracted":{},"document":{},"match":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"document_issue":{"type":"object","properties":{"note":{"type":"string"}},"description":"Present when the check fails because the document disagrees with itself (a unit list shorter than its own summary counts; a T12 subtotal that its lines do not add up to): what to show in place of the two numbers"}},"additionalProperties":true}}},"additionalProperties":true}},"required":["status"],"description":"The checks against the document's own figures. See the guide for every field.","additionalProperties":true},"RentRollResult":{"type":"object","properties":{"rows":{"type":"array","items":{"$ref":"#/components/schemas/Unit"}},"unit_mix":{"anyOf":[{"type":"object","properties":{"by_type":{"type":"array","items":{"type":"object","additionalProperties":true}},"totals":{"type":"object","additionalProperties":true}},"additionalProperties":true},{"type":"null"}]},"report":{"$ref":"#/components/schemas/Report"},"usage":{"type":"object","properties":{"billed":{"type":"boolean"},"cached":{"type":"boolean","description":"Always false: results are not stored, and every document that is read is counted. Kept for programs that read it"},"free_documents_remaining":{"type":"integer"},"documents_this_period":{"type":"integer"},"sample":{"type":"boolean"},"error":{"type":"string"},"seat":{"type":"boolean","description":"In a company on seats: read on a person's seat (billed only beyond the seat's fair use; documents_this_period is then that person's count)"}},"required":["billed"],"description":"How the document was counted. The two totals are the organization's: a workspace key and a member's key get billed and cached only."},"workspace":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}]}},"description":"The workspace a document was read for"},"reference":{"type":"string"},"customer":{"type":"string","description":"Your own id for the customer the document is for (what you sent in X-QD-Customer)"},"metadata":{"type":"object","additionalProperties":true},"detected":{"type":"object","additionalProperties":true}},"required":["rows","report"],"description":"A rent roll's result","additionalProperties":true},"T12Result":{"type":"object","properties":{"doc_type":{"type":"string","enum":["t12"]},"columns":{"type":"array","items":{"type":"string"}},"period":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"rows":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"canonical_label":{"type":"string"},"custom_label":{"type":"string"},"is_subtotal":{"type":"boolean"},"values":{"type":"array","items":{"type":"string"}},"total":{"type":"string"},"document_total":{"type":"string"},"review_note":{"type":"string"}},"additionalProperties":true}},"summary":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"report":{"$ref":"#/components/schemas/Report"},"usage":{"type":"object","properties":{"billed":{"type":"boolean"},"cached":{"type":"boolean","description":"Always false: results are not stored, and every document that is read is counted. Kept for programs that read it"},"free_documents_remaining":{"type":"integer"},"documents_this_period":{"type":"integer"},"sample":{"type":"boolean"},"error":{"type":"string"},"seat":{"type":"boolean","description":"In a company on seats: read on a person's seat (billed only beyond the seat's fair use; documents_this_period is then that person's count)"}},"required":["billed"],"description":"How the document was counted. The two totals are the organization's: a workspace key and a member's key get billed and cached only."},"workspace":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}]}},"description":"The workspace a document was read for"},"reference":{"type":"string"},"customer":{"type":"string"},"metadata":{"type":"object","additionalProperties":true},"detected":{"type":"object","additionalProperties":true}},"required":["doc_type","rows","report"],"description":"A T12 operating statement's result","additionalProperties":true},"Result":{"anyOf":[{"$ref":"#/components/schemas/RentRollResult"},{"$ref":"#/components/schemas/T12Result"}],"description":"A T12's result has doc_type 't12'; a rent roll's has none"},"Job":{"type":"object","properties":{"job_id":{"type":"string"},"status":{"type":"string","enum":["waiting_upload","queued","processing","done","failed","expired"]},"filename":{"anyOf":[{"type":"string"},{"type":"null"}]},"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}]},"reference":{"anyOf":[{"type":"string"},{"type":"null"}]},"metadata":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"customer":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Your own id for the customer the document is for (what you sent in X-QD-Customer)"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"batch_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"created_at":{"anyOf":[{"type":"integer","description":"Unix time, seconds"},{"type":"null"}]},"started_at":{"anyOf":[{"type":"integer","description":"Unix time, seconds"},{"type":"null"}]},"finished_at":{"anyOf":[{"type":"integer","description":"Unix time, seconds"},{"type":"null"}]},"result_status":{"anyOf":[{"type":"string","enum":["ok","needs_review","failed"]},{"type":"null"}]},"error":{"type":"string"},"error_code":{"type":"string","description":"Why a job failed: no_table_found, file_url_unreachable, payment_failed, daily_limit_reached, workspace_limit_reached, processing_error, interrupted, ..."},"result_available":{"type":"boolean"},"result_expires_at":{"anyOf":[{"type":"integer","description":"Unix time, seconds"},{"type":"null"}]},"downloads":{"type":"object","properties":{"excel":{"type":"string"},"json":{"type":"string"},"expire_in_hours":{"type":"number"},"expires_at":{"type":"integer","description":"Unix time, seconds"}},"description":"Signed links; they work while the result is held"},"result":{"$ref":"#/components/schemas/Result"},"note":{"type":"string"},"expires_at":{"anyOf":[{"type":"integer","description":"Unix time, seconds"},{"type":"null"}]},"idempotent_replay":{"type":"boolean"}},"required":["job_id","status"]},"BatchJob":{"type":"object","properties":{"job_id":{"type":"string"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"type":"string"},"result_status":{"anyOf":[{"type":"string"},{"type":"null"}]},"reference":{"anyOf":[{"type":"string"},{"type":"null"}]},"rows":{"anyOf":[{"type":"integer"},{"type":"null"}]},"error":{"anyOf":[{"type":"string"},{"type":"null"}]},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}]},"result_available":{"type":"boolean"}}},"Batch":{"type":"object","properties":{"batch_id":{"type":"string"},"status":{"type":"string","enum":["waiting_upload","processing","completed"]},"counts":{"type":"object","properties":{"total":{"type":"integer"},"queued":{"type":"integer"},"processing":{"type":"integer"},"done":{"type":"integer"},"failed":{"type":"integer"}}},"reference":{"anyOf":[{"type":"string"},{"type":"null"}]},"metadata":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"customer":{"anyOf":[{"type":"string"},{"type":"null"}]},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"created_at":{"type":"integer","description":"Unix time, seconds"},"jobs":{"type":"array","items":{"$ref":"#/components/schemas/BatchJob"}},"downloads":{"type":"object","properties":{"zip":{"type":"string"}}}},"required":["batch_id","status","counts"]},"UploadLink":{"type":"object","properties":{"job_id":{"type":"string"},"batch_id":{"type":"string"},"upload_url":{"type":"string"},"expires_at":{"type":"integer","description":"Unix time, seconds"},"max_files":{"type":"integer"}},"required":["upload_url","expires_at"],"description":"job_id for a one-file link; batch_id (and max_files) for a link that takes several"},"Workspace":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"type":"string","enum":["active","archived"]},"is_default":{"type":"boolean"},"daily_limit":{"anyOf":[{"type":"integer"},{"type":"null"}]},"created_at":{"type":"integer","description":"Unix time, seconds"},"keys_revoked":{"type":"integer"},"settings":{"type":"object","properties":{"values":{"$ref":"#/components/schemas/Settings"},"inherited":{"type":"boolean"}}},"t12_categories":{"type":"object","properties":{"custom":{"type":"array","items":{"$ref":"#/components/schemas/CustomCategory"}},"inherited":{"type":"boolean"}}}},"required":["id","name","status"]},"WorkspaceCreate":{"type":"object","properties":{"name":{"type":"string"},"external_id":{"type":"string","description":"Your own id for the client or team; unique in your organization"},"daily_limit":{"anyOf":[{"type":"integer"},{"type":"null"}]},"settings":{"$ref":"#/components/schemas/Settings"},"t12_categories":{"type":"array","items":{"$ref":"#/components/schemas/CustomCategory"}}},"required":["name"]},"WorkspaceUpdate":{"type":"object","properties":{"name":{"type":"string"},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"daily_limit":{"anyOf":[{"type":"integer"},{"type":"null"}]},"status":{"type":"string","enum":["active","archived"]}}},"Member":{"type":"object","properties":{"id":{"type":"integer"},"email":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"role":{"type":"string","enum":["owner","admin","member"]},"workspaces":{"anyOf":[{"type":"string","enum":["all"]},{"type":"array","items":{"type":"string"}}]},"status":{"type":"string","enum":["invited","active"]},"invited_at":{"type":"integer","description":"Unix time, seconds"},"joined_at":{"anyOf":[{"type":"integer","description":"Unix time, seconds"},{"type":"null"}]},"email_sent":{"type":"boolean"},"invited_by":{"anyOf":[{"type":"string"},{"type":"null"}]},"documents":{"type":"integer","description":"Documents this person has read since `since` (default: the start of this month, UTC)"},"seat":{"type":"boolean","description":"In a company on seats: this person has joined and is one of the seats it pays for"},"keys_created":{"type":"array","items":{"$ref":"#/components/schemas/KeyLeftBehind"},"description":"On a change that ends someone's time as an owner or admin: the organization and workspace keys they created that still work"}},"required":["id","email","role"]},"KeyLeftBehind":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"prefix":{"type":"string"},"scope":{"type":"string","enum":["organization","workspace"]},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"revoked":{"type":"boolean","description":"True when this call revoked it (revoke_created_keys=true)"}},"required":["id","name"]},"MemberRemoved":{"type":"object","properties":{"ok":{"type":"boolean"},"keys_revoked":{"type":"integer","description":"Keys of the person's own, revoked"},"keys_created":{"type":"array","items":{"$ref":"#/components/schemas/KeyLeftBehind"},"description":"Organization and workspace keys the person created (they saw each once)"}},"required":["ok"]},"MemberCreate":{"type":"object","properties":{"email":{"type":"string"},"emails":{"type":"array","items":{"type":"string"},"description":"Several people at once (up to 50), instead of `email`"},"role":{"type":"string","enum":["owner","admin","member"]},"workspaces":{"anyOf":[{"type":"string","enum":["all"]},{"type":"array","items":{"type":"string"}}]},"name":{"type":"string"}}},"MembersInvited":{"type":"object","properties":{"invited":{"type":"array","items":{"$ref":"#/components/schemas/Member"}},"skipped":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string"},"reason":{"type":"string"},"code":{"type":"string"}}}}},"required":["invited","skipped"],"description":"The answer to an invitation of several people (`emails`)"},"InviteSent":{"type":"object","properties":{"email":{"type":"string"},"email_sent":{"type":"boolean"}}},"LogCleared":{"type":"object","properties":{"ok":{"type":"boolean"},"documents":{"type":"integer","description":"Log entries that lost their details"},"saved_documents":{"type":"integer","description":"Saved problem documents deleted"},"jobs":{"type":"integer","description":"Job records (and held results) deleted"},"webhook_deliveries":{"type":"integer"}},"required":["ok"]},"ApiAccess":{"type":"object","properties":{"on":{"type":"boolean"},"ends_at":{"anyOf":[{"type":"integer","description":"Unix time, seconds"},{"type":"null"}],"description":"Switched off: when it stops working (the end of the billing period)"}},"required":["on"]},"ApiAccessUpdate":{"type":"object","properties":{"on":{"type":"boolean"}},"required":["on"]},"MemberUpdate":{"type":"object","properties":{"role":{"type":"string","enum":["owner","admin","member"]},"workspaces":{"anyOf":[{"type":"string","enum":["all"]},{"type":"array","items":{"type":"string"}}]},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"ApiKey":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"prefix":{"type":"string"},"created_at":{"type":"integer","description":"Unix time, seconds"},"last_used_at":{"anyOf":[{"type":"integer","description":"Unix time, seconds"},{"type":"null"}]},"revoked_at":{"anyOf":[{"type":"integer","description":"Unix time, seconds"},{"type":"null"}]},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"workspace_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"scope":{"type":"string","enum":["organization","workspace","member"]},"member":{"anyOf":[{"type":"string"},{"type":"null"}]},"created_by":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The member who created an organization or workspace key in the console"}},"required":["id","name","scope"]},"NewApiKey":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"api_key":{"type":"string","description":"Shown once"},"note":{"type":"string"},"scope":{"type":"string","enum":["organization","workspace","member"]},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"replaced":{"type":"object","properties":{"id":{"type":"integer"},"prefix":{"type":"string"}},"description":"Only from POST /v1/keys/{id}/replace: the key this one took the place of, which no longer works"}},"required":["id","api_key"]},"KeyCreate":{"type":"object","properties":{"name":{"type":"string"},"workspace":{"type":"string","description":"A workspace id or your own id for it: a workspace key. Without it: an organization key (owners only)."},"personal":{"type":"boolean","description":"A key of your own (what a person puts in the Excel add-in): the documents it reads are yours"}}},"Webhook":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string","enum":["job.completed","job.failed","batch.completed"]}},"active":{"type":"boolean"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"created_at":{"type":"integer","description":"Unix time, seconds"},"secret":{"type":"string"},"secret_hint":{"type":"string"}},"required":["id","url","events"]},"WebhookCreate":{"type":"object","properties":{"url":{"type":"string"},"events":{"type":"array","items":{"type":"string","enum":["job.completed","job.failed","batch.completed"]}},"workspace":{"type":"string"},"description":{"type":"string"}},"required":["url"]},"WebhookUpdate":{"type":"object","properties":{"url":{"type":"string"},"events":{"type":"array","items":{"type":"string","enum":["job.completed","job.failed","batch.completed"]}},"active":{"type":"boolean"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"roll_secret":{"type":"boolean"}}},"WebhookEvent":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string","enum":["job.completed","job.failed","batch.completed","webhook.test"]},"created":{"type":"integer","description":"Unix time, seconds"},"data":{"type":"object","additionalProperties":true,"description":"A job: job_id, status, result_status, doc_type, filename, reference, metadata, customer, workspace, batch_id, rows, error, error_code, result_url, result_expires_at. A batch: batch_id, status, counts, reference, metadata, customer, workspace_id, created_at, result_url. Never the document's content."}},"required":["id","type","created","data"],"description":"The body of a webhook delivery"},"WebhookDelivery":{"type":"object","properties":{"id":{"type":"string"},"event":{"type":"string"},"created":{"type":"integer","description":"Unix time, seconds"},"attempts":{"type":"integer"},"status":{"type":"string","enum":["pending","delivered","failed"]},"last_code":{"anyOf":[{"type":"integer"},{"type":"null"}]},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}]},"delivered_at":{"anyOf":[{"type":"integer","description":"Unix time, seconds"},{"type":"null"}]},"next_try":{"anyOf":[{"type":"number"},{"type":"null"}]},"body":{"$ref":"#/components/schemas/WebhookEvent"}}},"WebhookTest":{"type":"object","properties":{"delivered":{"type":"boolean"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}]},"error":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"Organization":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"brand_name":{"type":"string","description":"The name on upload pages and downloads: 'QuickData' unless you set your own ('' for none)"},"plan":{"type":"string"},"status":{"type":"string"},"workspaces":{"type":"integer"},"members":{"type":"integer"},"limits":{"type":"object","properties":{"documents_per_day":{"type":"integer"},"documents_per_minute":{"type":"integer"},"documents_in_flight":{"type":"integer"},"workspace_documents_per_day":{"anyOf":[{"type":"integer"},{"type":"null"}]}}},"data":{"type":"object","properties":{"mode":{"type":"string","enum":["private"]},"results_held_hours":{"type":"integer"},"saved_documents_kept_days":{"type":"integer"},"saved":{"type":"string"},"no_document_retention":{"type":"boolean","description":"True: QuickData records no file name or other detail of a document, and saves none"}},"description":"How documents are handled: nothing of a document that reads cleanly is stored"},"seats":{"type":"boolean","description":"A company on seats: each person who has joined is charged"},"api":{"type":"boolean","description":"The API Plan (the plan of an account that has it alone; an addition for a company with the Excel Add-In)"}},"required":["id","name"]},"OrganizationUpdate":{"type":"object","properties":{"name":{"type":"string"},"brand_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"no_document_retention":{"type":"boolean","description":"Owners only: record no details of documents and save none"}}},"AddinRelease":{"type":"object","properties":{"available":{"type":"boolean","description":"False while no release is published (then nothing else is sent)"},"version":{"type":"string","description":"The release customers get now, e.g. 2.0.1: compare it with the running add-in number by number and offer the update only when it is higher"},"filename":{"type":"string"},"bytes":{"type":"integer","description":"The file's size: check the download against it"},"sha256":{"type":"string","description":"The file's SHA-256 (hex): check the download against it before installing"},"released":{"type":"integer","description":"Unix time, seconds"},"notes":{"type":"string","description":"Release notes, \"\" when none"},"min_supported_version":{"type":"string","description":"Add-ins older than this must update before they read documents; \"\" when every version may still be used"},"url":{"type":"string","description":"Where to download it: /download/excel-add-in (no sign-in needed)"}},"required":["available"],"description":"The Excel add-in's current release: the add-in's update check"},"Me":{"type":"object","properties":{"organization":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"}}},"role":{"type":"string","enum":["owner","admin","member","org_key","workspace_key"]},"workspace":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}]}},"description":"The workspace a document was read for"},{"type":"null"}]},"limits":{"type":"object","properties":{"documents_per_day":{"type":"integer"},"documents_per_minute":{"type":"integer"},"documents_in_flight":{"type":"integer"},"workspace_documents_per_day":{"anyOf":[{"type":"integer"},{"type":"null"}]}}},"data":{"type":"object","properties":{"mode":{"type":"string","enum":["private"]},"results_held_hours":{"type":"integer"},"saved_documents_kept_days":{"type":"integer"},"saved":{"type":"string"},"no_document_retention":{"type":"boolean","description":"True: QuickData records no file name or other detail of a document, and saves none"}},"description":"How documents are handled: nothing of a document that reads cleanly is stored"},"status":{"type":"string"},"plan":{"type":"string"},"plan_name":{"type":"string"},"member":{"type":"object","properties":{"id":{"type":"integer"},"email":{"type":"string"},"role":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"invited_by":{"anyOf":[{"type":"string"},{"type":"null"}]},"seat":{"type":"object","properties":{"documents_this_period":{"type":"integer"}},"description":"In a company on seats: what this person has read on their seat"}}},"company":{"type":"object","properties":{"seats":{"type":"boolean"},"api":{"type":"boolean"}},"description":"Which plans the account has: `seats` the Excel Add-In (each person on a seat), `api` the API Plan"},"signed_in_with_key":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"prefix":{"type":"string"}},"description":"Only in a console that was opened with an API key"}},"description":"Owners, admins and organization keys also get the plan's figures: free_documents_remaining, documents_this_period, estimated_charge_this_period_usd, ...","additionalProperties":true},"UsageEntry":{"type":"object","properties":{"id":{"type":"integer"},"ts":{"type":"integer","description":"Unix time, seconds"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}]},"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}]},"rows":{"anyOf":[{"type":"integer"},{"type":"null"}]},"status":{"anyOf":[{"type":"string"},{"type":"null"}]},"billed":{"type":"boolean"},"cached":{"type":"boolean","description":"True only on entries from before results stopped being stored: served from the cache then, not billed"},"free":{"type":"boolean"},"seat":{"type":"boolean","description":"Read on a person's seat"},"elapsed_s":{"anyOf":[{"type":"number"},{"type":"null"}]},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Where it came from: excel (the add-in), console, api (a key), upload_link, mcp (an AI assistant)"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"reference":{"anyOf":[{"type":"string"},{"type":"null"}]},"key_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"member_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"review":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Why the document needed review, in plain words (its review reasons); null when it did not"},"rent_check":{"anyOf":[{"type":"string","enum":["document","review","none"]},{"type":"null"}],"description":"For a rent roll read ok: its tenant rent matches a rent total the document prints (document), the document prints none and a second reading checked the rent (review), or neither (none); null otherwise"},"customer":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Your own id for the customer the document is for (what you sent in X-QD-Customer)"}}},"UsageSummary":{"type":"object","properties":{"group_by":{"type":"string"},"start":{"anyOf":[{"type":"integer","description":"Unix time, seconds"},{"type":"null"}]},"end":{"anyOf":[{"type":"integer","description":"Unix time, seconds"},{"type":"null"}]},"lines":{"type":"array","items":{"type":"object","properties":{"documents":{"type":"integer"},"billed":{"type":"integer"},"free":{"type":"integer"},"cached":{"type":"integer"},"seat":{"type":"integer"},"seat_documents":{"type":"integer","description":"Documents read on a person's seat (the Excel Add-In's), those that could not be read left out"},"failed":{"type":"integer"},"needs_review":{"type":"integer"},"first_at":{"anyOf":[{"type":"integer","description":"Unix time, seconds"},{"type":"null"}]},"last_at":{"anyOf":[{"type":"integer","description":"Unix time, seconds"},{"type":"null"}]},"workspace_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":true}},"total_lines":{"type":"integer","description":"How many lines there are, whatever `limit` and `offset` returned"},"totals":{"type":"object","properties":{"documents":{"type":"integer"},"billed":{"type":"integer"},"free":{"type":"integer"},"cached":{"type":"integer"},"seat":{"type":"integer"},"seat_documents":{"type":"integer"},"failed":{"type":"integer"},"needs_review":{"type":"integer"}}}}},"AuditEntry":{"type":"object","properties":{"id":{"type":"integer"},"ts":{"type":"integer","description":"Unix time, seconds"},"actor":{"anyOf":[{"type":"string"},{"type":"null"}]},"actor_kind":{"anyOf":[{"type":"string","enum":["member","key","superadmin","system"]},{"type":"null"}]},"action":{"type":"string"},"target":{"anyOf":[{"type":"string"},{"type":"null"}]},"detail":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}]}}},"HeldDocument":{"type":"object","properties":{"id":{"type":"integer"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}]},"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}]},"reason":{"type":"string","enum":["needs_review","unreadable","error"]},"kept":{"type":"string","enum":["anonymized_copy","report_only","pending","file"],"description":"What is kept of the file: an anonymized copy (names, ids, emails and phone numbers replaced), no file at all (a scan, or one that could not be copied: only what was read from it), the copy is being made, or the file as sent (saved before 2026-10-12, replaced by its anonymized copy shortly)"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"reference":{"anyOf":[{"type":"string"},{"type":"null"}]},"bytes":{"anyOf":[{"type":"integer"},{"type":"null"}]},"saved_at":{"type":"integer","description":"Unix time, seconds"},"last_sent_at":{"type":"integer","description":"Unix time, seconds"},"deleted_no_later_than":{"type":"integer","description":"Unix time, seconds"}},"description":"A document saved because it could not be read or its result needs review"},"Settings":{"type":"object","properties":{"non_revenue_vacant":{"type":"boolean","description":"Count model, employee, office and down units as vacant (default true)"},"screener":{"type":"object","additionalProperties":true,"description":"Your own Deal Screener defaults: {assumptions, targets, state_taxes}, only what you set ({} = QuickData's)"}},"additionalProperties":true},"SettingsUpdate":{"type":"object","properties":{"non_revenue_vacant":{"type":"boolean"},"screener":{"type":"object","additionalProperties":true,"description":"Your own Deal Screener defaults, in full (what you leave out follows QuickData's)"},"inherit":{"type":"boolean","description":"With a workspace: follow the organization's again"}}},"CustomCategory":{"type":"object","properties":{"name":{"type":"string"},"parent":{"type":"string"},"description":{"type":"string"}},"required":["name","parent"]},"Categories":{"type":"object","properties":{"custom":{"type":"array","items":{"$ref":"#/components/schemas/CustomCategory"}},"blocks":{"type":"array","items":{"type":"object","additionalProperties":true}},"parents":{"type":"array","items":{"type":"string"}},"max_custom":{"type":"integer"},"workspace_id":{"type":"string"},"inherited":{"type":"boolean"}},"additionalProperties":true},"CategoriesUpdate":{"type":"object","properties":{"custom":{"type":"array","items":{"$ref":"#/components/schemas/CustomCategory"}},"inherit":{"type":"boolean"}}},"Ok":{"type":"object","properties":{"ok":{"type":"boolean"}},"additionalProperties":true}},"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Your API key: Authorization: Bearer rrx_..."}},"responses":{"Error":{"description":"An error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"security":[{"bearer":[]}],"webhooks":{"job.completed":{"post":{"summary":"A document was read","description":"Sent to your endpoint, signed in the QD-Signature header. Answer 2xx within 10 seconds.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}}},"responses":{"200":{"description":"Received"}}}},"job.failed":{"post":{"summary":"A job ended without a result","description":"Sent to your endpoint, signed in the QD-Signature header. Answer 2xx within 10 seconds.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}}},"responses":{"200":{"description":"Received"}}}},"batch.completed":{"post":{"summary":"Every job of a batch has ended","description":"Sent to your endpoint, signed in the QD-Signature header. Answer 2xx within 10 seconds.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}}},"responses":{"200":{"description":"Received"}}}}}}