{"openapi":"3.1.0","info":{"title":"API Reference","version":"1.0.0"},"paths":{"/v3/collections/{collection_name}/query":{"post":{"operationId":"fileSearch_query_collection_v3","summary":"Query","description":"Search indexed files and return source chunks with optional document, metadata, region (bounding boxes), relation, and related chunk context.\n\n**Compared with v2:** this response uses `results[].text`, supports explicit include controls, and returns structured rerank details.\n\n**Filter keys are top-level field names.** Never nest them under `metadata` or `custom_metadata`. Use `{\"policy_area\": \"payments\"}`, not `{\"custom_metadata\": {\"policy_area\": \"payments\"}}`. Operators are `$`-prefixed (`$gte`, not `gte`). See the [Advanced Querying guide](/guides/advanced-querying) for the full filter reference.","tags":["file-search"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Query response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryResponseV3"}}}},"400":{"description":"Invalid metadata filter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid authentication.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"403":{"description":"API key cannot query this collection.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"404":{"description":"Collection not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRequestV3"}}}}}},"/v2/collections/{collection_name}/query":{"post":{"operationId":"query_collectionV2","summary":"Query Collection","description":"Execute the v2 File Search endpoint against a collection. Returns retrieved chunks in search_results with content fields.","tags":["query"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryResponseV2"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRequestV2"}}}}}},"/v2/queries":{"get":{"operationId":"queries_list_queries_v2","summary":"List Queries","description":"List your stored queries, newest first, scoped to the environment of the API key you call with (a production key lists production queries).\n\nPage with `cursor` until `next_cursor` is null; there is no total count. A page can be shorter than `limit` while `next_cursor` is still set when a filter trimmed it. Your key's environment is part of the index, so pages come back full in either direction; `collection` and `status` are applied while reading, so a page can be shorter than `limit` while `next_cursor` is still set, and the API keeps reading to fill it. `from` and `to` bound the window on the index, so pair them with the other filters on large histories.\n\n`include` inlines the same bodies `GET /v2/queries/{query_id}` returns, per row, so a feed and its previews can come from one request: `results` (retrieved chunks in one normalised shape), `request`, `response`. Each costs a stored-body read, so `limit` is capped at 25 when `include` is set. The four body fields are always present on every row and null unless requested.\n\nHistory contains completed, non-streamed queries. Bodies are archived 90 days after the query (`body_status: archived`); the summary rows are kept.","tags":["queries"],"parameters":[{"name":"collection","in":"query","description":"Only queries against this collection.","required":false,"schema":{"type":["string","null"]}},{"name":"status","in":"query","description":"Filter by query status (`completed` or `failed`). Only completed queries are recorded today.","required":false,"schema":{"type":["string","null"]}},{"name":"from","in":"query","description":"Only queries created at or after this ISO-8601 date or timestamp (UTC when no offset is given).","required":false,"schema":{"type":["string","null"]}},{"name":"to","in":"query","description":"Only queries created before this ISO-8601 date or timestamp (exclusive).","required":false,"schema":{"type":["string","null"]}},{"name":"sort","in":"query","description":"Order by creation time: `desc` (newest first, default) or `asc`.","required":false,"schema":{"type":["string","null"],"default":"desc"}},{"name":"limit","in":"query","description":"Queries per page (1–100; at most 25 when `include` is set).","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"cursor","in":"query","description":"Continue from a previous page's `next_cursor`.","required":false,"schema":{"type":["string","null"]}},{"name":"include","in":"query","description":"Comma-separated bodies to inline on each row: `results` (normalised retrieved chunks), `request`, `response`. Each costs a stored-body read; without it a row is a summary.","required":false,"schema":{"type":["string","null"]}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryListResponseV2"}}}},"400":{"description":"Invalid status, sort, include, time range, limit, or cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"403":{"description":"The API key does not have query permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}}}}},"/v2/queries/{query_id}":{"get":{"operationId":"queries_get_query_v2","summary":"Get Query","description":"One stored query with its request body, response body and the retrieved chunks in one normalised shape (`results[]`: rank, score, text, filename, document id and a page, time or sheet location, whether the query ran on v2 or v3).\n\n`query_id` is the id from `GET /v2/queries` or the `query_id` field of a query response. The `request_id` a query response returns (`req_...`) is accepted in its place, so a query can be fetched straight after running it.\n\n`body_status` says what came back: `available`, `archived` (bodies are archived 90 days after the query and only the summary remains) or `missing`. A query from another organization or environment is a 404, the same as an unknown id.","tags":["queries"],"parameters":[{"name":"query_id","in":"path","description":"","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryDetailV2"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"403":{"description":"The API key does not have query permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"404":{"description":"No query with this id (query_id or request_id) in the key's organization and environment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}}}}},"/v2/queries/latency":{"get":{"operationId":"queries_get_query_latency_v2","summary":"Get Query Latency","description":"Latency percentiles and a histogram for a window of your stored queries.\n\nUnlike GET /v2/queries, which pages through individual records, this\nsummarises the whole filtered population in one bounded response: counts,\nexact p50/p95/p99, explicit histogram edges, and the same bins per\ncollection so their shapes can be compared.\n\nTwo numbers are reported separately on purpose. `counts.measured` are the\nqueries with a recorded processing time; `counts.missing` are matching\nqueries without one, which are left out of the percentiles rather than\ncounted as zero milliseconds. `coverage` says how much of the population\nrecorded each filterable setting, because older queries predate some of\nthem and answer `unknown`.\n\nWindows are capped at 90 days. Use GET /v2/queries to drill into\nindividual queries.","tags":["queries"],"parameters":[{"name":"from","in":"query","description":"Start of the window, inclusive. ISO-8601 date or timestamp (UTC when no offset is given).","required":false,"schema":{"type":["string","null"]}},{"name":"to","in":"query","description":"End of the window, exclusive.","required":false,"schema":{"type":["string","null"]}},{"name":"collection","in":"query","description":"Only queries against this collection.","required":false,"schema":{"type":["string","null"]}},{"name":"api_version","in":"query","description":"`v3`, `v2`, or `unknown` for queries that recorded no version.","required":false,"schema":{"type":["string","null"]}},{"name":"rerank","in":"query","description":"The recorded rerank setting: `on`, `off`, or `unknown`. A setting of on does not mean reranking ran.","required":false,"schema":{"type":["string","null"]}},{"name":"search_mode","in":"query","description":"`keyword`, `semantic`, `hybrid`, or `unknown`, derived from the recorded semantic ratio.","required":false,"schema":{"type":["string","null"]}},{"name":"has_filter","in":"query","description":"`true`, `false`, or `unknown` for queries that recorded no filter setting.","required":false,"schema":{"type":["string","null"]}},{"name":"bins","in":"query","description":"Histogram resolution (4-64; default 16). Edges are returned explicitly.","required":false,"schema":{"type":["integer","null"]}},{"name":"refresh","in":"query","description":"Recompute instead of serving a briefly cached result.","required":false,"schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryLatencyResponseV2"}}}},"400":{"description":"Missing or invalid window, filter value, or bin count.","content":{"application/json":{"schema":{"description":"Any type"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"description":"Any type"}}}},"403":{"description":"The API key does not have query permission.","content":{"application/json":{"schema":{"description":"Any type"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"503":{"description":"Analytics are unavailable; no metrics were computed.","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/queries/latency/collections":{"get":{"operationId":"queries_list_query_latency_collections_v2","summary":"List Query Latency Collections","description":"The collections that ran queries in the window, most active first.\n\nFor organizations with more collections than the metrics response returns\nseries for, so a picker can search the rest without asking for every\nseries at once.","tags":["queries"],"parameters":[{"name":"from","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"to","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"search","in":"query","description":"Case-insensitive substring match on the collection name.","required":false,"schema":{"type":["string","null"]}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0}},{"name":"collection","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"api_version","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"rerank","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"search_mode","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"has_filter","in":"query","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryLatencyFacetsResponseV2"}}}},"400":{"description":"Missing or invalid window, filter value, or bin count.","content":{"application/json":{"schema":{"description":"Any type"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"description":"Any type"}}}},"403":{"description":"The API key does not have query permission.","content":{"application/json":{"schema":{"description":"Any type"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"503":{"description":"Analytics are unavailable; no metrics were computed.","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/queries/latency/slowest":{"get":{"operationId":"queries_list_slowest_queries_v2","summary":"List Slowest Queries","description":"The slowest queries in the window, with ids and durations only.\n\nSorted by duration in the analytics store, so it costs one bounded read\nrather than a walk through chronological history. Pass a `request_id` to\nGET /v2/queries/{query_id} to open the query itself.","tags":["queries"],"parameters":[{"name":"from","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"to","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":20,"default":5}},{"name":"collection","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"api_version","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"rerank","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"search_mode","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"has_filter","in":"query","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlowestQueriesResponseV2"}}}},"400":{"description":"Missing or invalid window, filter value, or bin count.","content":{"application/json":{"schema":{"description":"Any type"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"description":"Any type"}}}},"403":{"description":"The API key does not have query permission.","content":{"application/json":{"schema":{"description":"Any type"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"503":{"description":"Analytics are unavailable; no metrics were computed.","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/collections":{"get":{"operationId":"collections_list_collections_v2","summary":"List Collections","description":"List collections for the authenticated organization with pagination.","tags":["collections"],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionListResponse"}}}}}}},"/v2/collections/{collection_name}":{"put":{"operationId":"collections_create_collection_v2","summary":"Create Collection","description":"Create a collection by name. The request is idempotent for an existing collection.","tags":["collections"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/CollectionCreateRequest"},{"type":"null"}]}}}}},"delete":{"operationId":"collections_delete_collection_v2","summary":"Delete Collection","description":"Delete a collection and its indexed documents.","tags":["collections"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardResponseV2"}}}}}}},"/v2/collections/{collection_name}/copy":{"post":{"operationId":"collections_copy_collection_v2","summary":"Copy Collection","description":"Clone metadata, documents, and vectors under a new name. Instant regardless of size.","tags":["collections"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionCopyResponse"}}}},"404":{"description":"Source collection not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"409":{"description":"target_name is already in use","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"422":{"description":"target_name is missing or fails the name rules","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionCopyRequest"}}}}}},"/v2/collections/{collection_name}/environment":{"patch":{"operationId":"collections_change_collection_environment_v2","summary":"Change Collection Environment","description":"Move a collection between environments without reindexing.","tags":["collections"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeEnvironmentResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeEnvironmentRequest"}}}}}},"/v2/collections/{collection_name}/documents":{"get":{"operationId":"collections_list_documents_v2","summary":"List Documents","description":"List documents in a collection with pagination.","tags":["collections"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentListResponse"}}}}}},"delete":{"operationId":"collections_wipe_collection_documents_v2","summary":"Wipe Collection Documents","description":"Remove all documents from a collection while keeping the collection itself.","tags":["collections"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentDeleteResponse"}}}}}}},"/v3/collections/{collection_name}/documents":{"get":{"operationId":"fileSearch_list_documents_v3","summary":"List Documents V3","description":"List the documents in a collection (v3 parity with GET /v2/collections/{name}/documents). With `metadata_filter`, one call maps an identifier from your own system to the Captain document, using the same filter grammar as query; pass `include_custom_metadata=true` to include each document's `custom_metadata`.","tags":["file-search"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0}},{"name":"include_custom_metadata","in":"query","description":"Include each document's custom_metadata. Default false: a page can return up to 1000 documents and each metadata object can be up to 64 KB, so this is opt-in rather than riding along by default.","required":false,"schema":{"type":"boolean","default":false}},{"name":"metadata_filter","in":"query","description":"JSON filter over custom_metadata, using the SAME grammar as query filters ($eq/$ne/$gt/$gte/$lt/$lte/$in/$nin/$exists/$and/$or, implicit $eq). Reverse lookup: which Captain document carries your ID, e.g. {\"payna_file_id\": \"doc_18842\"}.","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentListResponseV3"}}}}}}},"/v3/collections/{collection_name}/documents/{document_id}":{"get":{"operationId":"fileSearch_get_document_v3","summary":"Get Document","description":"Fetch one indexed document with its chunks and optional extracted regions.","tags":["file-search"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"document_id","in":"path","required":true,"schema":{"type":"string"}},{"name":"include_regions","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"include_metadata","in":"query","required":false,"schema":{"type":"boolean","default":true}}],"responses":{"200":{"description":"Get Document response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetDocumentResponseV3"}}}},"401":{"description":"Missing or invalid authentication.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"403":{"description":"Collection is inactive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"404":{"description":"Document or collection not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v3/collections/{collection_name}/documents/{document_id}/pages/{page_number}":{"get":{"operationId":"fileSearch_get_document_page_v3","summary":"Get Document Page","description":"Return one document page's OCR text in reading order and, optionally, its layout regions.\n\nAddressed by the `document_id` returned by [List Documents](/reference/v3/documents) and [Query](/reference/v3/query), plus a `page_number`.\n\n**Only works for documents with OCR data** (PDFs and similar). For other file types, use [Get Document](/reference/v3/document) or [Get Chunk](/reference/v3/documents/chunk) instead.","tags":["file-search"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"document_id","in":"path","required":true,"schema":{"type":"string"}},{"name":"page_number","in":"path","required":true,"schema":{"type":"integer","minimum":0}},{"name":"include_regions","in":"query","required":false,"schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Get Document Page response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetDocumentPageResponseV3"}}}},"404":{"description":"Document not found, has no OCR page data, is still indexing with no OCR data yet, or the page is beyond the document's page range.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetDocumentPageErrorV3"}}}}}}},"/v3/collections/{collection_name}/documents/{document_id}/asset-urls":{"post":{"operationId":"fileSearch_create_asset_urls_v3","summary":"Mint Asset URLs","description":"Mint short-lived presigned URLs for a document's figure crops.\n\nSupply the figure ids (`regions[].figure_id`) to mint URLs for. When batch\nrequested, each item degrades on its own: a figure with no crop does not fail\nthe whole request.","tags":["file-search"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"document_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetUrlsResponseV3"}}}},"403":{"description":"The API key does not have query permission on this collection.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"404":{"description":"Collection or document not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"422":{"description":"asset_ids missing, empty, over the batch limit, or malformed; or ttl_seconds out of range.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetUrlsRequestV3"}}}}}},"/v2/collections/{collection_name}/documents/{document_id}":{"get":{"operationId":"collections_get_document_v2","summary":"Get Document","description":"Retrieve a single document by ID using the v2 compatibility shape.","tags":["collections"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"document_id","in":"path","required":true,"schema":{"type":"string"}},{"name":"include_bbox","in":"query","description":"When true, include normalized element layout (bounding boxes) for the document under `bounding_boxes`. Omitted by default to keep the response lean.","required":false,"schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetDocumentResponse"}}}}}},"delete":{"operationId":"collections_delete_document_v2","summary":"Delete Document","description":"Delete one document from a collection by document ID.","tags":["collections"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"document_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentDeleteResponse"}}}}}}},"/v3/collections/{collection_name}/documents/{document_id}/metadata":{"put":{"operationId":"fileSearch_put_document_metadata_v3","summary":"Overwrite Document Metadata","description":"Overwrite a document's `custom_metadata` with the object in this request; keys omitted here are removed, including from the search filter index. Bulk indexing stamps one metadata object per request, so per-file values (such as an ID from your own system) are set here after indexing.","tags":["file-search"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"document_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Overwrite Document Metadata response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentMetadataResponseV3"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateChunkMetadataRequestV3"}}}}},"patch":{"operationId":"fileSearch_patch_document_metadata_v3","summary":"Patch Document Metadata V3","description":"Merge keys into a document's `custom_metadata` without restating the whole object; a `null` value deletes its key. Use PUT instead to replace the stored object wholesale.","tags":["file-search"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"document_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Update Document Metadata response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentMetadataResponseV3"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateChunkMetadataRequestV3"}}}}}},"/v3/collections/{collection_name}/documents/metadata/batch":{"patch":{"operationId":"fileSearch_patch_document_metadata_batch_v3","summary":"Update Document Metadata in Batches","description":"Merge `custom_metadata` into up to 100 documents in one request. Each item behaves like [Update Document Metadata](/reference/v3/document/metadata/update): supplied keys are merged, omitted keys kept, `null` deletes a key. Returns 200 with one result per item, in order. Envelope, partial success, and `unknown` outcomes are covered in the [Batch Metadata & Relations](/guides/batch-writes) guide.","tags":["file-search"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Update Document Metadata in Batches response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchDocumentMetadataResponseV3"}}}},"400":{"description":"Rejected before any write: malformed envelope, item count outside 1 to 100, duplicate `item_id` or targets, or a structural field error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequestErrorV3"}}}},"401":{"description":"Missing or invalid authentication.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"403":{"description":"API key cannot write to this collection.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"404":{"description":"Collection not found. A missing item target is reported inside `results[]`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"413":{"description":"Request body larger than 1 MiB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequestErrorV3"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchDocumentMetadataRequestV3"}}}}},"put":{"operationId":"fileSearch_put_document_metadata_batch_v3","summary":"Overwrite Document Metadata in Batches","description":"Overwrite the `custom_metadata` object on up to 100 documents in one request. Each item behaves like [Overwrite Document Metadata](/reference/v3/document/metadata/replace). Returns 200 with one result per item, in order. Overwrite is destructive: omitted keys are removed and `{}` clears the target. Consider [copying the collection](/reference/collections/copy) first. Envelope, partial success, and `unknown` outcomes are covered in the [Batch Metadata & Relations](/guides/batch-writes) guide.","tags":["file-search"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Overwrite Document Metadata in Batches response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchDocumentMetadataResponseV3"}}}},"400":{"description":"Rejected before any write: malformed envelope, item count outside 1 to 100, duplicate `item_id` or targets, or a structural field error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequestErrorV3"}}}},"401":{"description":"Missing or invalid authentication.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"403":{"description":"API key cannot write to this collection.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"404":{"description":"Collection not found. A missing item target is reported inside `results[]`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"413":{"description":"Request body larger than 1 MiB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequestErrorV3"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchDocumentMetadataRequestV3"}}}}}},"/v3/collections/{collection_name}/chunks":{"get":{"operationId":"fileSearch_list_chunks_v3","summary":"List Chunks","description":"List chunks for a document with pagination and optional regions or metadata.","tags":["file-search"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"document_id","in":"query","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":100}},{"name":"cursor","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0}},{"name":"include_regions","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"include_metadata","in":"query","required":false,"schema":{"type":"boolean","default":true}}],"responses":{"200":{"description":"List Chunks response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListChunksResponseV3"}}}},"401":{"description":"Missing or invalid authentication.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"403":{"description":"Collection is inactive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"404":{"description":"Collection not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v3/collections/{collection_name}/chunks/{chunk_id}":{"get":{"operationId":"fileSearch_get_chunk_v3","summary":"Get Chunk","description":"Fetch one chunk by ID with optional regions and metadata.","tags":["file-search"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"chunk_id","in":"path","required":true,"schema":{"type":"string"}},{"name":"document_id","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"include_regions","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"include_metadata","in":"query","required":false,"schema":{"type":"boolean","default":true}}],"responses":{"200":{"description":"Get Chunk response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetChunkResponseV3"}}}},"401":{"description":"Missing or invalid authentication.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"403":{"description":"Collection is inactive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"404":{"description":"Chunk or collection not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"422":{"description":"Chunk was found but its document_id could not be resolved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v3/collections/{collection_name}/chunks/{chunk_id}/metadata":{"get":{"operationId":"fileSearch_get_chunk_metadata_v3","summary":"Get Chunk Metadata","description":"Return custom metadata attached to a chunk.","tags":["file-search"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"chunk_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Get Chunk Metadata response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChunkMetadataResponseV3"}}}},"401":{"description":"Missing or invalid authentication.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"403":{"description":"Collection is inactive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"404":{"description":"Collection not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"operationId":"fileSearch_put_chunk_metadata_v3","summary":"Overwrite Chunk Metadata","description":"Overwrite the custom metadata object attached to a chunk.","tags":["file-search"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"chunk_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Overwrite Chunk Metadata response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChunkMetadataResponseV3"}}}},"401":{"description":"Missing or invalid authentication.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"403":{"description":"API key cannot write to this collection.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"404":{"description":"Collection not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateChunkMetadataRequestV3"}}}}},"patch":{"operationId":"fileSearch_patch_chunk_metadata_v3","summary":"Update Chunk Metadata","description":"Merge updates into the custom metadata object attached to a chunk.","tags":["file-search"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"chunk_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Update Chunk Metadata response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChunkMetadataResponseV3"}}}},"401":{"description":"Missing or invalid authentication.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"403":{"description":"API key cannot write to this collection.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"404":{"description":"Collection not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateChunkMetadataRequestV3"}}}}},"delete":{"operationId":"fileSearch_delete_chunk_metadata_v3","summary":"Delete Chunk Metadata","description":"Remove custom metadata from a chunk.","tags":["file-search"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"chunk_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Delete Chunk Metadata response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteChunkMetadataResponseV3"}}}},"401":{"description":"Missing or invalid authentication.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"403":{"description":"API key cannot write to this collection.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"404":{"description":"Collection not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v3/collections/{collection_name}/chunks/metadata/batch":{"patch":{"operationId":"fileSearch_patch_chunk_metadata_batch_v3","summary":"Update Chunk Metadata in Batches","description":"Merge `custom_metadata` into up to 100 chunks in one request. Each item behaves like [Update Chunk Metadata](/reference/v3/documents/chunk/metadata/update): supplied keys are merged, omitted keys kept, `null` deletes a key. Returns 200 with one result per item, in order. Envelope, partial success, and `unknown` outcomes are covered in the [Batch Metadata & Relations](/guides/batch-writes) guide.","tags":["file-search"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Update Chunk Metadata in Batches response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchChunkMetadataResponseV3"}}}},"400":{"description":"Rejected before any write: malformed envelope, item count outside 1 to 100, duplicate `item_id` or targets, or a structural field error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequestErrorV3"}}}},"401":{"description":"Missing or invalid authentication.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"403":{"description":"API key cannot write to this collection.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"404":{"description":"Collection not found. A missing item target is reported inside `results[]`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"413":{"description":"Request body larger than 1 MiB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequestErrorV3"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchChunkMetadataRequestV3"}}}}},"put":{"operationId":"fileSearch_put_chunk_metadata_batch_v3","summary":"Overwrite Chunk Metadata in Batches","description":"Overwrite the `custom_metadata` object on up to 100 chunks in one request. Each item behaves like [Overwrite Chunk Metadata](/reference/v3/documents/chunk/metadata/replace). Returns 200 with one result per item, in order. Overwrite is destructive: omitted keys are removed and `{}` clears the target. Consider [copying the collection](/reference/collections/copy) first. Envelope, partial success, and `unknown` outcomes are covered in the [Batch Metadata & Relations](/guides/batch-writes) guide.","tags":["file-search"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Overwrite Chunk Metadata in Batches response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchChunkMetadataResponseV3"}}}},"400":{"description":"Rejected before any write: malformed envelope, item count outside 1 to 100, duplicate `item_id` or targets, or a structural field error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequestErrorV3"}}}},"401":{"description":"Missing or invalid authentication.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"403":{"description":"API key cannot write to this collection.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"404":{"description":"Collection not found. A missing item target is reported inside `results[]`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"413":{"description":"Request body larger than 1 MiB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequestErrorV3"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchChunkMetadataRequestV3"}}}}}},"/v3/collections/{collection_name}/chunks/{chunk_id}/relations":{"get":{"operationId":"fileSearch_list_chunk_relations_v3","summary":"List Chunk Relations","description":"List typed graph relations connected to a chunk.","tags":["file-search"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"chunk_id","in":"path","required":true,"schema":{"type":"string"}},{"name":"relation_types","in":"query","required":false,"schema":{"type":["array","null"],"items":{"type":"string"}}},{"name":"relation_direction","in":"query","required":false,"schema":{"$ref":"#/components/schemas/V3CollectionsCollectionNameChunksChunkIdRelationsGetParametersRelationDirection","default":"outgoing"}}],"responses":{"200":{"description":"List Chunk Relations response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChunkRelationListResponseV3"}}}},"401":{"description":"Missing or invalid authentication.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"403":{"description":"Collection is inactive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"404":{"description":"Collection not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"operationId":"fileSearch_create_chunk_relation_v3","summary":"Create Chunk Relation","description":"Create a typed relation from one chunk to another chunk.","tags":["file-search"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"chunk_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChunkRelationResponseV3"}}}},"400":{"description":"Source and target chunk IDs must differ.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid authentication.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"403":{"description":"API key cannot write to this collection.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"404":{"description":"Collection not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateChunkRelationRequestV3"}}}}}},"/v3/collections/{collection_name}/relations/{relation_id}":{"delete":{"operationId":"fileSearch_delete_chunk_relation_v3","summary":"Delete Chunk Relation","description":"Delete a chunk relation by ID.","tags":["file-search"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"relation_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Delete Chunk Relation response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteChunkRelationResponseV3"}}}},"401":{"description":"Missing or invalid authentication.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"403":{"description":"API key cannot write to this collection.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"404":{"description":"Relation or collection not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v3/collections/{collection_name}/relations/batch":{"put":{"operationId":"fileSearch_create_chunk_relations_batch_v3","summary":"Create or Update Chunk Relations in Batches","description":"Create or update up to 100 chunk relations in one request. A relation is identified by its source chunk, target chunk, and `relation_type`. When no relation with that identity exists, one is created and the item returns 201. When exactly one exists, it keeps its `relation_id` and its entire `metadata` object is replaced: keys omitted from the item are removed, and `{}` clears the metadata. Relations not named in the request are left unchanged. This differs from [Create Chunk Relation](/reference/v3/documents/chunk/relations/create), which always creates and can therefore produce duplicate relations; when more than one existing relation matches an item's identity, the batch changes nothing and fails that item with 409 `relation_identity_ambiguous`. Returns 200 with one result per item, in order. Envelope, partial success, and `unknown` outcomes are covered in the [Batch Metadata & Relations](/guides/batch-writes) guide.","tags":["file-search"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Create or Update Chunk Relations in Batches response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRelationUpsertResponseV3"}}}},"400":{"description":"Rejected before any write: malformed envelope, item count outside 1 to 100, duplicate `item_id` or targets, or a structural field error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequestErrorV3"}}}},"401":{"description":"Missing or invalid authentication.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"403":{"description":"API key cannot write to this collection.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"404":{"description":"Collection not found. A missing item target is reported inside `results[]`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"413":{"description":"Request body larger than 1 MiB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequestErrorV3"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRelationUpsertRequestV3"}}}}}},"/v2/syncs":{"get":{"operationId":"sync_listS3Syncs","summary":"List S3 Syncs","description":"List your organization's syncs across all storage providers. Deleted syncs are excluded; paused syncs are included.","tags":["sync"],"parameters":[{"name":"authorization","in":"header","description":"Bearer {api_key}. Your Captain API key.","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3SyncListResponseDocs"}}}}}}},"/v2/syncs/{sync_id}":{"get":{"operationId":"sync_getS3Sync","summary":"Get S3 Sync","description":"Get a single sync, including its schedule state and last-reconcile status.","tags":["sync"],"parameters":[{"name":"sync_id","in":"path","description":"The sync id.","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","description":"Bearer {api_key}. Your Captain API key.","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3SyncConnectorResponseDocs"}}}}}},"patch":{"operationId":"sync_updateS3Sync","summary":"Update S3 Sync","description":"Update a sync's prefix, glob filters, deletion policy, cadence, custom metadata, or status (pause/resume). Only provided fields change.","tags":["sync"],"parameters":[{"name":"sync_id","in":"path","description":"The sync id.","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","description":"Bearer {api_key}. Your Captain API key.","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3SyncConnectorResponseDocs"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3SyncUpdateRequestDocs"}}}}},"delete":{"operationId":"sync_deleteS3Sync","summary":"Delete S3 Sync","description":"Remove a sync: syncing stops and the connector is marked inactive. Its per-object sync state is cleared. Documents already indexed by the sync remain in the collection.","tags":["sync"],"parameters":[{"name":"sync_id","in":"path","description":"The sync id.","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","description":"Bearer {api_key}. Your Captain API key.","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3SyncDeleteResponseDocs"}}}}}}},"/v2/syncs/{sync_id}/webhooks":{"post":{"operationId":"sync_subscribeEventWebhook","summary":"Subscribe Event Webhook","description":"Enroll a connector for real-time change events. For AWS S3, pass your SNS topic's ARN: Captain binds it to this sync and returns the queue_arn of Captain's SQS queue to subscribe the topic to, so events flow AWS-natively with no HTTP endpoint or signature handling on your side. For GCS, R2, Supabase, Backblaze, and Azure Blob, send an empty body: Captain mints a webhook secret and returns a private ingest_url to point the store's change notifications at, plus provider-specific setup steps. Pass rotate_secret to revoke a leaked ingest_url and mint a fresh one. Events complement the scheduled reconcile, which remains the reliability backstop. Idempotent per connector.","tags":["sync"],"parameters":[{"name":"sync_id","in":"path","description":"The sync id.","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","description":"Bearer {api_key}. Your Captain API key.","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3SyncSubscribeResponseDocs"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3SyncSubscribeRequestDocs"}}}}}},"/v2/syncs/{sync_id}/reconcile":{"post":{"operationId":"sync_reconcileS3Sync","summary":"Reconcile S3 Sync","description":"Run an on-demand reconciliation: list the bucket, diff it against Captain's indexed state, then index added/modified objects and apply the deletion policy to removed ones. Returns the deltas. This is the same operation the scheduled cadence runs automatically.","tags":["sync"],"parameters":[{"name":"sync_id","in":"path","description":"The sync id.","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","description":"Bearer {api_key}. Your Captain API key.","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3SyncReconcileResponseDocs"}}}}}}},"/v2/collections/{collection_name}/sync/s3":{"post":{"operationId":"sync_createS3Sync","summary":"Create S3 Sync","description":"Create a Sync for a collection and start the initial backfill. AWS S3 authenticates with cross-account assume-role (recommended) or an access key. Works across S3-compatible cloud storage: AWS S3, Google Cloud Storage, Cloudflare R2, Supabase Storage, and Backblaze B2 (each has its own create endpoint). Returns the sync; indexing runs asynchronously.","tags":["sync"],"parameters":[{"name":"collection_name","in":"path","description":"Destination collection.","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","description":"Bearer {api_key}. Your Captain API key.","required":false,"schema":{"type":["string","null"]}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3SyncConnectorResponseDocs"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3SyncCreateRequestDocs"}}}}}},"/v2/collections/{collection_name}/sync/gcs":{"post":{"operationId":"sync_createGcsSync","summary":"Create GCS Sync","description":"Create a Google Cloud Storage Sync for a collection and start the initial backfill. GCS authenticates with a service-account JSON (stored in Secrets Manager, never returned), so there is no region, endpoint_url, or access-key pair. Returns the sync; indexing runs asynchronously.","tags":["sync"],"parameters":[{"name":"collection_name","in":"path","description":"Destination collection.","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","description":"Bearer {api_key}. Your Captain API key.","required":false,"schema":{"type":["string","null"]}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3SyncConnectorResponseDocs"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GCSSyncCreateRequestDocs"}}}}}},"/v2/collections/{collection_name}/sync/azure":{"post":{"operationId":"sync_createAzureSync","summary":"Create Azure Sync","description":"Create an Azure Blob Storage Sync for a collection and start the initial backfill. Azure authenticates with the storage account's name and account key (stored securely, never returned), so there is no region, endpoint_url, or assume-role; the container is echoed back as `bucket`. Returns the sync; indexing runs asynchronously.","tags":["sync"],"parameters":[{"name":"collection_name","in":"path","description":"Destination collection.","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","description":"Bearer {api_key}. Your Captain API key.","required":false,"schema":{"type":["string","null"]}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3SyncConnectorResponseDocs"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AzureSyncCreateRequestDocs"}}}}}},"/v2/collections/{collection_name}/sync/r2":{"post":{"operationId":"sync_createR2Sync","summary":"Create R2 Sync","description":"Create a Cloudflare R2 Sync for a collection and start the initial backfill. The endpoint is derived from account_id and jurisdiction. Returns the sync; indexing runs asynchronously.","tags":["sync"],"parameters":[{"name":"collection_name","in":"path","description":"Destination collection.","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","description":"Bearer {api_key}. Your Captain API key.","required":false,"schema":{"type":["string","null"]}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3SyncConnectorResponseDocs"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/R2SyncCreateRequestDocs"}}}}}},"/v2/collections/{collection_name}/sync/supabase":{"post":{"operationId":"sync_createSupabaseSync","summary":"Create Supabase Sync","description":"Create a Supabase Storage Sync for a collection and start the initial backfill. Returns the sync; indexing runs asynchronously.","tags":["sync"],"parameters":[{"name":"collection_name","in":"path","description":"Destination collection.","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","description":"Bearer {api_key}. Your Captain API key.","required":false,"schema":{"type":["string","null"]}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3SyncConnectorResponseDocs"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupabaseSyncCreateRequestDocs"}}}}}},"/v2/collections/{collection_name}/sync/backblaze":{"post":{"operationId":"sync_createBackblazeSync","summary":"Create Backblaze Sync","description":"Create a Backblaze B2 Sync for a collection and start the initial backfill. Returns the sync; indexing runs asynchronously.","tags":["sync"],"parameters":[{"name":"collection_name","in":"path","description":"Destination collection.","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","description":"Bearer {api_key}. Your Captain API key.","required":false,"schema":{"type":["string","null"]}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3SyncConnectorResponseDocs"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackblazeSyncCreateRequestDocs"}}}}}},"/v2/collections/{collection_name}/index/s3":{"post":{"operationId":"indexing_index_s3_bucket_v2","summary":"Index S3 Bucket","description":"Index all files from S3 bucket into a collection.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n- Idempotency-Key: UUID for request deduplication (optional)\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    body: S3 bucket configuration\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexS3Request"}}}}}},"/v2/collections/{collection_name}/index/s3/file":{"post":{"operationId":"indexing_index_s3_file_v2","summary":"Index S3 File","description":"Index a single file from S3 bucket into a collection.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    body: S3 file configuration with file_uri\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexS3FileRequest"}}}}}},"/v2/collections/{collection_name}/index/s3/directory":{"post":{"operationId":"indexing_index_s3_directory_v2","summary":"Index S3 Directory","description":"Index all files from a specific directory in an S3 bucket.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n- Idempotency-Key: UUID for request deduplication (optional)\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    body: S3 directory configuration with directory_path\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexS3DirectoryRequest"}}}}}},"/v2/collections/{collection_name}/index/s3/manifest":{"post":{"operationId":"indexing_index_s3_manifest_v2","summary":"Index S3 Manifest","description":"Index an explicit list of objects from an S3 bucket, given as a JSON Lines manifest in the same bucket. One bulk job; nothing is listed or scanned.\n\nOne object per line, UTF-8, uncompressed. `uri` is required, the rest are optional:\n\n```json\n{\"uri\": \"s3://my-documents-bucket/inbox/2026-q4-msa.pdf\", \"source_identity\": \"contract-8841\", \"custom_metadata\": {\"department\": \"legal\", \"counterparty\": \"Northwind\"}}\n{\"uri\": \"s3://my-documents-bucket/inbox/2026-q4-sow.pdf\", \"source_identity\": \"contract-8842\", \"size\": 482113, \"etag\": \"9b2cf535f27731c974343645a3985328\"}\n{\"uri\": \"s3://my-documents-bucket/archive/2025-renewal.pdf\", \"source_identity\": \"contract-7310\"}\n{\"uri\": \"s3://my-documents-bucket/inbox/handbook.pdf\"}\n```\n\n### Physical location vs. logical identity\n\n`uri` is **where the file currently lives**: this bucket, this key. It must be inside `bucket_name`, and it is the only field Captain reads bytes from.\n\n`source_identity` is **what the document is**, in your own terms. Captain keeps one document per identity, so the identity is what decides whether a later index is an update or a new document:\n\n- Give `s3://my-documents-bucket/inbox/2026-q4-msa.pdf` the identity `contract-8841`. Move the file to `s3://my-documents-bucket/archive/2026-q4-msa.pdf` and index it again with the same identity, and Captain updates that one document. Its chunks are replaced and the old ones are retired.\n- Omit `source_identity` and the identity is the `uri`. The same file at a new key is a different identity, so you get a second document and both versions answer queries.\n\nA repeat of an identity already in the collection is skipped while `skip_existing` is true (the default), and replaced when you send `overwrite_existing: true` or `skip_existing: false`. While it is skipping, Captain compares content. A repeat whose content is unchanged is skipped. A repeat whose content differs is an identity conflict: it is neither skipped nor indexed, and the job reports it under `identity_conflicts` so that you can send it again with `overwrite_existing: true`. When either version has no checksum, the repeat is skipped. Use your own record id, not a path, whenever content can move or be delivered twice.\n\n### The other line fields\n\n- `custom_metadata`: merged over the job-level `custom_metadata`, key by key, for this file only. A line's value wins on a shared key.\n- `checksum` and `version_id`: recorded on the document. A `checksum` that is the object's ETag, written bare or as `etag:...`, is compared with the object before anything is read, and a line that does not match is reported as unreachable instead of being indexed. Write any other algorithm with its prefix, for example `sha256:...`; it is recorded but not verified. `version_id` pins the object version that is read.\n- `size` and `etag`: when both are present, as in an S3 Inventory export, Captain does not read the object's metadata before indexing. That is what lets a large manifest start quickly.\n\n### Limits and error handling\n\nA manifest holds up to **1,000,000 lines** and **500 MB**, with each line at most **10 KB**. It must be plain UTF-8 `.jsonl` or `.ndjson`; a compressed body is refused. Per line, `custom_metadata` takes at most 50 keys, keys up to 64 characters and string values up to 1,024 characters. The job-level `custom_metadata` is capped at 64 KB serialized. It is attached to every file in the job, so metadata size times file count must stay under 2 GB: a few hundred bytes fits the full million lines, and the full 64 KB fits about 32,000 files. Larger jobs should carry less job-level metadata or be split.\n\nA wrong `manifest_uri` is a 400 before the job is created, as is a manifest larger than the size cap. Request bodies are capped at 1 MB, which is why a large object list is a manifest in storage rather than an inline array.\n\nUnusable lines (invalid JSON, not a JSON object, a `uri` outside the bucket, a duplicate `uri`, an unknown key) and unreachable objects (missing, access denied, unsupported file type) are counted on the job. `GET /v2/jobs/{job_id}` returns a `manifest` object with the totals and a sample of up to 20 of each, giving the line number or `uri` and a reason. Neither fails the job: a million-line manifest with a few thousand bad lines indexes the rest.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"manifest missing or unreadable, or overwrite_existing and skip_existing both true","content":{"application/json":{"schema":{"description":"Any type"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexS3ManifestRequest"}}}}}},"/v2/collections/{collection_name}/index/gcs":{"post":{"operationId":"indexing_index_gcs_bucket_v2","summary":"Index GCS Bucket","description":"Index all files from GCS bucket into a collection.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n- Idempotency-Key: UUID for request deduplication (optional)\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    body: GCS bucket configuration\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexGCSRequest"}}}}}},"/v2/collections/{collection_name}/index/gcs/file":{"post":{"operationId":"indexing_index_gcs_file_v2","summary":"Index GCS File","description":"Index a single file from GCS bucket into a collection.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    body: GCS file configuration with file_uri\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexGCSFileRequest"}}}}}},"/v2/collections/{collection_name}/index/gcs/directory":{"post":{"operationId":"indexing_index_gcs_directory_v2","summary":"Index GCS Directory","description":"Index all files from a specific directory in a GCS bucket.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n- Idempotency-Key: UUID for request deduplication (optional)\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    body: GCS directory configuration with directory_path\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexGCSDirectoryRequest"}}}}}},"/v2/collections/{collection_name}/index/gcs/manifest":{"post":{"operationId":"indexing_index_gcs_manifest_v2","summary":"Index GCS Manifest","description":"Index an explicit list of objects from a Google Cloud Storage bucket, given as a JSON Lines manifest in the same bucket. One bulk job; nothing is listed or scanned.\n\nOne object per line, UTF-8, uncompressed. `uri` is required, the rest are optional:\n\n```json\n{\"uri\": \"gs://my-gcs-documents/inbox/2026-q4-msa.pdf\", \"source_identity\": \"contract-8841\", \"custom_metadata\": {\"department\": \"legal\", \"counterparty\": \"Northwind\"}}\n{\"uri\": \"gs://my-gcs-documents/inbox/2026-q4-sow.pdf\", \"source_identity\": \"contract-8842\", \"size\": 482113, \"etag\": \"9b2cf535f27731c974343645a3985328\"}\n{\"uri\": \"gs://my-gcs-documents/archive/2025-renewal.pdf\", \"source_identity\": \"contract-7310\"}\n{\"uri\": \"gs://my-gcs-documents/inbox/handbook.pdf\"}\n```\n\n### Physical location vs. logical identity\n\n`uri` is **where the file currently lives**: this bucket, this key. It must be inside `bucket_name`, and it is the only field Captain reads bytes from.\n\n`source_identity` is **what the document is**, in your own terms. Captain keeps one document per identity, so the identity is what decides whether a later index is an update or a new document:\n\n- Give `gs://my-gcs-documents/inbox/2026-q4-msa.pdf` the identity `contract-8841`. Move the file to `gs://my-gcs-documents/archive/2026-q4-msa.pdf` and index it again with the same identity, and Captain updates that one document. Its chunks are replaced and the old ones are retired.\n- Omit `source_identity` and the identity is the `uri`. The same file at a new key is a different identity, so you get a second document and both versions answer queries.\n\nA repeat of an identity already in the collection is skipped while `skip_existing` is true (the default), and replaced when you send `overwrite_existing: true` or `skip_existing: false`. While it is skipping, Captain compares content. A repeat whose content is unchanged is skipped. A repeat whose content differs is an identity conflict: it is neither skipped nor indexed, and the job reports it under `identity_conflicts` so that you can send it again with `overwrite_existing: true`. When either version has no checksum, the repeat is skipped. Use your own record id, not a path, whenever content can move or be delivered twice.\n\n### The other line fields\n\n- `custom_metadata`: merged over the job-level `custom_metadata`, key by key, for this file only. A line's value wins on a shared key.\n- `checksum` and `version_id`: recorded on the document. A `checksum` that is the object's ETag, written bare or as `etag:...`, is compared with the object before anything is read, and a line that does not match is reported as unreachable instead of being indexed. Write any other algorithm with its prefix, for example `sha256:...`; it is recorded but not verified. `version_id` pins the object generation that is read.\n- `size` and `etag`: when both are present, as in a Storage Insights export, Captain does not read the object's metadata before indexing. That is what lets a large manifest start quickly.\n\n### Limits and error handling\n\nA manifest holds up to **1,000,000 lines** and **500 MB**, with each line at most **10 KB**. It must be plain UTF-8 `.jsonl` or `.ndjson`; a compressed body is refused. Per line, `custom_metadata` takes at most 50 keys, keys up to 64 characters and string values up to 1,024 characters. The job-level `custom_metadata` is capped at 64 KB serialized. It is attached to every file in the job, so metadata size times file count must stay under 2 GB: a few hundred bytes fits the full million lines, and the full 64 KB fits about 32,000 files. Larger jobs should carry less job-level metadata or be split.\n\nA wrong `manifest_uri` is a 400 before the job is created, as is a manifest larger than the size cap. Request bodies are capped at 1 MB, which is why a large object list is a manifest in storage rather than an inline array.\n\nUnusable lines (invalid JSON, not a JSON object, a `uri` outside the bucket, a duplicate `uri`, an unknown key) and unreachable objects (missing, access denied, unsupported file type) are counted on the job. `GET /v2/jobs/{job_id}` returns a `manifest` object with the totals and a sample of up to 20 of each, giving the line number or `uri` and a reason. Neither fails the job: a million-line manifest with a few thousand bad lines indexes the rest.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"manifest missing or unreadable, or overwrite_existing and skip_existing both true","content":{"application/json":{"schema":{"description":"Any type"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexGCSManifestRequest"}}}}}},"/v2/collections/{collection_name}/index/azure":{"post":{"operationId":"indexing_index_azure_container_v2","summary":"Index Azure Container","description":"Index all files from an Azure Blob container into a collection.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n- Idempotency-Key: UUID for request deduplication (optional)\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    body: Azure Blob container configuration\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexAzureRequest"}}}}}},"/v2/collections/{collection_name}/index/azure/file":{"post":{"operationId":"indexing_index_azure_file_v2","summary":"Index Azure File","description":"Index a single file from Azure Blob Storage into a collection.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    body: Azure Blob file configuration with file_uri\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexAzureFileRequest"}}}}}},"/v2/collections/{collection_name}/index/azure/directory":{"post":{"operationId":"indexing_index_azure_directory_v2","summary":"Index Azure Directory","description":"Index all files from a specific directory (prefix) in an Azure Blob container.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n- Idempotency-Key: UUID for request deduplication (optional)\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    body: Azure Blob directory configuration with directory_path\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexAzureDirectoryRequest"}}}}}},"/v2/collections/{collection_name}/index/azure/manifest":{"post":{"operationId":"indexing_index_azure_manifest_v2","summary":"Index Azure Manifest","description":"Index an explicit list of objects from an Azure Blob Storage container, given as a JSON Lines manifest in the same container. One bulk job; nothing is listed or scanned.\n\nOne object per line, UTF-8, uncompressed. `uri` is required, the rest are optional:\n\n```json\n{\"uri\": \"https://mystorageaccount.blob.core.windows.net/my-azure-documents/inbox/2026-q4-msa.pdf\", \"source_identity\": \"contract-8841\", \"custom_metadata\": {\"department\": \"legal\", \"counterparty\": \"Northwind\"}}\n{\"uri\": \"https://mystorageaccount.blob.core.windows.net/my-azure-documents/inbox/2026-q4-sow.pdf\", \"source_identity\": \"contract-8842\", \"size\": 482113, \"etag\": \"9b2cf535f27731c974343645a3985328\"}\n{\"uri\": \"https://mystorageaccount.blob.core.windows.net/my-azure-documents/archive/2025-renewal.pdf\", \"source_identity\": \"contract-7310\"}\n{\"uri\": \"https://mystorageaccount.blob.core.windows.net/my-azure-documents/inbox/handbook.pdf\"}\n```\n\n### Physical location vs. logical identity\n\n`uri` is **where the file currently lives**: this container, this key. It must be inside `container_name`, and it is the only field Captain reads bytes from.\n\n`source_identity` is **what the document is**, in your own terms. Captain keeps one document per identity, so the identity is what decides whether a later index is an update or a new document:\n\n- Give `https://mystorageaccount.blob.core.windows.net/my-azure-documents/inbox/2026-q4-msa.pdf` the identity `contract-8841`. Move the file to `https://mystorageaccount.blob.core.windows.net/my-azure-documents/archive/2026-q4-msa.pdf` and index it again with the same identity, and Captain updates that one document. Its chunks are replaced and the old ones are retired.\n- Omit `source_identity` and the identity is the `uri`. The same file at a new key is a different identity, so you get a second document and both versions answer queries.\n\nA repeat of an identity already in the collection is skipped while `skip_existing` is true (the default), and replaced when you send `overwrite_existing: true` or `skip_existing: false`. While it is skipping, Captain compares content. A repeat whose content is unchanged is skipped. A repeat whose content differs is an identity conflict: it is neither skipped nor indexed, and the job reports it under `identity_conflicts` so that you can send it again with `overwrite_existing: true`. When either version has no checksum, the repeat is skipped. Use your own record id, not a path, whenever content can move or be delivered twice.\n\n### The other line fields\n\n- `custom_metadata`: merged over the job-level `custom_metadata`, key by key, for this file only. A line's value wins on a shared key.\n- `checksum` and `version_id`: recorded on the document. A `checksum` that is the object's ETag, written bare or as `etag:...`, is compared with the object before anything is read, and a line that does not match is reported as unreachable instead of being indexed. Write any other algorithm with its prefix, for example `sha256:...`; it is recorded but not verified. `version_id` pins the blob version that is read.\n- `size` and `etag`: when both are present, as in a Blob Inventory export, Captain does not read the object's metadata before indexing. That is what lets a large manifest start quickly.\n\n### Limits and error handling\n\nA manifest holds up to **1,000,000 lines** and **500 MB**, with each line at most **10 KB**. It must be plain UTF-8 `.jsonl` or `.ndjson`; a compressed body is refused. Per line, `custom_metadata` takes at most 50 keys, keys up to 64 characters and string values up to 1,024 characters. The job-level `custom_metadata` is capped at 64 KB serialized. It is attached to every file in the job, so metadata size times file count must stay under 2 GB: a few hundred bytes fits the full million lines, and the full 64 KB fits about 32,000 files. Larger jobs should carry less job-level metadata or be split.\n\nA wrong `manifest_uri` is a 400 before the job is created, as is a manifest larger than the size cap. Request bodies are capped at 1 MB, which is why a large object list is a manifest in storage rather than an inline array.\n\nUnusable lines (invalid JSON, not a JSON object, a `uri` outside the container, a duplicate `uri`, an unknown key) and unreachable objects (missing, access denied, unsupported file type) are counted on the job. `GET /v2/jobs/{job_id}` returns a `manifest` object with the totals and a sample of up to 20 of each, giving the line number or `uri` and a reason. Neither fails the job: a million-line manifest with a few thousand bad lines indexes the rest.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"manifest missing or unreadable, or overwrite_existing and skip_existing both true","content":{"application/json":{"schema":{"description":"Any type"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexAzureManifestRequest"}}}}}},"/v2/collections/{collection_name}/index/r2":{"post":{"operationId":"indexing_index_r2_bucket_v2","summary":"Index R2 Bucket","description":"Index all files from a Cloudflare R2 bucket into a collection.\n\nR2 is S3-compatible. Provide your R2 API token's Access Key ID and Secret Access Key.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n- Idempotency-Key: UUID for request deduplication (optional)\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    body: R2 bucket configuration\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexR2Request"}}}}}},"/v2/collections/{collection_name}/index/r2/file":{"post":{"operationId":"indexing_index_r2_file_v2","summary":"Index R2 File","description":"Index a single file from a Cloudflare R2 bucket into a collection.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    body: R2 file configuration with file_uri (r2://bucket/path/to/file.pdf)\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexR2FileRequest"}}}}}},"/v2/collections/{collection_name}/index/r2/directory":{"post":{"operationId":"indexing_index_r2_directory_v2","summary":"Index R2 Directory","description":"Index all files from a specific directory (prefix) in a Cloudflare R2 bucket.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n- Idempotency-Key: UUID for request deduplication (optional)\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    body: R2 directory configuration with directory_path\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexR2DirectoryRequest"}}}}}},"/v2/collections/{collection_name}/index/r2/manifest":{"post":{"operationId":"indexing_index_r2_manifest_v2","summary":"Index R2 Manifest","description":"Index an explicit list of objects from a Cloudflare R2 bucket, given as a JSON Lines manifest in the same bucket. One bulk job; nothing is listed or scanned.\n\nOne object per line, UTF-8, uncompressed. `uri` is required, the rest are optional:\n\n```json\n{\"uri\": \"r2://my-r2-bucket/inbox/2026-q4-msa.pdf\", \"source_identity\": \"contract-8841\", \"custom_metadata\": {\"department\": \"legal\", \"counterparty\": \"Northwind\"}}\n{\"uri\": \"r2://my-r2-bucket/inbox/2026-q4-sow.pdf\", \"source_identity\": \"contract-8842\", \"size\": 482113, \"etag\": \"9b2cf535f27731c974343645a3985328\"}\n{\"uri\": \"r2://my-r2-bucket/archive/2025-renewal.pdf\", \"source_identity\": \"contract-7310\"}\n{\"uri\": \"r2://my-r2-bucket/inbox/handbook.pdf\"}\n```\n\n### Physical location vs. logical identity\n\n`uri` is **where the file currently lives**: this bucket, this key. It must be inside `bucket_name`, and it is the only field Captain reads bytes from.\n\n`source_identity` is **what the document is**, in your own terms. Captain keeps one document per identity, so the identity is what decides whether a later index is an update or a new document:\n\n- Give `r2://my-r2-bucket/inbox/2026-q4-msa.pdf` the identity `contract-8841`. Move the file to `r2://my-r2-bucket/archive/2026-q4-msa.pdf` and index it again with the same identity, and Captain updates that one document. Its chunks are replaced and the old ones are retired.\n- Omit `source_identity` and the identity is the `uri`. The same file at a new key is a different identity, so you get a second document and both versions answer queries.\n\nA repeat of an identity already in the collection is skipped while `skip_existing` is true (the default), and replaced when you send `overwrite_existing: true` or `skip_existing: false`. While it is skipping, Captain compares content. A repeat whose content is unchanged is skipped. A repeat whose content differs is an identity conflict: it is neither skipped nor indexed, and the job reports it under `identity_conflicts` so that you can send it again with `overwrite_existing: true`. When either version has no checksum, the repeat is skipped. Use your own record id, not a path, whenever content can move or be delivered twice.\n\n### The other line fields\n\n- `custom_metadata`: merged over the job-level `custom_metadata`, key by key, for this file only. A line's value wins on a shared key.\n- `checksum` and `version_id`: recorded on the document. A `checksum` that is the object's ETag, written bare or as `etag:...`, is compared with the object before anything is read, and a line that does not match is reported as unreachable instead of being indexed. Write any other algorithm with its prefix, for example `sha256:...`; it is recorded but not verified. `version_id` pins the object version that is read.\n- `size` and `etag`: when both are present, as in a bucket listing export, Captain does not read the object's metadata before indexing. That is what lets a large manifest start quickly.\n\n### Limits and error handling\n\nA manifest holds up to **1,000,000 lines** and **500 MB**, with each line at most **10 KB**. It must be plain UTF-8 `.jsonl` or `.ndjson`; a compressed body is refused. Per line, `custom_metadata` takes at most 50 keys, keys up to 64 characters and string values up to 1,024 characters. The job-level `custom_metadata` is capped at 64 KB serialized. It is attached to every file in the job, so metadata size times file count must stay under 2 GB: a few hundred bytes fits the full million lines, and the full 64 KB fits about 32,000 files. Larger jobs should carry less job-level metadata or be split.\n\nA wrong `manifest_uri` is a 400 before the job is created, as is a manifest larger than the size cap. Request bodies are capped at 1 MB, which is why a large object list is a manifest in storage rather than an inline array.\n\nUnusable lines (invalid JSON, not a JSON object, a `uri` outside the bucket, a duplicate `uri`, an unknown key) and unreachable objects (missing, access denied, unsupported file type) are counted on the job. `GET /v2/jobs/{job_id}` returns a `manifest` object with the totals and a sample of up to 20 of each, giving the line number or `uri` and a reason. Neither fails the job: a million-line manifest with a few thousand bad lines indexes the rest.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"manifest missing or unreadable, or overwrite_existing and skip_existing both true","content":{"application/json":{"schema":{"description":"Any type"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexR2ManifestRequest"}}}}}},"/v2/collections/{collection_name}/index/supabase":{"post":{"operationId":"indexing_index_supabase_bucket_v2","summary":"Index Supabase Bucket","description":"Index all files from a Supabase Storage bucket into a collection.\n\nSupabase Storage is S3-compatible. Provide your Supabase endpoint_url (https://{project_ref}.storage.supabase.co/storage/v1/s3) plus the S3 access key ID and secret access key from Storage → S3 Connection.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n- Idempotency-Key: UUID for request deduplication (optional)\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    body: Supabase bucket configuration\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexSupabaseRequest"}}}}}},"/v2/collections/{collection_name}/index/supabase/file":{"post":{"operationId":"indexing_index_supabase_file_v2","summary":"Index Supabase File","description":"Index a single file from a Supabase Storage bucket into a collection.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    body: Supabase file configuration with file_uri (object path within the bucket, e.g. reports/annual-review.pdf)\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexSupabaseFileRequest"}}}}}},"/v2/collections/{collection_name}/index/supabase/directory":{"post":{"operationId":"indexing_index_supabase_directory_v2","summary":"Index Supabase Directory","description":"Index all files from a specific directory (prefix) in a Supabase Storage bucket.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n- Idempotency-Key: UUID for request deduplication (optional)\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    body: Supabase directory configuration with directory_path\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexSupabaseDirectoryRequest"}}}}}},"/v2/collections/{collection_name}/index/supabase/manifest":{"post":{"operationId":"indexing_index_supabase_manifest_v2","summary":"Index Supabase Manifest","description":"Index an explicit list of objects from a Supabase Storage bucket, given as a JSON Lines manifest in the same bucket. One bulk job; nothing is listed or scanned.\n\nOne object per line, UTF-8, uncompressed. `uri` is required, the rest are optional:\n\n```json\n{\"uri\": \"s3://documents/inbox/2026-q4-msa.pdf\", \"source_identity\": \"contract-8841\", \"custom_metadata\": {\"department\": \"legal\", \"counterparty\": \"Northwind\"}}\n{\"uri\": \"s3://documents/inbox/2026-q4-sow.pdf\", \"source_identity\": \"contract-8842\", \"size\": 482113, \"etag\": \"9b2cf535f27731c974343645a3985328\"}\n{\"uri\": \"s3://documents/archive/2025-renewal.pdf\", \"source_identity\": \"contract-7310\"}\n{\"uri\": \"s3://documents/inbox/handbook.pdf\"}\n```\n\n### Physical location vs. logical identity\n\n`uri` is **where the file currently lives**: this bucket, this key. It must be inside `bucket_name`, and it is the only field Captain reads bytes from.\n\n`source_identity` is **what the document is**, in your own terms. Captain keeps one document per identity, so the identity is what decides whether a later index is an update or a new document:\n\n- Give `s3://documents/inbox/2026-q4-msa.pdf` the identity `contract-8841`. Move the file to `s3://documents/archive/2026-q4-msa.pdf` and index it again with the same identity, and Captain updates that one document. Its chunks are replaced and the old ones are retired.\n- Omit `source_identity` and the identity is the `uri`. The same file at a new key is a different identity, so you get a second document and both versions answer queries.\n\nA repeat of an identity already in the collection is skipped while `skip_existing` is true (the default), and replaced when you send `overwrite_existing: true` or `skip_existing: false`. While it is skipping, Captain compares content. A repeat whose content is unchanged is skipped. A repeat whose content differs is an identity conflict: it is neither skipped nor indexed, and the job reports it under `identity_conflicts` so that you can send it again with `overwrite_existing: true`. When either version has no checksum, the repeat is skipped. Use your own record id, not a path, whenever content can move or be delivered twice.\n\n### The other line fields\n\n- `custom_metadata`: merged over the job-level `custom_metadata`, key by key, for this file only. A line's value wins on a shared key.\n- `checksum` and `version_id`: recorded on the document. A `checksum` that is the object's ETag, written bare or as `etag:...`, is compared with the object before anything is read, and a line that does not match is reported as unreachable instead of being indexed. Write any other algorithm with its prefix, for example `sha256:...`; it is recorded but not verified. `version_id` pins the object version that is read.\n- `size` and `etag`: when both are present, as in a bucket listing export, Captain does not read the object's metadata before indexing. That is what lets a large manifest start quickly.\n\n### Limits and error handling\n\nA manifest holds up to **1,000,000 lines** and **500 MB**, with each line at most **10 KB**. It must be plain UTF-8 `.jsonl` or `.ndjson`; a compressed body is refused. Per line, `custom_metadata` takes at most 50 keys, keys up to 64 characters and string values up to 1,024 characters. The job-level `custom_metadata` is capped at 64 KB serialized. It is attached to every file in the job, so metadata size times file count must stay under 2 GB: a few hundred bytes fits the full million lines, and the full 64 KB fits about 32,000 files. Larger jobs should carry less job-level metadata or be split.\n\nA wrong `manifest_uri` is a 400 before the job is created, as is a manifest larger than the size cap. Request bodies are capped at 1 MB, which is why a large object list is a manifest in storage rather than an inline array.\n\nUnusable lines (invalid JSON, not a JSON object, a `uri` outside the bucket, a duplicate `uri`, an unknown key) and unreachable objects (missing, access denied, unsupported file type) are counted on the job. `GET /v2/jobs/{job_id}` returns a `manifest` object with the totals and a sample of up to 20 of each, giving the line number or `uri` and a reason. Neither fails the job: a million-line manifest with a few thousand bad lines indexes the rest.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"manifest missing or unreadable, or overwrite_existing and skip_existing both true","content":{"application/json":{"schema":{"description":"Any type"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexSupabaseManifestRequest"}}}}}},"/v2/collections/{collection_name}/index/backblaze":{"post":{"operationId":"indexing_index_backblaze_bucket_v2","summary":"Index Backblaze Bucket","description":"Index all files from a Backblaze B2 bucket into a collection.\n\nBackblaze B2 is S3-compatible. Provide your Backblaze endpoint_url (https://s3.{region}.backblazeb2.com) plus the Application Key ID and Application Key from the App Keys page (used as the S3 access key ID and secret access key).\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n- Idempotency-Key: UUID for request deduplication (optional)\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    body: Backblaze bucket configuration\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexBackblazeRequest"}}}}}},"/v2/collections/{collection_name}/index/backblaze/file":{"post":{"operationId":"indexing_index_backblaze_file_v2","summary":"Index Backblaze File","description":"Index a single file from a Backblaze B2 bucket into a collection.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    body: Backblaze file configuration with file_uri (object key within the bucket, e.g. reports/annual-review.pdf)\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexBackblazeFileRequest"}}}}}},"/v2/collections/{collection_name}/index/backblaze/directory":{"post":{"operationId":"indexing_index_backblaze_directory_v2","summary":"Index Backblaze Directory","description":"Index all files from a specific directory (prefix) in a Backblaze B2 bucket.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n- Idempotency-Key: UUID for request deduplication (optional)\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    body: Backblaze directory configuration with directory_path\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexBackblazeDirectoryRequest"}}}}}},"/v2/collections/{collection_name}/index/backblaze/manifest":{"post":{"operationId":"indexing_index_backblaze_manifest_v2","summary":"Index Backblaze Manifest","description":"Index an explicit list of objects from a Backblaze B2 bucket, given as a JSON Lines manifest in the same bucket. One bulk job; nothing is listed or scanned.\n\nOne object per line, UTF-8, uncompressed. `uri` is required, the rest are optional:\n\n```json\n{\"uri\": \"s3://documents/inbox/2026-q4-msa.pdf\", \"source_identity\": \"contract-8841\", \"custom_metadata\": {\"department\": \"legal\", \"counterparty\": \"Northwind\"}}\n{\"uri\": \"s3://documents/inbox/2026-q4-sow.pdf\", \"source_identity\": \"contract-8842\", \"size\": 482113, \"etag\": \"9b2cf535f27731c974343645a3985328\"}\n{\"uri\": \"s3://documents/archive/2025-renewal.pdf\", \"source_identity\": \"contract-7310\"}\n{\"uri\": \"s3://documents/inbox/handbook.pdf\"}\n```\n\n### Physical location vs. logical identity\n\n`uri` is **where the file currently lives**: this bucket, this key. It must be inside `bucket_name`, and it is the only field Captain reads bytes from.\n\n`source_identity` is **what the document is**, in your own terms. Captain keeps one document per identity, so the identity is what decides whether a later index is an update or a new document:\n\n- Give `s3://documents/inbox/2026-q4-msa.pdf` the identity `contract-8841`. Move the file to `s3://documents/archive/2026-q4-msa.pdf` and index it again with the same identity, and Captain updates that one document. Its chunks are replaced and the old ones are retired.\n- Omit `source_identity` and the identity is the `uri`. The same file at a new key is a different identity, so you get a second document and both versions answer queries.\n\nA repeat of an identity already in the collection is skipped while `skip_existing` is true (the default), and replaced when you send `overwrite_existing: true` or `skip_existing: false`. While it is skipping, Captain compares content. A repeat whose content is unchanged is skipped. A repeat whose content differs is an identity conflict: it is neither skipped nor indexed, and the job reports it under `identity_conflicts` so that you can send it again with `overwrite_existing: true`. When either version has no checksum, the repeat is skipped. Use your own record id, not a path, whenever content can move or be delivered twice.\n\n### The other line fields\n\n- `custom_metadata`: merged over the job-level `custom_metadata`, key by key, for this file only. A line's value wins on a shared key.\n- `checksum` and `version_id`: recorded on the document. A `checksum` that is the object's ETag, written bare or as `etag:...`, is compared with the object before anything is read, and a line that does not match is reported as unreachable instead of being indexed. Write any other algorithm with its prefix, for example `sha256:...`; it is recorded but not verified. `version_id` pins the object version that is read.\n- `size` and `etag`: when both are present, as in a bucket listing export, Captain does not read the object's metadata before indexing. That is what lets a large manifest start quickly.\n\n### Limits and error handling\n\nA manifest holds up to **1,000,000 lines** and **500 MB**, with each line at most **10 KB**. It must be plain UTF-8 `.jsonl` or `.ndjson`; a compressed body is refused. Per line, `custom_metadata` takes at most 50 keys, keys up to 64 characters and string values up to 1,024 characters. The job-level `custom_metadata` is capped at 64 KB serialized. It is attached to every file in the job, so metadata size times file count must stay under 2 GB: a few hundred bytes fits the full million lines, and the full 64 KB fits about 32,000 files. Larger jobs should carry less job-level metadata or be split.\n\nA wrong `manifest_uri` is a 400 before the job is created, as is a manifest larger than the size cap. Request bodies are capped at 1 MB, which is why a large object list is a manifest in storage rather than an inline array.\n\nUnusable lines (invalid JSON, not a JSON object, a `uri` outside the bucket, a duplicate `uri`, an unknown key) and unreachable objects (missing, access denied, unsupported file type) are counted on the job. `GET /v2/jobs/{job_id}` returns a `manifest` object with the totals and a sample of up to 20 of each, giving the line number or `uri` and a reason. Neither fails the job: a million-line manifest with a few thousand bad lines indexes the rest.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"manifest missing or unreadable, or overwrite_existing and skip_existing both true","content":{"application/json":{"schema":{"description":"Any type"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexBackblazeManifestRequest"}}}}}},"/v2/collections/{collection_name}/index/dropbox":{"post":{"operationId":"indexing_index_dropbox_bucket_v2","summary":"Index Dropbox","description":"Index all files from a Dropbox account into a collection.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n- Idempotency-Key: UUID for request deduplication (optional)\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    body: Dropbox access token\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexDropboxRequest"}}}}}},"/v2/collections/{collection_name}/index/dropbox/file":{"post":{"operationId":"indexing_index_dropbox_file_v2","summary":"Index Dropbox File","description":"Index a single file from Dropbox into a collection.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n- Idempotency-Key: UUID for request deduplication (optional)\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    body: Dropbox file configuration with file_path\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexDropboxFileRequest"}}}}}},"/v2/collections/{collection_name}/index/dropbox/directory":{"post":{"operationId":"indexing_index_dropbox_directory_v2","summary":"Index Dropbox Directory","description":"Index all files from a specific folder in a Dropbox account into a collection.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n- Idempotency-Key: UUID for request deduplication (optional)\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    body: Dropbox directory configuration with directory_path\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexDropboxDirectoryRequest"}}}}}},"/v2/collections/{collection_name}/index/gdrive":{"post":{"operationId":"indexing_index_gdrive_v2","summary":"Index GDrive","description":"Index a Workspace user's entire Google Drive into a collection (headless).\n\nUses service-account domain-wide delegation to read as `subject_email` — no\nper-user OAuth. Scope to a folder or single file with the /directory or\n/file variants.\n\nHeaders:\n- Authorization: Bearer {api_key}\n- X-Organization-ID: Organization UUID\n- Idempotency-Key: UUID for request deduplication (optional)\n\nReturns: { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexGDriveRequest"}}}}}},"/v2/collections/{collection_name}/index/gdrive/file":{"post":{"operationId":"indexing_index_gdrive_file_v2","summary":"Index GDrive File","description":"Index a single Google Drive file (by file ID) into a collection (headless).","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexGDriveFileRequest"}}}}}},"/v2/collections/{collection_name}/index/gdrive/directory":{"post":{"operationId":"indexing_index_gdrive_directory_v2","summary":"Index GDrive Directory","description":"Index a Google Drive folder (recursively) into a collection (headless).","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexGDriveDirectoryRequest"}}}}}},"/v2/collections/{collection_name}/index/sharepoint":{"post":{"operationId":"indexing_index_sharepoint_v2","summary":"Index SharePoint Site","description":"Index a SharePoint site's document library into a collection (headless).\n\nUses Microsoft Graph app-only auth (Entra ID App Registration with\nSites.Selected or Sites.Read.All application permission) — no per-user\nOAuth. Scope to a folder or single file with the /directory or /file\nvariants.\n\nHeaders:\n- Authorization: Bearer {api_key}\n- X-Organization-ID: Organization UUID\n- Idempotency-Key: UUID for request deduplication (optional)\n\nReturns: { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexSharePointRequest"}}}}}},"/v2/collections/{collection_name}/index/sharepoint/file":{"post":{"operationId":"indexing_index_sharepoint_file_v2","summary":"Index SharePoint File","description":"Index a single SharePoint file (by driveItem ID) into a collection (headless).","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexSharePointFileRequest"}}}}}},"/v2/collections/{collection_name}/index/sharepoint/directory":{"post":{"operationId":"indexing_index_sharepoint_directory_v2","summary":"Index SharePoint Directory","description":"Index a SharePoint folder (recursively) into a collection (headless).","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexSharePointDirectoryRequest"}}}}}},"/v2/collections/{collection_name}/index/onedrive":{"post":{"operationId":"indexing_index_onedrive_v2","summary":"Index OneDrive","description":"Index a user's entire OneDrive for Business into a collection (headless).\n\nUses Microsoft Graph app-only auth (Entra ID App Registration with the\nFiles.Read.All application permission) — no per-user OAuth. Scope to a\nfolder or single file with the /directory or /file variants.\n\nHeaders:\n- Authorization: Bearer {api_key}\n- X-Organization-ID: Organization UUID\n- Idempotency-Key: UUID for request deduplication (optional)\n\nReturns: { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexOneDriveRequest"}}}}}},"/v2/collections/{collection_name}/index/onedrive/file":{"post":{"operationId":"indexing_index_onedrive_file_v2","summary":"Index OneDrive File","description":"Index a single OneDrive file (by driveItem ID) into a collection (headless).","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexOneDriveFileRequest"}}}}}},"/v2/collections/{collection_name}/index/onedrive/directory":{"post":{"operationId":"indexing_index_onedrive_directory_v2","summary":"Index OneDrive Directory","description":"Index a OneDrive folder (recursively) into a collection (headless).","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexOneDriveDirectoryRequest"}}}}}},"/v2/collections/{collection_name}/index/url":{"post":{"operationId":"indexing_index_url_v2","summary":"Index URL","description":"Index documents from public URL(s) into a collection.\n\nAccepts either a single `url` string or a `urls` array of strings.\nDocuments are downloaded from the provided URLs and processed through\nthe same pipeline as cloud storage indexing.\n\nSupported formats: PDF, TXT, DOCX, CSV, XLSX, and other document types.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n- Idempotency-Key: UUID for request deduplication (optional)\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    body: URL configuration with url or urls\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexURLRequest"}}}}}},"/v2/collections/{collection_name}/index/youtube":{"post":{"operationId":"indexing_index_youtube_v2","summary":"Index YouTube","description":"Index YouTube videos into a collection.\n\nThree modes control how each video is processed and billed:\n\n| mode | Behavior | Billing |\n| --- | --- | --- |\n| `transcript` (default) | Fetches the caption track (auto-generated or manual), formats it with inline timestamps, and indexes it as text. No frames or audio are processed. | Basic text pages (roughly 3 credits for an hour of captions) |\n| `audio` | Pulls the audio track through the multimodal audio pipeline (transcription plus audio understanding). | 5 credits per audio minute |\n| `video` | Pulls the video through the multimodal video pipeline (frame descriptions plus transcription). | 20 credits per video minute |\n\nThe default is `transcript` and will stay `transcript`: media modes cost orders of magnitude more for the same video and are strictly opt-in.\n\nA video with no captions fails in transcript mode by default. Set `on_missing_transcript` to `audio` or `video` to fall back to a media mode for that video instead. Because the fallback changes what you are billed, it is recorded per video: `GET /v2/jobs/{job_id}` returns a `youtube` array with `mode_used`, `fell_back_from`, `transcript_available`, and `languages` for every video in the job.\n\nAccepts either a single `url` string or a `urls` array (max 20; duplicate videos are removed). Supported URL shapes: `youtube.com/watch?v=`, `youtu.be/`, `youtube.com/shorts/`, `youtube.com/embed/`, `youtube.com/v/`, and `youtube.com/live/`. Redirects and shortener URLs are not followed. Live streams are not indexable, and media longer than 4 hours is rejected.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n- Idempotency-Key: UUID for request deduplication (optional)\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexYoutubeRequest"}}}}}},"/v2/collections/{collection_name}/index/text":{"post":{"operationId":"indexing_index_text_v2","summary":"Index Text","description":"Index plain text content into a collection.\n\nAccepts raw text content in the request body, saves it as a .txt file,\nand indexes it for semantic search. No file upload or cloud storage needed.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n- Idempotency-Key: UUID for request deduplication (optional)\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    body: Text content and optional metadata\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexTextRequest"}}}}}},"/v2/collections/{collection_name}/index/file":{"post":{"operationId":"indexing_index_file_v2","summary":"Index File","description":"Index uploaded files into a collection.\n\nUpload one or more files directly via multipart form-data. Supports PDF, DOCX,\nXLSX, CSV, TXT, images, and other document types. Files are processed through\nthe same pipeline as cloud storage indexing.\n\nHeaders:\n- Authorization: Bearer {api_key} - Captain API key for authentication\n- X-Organization-ID: Organization UUID\n- Idempotency-Key: UUID for request deduplication (optional)\n\nArgs:\n    collection_name: Name of the collection (path parameter)\n    files: One or more files to upload and index\n    processing_type: \"advanced\" or \"basic\" (default: \"basic\")\n    custom_metadata: JSON string of custom metadata (optional)\n\nReturns:\n    { job_id, status: \"pending\" }","tags":["indexing"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexJobResponse"}}}},"400":{"description":"overwrite_existing and skip_existing cannot both be true","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"custom_metadata":{"type":["string","null"],"description":"JSON string of custom metadata to attach to all indexed chunks."},"files":{"type":"array","items":{"type":"string","format":"binary"},"description":"One or more files to index (max 20). Supported: PDF, DOCX, XLSX, CSV, TXT, MD, JSON, YAML, PNG, JPG, GIF, BMP, TIFF, WEBP, MP4, MOV, AVI, MKV, WEBM, MP3, WAV, AAC, FLAC, M4A, OGG."},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"processing_type":{"type":"string","default":"basic","description":"Document processing type: 'advanced' for AI-enhanced extraction (tables, figures, charts), 'basic' for standard processing."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"},"mask_pii":{"type":"boolean","default":false,"description":"When true, mask detected PII in the parsed content before it is embedded and stored."},"pii_engine":{"$ref":"#/components/schemas/V2CollectionsCollectionNameIndexFilePostRequestBodyContentMultipartFormDataSchemaPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["string","null"],"description":"JSON string of additional PII categories to mask, an array of objects with name, description and optional examples (the same shape as pii_fields on the JSON indexing endpoints). Requires mask_pii to be true."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job. Requires mask_pii to be true. Up to 1,000 characters."}},"required":["files"]}}}}}},"/v2/parsing-scripts/validate":{"post":{"operationId":"indexing_validate_parsing_script_v2","summary":"Validate Parsing Script","description":"Validate a JavaScript parsing script without running it against real data.\n\nUpload your .js file as multipart/form-data under the `file` field. The\nendpoint runs the same V8 sandbox that `json_handler` uses at indexing\ntime, so a script that validates here will work when you index files.\n\nChecks:\n1. JavaScript syntax parses cleanly\n2. Script exports a default function\n\nReturns HTTP 200 for both valid and invalid scripts — `valid: false` is\na business-logic result, not an HTTP error. 4xx/5xx responses indicate\nauth failures, malformed requests, or service unavailability.","tags":["indexing"],"parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateParsingScriptResponse"}}}},"400":{"description":"Malformed request — empty upload or missing X-Organization-ID header.","content":{"application/json":{"schema":{"description":"Any type"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"description":"Any type"}}}},"403":{"description":"API key does not belong to the organization, or trial/billing limits exceeded.","content":{"application/json":{"schema":{"description":"Any type"}}}},"413":{"description":"Script file exceeds 1000000 bytes.","content":{"application/json":{"schema":{"description":"Any type"}}}},"503":{"description":"Validation service temporarily unavailable (py_mini_racer not installed).","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"The .js parsing script file to validate."}},"required":["file"]}}}}}},"/v2/jobs":{"get":{"operationId":"jobs_list_jobs_v2","summary":"List Jobs","description":"List your indexing jobs, newest first. Filter by status or collection, and page through results with limit and offset. Use this to see what's currently running, review recent jobs, and check how many files each indexed. For the full detail of a single job, use GET /v2/jobs/{job_id}.","tags":["jobs"],"parameters":[{"name":"status","in":"query","description":"Filter by job status.","required":false,"schema":{"oneOf":[{"$ref":"#/components/schemas/V2JobsGetParametersStatusSchema"},{"type":"null"}]}},{"name":"collection","in":"query","description":"Filter by collection name.","required":false,"schema":{"type":["string","null"]}},{"name":"limit","in":"query","description":"Jobs per page.","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"offset","in":"query","description":"Pagination offset.","required":false,"schema":{"type":"integer","minimum":0,"default":0}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobListResponseV2"}}}},"400":{"description":"Invalid status filter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}}}}},"/v2/jobs/{job_id}":{"get":{"operationId":"jobs_get_job_status_v2","summary":"Get Job Status","description":"Get status, progress, and file-level details for an indexing job. Use files_limit and files_cursor to page through indexed files when the job contains many inputs.","tags":["jobs"],"parameters":[{"name":"job_id","in":"path","description":"ID of the job to look up, as returned by the indexing endpoint that started it.","required":true,"schema":{"type":"string"}},{"name":"files_limit","in":"query","description":"Number of files to return per page","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":50}},{"name":"files_cursor","in":"query","description":"Pagination cursor for files","required":false,"schema":{"type":["string","null"]}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobStatusResponse"}}}}}},"delete":{"operationId":"jobs_delete_job_v2","summary":"Cancel Job","description":"Cancel/delete an indexing job.\n\nMaps to POST /v1/index-stop/{job_id}\n\nBehavior:\n- If job is pending or running -> transition to cancelled\n- If job is already completed/failed/cancelled -> return 200 with current state (idempotent)\n\nReturns:\n- job_id: The job identifier\n- status: Current status after cancel attempt\n- message: Human-readable description\n- cancelled_at: Cancellation timestamp (RFC3339)\n\nAuthentication: Requires Bearer token in Authorization header","tags":["jobs"],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCancelResponse"}}}}}}},"/v2/jobs/{job_id}/rollback":{"patch":{"operationId":"jobs_rollback_job_v2","summary":"Rollback Job","description":"Rollback a completed/failed indexing job — removes all indexed data (RDS + Turbopuffer).\n\nBehavior:\n- If job is RUNNING: returns 409 Conflict — cancel it first\n- If job is in terminal state (SUCCEEDED/FAILED/ABORTED/TIMED_OUT): deletes all data\n- If job not found: returns 404\n\nReturns:\n- job_id: The job identifier\n- status: \"rolled_back\" or \"error\"\n- files_removed: List of file names that were removed\n- rolled_back_at: Timestamp of rollback\n\nAuthentication: Requires Bearer token in Authorization header","tags":["jobs"],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobRollbackResponse"}}}}}}},"/v2/jobs/{job_id}/pii":{"get":{"operationId":"jobs_get_job_pii_report_v2","summary":"Get PII Masking Report","description":"Get the PII masking report for a job that ran with `mask_pii: true`. Returns a signed download link (valid for up to 300 seconds) and an entity count for each report object; the masked values themselves are only in the downloaded objects. Reports are kept for 90 days after the job ran, then expire automatically (410). Requires a key with the `index` permission.","tags":["jobs"],"parameters":[{"name":"job_id","in":"path","description":"ID of the job whose masking report to act on, as returned by the indexing endpoint that started it.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PiiReportResponseV2"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpErrorResponseV2"}}}},"403":{"description":"`missing_permission`: the key lacks the `index` permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PiiReportErrorV2"}}}},"404":{"description":"Job not found, or it belongs to another organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpErrorResponseV2"}}}},"409":{"description":"`not_masked`: the job did not run with `mask_pii`. `predates_feature`: the job was indexed before reports were kept. `report_unavailable`: no report objects exist yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PiiReportErrorV2"}}}},"410":{"description":"`deleted`: the report was deleted (`deleted_at` is included). `expired`: 90 days passed since the job ran and the report was removed automatically","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PiiReportErrorV2"}}}},"503":{"description":"`report_signer_unconfigured`, `registry_unavailable`, `report_store_unavailable`, or `audit_unavailable`. Retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PiiReportErrorV2"}}}}}},"delete":{"operationId":"jobs_delete_job_pii_report_v2","summary":"Delete PII Masking Report","description":"Permanently delete a job's PII masking report before its automatic 90-day expiry. Later GET calls return 410 with `deleted_at`; the report is never regenerated. Refused while the job is still running. Requires a key with the `index` permission.","tags":["jobs"],"parameters":[{"name":"job_id","in":"path","description":"ID of the job whose masking report to act on, as returned by the indexing endpoint that started it.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PiiReportDeleteResponseV2"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpErrorResponseV2"}}}},"403":{"description":"`missing_permission`: the key lacks the `index` permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PiiReportErrorV2"}}}},"404":{"description":"Job not found, or it belongs to another organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpErrorResponseV2"}}}},"409":{"description":"`job_running`: the job is still processing. `not_masked`: the job did not run with `mask_pii`. `predates_feature`: the job was indexed before reports were kept","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PiiReportErrorV2"}}}},"410":{"description":"`deleted`: already deleted (`deleted_at` is included). `expired`: 90 days passed since the job ran and the report was removed automatically","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PiiReportErrorV2"}}}},"503":{"description":"`report_signer_unconfigured`, `registry_unavailable`, `report_store_unavailable`, or `job_status_unavailable`. Retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PiiReportErrorV2"}}}}}}},"/v3/collections/{collection_name}/evals/uploads":{"post":{"operationId":"fileSearch_create_eval_upload_v3","summary":"Create Evaluation Upload","description":"Mint a single-use upload URL for an evaluation set. PUT the raw `.ndjson` bytes to `upload_url` with exactly the returned `headers` (no `Authorization`); the URL accepts one PUT of exactly `byte_size` bytes, then expires. Files are at most 10,000 lines and 50 MB. The upload is bound to this collection, so a later [Create Eval](/reference/evals/create) cannot point the same `upload_id` at a different one. Line format and limits are on the [Evaluations](/guides/evaluations) guide.","tags":["file-search"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Upload minted. PUT the file to `upload_url` before `expires_at`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvalUploadResponseV3"}}}},"400":{"description":"Invalid `filename` (must end in `.ndjson`), `byte_size` (1 to 52,428,800), or `content_type`.","content":{"application/json":{"schema":{"description":"Any type"}}}},"401":{"description":"Missing or invalid authentication.","content":{"application/json":{"schema":{"description":"Any type"}}}},"403":{"description":"API key does not have the query permission for this collection.","content":{"application/json":{"schema":{"description":"Any type"}}}},"404":{"description":"Collection not found (or an eval / upload that belongs to another organization: no existence oracle).","content":{"application/json":{"schema":{"description":"Any type"}}}},"429":{"description":"Too many unconsumed upload URLs for this collection (`TOO_MANY_PENDING_UPLOADS`); PUT to one or let it expire.","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvalUploadRequestV3"}}}}}},"/v3/collections/{collection_name}/evals":{"post":{"operationId":"fileSearch_create_eval_v3","summary":"Queue Evaluation","description":"Queue an evaluation of an uploaded case set against one to eight named query configurations. `Idempotency-Key` is required: within 24 hours the same key with the same body returns the stored `201` body with status `200`; the same key with a different body is `409` (`IDEMPOTENCY_KEY_REUSE`). Gold is resolved at accept time (document id, then unique basename); unresolved cases are `error` and never queried or billed. Each `configs[]` entry is the [v3 query](/reference/v3/query) body minus `query` and is validated the same way. Each unit (one question under one config) is billed as one query, so whether it costs credits depends on the plan; only units that ran (scored, or timed out at the 30 s limit) are counted. Scoring, limits, billing and the NDJSON format are on the [Evaluations](/guides/evaluations) guide.","tags":["file-search"],"parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","description":"Caller-chosen key, 1 to 256 characters of `A-Z a-z 0-9 . _ : / = + -`, scoped to the organization for 24 hours.","required":true,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Idempotent replay: the stored original `201` body (including the original `eval_id`), not live status. Poll [Get Eval](/reference/evals/get) for progress.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvalResponseV3"}}}},"400":{"description":"`INVALID_ID_PREFIX`, missing or invalid `Idempotency-Key`, upload not yet PUT or expired, duplicate config names, a config failing v3 query validation, or a whole-file NDJSON problem (blank line, invalid JSON, duplicate case `id`, more than 10,000 lines, more than 80,000 units).","content":{"application/json":{"schema":{"description":"Any type"}}}},"401":{"description":"Missing or invalid authentication.","content":{"application/json":{"schema":{"description":"Any type"}}}},"403":{"description":"API key does not have the query permission for this collection.","content":{"application/json":{"schema":{"description":"Any type"}}}},"404":{"description":"Collection not found (or an eval / upload that belongs to another organization: no existence oracle).","content":{"application/json":{"schema":{"description":"Any type"}}}},"409":{"description":"`IDEMPOTENCY_KEY_REUSE` (same key, different body) or `UPLOAD_ALREADY_BOUND` (upload already used by another eval).","content":{"application/json":{"schema":{"description":"Any type"}}}},"429":{"description":"`TOO_MANY_PENDING_EVALS`: the organization already has 20 pending evals (`Retry-After` is set). Evals are paced as jobs, so this is never an org-wide query 429.","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEvalRequestV3"}}}}}},"/v3/evals":{"get":{"operationId":"evals_list_evals_v3","summary":"List Evaluations","description":"List your evaluations, newest first, scoped to the environment of the\nAPI key you call with.\n\nEach row carries the status, progress and per-configuration scorecards, so\na dashboard or agent can show where every evaluation stands without\nfetching each one. Per-case results and stored answers stay on\nGET /v3/evals/{eval_id}.\n\nPage with `cursor` until `next_cursor` is null; there is no total count.\nEvaluations still running are settled against their job before the page\nreturns, up to a few per page, so a finished run stops reading as running.","tags":["evals"],"parameters":[{"name":"collection","in":"query","description":"Only evaluations against this collection.","required":false,"schema":{"type":["string","null"]}},{"name":"status","in":"query","description":"Filter by status: `pending`, `running`, `completed`, `completed_with_errors` or `failed`.","required":false,"schema":{"type":["string","null"]}},{"name":"limit","in":"query","description":"Rows per page (1-100).","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"cursor","in":"query","description":"Continue from a previous page's `next_cursor`.","required":false,"schema":{"type":["string","null"],"maxLength":512}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvalListResponseV3"}}}},"400":{"description":"Invalid status or cursor.","content":{"application/json":{"schema":{"description":"Any type"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"description":"Any type"}}}},"403":{"description":"The API key does not have query permission.","content":{"application/json":{"schema":{"description":"Any type"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v3/evals/{eval_id}":{"get":{"operationId":"fileSearch_get_eval_v3","summary":"Get Evaluation Results","description":"Status, progress, per-config scorecards, billing and per-case results for an eval. `scorecards` is `{}` and `billing` is `null` until the eval is terminal (`completed`, `completed_with_errors`, or `failed`). Items are paged by `items_limit` (default 100, max 500) and `items_cursor`; each item carries a result object per config name. Recall, MRR and nDCG are over scored units only; a failed query is counted in `failed`, never scored as a miss. Evals of a deleted collection return `404`. Metric definitions are on the [Evaluations](/guides/evaluations) guide.","tags":["file-search"],"parameters":[{"name":"eval_id","in":"path","required":true,"schema":{"type":"string"}},{"name":"items_limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":100}},{"name":"items_cursor","in":"query","required":false,"schema":{"type":["string","null"],"maxLength":256}}],"responses":{"200":{"description":"The eval, with items paged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvalResponseV3"}}}},"400":{"description":"`INVALID_ID_PREFIX` (ids start with `eval_`) or `INVALID_CURSOR`.","content":{"application/json":{"schema":{"description":"Any type"}}}},"401":{"description":"Missing or invalid authentication.","content":{"application/json":{"schema":{"description":"Any type"}}}},"403":{"description":"API key does not have the query permission for this collection.","content":{"application/json":{"schema":{"description":"Any type"}}}},"404":{"description":"Collection not found (or an eval / upload that belongs to another organization: no existence oracle).","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v3/evals/{eval_id}/answers/{case_id}/{config_name}":{"get":{"operationId":"evals_get_eval_answer_v3","summary":"Get Eval Answer V3","description":"The exact Query v3 request one unit sent and the response it received,\nkept on the eval for as long as the eval exists. 404 until the unit has\nbeen queried.","tags":["evals"],"parameters":[{"name":"eval_id","in":"path","required":true,"schema":{"type":"string"}},{"name":"case_id","in":"path","required":true,"schema":{"type":"string"}},{"name":"config_name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvalAnswerV3"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/datasets/odyssey/feed":{"get":{"operationId":"odyssey_eventFeed","summary":"Get Event Feed","description":"Global, chronological, cursor-paginated stream of structured company events.\n\nAlways live: every read builds the stream at request time — items are gathered from publisher sources, merged, de-duplicated, sorted by recency, and enriched per page. There is no stored-backlog mode and no `live` flag. `since`/`until` window by time; pass `next_cursor` back until `has_more` is false. Each page pays a live fetch plus enrichment, so keep `page_size` small and paginate via `next_cursor`.","tags":["odyssey"],"parameters":[{"name":"types","in":"query","description":"Restrict to event kinds; omit = all 8","required":false,"schema":{"type":["array","null"],"items":{"type":"string"}}},{"name":"sector","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"min_amount","in":"query","description":"USD floor on event_data.amount","required":false,"schema":{"type":["number","null"],"format":"double"}},{"name":"since","in":"query","description":"Start boundary: items at/after this ISO-8601 UTC timestamp","required":false,"schema":{"type":["string","null"]}},{"name":"until","in":"query","description":"End boundary: items strictly before this ISO-8601 UTC timestamp","required":false,"schema":{"type":["string","null"]}},{"name":"cursor","in":"query","description":"Opaque next_cursor from a prior page; supersedes until","required":false,"schema":{"type":["string","null"]}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":100}},{"name":"fields","in":"query","required":false,"schema":{"type":"string","pattern":"^(ids|full)$","default":"full"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__routes__v2__odyssey__events__FeedResponse"}}}}}}},"/v2/datasets/odyssey/events/{event_id}":{"get":{"operationId":"odyssey_getEvent","summary":"Get Event","description":"One event by id.","tags":["odyssey"],"parameters":[{"name":"event_id","in":"path","description":"Public event id from a feed item","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyEventDetail"}}}}}}},"/v2/datasets/odyssey/publications/feed":{"get":{"operationId":"odyssey_publicationFeed","summary":"Get Publication Feed","description":"Chronological, cursor-paginated stream of articles.\n\nAlways live: every read builds the feed at request time — articles are gathered from publisher sources, merged, de-duplicated, and sorted by recency. The aggregated listing itself is never cached; only per-article enrichment work is. `fields=ids` is the cheap title-only mode. `fields=full` returns entity-linked articles; articles not yet enriched come back with `enrichment_status=\"pending\"` — the list never enriches a whole page inline. Hydrate individual articles via `GET /v2/datasets/odyssey/publications/articles/{article_id}`, which enriches on demand. `since`/`until` window by time; page via `next_cursor`.\n\nFilters: `publications=` is a cheap publisher allowlist applied before enrichment. `sector=` and `has_entities=` depend on enrichment, so they hydrate the page on demand — the page size is clamped low and each request carries an enrichment budget and wall-clock deadline; when a bound is hit you receive a partial page plus a cursor to continue.","tags":["odyssey"],"parameters":[{"name":"since","in":"query","description":"Start boundary: items at/after this ISO-8601 UTC timestamp","required":false,"schema":{"type":["string","null"]}},{"name":"until","in":"query","description":"End boundary: items strictly before this ISO-8601 UTC timestamp","required":false,"schema":{"type":["string","null"]}},{"name":"cursor","in":"query","description":"Opaque next_cursor from a prior page; supersedes until","required":false,"schema":{"type":["string","null"]}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":100}},{"name":"publications","in":"query","description":"Pre-enrichment allowlist: only articles from these publishers (registrable domain, canonical slug, or catalog name)","required":false,"schema":{"type":["array","null"],"items":{"type":"string"}}},{"name":"publication","in":"query","description":"Singular alias of `publications` (accepted for compatibility; merged with `publications`)","required":false,"schema":{"type":["array","null"],"items":{"type":"string"}}},{"name":"sector","in":"query","description":"Filter to articles whose enriched sector matches (hydrates the page on demand; page is clamped + budgeted). Tolerant of case, separators, and shorthand (e.g. `fintech` matches `Financial Services`)","required":false,"schema":{"type":["string","null"]}},{"name":"has_entities","in":"query","description":"Filter to articles that did/didn't resolve any entity (hydrates the page on demand; page is clamped + budgeted)","required":false,"schema":{"type":["boolean","null"]}},{"name":"fields","in":"query","description":"'ids' = titles and ids only (no entity-linking); 'full' = entity-linked articles","required":false,"schema":{"type":"string","pattern":"^(ids|full)$","default":"full"}},{"name":"title_only","in":"query","description":"Alias for `fields=ids`: titles + ids only, no entity-linking","required":false,"schema":{"type":["boolean","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__routes__v2__odyssey__feed__FeedResponse"}}}}}}},"/v2/datasets/odyssey/publications/articles/{article_id}":{"get":{"operationId":"odyssey_getArticle","summary":"Get Article","description":"One article by id, entity-linked. A cache miss triggers entity enrichment on demand and caches the result. If the enrichment backend is unavailable, the article is returned with `enrichment_status=\"pending\"` rather than failing the request.","tags":["odyssey"],"parameters":[{"name":"article_id","in":"path","description":"Public article id from a feed item","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyArticleDetail"}}}}}}},"/v2/datasets/odyssey/webhooks/subscribe":{"post":{"operationId":"odyssey_subscribeWebhook","summary":"Subscribe Webhook","description":"Register a watchlist webhook (legacy path; see also POST /subscriptions).","tags":["odyssey"],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscribeResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeRequest"}}}}}},"/v2/datasets/odyssey/webhooks/subscriptions":{"post":{"operationId":"odyssey_createSubscription","summary":"Create Subscription","description":"Register a watchlist webhook (RESTful alias of /subscribe).","tags":["odyssey"],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscribeResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeRequest"}}}}},"get":{"operationId":"odyssey_listSubscriptions","summary":"List Subscriptions","description":"List the caller's active subscriptions (inactive ones excluded).","tags":["odyssey"],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscriptionList"}}}}}}},"/v2/datasets/odyssey/companies/search":{"get":{"operationId":"odyssey_companies_search","summary":"Search Companies","description":"Search for companies by name or natural language description.\n\nSupports two modes:\n- **Direct lookup**: Short queries (1-3 words) like \"Stripe\" or \"OpenAI\" resolve directly\n- **Natural language search**: Longer queries like \"AI startups in San Francisco raising Series B\"\n  are translated to structured search queries and return multiple matching companies\n\n**Headers:**\n- `Authorization`: Bearer {api_key}\n- `X-Organization-ID`: Organization UUID","tags":["odyssey"],"parameters":[{"name":"q","in":"query","description":"Company name, domain, or natural language search query (e.g. 'AI startups in San Francisco')","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum number of results (default 5)","required":false,"schema":{"type":"integer","minimum":1,"maximum":25,"default":5}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanySearchResponse"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}}}}},"/v2/datasets/odyssey/companies/{company_id}/full":{"get":{"operationId":"odyssey_companies_full","summary":"Get Company Full","description":"Get the complete company record with ALL available data fields.\n\nReturns everything: base profile, funding details with amounts and investors,\nemployee analytics, growth rates, executive changes, office locations,\njob postings, industry classifications, subsidiaries, and more.\n\nUse this after identifying a company via search to get the full picture.\n\n**Headers:**\n- `Authorization`: Bearer {api_key}\n- `X-Organization-ID`: Organization UUID","tags":["odyssey"],"parameters":[{"name":"company_id","in":"path","description":"Company entity ID, name, or website domain","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponse"}}}},"404":{"description":"Company not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}}}}},"/v2/datasets/odyssey/companies/{company_id}/bio":{"get":{"operationId":"odyssey_companies_bio","summary":"Get Company Bio","description":"Get a comprehensive company profile.\n\n**Headers:**\n- `Authorization`: Bearer {api_key}\n- `X-Organization-ID`: Organization UUID","tags":["odyssey"],"parameters":[{"name":"company_id","in":"path","description":"Company entity ID or identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyOverview"}}}},"404":{"description":"Company not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}}}}},"/v2/datasets/odyssey/companies/{company_id}/active-investors":{"get":{"operationId":"odyssey_companies_active_investors","summary":"Get Company Active Investors","description":"Get a company's active investors.\n\n**Headers:**\n- `Authorization`: Bearer {api_key}\n- `X-Organization-ID`: Organization UUID","tags":["odyssey"],"parameters":[{"name":"company_id","in":"path","description":"Company entity ID or identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestorsList"}}}},"404":{"description":"Company not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"501":{"description":"Investor data not yet implemented","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}}}}},"/v2/datasets/odyssey/companies/{company_id}/service-providers":{"get":{"operationId":"odyssey_companies_service_providers","summary":"Get Company Service Providers","description":"Get general service providers for company.\n\n**Headers:**\n- `Authorization`: Bearer {api_key}\n- `X-Organization-ID`: Organization UUID","tags":["odyssey"],"parameters":[{"name":"company_id","in":"path","description":"Company entity ID or identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/odyssey_companies_service_providers_Response_200"}}}},"501":{"description":"Service provider data not currently available","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}}}}},"/v2/datasets/odyssey/companies/{company_id}/service-providers/deal":{"get":{"operationId":"odyssey_companies_service_providers_deal","summary":"Get Company Service Providers Deal","description":"Get deal-specific service providers (legal, financial advisors) for company.\n\n**Headers:**\n- `Authorization`: Bearer {api_key}\n- `X-Organization-ID`: Organization UUID","tags":["odyssey"],"parameters":[{"name":"company_id","in":"path","description":"Company entity ID or identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/odyssey_companies_service_providers_deal_Response_200"}}}},"501":{"description":"Service provider data not currently available","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}}}}},"/v2/datasets/odyssey/companies/{company_id}/financing/recent":{"get":{"operationId":"odyssey_companies_financing_recent","summary":"Get Company Financing Recent","description":"Get a company's most recent financing round.\n\n**Headers:**\n- `Authorization`: Bearer {api_key}\n- `X-Organization-ID`: Organization UUID","tags":["odyssey"],"parameters":[{"name":"company_id","in":"path","description":"Company entity ID, name, or website domain","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FundingHistory"}}}},"404":{"description":"Company not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"501":{"description":"Not yet implemented","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}}}}},"/v2/datasets/odyssey/companies/{company_id}/debt-financing/recent":{"get":{"operationId":"odyssey_companies_debt_financing_recent","summary":"Get Company Debt Financing Recent","description":"Get most recent debt financing for company.\n\n**Headers:**\n- `Authorization`: Bearer {api_key}\n- `X-Organization-ID`: Organization UUID","tags":["odyssey"],"parameters":[{"name":"company_id","in":"path","description":"Company entity ID or identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/odyssey_companies_debt_financing_recent_Response_200"}}}},"501":{"description":"Debt financing data requires specialized data source","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}}}}},"/v2/datasets/odyssey/companies/{company_id}/deals":{"get":{"operationId":"odyssey_companies_deals","summary":"Get Company Deals","description":"Get a company's deal history (acquisitions and funding rounds).\n\n**Headers:**\n- `Authorization`: Bearer {api_key}\n- `X-Organization-ID`: Organization UUID","tags":["odyssey"],"parameters":[{"name":"company_id","in":"path","description":"Company entity ID or identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyDealsList"}}}},"404":{"description":"Company not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"501":{"description":"Deals data not yet implemented","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}}}}},"/v2/datasets/odyssey/companies/{company_id}/financials":{"get":{"operationId":"odyssey_companies_financials","summary":"Get Company Financials","description":"Get company financial data. Public companies return audited figures from SEC filings (revenue, net income, assets, liabilities); private companies return an estimated revenue range where available.\n\n**Headers:**\n- `Authorization`: Bearer {api_key}\n- `X-Organization-ID`: Organization UUID","tags":["odyssey"],"parameters":[{"name":"company_id","in":"path","description":"Company entity ID or identifier","required":true,"schema":{"type":"string"}},{"name":"fiscal_year","in":"query","description":"Fiscal year (default: 2024)","required":false,"schema":{"type":["integer","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinancialData"}}}},"404":{"description":"Company not found or no financial data available","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"501":{"description":"SEC EDGAR integration not yet implemented","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}}}}},"/v2/datasets/odyssey/companies/{company_id}/financials/recent":{"get":{"operationId":"odyssey_companies_financials_recent","summary":"Get Company Financials Recent","description":"Get most recent company financial data from SEC EDGAR.\n\nDefaults to most recent available year (2024 or 2023).\n\n**Headers:**\n- `Authorization`: Bearer {api_key}\n- `X-Organization-ID`: Organization UUID","tags":["odyssey"],"parameters":[{"name":"company_id","in":"path","description":"Company entity ID or identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinancialData"}}}},"404":{"description":"Company not found or no financial data available","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}}}}},"/v2/datasets/odyssey/companies/{company_id}/similar":{"get":{"operationId":"odyssey_companies_similar","summary":"Get Company Similar","description":"Get similar companies analysis.\n\nUses LinkedIn company page to extract similar companies.\n\n**Headers:**\n- `Authorization`: Bearer {api_key}\n- `X-Organization-ID`: Organization UUID","tags":["odyssey"],"parameters":[{"name":"company_id","in":"path","description":"Company entity ID or identifier","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum number of similar companies","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":10}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompetitorsList"}}}},"404":{"description":"Company not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"501":{"description":"Similar companies analysis not yet implemented","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}}}}},"/v2/datasets/odyssey/people/search":{"get":{"operationId":"odyssey_people_search","summary":"Search people","description":"Search for people by name, company, title, or location","tags":["odyssey"],"parameters":[{"name":"q","in":"query","description":"Search query (name, company, title)","required":true,"schema":{"type":"string"}},{"name":"location","in":"query","description":"Location filter","required":false,"schema":{"type":["string","null"]}},{"name":"company","in":"query","description":"Current company filter","required":false,"schema":{"type":["string","null"]}},{"name":"title","in":"query","description":"Job title filter","required":false,"schema":{"type":["string","null"]}},{"name":"limit","in":"query","description":"Maximum results per page","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":10}},{"name":"offset","in":"query","description":"Number of results to skip for pagination","required":false,"schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonSearchResponse"}}}}}}},"/v2/datasets/odyssey/people/{person_id}/bio":{"get":{"operationId":"odyssey_people_bio","summary":"Person bio","description":"Get person bio with high-level profile information","tags":["odyssey"],"parameters":[{"name":"person_id","in":"path","description":"Person entity ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonBioResponse"}}}}}}},"/v2/datasets/odyssey/deals/search":{"get":{"operationId":"odyssey_deals_search","summary":"Search Deals","description":"Search funding rounds and deals by company, deal type, amount range, and date range.","tags":["odyssey"],"parameters":[{"name":"q","in":"query","description":"Search query","required":false,"schema":{"type":"string","default":""}},{"name":"company","in":"query","description":"Filter by company name","required":false,"schema":{"type":["string","null"]}},{"name":"deal_type","in":"query","description":"Filter by deal type","required":false,"schema":{"type":["string","null"]}},{"name":"min_amount","in":"query","description":"Min deal amount","required":false,"schema":{"type":["number","null"],"format":"double"}},{"name":"max_amount","in":"query","description":"Max deal amount","required":false,"schema":{"type":["number","null"],"format":"double"}},{"name":"start_date","in":"query","description":"Start date (YYYY-MM-DD)","required":false,"schema":{"type":["string","null"]}},{"name":"end_date","in":"query","description":"End date (YYYY-MM-DD)","required":false,"schema":{"type":["string","null"]}},{"name":"page","in":"query","description":"Page number","required":false,"schema":{"type":"integer","minimum":1,"default":1}},{"name":"page_size","in":"query","description":"Results per page","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DealSearchResponse"}}}}}}},"/v2/datasets/odyssey/deals/{id}/bio":{"get":{"operationId":"odyssey_deals_bio","summary":"Get Deal Bio","description":"Get deal bio.\n\nReturns comprehensive deal information including amount, type, date, and participants.","tags":["odyssey"],"parameters":[{"name":"id","in":"path","description":"Deal entity ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DealOverview"}}}}}}},"/v2/datasets/odyssey/deals/{id}/investors":{"get":{"operationId":"odyssey_deals_investors","summary":"Get Deal Investors","description":"Get deal investors (participants).\n\nReturns all investors participating in the deal with their roles and investment amounts.","tags":["odyssey"],"parameters":[{"name":"id","in":"path","description":"Deal entity ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DealParticipantsResponse"}}}}}}},"/v2/datasets/odyssey/deals/{id}/service-providers":{"get":{"operationId":"odyssey_deals_service_providers","summary":"Get Deal Service Providers","description":"Get deal service providers.\n\nReturns service providers (legal, accounting, etc.) involved in the deal.\n\nNote: Service provider data not available from public sources.","tags":["odyssey"],"parameters":[{"name":"id","in":"path","description":"Deal entity ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyDealsServiceProvidersResponse"}}}}}}},"/v2/datasets/odyssey/deals/{id}/valuation":{"get":{"operationId":"odyssey_deals_valuation","summary":"Get Deal Valuation","description":"Get deal valuation & terms.\n\nReturns detailed terms including valuations, equity percentage, and structure.","tags":["odyssey"],"parameters":[{"name":"id","in":"path","description":"Deal entity ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DealTermsResponse"}}}}}}},"/v2/datasets/odyssey/deals/{id}/stock-info":{"get":{"operationId":"odyssey_deals_stock_info","summary":"Get Deal Stock Info","description":"Get current stock information for a deal's company. Public companies only.","tags":["odyssey"],"parameters":[{"name":"id","in":"path","description":"Deal entity ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyDealsStockInfoResponse"}}}}}}},"/v2/datasets/odyssey/deals/{id}/debt-lenders":{"get":{"operationId":"odyssey_deals_debt_lenders","summary":"Get Deal Debt Lenders","description":"Get debt lenders.\n\nReturns lenders and debt financing details for the deal.\n\nNote: Debt lender data is limited in public sources.","tags":["odyssey"],"parameters":[{"name":"id","in":"path","description":"Deal entity ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyDealsDebtLendersResponse"}}}}}}},"/v2/datasets/odyssey/investors/search":{"get":{"operationId":"odyssey_investors_search","summary":"Search Investors","description":"Search for investor firms by name.","tags":["odyssey"],"parameters":[{"name":"q","in":"query","description":"Search query","required":false,"schema":{"type":"string","default":""}},{"name":"investor_type","in":"query","description":"Filter by type","required":false,"schema":{"type":["string","null"]}},{"name":"stage_focus","in":"query","description":"Filter by stage","required":false,"schema":{"type":["string","null"]}},{"name":"location","in":"query","description":"Filter by location","required":false,"schema":{"type":["string","null"]}},{"name":"min_aum","in":"query","description":"Min AUM","required":false,"schema":{"type":["number","null"],"format":"double"}},{"name":"page","in":"query","description":"Page number","required":false,"schema":{"type":"integer","minimum":1,"default":1}},{"name":"page_size","in":"query","description":"Results per page","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestorSearchResponse"}}}}}}},"/v2/datasets/odyssey/investors/{id}/bio":{"get":{"operationId":"odyssey_investors_bio","summary":"Get Investor Bio","description":"Get a comprehensive investor profile.","tags":["odyssey"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestorOverview"}}}}}}},"/v2/datasets/odyssey/investors/{id}/active-investments":{"get":{"operationId":"odyssey_investors_active_investments","summary":"Get Investor Active Investments","description":"Get an investor's active portfolio companies.","tags":["odyssey"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"status","in":"query","description":"Filter by status (active/exited)","required":false,"schema":{"type":["string","null"]}},{"name":"page","in":"query","description":"Page number","required":false,"schema":{"type":"integer","minimum":1,"default":1}},{"name":"page_size","in":"query","description":"Results per page","required":false,"schema":{"type":"integer","minimum":1,"maximum":1000,"default":50}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortfolioResponse"}}}}}}},"/v2/datasets/odyssey/investors/{id}/preferences":{"get":{"operationId":"odyssey_investors_preferences","summary":"Get Investor Preferences","description":"Get an investor's investment preferences (stage, sector, and check-size focus).","tags":["odyssey"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestorPreferences"}}}}}}},"/v2/datasets/odyssey/investors/{id}/funds":{"get":{"operationId":"odyssey_investors_funds","summary":"Get Investor Funds","description":"Get the funds managed by an investor.","tags":["odyssey"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FundsResponse"}}}}}}},"/v2/datasets/odyssey/investors/{id}/funds/latest":{"get":{"operationId":"odyssey_investors_funds_latest","summary":"Get Investor Latest Fund","description":"Get an investor's most recently closed fund.","tags":["odyssey"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LatestFundResponse"}}}}}}},"/v2/datasets/odyssey/investors/{id}/service-providers/deal":{"get":{"operationId":"odyssey_investors_service_providers_deal","summary":"Get Investor Deal Service Providers","description":"Get service providers involved in an investor's specific deals.","tags":["odyssey"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceProvidersResponse"}}}}}}},"/v2/datasets/odyssey/investors/{id}/board-seats":{"get":{"operationId":"odyssey_investors_board_seats","summary":"Get Investor Board Seats","description":"Get board seats held by an investor's representatives.","tags":["odyssey"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardSeatsResponse"}}}}}}},"/v2/datasets/odyssey/funds/search":{"get":{"operationId":"odyssey_funds_search","summary":"Search funds","description":"Search for venture and credit fund management firms.","tags":["odyssey"],"parameters":[{"name":"q","in":"query","description":"Search query","required":true,"schema":{"type":"string"}},{"name":"fund_type","in":"query","description":"Fund type filter","required":false,"schema":{"type":["string","null"]}},{"name":"vintage_year","in":"query","description":"Fund vintage year","required":false,"schema":{"type":["integer","null"]}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyFundsSearchResponse"}}}}}}},"/v2/datasets/odyssey/funds/{fund_id}/bio":{"get":{"operationId":"odyssey_funds_bio","summary":"Fund bio","description":"Get fund biography and profile (renamed from overview)","tags":["odyssey"],"parameters":[{"name":"fund_id","in":"path","description":"Fund entity ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyFundsBioResponse"}}}}}}},"/v2/datasets/odyssey/funds/{fund_id}/active-investments":{"get":{"operationId":"odyssey_funds_active_investments","summary":"Fund active investments","description":"Get active portfolio companies for the fund","tags":["odyssey"],"parameters":[{"name":"fund_id","in":"path","description":"Fund entity ID","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyFundsActiveInvestmentsResponse"}}}}}}},"/v2/datasets/odyssey/limited-partners/search":{"get":{"operationId":"odyssey_lps_search","summary":"Search LPs","description":"Search for limited partners.","tags":["odyssey"],"parameters":[{"name":"q","in":"query","description":"Search query","required":true,"schema":{"type":"string"}},{"name":"lp_type","in":"query","description":"LP type filter","required":false,"schema":{"type":["string","null"]}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyLpsSearchResponse"}}}}}}},"/v2/datasets/odyssey/limited-partners/{lp_id}/bio":{"get":{"operationId":"odyssey_lps_bio","summary":"LP bio","description":"Get LP biography and profile (renamed from overview)","tags":["odyssey"],"parameters":[{"name":"lp_id","in":"path","description":"LP entity ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyLpsBioResponse"}}}}}}},"/v2/datasets/odyssey/service-providers/search":{"get":{"operationId":"odyssey_service_providers_search","summary":"Search service providers","description":"Search for service providers such as law firms, accounting firms, and consultants.","tags":["odyssey"],"parameters":[{"name":"q","in":"query","description":"Search query","required":true,"schema":{"type":"string"}},{"name":"provider_type","in":"query","description":"Provider type (law, accounting, consulting)","required":false,"schema":{"type":["string","null"]}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyServiceProvidersSearchResponse"}}}}}}},"/v2/datasets/odyssey/service-providers/{provider_id}/bio":{"get":{"operationId":"odyssey_service_providers_bio","summary":"Provider bio","description":"Get service provider biography and profile (renamed from overview)","tags":["odyssey"],"parameters":[{"name":"provider_id","in":"path","description":"Service provider entity ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponse"}}}}}}},"/v2/datasets/odyssey/service-providers/{provider_id}/companies":{"get":{"operationId":"odyssey_service_providers_companies","summary":"Provider company clients","description":"Get company clients served by this service provider (renamed from clients)","tags":["odyssey"],"parameters":[{"name":"provider_id","in":"path","description":"Service provider entity ID","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyServiceProvidersCompaniesResponse"}}}}}}},"/v2/datasets/odyssey/service-providers/{provider_id}/deals":{"get":{"operationId":"odyssey_service_providers_deals","summary":"Provider deal participation","description":"Get deals where this service provider participated (MINIMAL)","tags":["odyssey"],"parameters":[{"name":"provider_id","in":"path","description":"Service provider entity ID","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyServiceProvidersDealsResponse"}}}}}}},"/v2/datasets/odyssey/service-providers/{provider_id}/investors":{"get":{"operationId":"odyssey_service_providers_investors","summary":"Provider investor clients","description":"Get investors who are clients of this service provider (MINIMAL)","tags":["odyssey"],"parameters":[{"name":"provider_id","in":"path","description":"Service provider entity ID","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyServiceProvidersInvestorsResponse"}}}}}}},"/v2/datasets/odyssey/service-providers/{provider_id}/funds":{"get":{"operationId":"odyssey_service_providers_funds","summary":"Provider fund clients","description":"Get funds who are clients of this service provider (MINIMAL)","tags":["odyssey"],"parameters":[{"name":"provider_id","in":"path","description":"Service provider entity ID","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyServiceProvidersFundsResponse"}}}}}}},"/v2/datasets/odyssey/patents/search":{"get":{"operationId":"odyssey_patents_search","summary":"Search Patents","description":"Search patents by query (assignee, inventor, or keywords).\n\nArgs:\n    q: Search query\n    limit: Maximum results (1-100)\n\nReturns:\n    Patent search results","tags":["odyssey"],"parameters":[{"name":"q","in":"query","description":"Search query (assignee, inventor, or keywords)","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum number of results","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatentSearchResponse"}}}}}}},"/v2/datasets/odyssey/patents/{id}":{"get":{"operationId":"odyssey_patents_get_by_id","summary":"Get Patent By Id","description":"Get patent details by patent number.\n\nArgs:\n    id: Patent number (e.g., \"US10123456B2\")\n\nReturns:\n    Patent details","tags":["odyssey"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatentByIdResponse"}}}}}}},"/v2/datasets/odyssey/patents/{entityId}/file":{"get":{"operationId":"odyssey_patents_get_file","summary":"Get Patent File","description":"Get the document link for a patent by patent number. Returns a redirect to the patent PDF.","tags":["odyssey"],"parameters":[{"name":"entityId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyPatentsGetFileResponse"}}}}}}},"/v2/datasets/odyssey/credit-analysis/news/search":{"get":{"operationId":"odyssey_credit_analysis_news_search","summary":"Search Credit News","description":"Search credit and financial news articles matching a query.","tags":["odyssey"],"parameters":[{"name":"q","in":"query","description":"Search query for financial news","required":true,"schema":{"type":"string"}},{"name":"regions","in":"query","description":"Region filter","required":false,"schema":{"type":["string","null"]}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsSearchResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/datasets/odyssey/credit-analysis/news/recent":{"get":{"operationId":"odyssey_credit_analysis_news_recent","summary":"Get Recent Credit News","description":"Get recent credit and financial news articles.","tags":["odyssey"],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsSearchResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/datasets/odyssey/credit-analysis/news/{newsId}":{"get":{"operationId":"odyssey_credit_analysis_news_detail","summary":"Get News Detail","description":"Get detailed news article by ID.\n\nReturns cached article from a previous search. Articles are cached when\nreturned by /news/search or /news/recent.","tags":["odyssey"],"parameters":[{"name":"newsId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyCreditAnalysisNewsDetailResponse"}}}},"404":{"description":"News article not found","content":{"application/json":{"schema":{"description":"Any type"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/datasets/odyssey/credit-analysis/news/bulk":{"post":{"operationId":"odyssey_credit_analysis_news_bulk","summary":"Bulk News Lookup","description":"Bulk lookup of news articles by query terms.\n\nAccepts a JSON body with list of search queries, returns results for each.","tags":["odyssey"],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditNewsBulkResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/datasets/odyssey/credit-analysis/agreements/search":{"get":{"operationId":"odyssey_credit_analysis_agreements_search","summary":"Search Credit Agreements","description":"Search SEC 8-K filings for credit agreements.\n\nWhen public companies enter material credit facilities, they file the\nagreement as an exhibit to an 8-K. Returns filing dates and companies.","tags":["odyssey"],"parameters":[{"name":"borrower","in":"query","description":"Borrower/company name","required":false,"schema":{"type":["string","null"]}},{"name":"lender","in":"query","description":"Lender/agent name","required":false,"schema":{"type":["string","null"]}},{"name":"date_from","in":"query","description":"Start date (YYYY-MM-DD)","required":false,"schema":{"type":["string","null"]}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyCreditAnalysisAgreementsSearchResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/datasets/odyssey/credit-analysis/agreements/{company}":{"get":{"operationId":"odyssey_credit_analysis_agreement_detail","summary":"Get Agreement Detail","description":"Get the most recent credit agreement filing for a company.\n\nLocates the 8-K filing containing the credit agreement and provides\na link to the full document on SEC EDGAR.","tags":["odyssey"],"parameters":[{"name":"company","in":"path","description":"Company name to find credit agreement for","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyCreditAnalysisAgreementDetailResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/datasets/odyssey/credit-analysis/bdc/search":{"get":{"operationId":"odyssey_credit_analysis_bdc_search","summary":"Search Bdc Portfolios","description":"Search across all indexed BDC portfolios for a borrower, industry, or keyword.\n\nSearches loan-level data from ~50 BDC quarterly filings covering $150B+ in direct loans.\nReturns matching investments with terms (spread, seniority, maturity, fair value).","tags":["odyssey"],"parameters":[{"name":"q","in":"query","description":"Search query — borrower name, industry, or keyword","required":true,"schema":{"type":"string"}},{"name":"seniority","in":"query","description":"Filter by seniority: first_lien, second_lien, unitranche, mezzanine, equity","required":false,"schema":{"type":["string","null"]}},{"name":"non_accrual_only","in":"query","description":"Only return defaulted (non-accrual) investments","required":false,"schema":{"type":"boolean","default":false}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyCreditAnalysisBdcSearchResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/datasets/odyssey/credit-analysis/bdc":{"get":{"operationId":"odyssey_credit_analysis_list_bdcs","summary":"List Bdcs","description":"List all tracked Business Development Companies (BDCs).\n\nBDCs are publicly traded private credit funds that disclose every loan quarterly.\nReturns ticker, name, and SEC CIK for each tracked BDC.","tags":["odyssey"],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyCreditAnalysisListBdcsResponse"}}}}}}},"/v2/datasets/odyssey/credit-analysis/bdc/{ticker}/portfolio":{"get":{"operationId":"odyssey_credit_analysis_bdc_portfolio","summary":"Get Bdc Portfolio","description":"Full Schedule of Investments for a specific BDC.\n\nParsed from the BDC's SEC 10-Q/10-K filing. Each investment includes:\nborrower name, industry, investment type, seniority, coupon, spread,\nreference rate, maturity, principal, fair value, and non-accrual status.","tags":["odyssey"],"parameters":[{"name":"ticker","in":"path","description":"BDC ticker symbol (e.g., ARCC, BXSL, FSK)","required":true,"schema":{"type":"string"}},{"name":"quarter","in":"query","description":"Quarter like '2025-Q1' — defaults to latest filing","required":false,"schema":{"type":["string","null"]}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":1000,"default":500}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyCreditAnalysisBdcPortfolioResponse"}}}},"404":{"description":"BDC or filing not found","content":{"application/json":{"schema":{"description":"Any type"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/datasets/odyssey/credit-analysis/bdc/{ticker}/stats":{"get":{"operationId":"odyssey_credit_analysis_bdc_stats","summary":"Get Bdc Stats","description":"Aggregate portfolio statistics for a BDC.\n\nReturns weighted average spread, non-accrual rate, seniority breakdown,\ntop industries, and total portfolio fair value.","tags":["odyssey"],"parameters":[{"name":"ticker","in":"path","description":"BDC ticker symbol","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyCreditAnalysisBdcStatsResponse"}}}},"404":{"description":"BDC not found","content":{"application/json":{"schema":{"description":"Any type"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/datasets/odyssey/credit-analysis/borrowers/{name}":{"get":{"operationId":"odyssey_credit_analysis_borrower_lookup","summary":"Lookup Borrower","description":"Cross-BDC borrower lookup — find a company across all BDC portfolios.\n\nReturns every BDC that holds this borrower's debt, with position sizes,\nspreads, and valuations. Reveals syndication patterns and allows\ncross-lender credit deterioration monitoring.","tags":["odyssey"],"parameters":[{"name":"name","in":"path","description":"Borrower/company name to search across all BDC portfolios","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyCreditAnalysisBorrowerLookupResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/datasets/odyssey/credit-analysis/funds/search":{"get":{"operationId":"odyssey_credit_analysis_funds_search","summary":"Search Credit Funds","description":"Search private credit funds via SEC Form D filings.\n\nForm D is filed when private funds raise capital under Regulation D.\nCovers fund formations, managers, and capital raised.","tags":["odyssey"],"parameters":[{"name":"q","in":"query","description":"Fund name, manager name, or keyword","required":true,"schema":{"type":"string"}},{"name":"strategy","in":"query","description":"Filter by strategy: direct_lending, mezzanine, distressed, venture_lending, clo","required":false,"schema":{"type":["string","null"]}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyCreditAnalysisFundsSearchResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/datasets/odyssey/credit-analysis/funds/formations":{"get":{"operationId":"odyssey_credit_analysis_fund_formations","summary":"Get Fund Formations","description":"Recent private credit fund formations from SEC Form D filings.\n\nShows new funds launching in the private credit space.","tags":["odyssey"],"parameters":[{"name":"days_back","in":"query","description":"Look back period in days","required":false,"schema":{"type":"integer","minimum":1,"maximum":365,"default":90}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyCreditAnalysisFundFormationsResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/datasets/odyssey/credit-analysis/funds/managers":{"get":{"operationId":"odyssey_credit_analysis_list_managers","summary":"List Credit Managers","description":"List known private credit fund managers with their strategies.","tags":["odyssey"],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyCreditAnalysisListManagersResponse"}}}}}}},"/v2/datasets/odyssey/credit-analysis/funds/managers/{name}":{"get":{"operationId":"odyssey_credit_analysis_manager_detail","summary":"Get Manager Detail","description":"Detailed information about a private credit fund manager.\n\nCombines SEC filing data with known manager intelligence.\nReturns filing history, fund count, strategy, and recent Form D filings.","tags":["odyssey"],"parameters":[{"name":"name","in":"path","description":"Manager name (e.g., 'Ares Management')","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyCreditAnalysisManagerDetailResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/datasets/odyssey/credit-analysis/market/overview":{"get":{"operationId":"odyssey_credit_analysis_market_overview","summary":"Get Market Overview","description":"Comprehensive private credit market snapshot from free public sources.\n\nReturns:\n- **Lending standards** (SLOOS): Net % of banks tightening C&I loan standards\n- **Credit spreads**: ICE BofA High Yield, BBB, BB, CCC spreads\n- **Bank lending**: Total C&I loans outstanding\n- **Interest rates**: 10Y Treasury, SOFR\n- **Financial conditions**: St. Louis Financial Stress Index, Chicago NFCI\n\nData sourced from Federal Reserve (FRED API), updated daily/weekly/quarterly.","tags":["odyssey"],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketOverviewResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/datasets/odyssey/credit-analysis/market/spreads":{"get":{"operationId":"odyssey_credit_analysis_market_spreads","summary":"Get Credit Spreads","description":"Current and historical credit spread data.\n\nReturns ICE BofA High Yield, BBB, BB, and CCC spreads with historical trend.\nUseful for monitoring private credit pricing environment.","tags":["odyssey"],"parameters":[{"name":"history","in":"query","description":"Number of historical data points","required":false,"schema":{"type":"integer","minimum":1,"maximum":365,"default":30}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketSpreadsResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/datasets/odyssey/credit-analysis/market/lending-standards":{"get":{"operationId":"odyssey_credit_analysis_lending_standards","summary":"Get Lending Standards","description":"Federal Reserve Senior Loan Officer Opinion Survey (SLOOS) data.\n\nShows net % of banks tightening or easing C&I loan standards and widening spreads.\nLeading indicator for private credit market conditions.","tags":["odyssey"],"parameters":[{"name":"history","in":"query","description":"Number of quarterly data points","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyCreditAnalysisLendingStandardsResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/datasets/odyssey/credit-analysis/nport/search":{"get":{"operationId":"odyssey_credit_analysis_nport_search","summary":"Search Nport Holdings","description":"Search N-PORT filings for private credit holdings.\n\nSearches across interval fund and registered fund filings for loan holdings\nmatching the query.","tags":["odyssey"],"parameters":[{"name":"q","in":"query","description":"Borrower name or keyword to search in N-PORT filings","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyCreditAnalysisNportSearchResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/datasets/odyssey/credit-analysis/nport/funds":{"get":{"operationId":"odyssey_credit_analysis_nport_funds","summary":"List Nport Funds","description":"List tracked private credit interval funds that file N-PORT.\n\nN-PORT filings contain loan-by-loan holdings with issuer, principal,\nfair value, coupon, maturity, and liquidity classification.","tags":["odyssey"],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyCreditAnalysisNportFundsResponse"}}}}}}},"/v2/datasets/odyssey/credit-analysis/nport/{ticker}/filings":{"get":{"operationId":"odyssey_credit_analysis_nport_fund_filings","summary":"Get Nport Fund Filings","description":"Get N-PORT filing list for a specific private credit interval fund.","tags":["odyssey"],"parameters":[{"name":"ticker","in":"path","description":"Fund ticker (e.g., CCLFX, AFT)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"description":"Any type"}}}},"404":{"description":"Fund not found","content":{"application/json":{"schema":{"description":"Any type"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/datasets/odyssey/credit-analysis/relationships/search":{"get":{"operationId":"odyssey_credit_analysis_relationships_search","summary":"Search Credit Relationships","description":"Search lender-borrower relationships across BDC portfolios and UCC filing data.\n\nProvide either `lender` (to find their borrowers) or `borrower` (to find their lenders).\nCross-references BDC SEC filings with state UCC portal links for deeper research.","tags":["odyssey"],"parameters":[{"name":"lender","in":"query","description":"Lender name — find their borrowers","required":false,"schema":{"type":["string","null"]}},{"name":"borrower","in":"query","description":"Borrower name — find their lenders","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyCreditAnalysisRelationshipsSearchResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/datasets/odyssey/credit-analysis/relationships/portals":{"get":{"operationId":"odyssey_credit_analysis_ucc_portals","summary":"Get Ucc Portals","description":"Get UCC filing search portal information.\n\nReturns URLs for free state-level UCC search portals and a list of\nknown major private credit lenders to search for.","tags":["odyssey"],"parameters":[{"name":"state","in":"query","description":"State code (e.g., CA, NY). Omit for all states.","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponse"}}}}}}},"/v2/datasets/odyssey/credit-analysis/sba/search":{"get":{"operationId":"odyssey_credit_analysis_sba_search","summary":"Search Sba Loans","description":"Search SBA 7(a) loan data.\n\nContains loan-level data with borrower, lender, terms, and performance.\nCovers FY2020-present (~50K most recent loans indexed).","tags":["odyssey"],"parameters":[{"name":"borrower","in":"query","description":"Borrower name (partial match)","required":false,"schema":{"type":["string","null"]}},{"name":"lender","in":"query","description":"Bank/lender name (partial match)","required":false,"schema":{"type":["string","null"]}},{"name":"state","in":"query","description":"State code (e.g., CA, NY, TX)","required":false,"schema":{"type":["string","null"]}},{"name":"naics","in":"query","description":"NAICS code prefix (e.g., 5112 for software)","required":false,"schema":{"type":["string","null"]}},{"name":"status","in":"query","description":"Loan status: CHGOFF (charged off), PIF (paid in full)","required":false,"schema":{"type":["string","null"]}},{"name":"min_amount","in":"query","description":"Minimum gross approval amount ($)","required":false,"schema":{"type":["number","null"],"format":"double"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyCreditAnalysisSbaSearchResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/datasets/odyssey/credit-analysis/sba/stats":{"get":{"operationId":"odyssey_credit_analysis_sba_stats","summary":"Get Sba Stats","description":"Aggregate SBA 7(a) loan statistics.\n\nReturns default rates, average loan size, top states, and top industries.","tags":["odyssey"],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyCreditAnalysisSbaStatsResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/v2/datasets/odyssey/credit-analysis/ledger/divergence":{"get":{"operationId":"odyssey_borrower_ledger_divergence","summary":"Borrower Ledger Divergence","description":"Cross-lender mark-divergence alerts for a period, widest spread first —\nthe sellable early-distress signal. Cursor-paged feed; each page is a bounded\nQuery over pre-sorted decile partitions (no read-time sort, no Scan).","tags":["odyssey"],"parameters":[{"name":"period","in":"query","description":"Filing period end YYYY-MM-DD","required":true,"schema":{"type":"string"}},{"name":"min_confidence","in":"query","description":"medium (2 lenders) or high (>=3)","required":false,"schema":{"type":["string","null"],"default":"medium"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"cursor","in":"query","description":"Opaque pagination cursor","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DivergenceFeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/datasets/odyssey/credit-analysis/ledger/borrowers/{credit_id}":{"get":{"operationId":"odyssey_borrower_ledger_profile","summary":"Borrower Ledger Profile","description":"Borrower profile — a single precomputed GetItem (lenders, quarters, latest FV).","tags":["odyssey"],"parameters":[{"name":"credit_id","in":"path","description":"Borrower credit id (cred_...)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BorrowerProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/datasets/odyssey/credit-analysis/ledger/borrowers/{credit_id}/marks":{"get":{"operationId":"odyssey_borrower_ledger_marks","summary":"Borrower Ledger Marks","description":"Cross-lender fair-value marks for one borrower (optionally at a period).\n\nOne DynamoDB Query on the borrower's partition. Each mark carries its SEC\ncitation. `mark_pct` is fair value as a percent of principal.","tags":["odyssey"],"parameters":[{"name":"credit_id","in":"path","description":"Borrower credit id (cred_...)","required":true,"schema":{"type":"string"}},{"name":"as_of","in":"query","description":"Period end YYYY-MM-DD; omit for all periods","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BorrowerMarksResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/datasets/odyssey/credit-analysis/ledger/borrowers/{credit_id}/trend":{"get":{"operationId":"odyssey_borrower_ledger_trend","summary":"Borrower Ledger Trend","description":"Multi-quarter mark/spread series for the borrower — a single precomputed\nGetItem. Surfaces widening-spread (early-distress) trends over time.","tags":["odyssey"],"parameters":[{"name":"credit_id","in":"path","description":"Borrower credit id (cred_...)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BorrowerTrendResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/datasets/odyssey/credit-analysis/ledger/lenders/{cik}/portfolio":{"get":{"operationId":"odyssey_borrower_ledger_lender_portfolio","summary":"Borrower Ledger Lender Portfolio","description":"A lender's marked positions for a period, lowest mark (most distressed)\nfirst. One Query on the lender-index GSI; the thresholds are filters.","tags":["odyssey"],"parameters":[{"name":"cik","in":"path","description":"SEC CIK of the BDC lender","required":true,"schema":{"type":"integer"}},{"name":"period","in":"query","description":"Filing period end YYYY-MM-DD","required":true,"schema":{"type":"string"}},{"name":"max_mark_pct","in":"query","description":"Only positions marked below this % (e.g. 90)","required":false,"schema":{"type":["number","null"],"format":"double"}},{"name":"min_principal_usd","in":"query","description":"Only positions with principal >= this","required":false,"schema":{"type":["number","null"],"format":"double"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LenderPortfolioResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/datasets/odyssey/fundamentals/sandbox":{"get":{"operationId":"odyssey_fundamentals_sandbox","summary":"Get Sandbox Entities","description":"Get pre-loaded sample entities for testing.\n\nReturns a list of sample companies with entity IDs that can be used for testing.","tags":["odyssey"],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyFundamentalsSandboxResponse"}}}}}}},"/v2/datasets/odyssey/fundamentals/lookup-tables":{"get":{"operationId":"odyssey_fundamentals_lookup_tables","summary":"Get Lookup Tables","description":"Get list of available lookup tables.\n\nReturns metadata about available lookup tables (industries, sectors, etc.)","tags":["odyssey"],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyFundamentalsLookupTablesResponse"}}}}}}},"/v2/datasets/odyssey/fundamentals/lookup-tables/{tableId}":{"get":{"operationId":"odyssey_fundamentals_lookup_table_values","summary":"Get Lookup Table Values","description":"Get values from a specific lookup table.\n\nReturns the rows of data for the specified table.","tags":["odyssey"],"parameters":[{"name":"tableId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OdysseyFundamentalsLookupTableValuesResponse"}}}}}}},"/v2/datasets/scientific/sources/search":{"get":{"operationId":"datasets_search_scientific_sources","summary":"Search Scientific Sources","description":"Search supported scientific sources and return scrapeable source URLs. Use datasets to scope search to one or more dataset keys. Results are returned in the standard dataset search response shape.","tags":["datasets"],"parameters":[{"name":"q","in":"query","description":"Search query.","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum number of sources to return.","required":false,"schema":{"type":"integer","default":10}},{"name":"datasets","in":"query","description":"Dataset scope. Supports repeated query params and comma-separated values.","required":false,"schema":{"oneOf":[{"$ref":"#/components/schemas/V2DatasetsScientificSourcesSearchGetParametersDatasetsSchema"},{"type":"null"}]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSearchResponse"}}}}}}},"/v2/datasets/scientific/sources/scrape":{"get":{"operationId":"datasets_scrape_scientific_source","summary":"Scrape Scientific Source","description":"Scrape a returned scientific source URL and return article content that client application code can index as a file or text document.","tags":["datasets"],"parameters":[{"name":"url","in":"query","description":"Source URL returned by scientific source search.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetArticleResponse"}}}}}}},"/v2/datasets/scientific/medical/ask":{"post":{"operationId":"datasets_searchMedicalPapers","summary":"Search Medical Papers","description":"Search medical and biomedical papers with a natural-language question.\nFederates PubMed, PMC full-text, ClinicalTrials.gov, and Semantic Scholar,\nthen synthesizes a cited answer.\n\nImplementation: invokes the `medical-agent` Lambda (TypeScript, Mastra,\nClaude Sonnet). Streaming responses flow through the `captain-stream` S2\nbasin — identical pattern to `/v2/collections/{name}/query`.","tags":["datasets"],"responses":{"200":{"description":"Synthesized answer with cited sources. Returns JSON by default; when `stream=true` the response is `text/event-stream` with `tool.start`, `tool.end`, `text.delta`, and `run.end` events.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScientificAskResponse"}}}},"400":{"description":"Malformed body or input validation error.","content":{"application/json":{"schema":{"description":"Any type"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"description":"Any type"}}}},"403":{"description":"API key does not belong to the organization, datasets access disabled, or trial/billing limits exceeded.","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScientificAskRequest"}}}}}},"/v2/datasets/{dataset}/search":{"get":{"operationId":"datasets_search_dataset","summary":"Search Dataset","description":"Search for articles within a news dataset.\n\nPerforms search constrained to the dataset's domain.\n\n**Supported Datasets:**\n- `nytimes`: New York Times (nytimes.com)\n- `washpost`: Washington Post (washingtonpost.com)\n- `sfstandard`: SF Standard (sfstandard.com)\n- `sacbee`: Sacramento Bee (sacbee.com)\n- `sfchronicle`: San Francisco Chronicle (sfchronicle.com)\n- `newyorker`: The New Yorker (newyorker.com)\n- `theatlantic`: The Atlantic (theatlantic.com)\n- `sjmercury`: San Jose Mercury News (mercurynews.com)\n- `latimes`: Los Angeles Times (latimes.com)\n- `wired`: WIRED (wired.com)\n- `scientificamerican`: Scientific American (scientificamerican.com)\n\n**Headers:**\n- `Authorization`: Bearer {api_key} - Captain API key for authentication\n- `X-Organization-ID`: Organization UUID\n\n**Query Parameters:**\n- `q`: Search query (required)\n- `limit`: Maximum results to return (default: 10, max: 100)\n\n**Returns:**\nList of search results with title, URL, snippet, and date.\n\n**Example:**\n```\nGET /v2/datasets/nytimes/search?q=artificial+intelligence&limit=5\n```","tags":["datasets"],"parameters":[{"name":"dataset","in":"path","description":"The news dataset to search","required":true,"schema":{"type":"string"}},{"name":"q","in":"query","description":"Search query","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum number of results to return","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10}},{"name":"author","in":"query","description":"Filter by author/byline name (appended as quoted phrase to search)","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetSearchResponse"}}}},"400":{"description":"Invalid dataset or request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"403":{"description":"API key does not belong to organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"502":{"description":"Search service error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"503":{"description":"Search service not configured","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"504":{"description":"Search request timed out","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}}}}},"/v2/datasets/{dataset}/{url}":{"get":{"operationId":"datasets_get_dataset_article","summary":"Get Dataset Article","description":"Get a full article from a supported news dataset.\n\nContact your Account Executive for available datasets.\n\n**Headers:**\n- `Authorization`: Bearer {api_key} - Captain API key for authentication\n- `X-Organization-ID`: Organization UUID\n\n**URL Path:**\n- `dataset`: The dataset name\n- `url`: Full article URL appended to the path\n\n**Returns:**\nArticle data including title, author, date, and full content in markdown format.\n\n**Example:**\n```\nGET /v2/datasets/latimes/https://www.latimes.com/example/news_example.html\n```","tags":["datasets"],"parameters":[{"name":"dataset","in":"path","description":"The news dataset to get articles from","required":true,"schema":{"type":"string"}},{"name":"url","in":"path","description":"Full URL of the article to get (URL-encoded)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetArticleResponse"}}}},"400":{"description":"Invalid dataset or URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"403":{"description":"API key does not belong to organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"503":{"description":"Dataset fetcher not available","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}}}}},"/v2/datasets/batch-search":{"post":{"operationId":"datasets_batch_search_datasets","summary":"Batch Search Datasets","description":"Search for articles across multiple news datasets in a single request.\n\nSearches the same query across all specified datasets simultaneously with\ncombined `site:` operators for efficient multi-source search.\n\n**Supported Datasets:**\nnytimes, washpost, sfstandard, sacbee, sfchronicle, newyorker, theatlantic, sjmercury, latimes\n\n**Example:**\n```json\nPOST /v2/datasets/batch-search\n{\n    \"q\": \"artificial intelligence regulation\",\n    \"datasets\": [\"nytimes\", \"washpost\", \"theatlantic\"],\n    \"limit\": 20\n}\n```\n\n**Headers:**\n- `Authorization`: Bearer {api_key}\n- `X-Organization-ID`: Organization UUID","tags":["datasets"],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSearchResponse"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"403":{"description":"API key does not belong to organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}},"503":{"description":"Search service not configured","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseV2"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSearchRequest"}}}}}},"/feedback":{"post":{"operationId":"feedback_submit_feedback","summary":"Submit Feedback","description":"Submit feedback about the Captain API or docs as plain text.","tags":["feedback"],"parameters":[{"name":"agent","in":"query","description":"Optional agent/tool name (e.g. 'claude-code').","required":false,"schema":{"type":["string","null"]}},{"name":"client_version","in":"query","description":"Optional client or SDK version.","required":false,"schema":{"type":["string","null"]}},{"name":"source","in":"query","description":"Optional source doc/page the feedback is about.","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"description":"Any type"}}}}}}}},"tags":[{"name":"file-search"},{"name":"query"},{"name":"queries"},{"name":"collections"},{"name":"sync"},{"name":"indexing"},{"name":"jobs"},{"name":"evals"},{"name":"odyssey"},{"name":"datasets"},{"name":"feedback"}],"servers":[{"url":"https://api.captain.dev","description":"Production API"}],"components":{"schemas":{"QueryRequestV3Filter":{"type":"object","properties":{},"description":"Document metadata filter expression. Keys are top-level field names, never nested under `metadata` or `custom_metadata`. A bare value is an implicit `$eq` (`{\"policy_area\": \"payments\"}`). Supported operators: `$eq` (=), `$ne` (≠), `$gt` (>), `$gte` (≥), `$lt` (<), `$lte` (≤), `$in`, `$nin`, and the logical `$and` and `$or`. `$in` and `$nin` take a list; every other operator takes a scalar. Max nesting depth is 10. To scope a query to specific documents, filter on `file_id` with `$in`. See the [Advanced Querying guide](/guides/advanced-querying) for more.","title":"QueryRequestV3Filter"},"RerankOptions":{"type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Whether to rerank. Sending the object without this field means enabled — the object form exists to tune reranking."},"candidate_limit":{"type":["integer","null"],"minimum":1,"maximum":200,"description":"How many fused retrieval candidates are fetched and reranked before the top `limit` results are returned. Defaults to `limit` x 3 (the measured configuration). Must be >= `limit`; capped at 200. Larger pools can lift recall on corpora with many near-duplicate documents, at the cost of rerank latency."},"model":{"type":["string","null"],"description":"Reranker model. Voyage cross-encoders: `voyage-rerank-2.5` (default) and `voyage-rerank-3` (aliases `rerank-2.5`, `rerank-3`). Gemini LLM rerankers: `gemini-2.5-flash` and `gemini-3.8-flash` — higher quality ceiling on complex queries, higher latency; best with small candidate pools. The family aliases `voyage` and `gemini` resolve to each family's default. Unknown values return a 400 listing the allowed set."}},"description":"Object form of the `rerank` parameter. The boolean form stays valid: `true` is equivalent to sending this object with every field at its default.","title":"RerankOptions"},"QueryRequestV3Rerank":{"oneOf":[{"type":"boolean"},{"$ref":"#/components/schemas/RerankOptions"}],"description":"Rerank retrieved candidates before returning the top results (adds roughly 200 ms). Boolean form uses the defaults: voyage-rerank-2.5 over a pool of `limit` x 3 candidates. Object form tunes reranking — see RerankOptions. Multimodal collections default to reranking; an explicit `false` (or `{\"enabled\": false}`) opts out and returns a warning noting reduced cross-modal ranking quality.","title":"QueryRequestV3Rerank"},"QueryIncludeV3":{"type":"object","properties":{"document":{"type":"boolean","default":true,"description":"Include the parent document object for each returned chunk."},"metadata":{"type":"boolean","default":true,"description":"Include Captain-generated retrieval metadata and application-supplied chunk metadata."},"regions":{"type":"boolean","default":false,"description":"Include extracted layout regions, including bounding boxes when available."},"relations":{"type":"boolean","default":false,"description":"Include graph relations connected to each returned chunk."},"related_chunks":{"type":"boolean","default":false,"description":"Include linked chunks for returned relations."},"neighboring_chunks":{"type":"boolean","default":false,"description":"Include the chunk immediately before and after each result in the source file."},"document_metadata":{"type":"boolean","default":false},"archived":{"type":"boolean","default":false,"description":"Include chunks archived by a sync `archive` deletion policy. Archived content is excluded from search by default; set true to surface it."}},"description":"Optional expansions for v3 query results. Leave expensive context off unless the caller needs it.","title":"QueryIncludeV3"},"QueryRequestV3RelationDirection":{"type":"string","enum":["outgoing","incoming","both"],"default":"outgoing","description":"Which graph edge direction to include for relation context.","title":"QueryRequestV3RelationDirection"},"QueryRequestV3ExcludeChunkTypesItems":{"type":"string","enum":["body","table","heading","page_header","page_footer","footnote","figure"],"title":"QueryRequestV3ExcludeChunkTypesItems"},"BoostClauseV3Eq":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"}],"description":"Requires `field`. Boost chunks whose `field` equals this value. Strings, numbers, and booleans are supported. A list-valued field matches when any element equals it. Use `in` instead for several values.","title":"BoostClauseV3Eq"},"BoostClauseV3InItems":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"}],"title":"BoostClauseV3InItems"},"BoostClauseV3":{"type":"object","properties":{"field":{"type":["string","null"],"minLength":1,"maxLength":256,"description":"Required with `eq` or `in`; omit it for a `chunk_ids` rule. One of your own custom_metadata keys, the same keys `filter` accepts. Anything filterable is boostable, with no re-indexing. Captain's internal attributes (file_id, job_id, chunk_index and similar) return a 400."},"eq":{"oneOf":[{"$ref":"#/components/schemas/BoostClauseV3Eq"},{"type":"null"}],"description":"Requires `field`. Boost chunks whose `field` equals this value. Strings, numbers, and booleans are supported. A list-valued field matches when any element equals it. Use `in` instead for several values."},"in":{"type":["array","null"],"items":{"$ref":"#/components/schemas/BoostClauseV3InItems"},"description":"Requires `field`. Boost chunks whose `field` matches any of these values, up to 50. Use it for one key with several acceptable values, and for list-valued metadata."},"chunk_ids":{"type":["array","null"],"items":{"type":"string"},"description":"Use instead of `field`/`eq`/`in` to boost specific chunks, up to 100. Accepts a `chunk_id` from a previous response, or `document_id:chunk_index`, which keeps resolving after the document is re-indexed. Use it to keep a follow-up question anchored to passages an earlier answer cited."},"weight":{"type":"number","format":"double","minimum":0.2,"maximum":5,"description":"Required. Multiplier on the matching chunk's retrieval score, 0.2 to 5.0. The rule's retrieval pass is what makes a chunk appear; the weight decides where it lands. 1.5 to 2.0 is a good default and is usually enough to lift a tagged chunk to the top. Use 3.0 to 5.0 when boosted chunks compete with each other, or when a rule matches many chunks. Below 1.0 demotes, and only reorders chunks the query already found. When several rules match the same chunk their weights multiply, capped at 5.0."},"reserve":{"type":"integer","minimum":0,"default":0,"description":"With reranking on, guarantee this many of this rule's chunks a place on the page, chosen by reranker order. Reranking runs after boosting and can otherwise drop a boosted chunk whose text does not resemble the query. 0 (default) leaves the reranker's judgement in charge. The sum across all boost rules cannot exceed `limit`."}},"required":["weight"],"description":"One boost rule.\n\nA boost rule is one entry in the request's `boost` array: some metadata to look for, and how much to favour the chunks carrying it. Each rule is exactly one of three shapes, and anything else returns a 422:\n\n- `{ \"field\": ..., \"eq\": ..., \"weight\": ... }` - one metadata value\n- `{ \"field\": ..., \"in\": [...], \"weight\": ... }` - any of several values, and list-valued metadata\n- `{ \"chunk_ids\": [...], \"weight\": ... }` - specific chunks, by id\n\n`weight` is always required. The other properties are marked optional only because which ones apply depends on the shape: `field` is required with `eq` or `in`, and unused by a `chunk_ids` rule.","title":"BoostClauseV3"},"QueryRequestV3":{"type":"object","properties":{"query":{"type":"string","description":"Natural-language search query."},"limit":{"type":"integer","minimum":1,"maximum":100,"default":10,"description":"Maximum number of ranked chunks to return."},"filter":{"oneOf":[{"$ref":"#/components/schemas/QueryRequestV3Filter"},{"type":"null"}],"description":"Document metadata filter expression. Keys are top-level field names, never nested under `metadata` or `custom_metadata`. A bare value is an implicit `$eq` (`{\"policy_area\": \"payments\"}`). Supported operators: `$eq` (=), `$ne` (≠), `$gt` (>), `$gte` (≥), `$lt` (<), `$lte` (≤), `$in`, `$nin`, and the logical `$and` and `$or`. `$in` and `$nin` take a list; every other operator takes a scalar. Max nesting depth is 10. To scope a query to specific documents, filter on `file_id` with `$in`. See the [Advanced Querying guide](/guides/advanced-querying) for more."},"rerank":{"$ref":"#/components/schemas/QueryRequestV3Rerank","default":false,"description":"Rerank retrieved candidates before returning the top results (adds roughly 200 ms). Boolean form uses the defaults: voyage-rerank-2.5 over a pool of `limit` x 3 candidates. Object form tunes reranking — see RerankOptions. Multimodal collections default to reranking; an explicit `false` (or `{\"enabled\": false}`) opts out and returns a warning noting reduced cross-modal ranking quality."},"include":{"$ref":"#/components/schemas/QueryIncludeV3","description":"Controls which optional result objects are included in the response."},"relation_types":{"type":["array","null"],"items":{"type":"string"},"description":"Optional relation type filter when `include.relations` or `include.related_chunks` is enabled."},"relation_direction":{"$ref":"#/components/schemas/QueryRequestV3RelationDirection","default":"outgoing","description":"Which graph edge direction to include for relation context."},"exclude_chunk_types":{"type":["array","null"],"items":{"$ref":"#/components/schemas/QueryRequestV3ExcludeChunkTypesItems"},"description":"Layout roles to drop from results: body, table, heading, page_header, page_footer, footnote, figure. Useful for removing repeated page furniture such as running headers and footnotes. Applied during retrieval, before reranking, so excluded chunks never occupy a result slot. Chunks with no layout label always pass. Unknown values return a 400."},"boost":{"type":["array","null"],"items":{"$ref":"#/components/schemas/BoostClauseV3"},"description":"Optional metadata-based ranking: a list of up to 10 boost rules, each naming some of your own custom_metadata and how much to favour the chunks carrying it. Use it when a chunk is the right answer but does not match the query's wording, for example one a reviewer tagged as the answer to this question, or one your application already cited earlier in a conversation. Each rule both retrieves chunks carrying that metadata and multiplies their retrieval score by `weight`. With reranking on the reranker still decides the final order unless a rule sets `reserve`. Omit the field entirely and retrieval is unchanged. See the Advanced Search guide for choosing a weight."},"semantic_ratio":{"type":"number","format":"double","minimum":0,"maximum":1,"default":0.5,"description":"Balance between semantic and keyword retrieval. Captain searches both ways at once: keyword (sparse, BM25) matches the words in the query, semantic (dense vector) matches its meaning. 0.0 is keyword only, 1.0 is semantic only, and 0.5 (the default) weighs them equally. Lower it for corpora full of exact terms such as part numbers or error codes; raise it when callers phrase questions in their own words. Between the endpoints both searches run, so a result found only by the down-weighted side still appears, just lower. The endpoints skip the other search entirely: 0.0 also skips embedding the query, making it the fastest option, though queries using `boost` and collections holding images, video, or audio keep vector search running. See the Advanced Querying guide for more."},"max_chunks_per_document":{"type":["integer","null"],"minimum":1,"maximum":100,"description":"Cap on how many chunks any single document may occupy in `results`. Ranking is unchanged: the same ranked chunks come back, minus a document's surplus beyond the cap, backfilled with the next best chunks from other documents so `limit` results still come back whenever the ranked pool has them. The cap is applied inside retrieval itself, so the candidate pool spans many documents rather than being thinned after the fact. Omitted (the default) applies no cap. The two numbers compose: `limit = N x K` returns up to N documents with up to K chunks each, in document-rank order, and each result's `document` object (`include.document`, on by default) carries the document's id, filename, and source. For the five most relevant documents, send `limit: 5` with `max_chunks_per_document: 1`."}},"required":["query"],"description":"Request body for v3 File Search.","title":"QueryRequestV3"},"FileSearchResultV3Modality":{"type":"string","enum":["text","pdf","document","image","audio","video","spreadsheet","unknown"],"default":"unknown","description":"Indexed content type that matched the query.","title":"FileSearchResultV3Modality"},"FileSearchResultV3MatchSourcesItems":{"type":"string","enum":["content_embedding","transcript","ocr","table","metadata","summary","keyword"],"title":"FileSearchResultV3MatchSourcesItems"},"FileSearchSourceV3":{"type":"object","properties":{"type":{"type":["string","null"],"description":"Source kind, such as uploaded file, cloud object, URL, or Captain-managed file."},"uri":{"type":["string","null"],"description":"Original file URI or Captain-managed URI."},"mime_type":{"type":["string","null"],"description":"MIME type when known."}},"description":"Original source information for an indexed file.","title":"FileSearchSourceV3"},"FileSearchDocumentV3":{"type":"object","properties":{"id":{"type":["string","null"],"description":"Document identifier."},"filename":{"type":["string","null"],"description":"Original or indexed filename."},"source":{"oneOf":[{"$ref":"#/components/schemas/FileSearchSourceV3"},{"type":"null"}],"description":"Original source location and MIME type for the document."},"custom_metadata":{"type":["object","null"],"additionalProperties":{"description":"Any type"}}},"description":"Parent document for a returned chunk.","title":"FileSearchDocumentV3"},"FileSearchLocationFromV3":{"type":"object","properties":{"page_start":{"type":["integer","null"]},"page_end":{"type":["integer","null"]},"chunk_index":{"type":["integer","null"]},"parent_chunk_index":{"type":["integer","null"]},"start_seconds":{"type":["number","null"],"format":"double"},"end_seconds":{"type":["number","null"],"format":"double"},"sheet_name":{"type":["string","null"]},"row_start":{"type":["integer","null"]},"row_end":{"type":["integer","null"]},"col_start":{"type":["integer","null"]},"col_end":{"type":["integer","null"]}},"title":"FileSearchLocationFromV3"},"FileSearchMediaV3":{"type":"object","properties":{"transcript":{"type":["string","null"],"description":"Transcript text associated with the returned media segment."}},"description":"Media-specific context for audio and video chunks.","title":"FileSearchMediaV3"},"FileSearchRegionFromV3":{"type":"object","properties":{"type":{"type":["string","null"],"description":"Region category, such as `text`, `title`, `section_header`, `key_value`, `table`, `figure`, `chart`, or `image`. Regions of type `figure`, `chart`, or `image` also carry a cropped `image_url` (a visual citation)."},"text":{"type":["string","null"]},"page":{"type":["integer","null"]},"bbox":{"type":["object","null"],"additionalProperties":{"type":"number","format":"double"}},"confidence":{"type":["string","null"]},"image_url":{"type":["string","null"],"description":"Short-lived presigned URL to a cropped image of the region (a visual citation), returned for `figure`, `chart`, and `image` regions when `include.regions` is true. Null for text regions and for documents indexed before figure cropping was enabled. Fetch promptly — the link expires within minutes."},"description":{"type":["string","null"]}},"title":"FileSearchRegionFromV3"},"FileSearchResultV3Metadata":{"type":"object","properties":{},"description":"Captain-generated retrieval, ranking, source location, and indexed content metadata.","title":"FileSearchResultV3Metadata"},"FileSearchResultV3CustomMetadata":{"type":"object","properties":{},"description":"Application-supplied chunk metadata from indexing or chunk metadata update endpoints.","title":"FileSearchResultV3CustomMetadata"},"ChunkRelationFromV3TargetStatus":{"type":"string","enum":["found","missing","unknown"],"default":"unknown","title":"ChunkRelationFromV3TargetStatus"},"ChunkRelationFromV3Metadata":{"type":"object","properties":{},"title":"ChunkRelationFromV3Metadata"},"ChunkRelationFromV3":{"type":"object","properties":{"relation_id":{"type":"string"},"source_chunk_id":{"type":"string"},"target_chunk_id":{"type":"string"},"target_document_id":{"type":["string","null"]},"target_status":{"$ref":"#/components/schemas/ChunkRelationFromV3TargetStatus","default":"unknown"},"relation_type":{"type":"string"},"metadata":{"$ref":"#/components/schemas/ChunkRelationFromV3Metadata"},"created_at":{"type":["string","null"]},"updated_at":{"type":["string","null"]}},"required":["relation_id","source_chunk_id","target_chunk_id","relation_type"],"title":"ChunkRelationFromV3"},"RelatedChunkV3Metadata":{"type":"object","properties":{},"description":"Metadata associated with the related chunk.","title":"RelatedChunkV3Metadata"},"RelatedChunkV3ChunkType":{"type":"string","enum":["body","table","heading","page_header","page_footer","footnote","figure"],"description":"Layout role of this chunk, classified from the parser's block structure at indexing time: body, table, heading, page_header, page_footer, footnote, or figure. Null when the chunk has no label: content indexed before chunk types shipped, plain-text and media content, or regions the parser returned without block structure. Treat unknown future values as additive. Present on related and neighboring chunks as well.","title":"RelatedChunkV3ChunkType"},"RelatedChunkV3":{"type":"object","properties":{"chunk_id":{"type":"string","description":"Related chunk identifier."},"document_id":{"type":["string","null"],"description":"Parent document identifier for the related chunk."},"text":{"type":["string","null"],"description":"Related chunk text when included."},"location":{"oneOf":[{"$ref":"#/components/schemas/FileSearchLocationFromV3"},{"type":"null"}],"description":"Source position for the related chunk."},"metadata":{"oneOf":[{"$ref":"#/components/schemas/RelatedChunkV3Metadata"},{"type":"null"}],"description":"Metadata associated with the related chunk."},"chunk_type":{"oneOf":[{"$ref":"#/components/schemas/RelatedChunkV3ChunkType"},{"type":"null"}],"description":"Layout role of this chunk, classified from the parser's block structure at indexing time: body, table, heading, page_header, page_footer, footnote, or figure. Null when the chunk has no label: content indexed before chunk types shipped, plain-text and media content, or regions the parser returned without block structure. Treat unknown future values as additive. Present on related and neighboring chunks as well."}},"required":["chunk_id"],"description":"Chunk linked to a search result through a requested relation.","title":"RelatedChunkV3"},"ChunkNeighborsV3":{"type":"object","properties":{"prev":{"oneOf":[{"$ref":"#/components/schemas/RelatedChunkV3"},{"type":"null"}],"description":"The chunk immediately before this result in the source file. Null when this result is the first chunk."},"next":{"oneOf":[{"$ref":"#/components/schemas/RelatedChunkV3"},{"type":"null"}],"description":"The chunk immediately after this result in the source file. Null when this result is the last chunk."}},"description":"The chunks immediately before and after a result in the source file, returned when `include.neighbors` is enabled.","title":"ChunkNeighborsV3"},"FileSearchResultV3ChunkType":{"type":"string","enum":["body","table","heading","page_header","page_footer","footnote","figure"],"description":"Layout role of this chunk, classified from the parser's block structure at indexing time: body, table, heading, page_header, page_footer, footnote, or figure. Null when the chunk has no label: content indexed before chunk types shipped, plain-text and media content, or regions the parser returned without block structure. Treat unknown future values as additive.","title":"FileSearchResultV3ChunkType"},"ResultBoostV3":{"type":"object","properties":{"multiplier":{"type":"number","format":"double","description":"The combined weight applied to this chunk, capped at 5.0."},"clauses":{"type":"array","items":{"type":"integer"},"default":[],"description":"Which boost rules matched, as positions in the request's `boost` array."},"pre_boost_rank":{"type":["integer","null"],"description":"This chunk's retrieval rank before the boost, 1-based."},"pre_boost_score":{"type":["number","null"],"format":"double","description":"This chunk's retrieval score before the boost."},"reserved":{"type":"boolean","default":false,"description":"True when `reserve` placed this result on the page rather than its score."}},"required":["multiplier"],"description":"Why a result was boosted, and where it stood before the boost.","title":"ResultBoostV3"},"FileSearchResultV3":{"type":"object","properties":{"chunk_id":{"type":"string","description":"Stable identifier for the retrieved chunk. Chunk IDs include the parent document identifier and chunk index."},"score":{"type":"number","format":"double","description":"Final retrieval score used to rank the result. Use it to compare results within the same response, not across unrelated collections."},"text":{"type":"string","description":"Retrieved chunk text."},"modality":{"$ref":"#/components/schemas/FileSearchResultV3Modality","default":"unknown","description":"Indexed content type that matched the query."},"match_sources":{"type":"array","items":{"$ref":"#/components/schemas/FileSearchResultV3MatchSourcesItems"},"description":"Retrieval signals that contributed to the match, such as `content_embedding`, `keyword`, `ocr`, `table`, `transcript`, `metadata`, or `summary`."},"document":{"oneOf":[{"$ref":"#/components/schemas/FileSearchDocumentV3"},{"type":"null"}],"description":"Parent file for the chunk when `include.document` is enabled."},"location":{"oneOf":[{"$ref":"#/components/schemas/FileSearchLocationFromV3"},{"type":"null"}],"description":"Where the chunk appears inside the source file. PDF and document results use page fields, media results use time fields, and spreadsheet results use sheet, row, and column fields."},"media":{"oneOf":[{"$ref":"#/components/schemas/FileSearchMediaV3"},{"type":"null"}],"description":"Media-specific context for audio and video results, such as transcript data for the retrieved segment."},"regions":{"type":["array","null"],"items":{"$ref":"#/components/schemas/FileSearchRegionFromV3"},"description":"Extracted layout regions when `include.regions` is enabled. Regions can represent OCR text, form fields, headings, tables, charts, or image areas."},"metadata":{"oneOf":[{"$ref":"#/components/schemas/FileSearchResultV3Metadata"},{"type":"null"}],"description":"Captain-generated retrieval, ranking, source location, and indexed content metadata."},"custom_metadata":{"oneOf":[{"$ref":"#/components/schemas/FileSearchResultV3CustomMetadata"},{"type":"null"}],"description":"Application-supplied chunk metadata from indexing or chunk metadata update endpoints."},"rerank_score":{"type":["number","null"],"format":"double","description":"Score assigned by the reranker for this result when reranking is applied."},"relations":{"type":["array","null"],"items":{"$ref":"#/components/schemas/ChunkRelationFromV3"},"description":"Graph edges connected to the retrieved chunk when relation context is requested."},"related_chunks":{"type":["array","null"],"items":{"$ref":"#/components/schemas/RelatedChunkV3"},"description":"Linked chunks returned with relation context, including their text, location, and metadata when available."},"neighboring_chunks":{"oneOf":[{"$ref":"#/components/schemas/ChunkNeighborsV3"},{"type":"null"}],"description":"The chunk immediately before and after this result in the source file, when `include.neighboring_chunks` is enabled."},"chunk_type":{"oneOf":[{"$ref":"#/components/schemas/FileSearchResultV3ChunkType"},{"type":"null"}],"description":"Layout role of this chunk, classified from the parser's block structure at indexing time: body, table, heading, page_header, page_footer, footnote, or figure. Null when the chunk has no label: content indexed before chunk types shipped, plain-text and media content, or regions the parser returned without block structure. Treat unknown future values as additive."},"boost":{"oneOf":[{"$ref":"#/components/schemas/ResultBoostV3"},{"type":"null"}],"description":"Set when a boost rule matched this result; null otherwise."}},"required":["chunk_id","score","text"],"description":"A retrieved chunk from an indexed file.","title":"FileSearchResultV3"},"QueryRerankV3Reason":{"type":"string","enum":["requested","disabled","required_for_multimodal","default_for_multimodal"],"description":"Why reranking was applied or skipped.","title":"QueryRerankV3Reason"},"QueryRerankV3":{"type":"object","properties":{"used":{"type":"boolean","description":"Whether reranking was applied."},"reason":{"$ref":"#/components/schemas/QueryRerankV3Reason","description":"Why reranking was applied or skipped."},"model":{"type":["string","null"],"description":"The reranker model that ran. Null when reranking was not applied."},"candidate_limit":{"type":["integer","null"],"description":"The candidate pool size that was reranked. Null when reranking was not applied."},"fallback":{"type":["string","null"],"description":"Recorded rerank fallback outcome, when available. Read alongside used, reason, model, candidate_limit, and warnings."}},"required":["used","reason"],"description":"Reranking status for the query response.","title":"QueryRerankV3"},"QueryResponseV3ExcludeChunkTypesItems":{"type":"string","enum":["body","table","heading","page_header","page_footer","footnote","figure"],"title":"QueryResponseV3ExcludeChunkTypesItems"},"BoostAppliedV3Eq":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"}],"description":"The value this rule matched on.","title":"BoostAppliedV3Eq"},"BoostAppliedV3InItems":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"}],"title":"BoostAppliedV3InItems"},"BoostAppliedV3":{"type":"object","properties":{"field":{"type":["string","null"],"minLength":1,"maxLength":256,"description":"The metadata key this rule targeted."},"eq":{"oneOf":[{"$ref":"#/components/schemas/BoostAppliedV3Eq"},{"type":"null"}],"description":"The value this rule matched on."},"in":{"type":["array","null"],"items":{"$ref":"#/components/schemas/BoostAppliedV3InItems"},"description":"The values this rule matched on."},"chunk_ids":{"type":["array","null"],"items":{"type":"string"},"description":"The chunks this rule targeted."},"weight":{"type":"number","format":"double","minimum":0.2,"maximum":5,"description":"The multiplier this rule applied."},"reserve":{"type":"integer","minimum":0,"default":0,"description":"Page slots this rule guaranteed. 0 means the reranker decided."},"matched":{"type":"integer","default":0,"description":"Retrieved chunks this rule matched."},"in_pool":{"type":"integer","default":0,"description":"Matched chunks that reached reranking. Equals `matched` when reranking is off."},"on_page":{"type":"integer","default":0,"description":"Matched chunks in the results returned."},"applied":{"type":"boolean","default":true,"description":"False when boosts were skipped; a warning explains why."}},"required":["weight"],"description":"One boost rule, echoed back with what it did. See BoostClauseV3 on the request for what each property means.","title":"BoostAppliedV3"},"QueryStageSegmentV3":{"type":"object","properties":{"start_ms":{"type":"integer","minimum":0},"duration_ms":{"type":"integer","minimum":0}},"required":["start_ms","duration_ms"],"title":"QueryStageSegmentV3"},"QueryStageV3":{"type":"object","properties":{"name":{"type":"string","description":"Public operation name. New names may be added; clients must tolerate unknown names."},"start_ms":{"type":"integer","minimum":0,"description":"Start offset in milliseconds from the shared query-processing origin."},"duration_ms":{"type":"integer","minimum":0,"description":"Wall-clock extent from this stage's first start to last finish. May overlap other stages. Use segments when present to preserve gaps and concurrent intervals."},"segments":{"type":["array","null"],"items":{"$ref":"#/components/schemas/QueryStageSegmentV3"},"description":"Actual intervals when a stage runs more than once. Do not add overlapping durations or infer continuous work between them."}},"required":["name","start_ms","duration_ms"],"title":"QueryStageV3"},"QueryTimingV3":{"type":"object","properties":{"stages":{"type":"array","items":{"$ref":"#/components/schemas/QueryStageV3"},"description":"Measured stage groups ordered by start offset. Each stage name appears once; repeated work is preserved in segments. Groups can overlap. Skipped operations are omitted. Asset signing, when performed during hydration, is nested inside that hydration interval, not additional disjoint time. Offsets and endpoints use one monotonic origin, rounded down to milliseconds."},"total_ms":{"type":"integer","minimum":0,"description":"Query processing time from handler entry before authentication through response model construction. Excludes gateway routing, request-body parsing, JSON serialization, compression, network transfer, client decoding, and background tracking. Measured independently, never summed from stages."}},"required":["stages","total_ms"],"title":"QueryTimingV3"},"QueryResponseV3":{"type":"object","properties":{"query":{"type":"string","description":"Echo of the submitted query."},"results":{"type":"array","items":{"$ref":"#/components/schemas/FileSearchResultV3"},"description":"Retrieved source chunks sorted by final retrieval score."},"total_results":{"type":"integer","description":"Number of results returned in this response."},"limit":{"type":"integer","description":"Result limit applied to the request."},"rerank":{"$ref":"#/components/schemas/QueryRerankV3","description":"Whether reranking was applied and why."},"warnings":{"type":"array","items":{"type":"string"},"description":"Non-fatal notices about the request or response, such as forced reranking for multimodal collections."},"execution_time_ms":{"type":["integer","null"],"description":"Compatibility alias for timing.total_ms. Prefer timing.total_ms for new integrations."},"request_id":{"type":["string","null"],"description":"Request identifier for support and trace lookup."},"query_id":{"type":["string","null"],"description":"Id of this query in your history. Fetch it back with GET /v2/queries/{query_id}. Present when the query was stored (completed, non-streamed queries)."},"exclude_chunk_types":{"type":"array","items":{"$ref":"#/components/schemas/QueryResponseV3ExcludeChunkTypesItems"},"default":[],"description":"The layout roles this query excluded, echoed back so a caller can confirm what the server applied. Empty when none were requested."},"boost":{"type":"array","items":{"$ref":"#/components/schemas/BoostAppliedV3"},"default":[],"description":"The boost rules this query applied, each with `matched`, `in_pool`, and `on_page` counts. Always present; empty when no boost was sent."},"semantic_ratio":{"type":"number","format":"double","default":0.5,"description":"The semantic/keyword balance applied to this query. Always present; 0.5 when the request did not set one."},"timing":{"$ref":"#/components/schemas/QueryTimingV3","description":"Always-on query processing timing, including successful empty results. Stage offsets share one monotonic origin; overlapping durations must not be summed."}},"required":["query","results","total_results","limit","rerank","timing"],"description":"Response body for v3 File Search.","title":"QueryResponseV3"},"ValidationErrorLocItems":{"oneOf":[{"type":"string"},{"type":"integer"}],"title":"ValidationErrorLocItems"},"ValidationError":{"type":"object","properties":{"loc":{"type":"array","items":{"$ref":"#/components/schemas/ValidationErrorLocItems"}},"msg":{"type":"string"},"type":{"type":"string"}},"required":["loc","msg","type"],"title":"ValidationError"},"HTTPValidationError":{"type":"object","properties":{"detail":{"type":"array","items":{"$ref":"#/components/schemas/ValidationError"}}},"title":"HTTPValidationError"},"QueryRequestV2Rerank":{"oneOf":[{"type":"boolean"},{"$ref":"#/components/schemas/RerankOptions"}],"description":"Rerank retrieved candidates before returning the top results (adds roughly 200 ms). Boolean form uses the defaults: voyage-rerank-2.5 over a pool of `limit` x 3 candidates. Object form tunes reranking — see RerankOptions. Multimodal collections default to reranking; an explicit `false` (or `{\"enabled\": false}`) opts out and returns a warning noting reduced cross-modal ranking quality. On v2, the deprecated `inference=true` path honours only the enabled/disabled state; the tuning fields apply to retrieval queries.","title":"QueryRequestV2Rerank"},"QueryRequestV2":{"type":"object","properties":{"query":{"type":"string","description":"Natural-language search query."},"top_k":{"type":["integer","null"],"default":10,"description":"Maximum number of search results to return."},"metadata_filter":{"type":["object","null"],"additionalProperties":{"description":"Any type"},"description":"Filter expression for indexed document metadata. Supports $eq, $ne, $gt, $gte, $lt, $lte, $in, $nin, $and, and $or."},"include_archived":{"type":"boolean","default":false,"description":"Include chunks archived by a sync `archive` deletion policy. Archived content is excluded from search by default; set true to surface it."},"rerank":{"oneOf":[{"$ref":"#/components/schemas/QueryRequestV2Rerank"},{"type":"null"}],"default":false,"description":"Rerank retrieved candidates before returning the top results (adds roughly 200 ms). Boolean form uses the defaults: voyage-rerank-2.5 over a pool of `limit` x 3 candidates. Object form tunes reranking — see RerankOptions. Multimodal collections default to reranking; an explicit `false` (or `{\"enabled\": false}`) opts out and returns a warning noting reduced cross-modal ranking quality. On v2, the deprecated `inference=true` path honours only the enabled/disabled state; the tuning fields apply to retrieval queries."},"include_bbox":{"type":["boolean","null"],"default":false,"description":"Legacy v2 layout option retained for clients that already depend on bounding boxes."},"semantic_ratio":{"type":"number","format":"double","minimum":0,"maximum":1,"default":0.5,"description":"Balance between semantic and keyword retrieval. Captain searches both ways at once: keyword (sparse, BM25) matches the words in the query, semantic (dense vector) matches its meaning. 0.0 is keyword only, 1.0 is semantic only, and 0.5 (the default) weighs them equally. Lower it for corpora full of exact terms such as part numbers or error codes; raise it when callers phrase questions in their own words. Between the endpoints both searches run, so a result found only by the down-weighted side still appears, just lower. The endpoints skip the other search entirely: 0.0 also skips embedding the query, making it the fastest option, though queries using `boost` and collections holding images, video, or audio keep vector search running. See the Advanced Querying guide for more."}},"required":["query"],"description":"Request body for v2 compatibility File Search. Returns retrieved chunks and does not generate an LLM answer.","title":"QueryRequestV2"},"FileSearchResult":{"type":"object","properties":{"score":{"type":"number","format":"double"},"content":{"type":"string","description":"Retrieved chunk text. v3 uses text instead."},"document_id":{"type":["string","null"]},"filename":{"type":["string","null"]},"uri":{"type":["string","null"]},"chunk_index":{"type":["integer","null"]},"metadata":{"type":["object","null"],"additionalProperties":{"description":"Any type"}},"rerank_score":{"type":["number","null"],"format":"double"}},"required":["score","content"],"description":"A v2 compatibility File Search result chunk.","title":"FileSearchResult"},"TokenBalance":{"type":"object","properties":{"credit_limit":{"type":"integer"},"total_used":{"type":"integer"},"remaining":{"type":"integer"},"unlimited":{"type":"boolean","default":false}},"required":["credit_limit","total_used","remaining"],"title":"TokenBalance"},"QueryResponseV2":{"type":"object","properties":{"success":{"type":"boolean"},"query":{"type":"string"},"search_results":{"type":"array","items":{"$ref":"#/components/schemas/FileSearchResult"}},"total_results":{"type":"integer"},"top_k":{"type":"integer"},"warnings":{"type":["array","null"],"items":{"type":"string"}},"tokens_used":{"type":["object","null"],"additionalProperties":{"type":"integer"}},"execution_time_ms":{"type":["integer","null"]},"request_id":{"type":["string","null"]},"query_id":{"type":["string","null"],"description":"Id of this query in your history. Fetch it back with GET /v2/queries/{query_id}. Present when the query was stored (completed, non-streamed queries)."},"token_balance":{"oneOf":[{"$ref":"#/components/schemas/TokenBalance"},{"type":"null"}]}},"required":["success","query","search_results","total_results","top_k"],"description":"v2 compatibility File Search response. Returns search_results with content fields.","title":"QueryResponseV2"},"QueryParamsV2Include":{"type":"object","properties":{},"title":"QueryParamsV2Include"},"QueryParamsV2":{"type":"object","properties":{"limit":{"type":["integer","null"]},"semantic_ratio":{"type":["number","null"],"format":"double"},"has_filter":{"type":["boolean","null"]},"has_boost":{"type":["boolean","null"]},"exclude_chunk_types":{"type":["array","null"],"items":{"type":"string"}},"include":{"oneOf":[{"$ref":"#/components/schemas/QueryParamsV2Include"},{"type":"null"}]}},"title":"QueryParamsV2"},"QueryResultLocationV2":{"type":"object","properties":{"page_start":{"type":["integer","null"]},"page_end":{"type":["integer","null"]},"start_seconds":{"type":["number","null"],"format":"double"},"end_seconds":{"type":["number","null"],"format":"double"},"sheet_name":{"type":["string","null"]},"row_start":{"type":["integer","null"]}},"title":"QueryResultLocationV2"},"QueryResultV2":{"type":"object","properties":{"rank":{"type":"integer"},"chunk_id":{"type":["string","null"]},"score":{"type":["number","null"],"format":"double"},"rerank_score":{"type":["number","null"],"format":"double"},"text":{"type":"string","default":""},"filename":{"type":["string","null"]},"document_id":{"type":["string","null"]},"modality":{"type":["string","null"]},"chunk_type":{"type":["string","null"]},"location":{"oneOf":[{"$ref":"#/components/schemas/QueryResultLocationV2"},{"type":"null"}]}},"required":["rank"],"title":"QueryResultV2"},"QuerySummaryV2Request":{"type":"object","properties":{},"title":"QuerySummaryV2Request"},"QuerySummaryV2Response":{"type":"object","properties":{},"title":"QuerySummaryV2Response"},"QuerySummaryV2":{"type":"object","properties":{"query_id":{"type":"string"},"query_text":{"type":["string","null"]},"collection_name":{"type":["string","null"]},"environment":{"type":["string","null"]},"status":{"type":["string","null"]},"api_version":{"type":["string","null"]},"created_at":{"type":["string","null"]},"latency_ms":{"type":["integer","null"]},"result_count":{"type":["integer","null"]},"request_id":{"type":["string","null"]},"params":{"oneOf":[{"$ref":"#/components/schemas/QueryParamsV2"},{"type":"null"}]},"results":{"type":["array","null"],"items":{"$ref":"#/components/schemas/QueryResultV2"}},"request":{"oneOf":[{"$ref":"#/components/schemas/QuerySummaryV2Request"},{"type":"null"}]},"response":{"oneOf":[{"$ref":"#/components/schemas/QuerySummaryV2Response"},{"type":"null"}]},"body_status":{"type":["string","null"]}},"required":["query_id"],"title":"QuerySummaryV2"},"QueryListResponseV2":{"type":"object","properties":{"queries":{"type":"array","items":{"$ref":"#/components/schemas/QuerySummaryV2"}},"count":{"type":"integer"},"next_cursor":{"type":["string","null"]}},"required":["queries","count"],"title":"QueryListResponseV2"},"ErrorResponseV2Details":{"type":"object","properties":{},"title":"ErrorResponseV2Details"},"ErrorResponseV2":{"type":"object","properties":{"details":{"oneOf":[{"$ref":"#/components/schemas/ErrorResponseV2Details"},{"type":"null"}]},"error":{"type":"string"},"message":{"type":"string"},"path":{"type":["string","null"]},"success":{"type":"boolean","default":false}},"required":["error","message"],"title":"ErrorResponseV2"},"QueryDetailV2Request":{"type":"object","properties":{},"title":"QueryDetailV2Request"},"QueryDetailV2Response":{"type":"object","properties":{},"title":"QueryDetailV2Response"},"QueryDetailV2":{"type":"object","properties":{"query_id":{"type":"string"},"query_text":{"type":["string","null"]},"collection_name":{"type":["string","null"]},"environment":{"type":["string","null"]},"status":{"type":["string","null"]},"api_version":{"type":["string","null"]},"created_at":{"type":["string","null"]},"latency_ms":{"type":["integer","null"]},"result_count":{"type":["integer","null"]},"request_id":{"type":["string","null"]},"params":{"oneOf":[{"$ref":"#/components/schemas/QueryParamsV2"},{"type":"null"}]},"results":{"type":["array","null"],"items":{"$ref":"#/components/schemas/QueryResultV2"}},"request":{"oneOf":[{"$ref":"#/components/schemas/QueryDetailV2Request"},{"type":"null"}]},"response":{"oneOf":[{"$ref":"#/components/schemas/QueryDetailV2Response"},{"type":"null"}]},"body_status":{"type":"string"},"error_message":{"type":["string","null"]},"error_type":{"type":["string","null"]}},"required":["query_id","body_status"],"title":"QueryDetailV2"},"LatencyCollectionSeriesV2":{"type":"object","properties":{"collection_name":{"type":"string","description":"The collection, or `Other` for the folded remainder."},"count":{"type":"integer","description":"Measured queries against this collection."},"counts":{"type":"array","items":{"type":"integer"},"description":"Per-bin counts against the same edges as the overall histogram, so shapes are comparable."},"is_other":{"type":"boolean","default":false,"description":"True for the folded remainder rather than a real collection."},"p50":{"type":["integer","null"],"description":"Median in ms; null for the `Other` group, whose percentiles cannot be derived exactly."},"p95":{"type":["integer","null"],"description":"95th percentile in ms; null for `Other`."},"p99":{"type":["integer","null"],"description":"99th percentile in ms; null for `Other`."}},"required":["collection_name","count","counts"],"title":"LatencyCollectionSeriesV2"},"LatencyCompletenessV2":{"type":"object","properties":{"complete":{"type":"boolean","description":"True when the window has settled past the ingestion lag, so no further rows are expected for it. This is a settled-not-filling signal, not a guarantee of wholeness: usage rows are written after the response and a failed write is not retried, so compare `watermark` against the window when exactness matters."},"watermark":{"type":["string","null"],"description":"The most recent query time seen in the window. How far the data actually reaches."}},"required":["complete"],"title":"LatencyCompletenessV2"},"LatencyCountsV2":{"type":"object","properties":{"matching":{"type":"integer","description":"Queries in the window that matched every filter."},"measured":{"type":"integer","description":"Of those, the ones with a recorded processing time."},"missing":{"type":"integer","description":"Of those, the ones with no recorded processing time. Not zero-millisecond queries."}},"required":["matching","measured","missing"],"title":"LatencyCountsV2"},"LatencyFiltersAppliedV2HasFilter":{"type":"string","enum":["true","false","unknown"],"description":"Whether the request carried a metadata filter.","title":"LatencyFiltersAppliedV2HasFilter"},"LatencyFiltersAppliedV2Rerank":{"type":"string","enum":["on","off","unknown"],"description":"The recorded rerank request setting.","title":"LatencyFiltersAppliedV2Rerank"},"LatencyFiltersAppliedV2SearchMode":{"type":"string","enum":["keyword","semantic","hybrid","unknown"],"description":"Derived from the recorded semantic ratio.","title":"LatencyFiltersAppliedV2SearchMode"},"LatencyFiltersAppliedV2":{"type":"object","properties":{"api_version":{"type":["string","null"],"description":"`v3` or `v2`."},"collection":{"type":["string","null"],"description":"Only queries against this collection."},"has_filter":{"oneOf":[{"$ref":"#/components/schemas/LatencyFiltersAppliedV2HasFilter"},{"type":"null"}],"description":"Whether the request carried a metadata filter."},"query_environment":{"type":["string","null"],"description":"The API key environment the queries ran in."},"rerank":{"oneOf":[{"$ref":"#/components/schemas/LatencyFiltersAppliedV2Rerank"},{"type":"null"}],"description":"The recorded rerank request setting."},"search_mode":{"oneOf":[{"$ref":"#/components/schemas/LatencyFiltersAppliedV2SearchMode"},{"type":"null"}],"description":"Derived from the recorded semantic ratio."}},"title":"LatencyFiltersAppliedV2"},"LatencyHistogramV2":{"type":"object","properties":{"counts":{"type":"array","items":{"type":"integer"},"description":"Measured queries per bin. Bin i spans edges[i] (inclusive) to edges[i+1] (exclusive); the last bin includes its upper edge."},"edges":{"type":"array","items":{"type":"integer"},"description":"Bin edges in ms, ascending. One more entry than `counts`."}},"required":["counts","edges"],"title":"LatencyHistogramV2"},"LatencyPercentilesV2":{"type":"object","properties":{"p50":{"type":["integer","null"],"description":"Median processing time in ms; null when nothing was measured."},"p95":{"type":["integer","null"],"description":"95th percentile in ms; null when nothing was measured."},"p99":{"type":["integer","null"],"description":"99th percentile in ms; null when nothing was measured."}},"title":"LatencyPercentilesV2"},"LatencyWindowV2":{"type":"object","properties":{"from":{"type":"string","description":"Start of the window, inclusive (UTC)."},"to":{"type":"string","description":"End of the window, exclusive (UTC)."}},"required":["from","to"],"title":"LatencyWindowV2"},"QueryLatencyResponseV2":{"type":"object","properties":{"collections":{"type":"array","items":{"$ref":"#/components/schemas/LatencyCollectionSeriesV2"}},"completeness":{"$ref":"#/components/schemas/LatencyCompletenessV2"},"counts":{"$ref":"#/components/schemas/LatencyCountsV2"},"coverage":{"type":"object","additionalProperties":{"type":"number","format":"double"},"description":"Per filter, the share of matching queries that recorded that dimension (0.0-1.0). A low value means most of the population answers `unknown`."},"filters_applied":{"$ref":"#/components/schemas/LatencyFiltersAppliedV2"},"generated_at":{"type":"string","description":"When these numbers were computed. A cached response keeps its original value."},"histogram":{"$ref":"#/components/schemas/LatencyHistogramV2"},"metric":{"type":"string","enum":["query_processing_time"],"default":"query_processing_time","description":"What is being measured: server-side query processing time, not end-to-end client latency."},"metric_version":{"type":"string","default":"1"},"percentile_method":{"type":"string","enum":["exact"],"default":"exact","description":"Percentiles come from the measurements themselves, not an approximate sketch."},"percentiles":{"$ref":"#/components/schemas/LatencyPercentilesV2"},"population":{"type":"string","description":"Which queries the metric covers. Completed, non-evaluation queries: a failed query records no usage row, and evaluation units are excluded."},"unit":{"type":"string","enum":["ms"],"default":"ms"},"window":{"$ref":"#/components/schemas/LatencyWindowV2"}},"required":["completeness","counts","filters_applied","generated_at","histogram","percentiles","population","window"],"description":"Bounded latency metrics for a filtered population of stored queries.","title":"QueryLatencyResponseV2"},"LatencyCollectionFacetV2":{"type":"object","properties":{"collection_name":{"type":"string"},"query_count":{"type":"integer"}},"required":["collection_name","query_count"],"title":"LatencyCollectionFacetV2"},"QueryLatencyFacetsResponseV2":{"type":"object","properties":{"collections":{"type":"array","items":{"$ref":"#/components/schemas/LatencyCollectionFacetV2"}},"has_more":{"type":"boolean"},"limit":{"type":"integer"},"offset":{"type":"integer"},"total":{"type":"integer","description":"Distinct collections matching the window and filters."}},"required":["has_more","limit","offset","total"],"description":"Searchable collection list for the latency picker, so a large\norganization never needs every series in one response.","title":"QueryLatencyFacetsResponseV2"},"SlowestQueryV2":{"type":"object","properties":{"collection_name":{"type":"string"},"duration_ms":{"type":"integer"},"occurred_at":{"type":"string"},"query_id":{"type":["string","null"],"description":"The query id, when the row recorded one."},"request_id":{"type":"string","description":"Pass to GET /v2/queries/{query_id} to open the query. Always present."}},"required":["collection_name","duration_ms","occurred_at","request_id"],"title":"SlowestQueryV2"},"SlowestQueriesResponseV2":{"type":"object","properties":{"generated_at":{"type":"string"},"queries":{"type":"array","items":{"$ref":"#/components/schemas/SlowestQueryV2"}},"window":{"$ref":"#/components/schemas/LatencyWindowV2"}},"required":["generated_at","window"],"description":"The slowest queries in the window: ids and durations only, never bodies.","title":"SlowestQueriesResponseV2"},"CollectionListItem":{"type":"object","properties":{"created_at":{"type":["string","null"]},"collection_id":{"type":"string"},"collection_name":{"type":"string"},"document_count":{"type":["integer","null"]}},"required":["collection_id","collection_name"],"title":"CollectionListItem"},"CollectionListResponse":{"type":"object","properties":{"collections":{"type":"array","items":{"$ref":"#/components/schemas/CollectionListItem"}},"limit":{"type":"integer"},"offset":{"type":"integer"},"total_count":{"type":"integer"}},"required":["collections","limit","offset","total_count"],"title":"CollectionListResponse"},"CollectionCreateRequestMetadata":{"type":"object","properties":{},"title":"CollectionCreateRequestMetadata"},"CollectionCreateRequest":{"type":"object","properties":{"description":{"type":["string","null"]},"metadata":{"oneOf":[{"$ref":"#/components/schemas/CollectionCreateRequestMetadata"},{"type":"null"}]}},"title":"CollectionCreateRequest"},"CollectionResponseMetadata":{"type":"object","properties":{},"title":"CollectionResponseMetadata"},"CollectionResponse":{"type":"object","properties":{"collection_id":{"type":"string"},"collection_name":{"type":"string"},"created_at":{"type":["string","null"]},"description":{"type":["string","null"]},"metadata":{"oneOf":[{"$ref":"#/components/schemas/CollectionResponseMetadata"},{"type":"null"}]},"organization_id":{"type":"string"}},"required":["collection_id","collection_name","organization_id"],"title":"CollectionResponse"},"CollectionCopyRequest":{"type":"object","properties":{"target_name":{"type":"string","description":"Name for the copy. Must be unique within the organization and environment. Same rules as creating a collection: 3-63 characters, alphanumeric start and end, letters, numbers, hyphens and underscores only."},"include_graph":{"type":"boolean","default":true,"description":"Copy the collection's chunk relations and chunk metadata along with its documents and vectors. Defaults to true so a copy is a faithful original; set false to copy documents and vectors only."}},"required":["target_name"],"title":"CollectionCopyRequest"},"CollectionCopyResponse":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"source_collection":{"type":"string","description":"Name of the collection copied from."},"collection_name":{"type":"string","description":"Name of the new copy."},"collection_id":{"type":"string","description":"ID of the new copy."},"documents_copied":{"type":"integer","description":"Number of documents cloned."},"files_copied":{"type":"integer","default":0,"description":"Number of files cloned."},"namespaces_copied":{"type":"integer","description":"Number of Turbopuffer namespaces copied (text plus any media)."},"relations_copied":{"type":"integer","default":0,"description":"Number of chunk relations cloned. Counts ROWS, not distinct edges: duplicate (source, target, type) triples in the source are reproduced faithfully."},"chunk_metadata_copied":{"type":"integer","default":0,"description":"Number of chunk metadata rows cloned."},"relations_unresolved":{"type":"integer","default":0,"description":"Relations copied whose target document could not be remapped into the new collection, so their target_document_id is null. Usually these are edges already broken in the source (the target document was deleted, or the id never matched a document); if the source was being indexed while the copy ran, a freshly created edge can also land here. The copy reproduces the edge rather than writing a pointer that resolves to nothing."}},"required":["success","message","source_collection","collection_name","collection_id","documents_copied","namespaces_copied"],"title":"CollectionCopyResponse"},"StandardResponseV2":{"type":"object","properties":{"error":{"type":["string","null"]},"message":{"type":"string"},"success":{"type":"boolean"}},"required":["message","success"],"title":"StandardResponseV2"},"ChangeEnvironmentRequestNewEnvironment":{"type":"string","enum":["development","staging","production"],"title":"ChangeEnvironmentRequestNewEnvironment"},"ChangeEnvironmentRequest":{"type":"object","properties":{"new_environment":{"$ref":"#/components/schemas/ChangeEnvironmentRequestNewEnvironment"}},"required":["new_environment"],"title":"ChangeEnvironmentRequest"},"ChangeEnvironmentResponse":{"type":"object","properties":{"collection_name":{"type":"string"},"files_moved":{"type":"integer"},"message":{"type":"string"},"new_environment":{"type":"string"},"previous_environment":{"type":"string"},"success":{"type":"boolean"}},"required":["collection_name","files_moved","message","new_environment","previous_environment","success"],"title":"ChangeEnvironmentResponse"},"DocumentListItem":{"type":"object","properties":{"chunk_count":{"type":"integer","default":0},"content_type":{"type":["string","null"]},"created_at":{"type":["string","null"]},"document_id":{"type":"string"},"filename":{"type":"string"},"indexed_at":{"type":["string","null"]},"indexing_status":{"type":["string","null"]},"uri":{"type":["string","null"]}},"required":["document_id","filename"],"title":"DocumentListItem"},"DocumentListResponse":{"type":"object","properties":{"collection_name":{"type":"string"},"documents":{"type":"array","items":{"$ref":"#/components/schemas/DocumentListItem"}},"limit":{"type":"integer"},"offset":{"type":"integer"},"total_count":{"type":"integer"}},"required":["collection_name","documents","limit","offset","total_count"],"title":"DocumentListResponse"},"DocumentListItemV3":{"type":"object","properties":{"chunk_count":{"type":"integer","default":0},"content_type":{"type":["string","null"]},"created_at":{"type":["string","null"]},"custom_metadata":{"type":["object","null"],"additionalProperties":{"description":"Any type"}},"document_id":{"type":"string"},"filename":{"type":"string"},"indexed_at":{"type":["string","null"]},"indexing_status":{"type":["string","null"]},"status":{"type":["string","null"]},"uri":{"type":["string","null"]},"checksum":{"type":["string","null"],"description":"Checksum of the source bytes the current version was indexed from, prefixed with its algorithm (for example etag:...). Null when not recorded."},"source_version_id":{"type":["string","null"],"description":"The storage provider's object version the current version was indexed from, when the provider reports one."}},"required":["document_id","filename"],"description":"One document in the v3 list-documents response (mirrors the v2 list item).","title":"DocumentListItemV3"},"DocumentListResponseV3":{"type":"object","properties":{"collection_name":{"type":"string"},"documents":{"type":"array","items":{"$ref":"#/components/schemas/DocumentListItemV3"}},"limit":{"type":"integer"},"offset":{"type":"integer"},"total_count":{"type":"integer"}},"required":["collection_name","documents","limit","offset","total_count"],"title":"DocumentListResponseV3"},"DocumentMetadataV3":{"type":"object","properties":{"filename":{"type":["string","null"]},"file_type":{"type":["string","null"]},"file_size":{"type":["integer","null"]},"mime_type":{"type":["string","null"]},"uri":{"type":["string","null"]},"summary":{"type":["string","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"indexing_status":{"type":["string","null"]},"created_at":{"type":["string","null"]},"indexed_at":{"type":["string","null"]},"checksum":{"type":["string","null"],"description":"Checksum of the source bytes the current version was indexed from, prefixed with its algorithm (for example etag:...). Null when not recorded."},"source_version_id":{"type":["string","null"],"description":"The storage provider's object version the current version was indexed from, when the provider reports one."}},"title":"DocumentMetadataV3"},"DocumentChunkV3CustomMetadata":{"type":"object","properties":{},"title":"DocumentChunkV3CustomMetadata"},"DocumentChunkV3Metadata":{"type":"object","properties":{},"title":"DocumentChunkV3Metadata"},"DocumentChunkV3ChunkType":{"type":"string","enum":["body","table","heading","page_header","page_footer","footnote","figure"],"description":"Layout role of this chunk, classified from the parser's block structure at indexing time: body, table, heading, page_header, page_footer, footnote, or figure. Null when the chunk has no label: content indexed before chunk types shipped, plain-text and media content, or regions the parser returned without block structure. Treat unknown future values as additive.","title":"DocumentChunkV3ChunkType"},"DocumentChunkV3":{"type":"object","properties":{"chunk_id":{"type":"string"},"document_id":{"type":"string"},"text":{"type":"string"},"location":{"oneOf":[{"$ref":"#/components/schemas/FileSearchLocationFromV3"},{"type":"null"}]},"regions":{"type":["array","null"],"items":{"$ref":"#/components/schemas/FileSearchRegionFromV3"}},"custom_metadata":{"oneOf":[{"$ref":"#/components/schemas/DocumentChunkV3CustomMetadata"},{"type":"null"}]},"metadata":{"oneOf":[{"$ref":"#/components/schemas/DocumentChunkV3Metadata"},{"type":"null"}]},"chunk_type":{"oneOf":[{"$ref":"#/components/schemas/DocumentChunkV3ChunkType"},{"type":"null"}],"description":"Layout role of this chunk, classified from the parser's block structure at indexing time: body, table, heading, page_header, page_footer, footnote, or figure. Null when the chunk has no label: content indexed before chunk types shipped, plain-text and media content, or regions the parser returned without block structure. Treat unknown future values as additive."}},"required":["chunk_id","document_id","text"],"title":"DocumentChunkV3"},"GetDocumentResponseV3":{"type":"object","properties":{"document_id":{"type":"string"},"collection_name":{"type":"string"},"chunk_count":{"type":"integer"},"metadata":{"$ref":"#/components/schemas/DocumentMetadataV3"},"chunks":{"type":"array","items":{"$ref":"#/components/schemas/DocumentChunkV3"}},"warnings":{"type":"array","items":{"type":"string"}},"custom_metadata":{"type":["object","null"],"additionalProperties":{"description":"Any type"}}},"required":["document_id","collection_name","chunk_count","metadata"],"title":"GetDocumentResponseV3"},"GetDocumentPageResponseV3TextSource":{"type":"string","enum":["ocr"],"default":"ocr","description":"Where `text` came from. Always `ocr` today; a future value would mean reconstructed text, not primary-source OCR.","title":"GetDocumentPageResponseV3TextSource"},"PageWarningV3":{"type":"object","properties":{"code":{"type":"string","description":"Stable machine-readable warning code, such as `document_indexing` or `page_empty`."},"message":{"type":"string","description":"Human-readable explanation. Free to change; branch on `code`, not this text."}},"required":["code","message"],"description":"A non-fatal condition on an otherwise successful page fetch, such as indexing still in progress or the page having no extractable text.","title":"PageWarningV3"},"GetDocumentPageResponseV3":{"type":"object","properties":{"collection_name":{"type":"string"},"document_id":{"type":"string"},"page":{"type":"integer","description":"The requested page number, echoed back."},"page_count":{"type":["integer","null"],"description":"Best-effort total page count, derived from the document's OCR data. Null when it cannot be determined."},"text":{"type":"string","description":"The page's full text in reading order. Empty string when the page exists but has no extractable text (see `warnings`)."},"text_source":{"$ref":"#/components/schemas/GetDocumentPageResponseV3TextSource","default":"ocr","description":"Where `text` came from. Always `ocr` today; a future value would mean reconstructed text, not primary-source OCR."},"regions":{"type":["array","null"],"items":{"$ref":"#/components/schemas/FileSearchRegionFromV3"},"description":"Layout regions on this page when `include_regions` is true. Regions of type `figure`, `chart`, or `image` carry a presigned `image_url`."},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/PageWarningV3"},"description":"Non-fatal conditions on this response, such as `document_indexing` (content may be incomplete) or `page_empty` (page exists, no extractable text)."}},"required":["collection_name","document_id","page","text"],"description":"One document page's OCR text and, optionally, its layout regions.","title":"GetDocumentPageResponseV3"},"GetDocumentPageErrorV3Code":{"type":"string","enum":["document_not_found","document_indexing","document_has_no_pages","page_out_of_range"],"description":"Stable machine-readable error code. Branch on this, not `message`.","title":"GetDocumentPageErrorV3Code"},"GetDocumentPageErrorV3":{"type":"object","properties":{"code":{"$ref":"#/components/schemas/GetDocumentPageErrorV3Code","description":"Stable machine-readable error code. Branch on this, not `message`."},"message":{"type":"string","description":"Human-readable explanation. Free to change."},"page_count":{"type":["integer","null"],"description":"Present only for `page_out_of_range`: the document's best-effort total page count."}},"required":["code","message"],"description":"Error body returned when a page cannot be fetched.","title":"GetDocumentPageErrorV3"},"AssetUrlsRequestV3":{"type":"object","properties":{"asset_ids":{"type":"array","items":{"type":"string","pattern":"^fig_1_[a-z2-7]{26}$","maxLength":64},"description":"Figure ids to mint URLs for, from `regions[].figure_id`. Stable and safe to store, unlike the URLs they mint. Up to 100; duplicates each return their own item."},"ttl_seconds":{"type":["integer","null"],"minimum":60,"maximum":604800,"description":"How long each URL stays valid, in seconds. Default 900 (15 min); min 60, max 604800 (7 days)."}},"required":["asset_ids"],"title":"AssetUrlsRequestV3"},"AssetUrlV3Status":{"type":"string","enum":["signed","unavailable"],"title":"AssetUrlV3Status"},"AssetUrlV3":{"type":"object","properties":{"asset_id":{"type":"string","description":"Echoes the requested id, so a response can be keyed or positionally indexed. For figures this is `regions[].figure_id`."},"bbox":{"type":["object","null"],"additionalProperties":{"type":"number","format":"double"}},"content_type":{"type":["string","null"]},"expires_at":{"type":["string","null"],"description":"RFC 3339 UTC instant after which `image_url` stops working."},"image_url":{"type":["string","null"]},"kind":{"type":"string","default":"figure","description":"The kind of asset this id addresses, from its prefix. Currently always `figure`. Treat unknown values as opaque."},"message":{"type":["string","null"]},"page":{"type":["integer","null"],"description":"The figure's page in the source document, 1-based. On a document split for parallel parsing this can differ from `regions[].page` (the page within the split as the parser saw it). This field is the one that matches the image."},"reason":{"type":["string","null"],"description":"Set when status is `unavailable`. Open-ended: treat unknown values as generic failures. Current values: `no_crop_available` (document indexed before figure cropping; re-index to generate crops), `figure_not_found` (no figure in this document has that id), `ocr_unavailable` (layout data could not be read; retry, do not discard the id), `signing_unavailable` (crop signing not configured on this deployment)."},"status":{"$ref":"#/components/schemas/AssetUrlV3Status"}},"required":["asset_id","status"],"title":"AssetUrlV3"},"AssetUrlsResponseV3":{"type":"object","properties":{"asset_urls":{"type":"array","items":{"$ref":"#/components/schemas/AssetUrlV3"}},"collection_name":{"type":"string"},"document_id":{"type":"string"},"expires_at":{"type":["string","null"],"description":"Earliest expiry across all signed items, so a client can schedule a single refresh instead of one timer per image. Null when nothing was signed."},"expires_in_seconds":{"type":["integer","null"],"description":"Same deadline as a duration. Provided because browser clocks are routinely wrong, which makes an absolute-only expiry unreliable."},"signed_count":{"type":"integer","default":0},"unavailable_count":{"type":"integer","default":0},"warnings":{"type":"array","items":{"type":"string"}}},"required":["collection_name","document_id"],"title":"AssetUrlsResponseV3"},"FileSearchLocation":{"type":"object","properties":{"page_start":{"type":["integer","null"],"description":"First page covered by the chunk for paged documents."},"page_end":{"type":["integer","null"],"description":"Last page covered by the chunk for paged documents."},"start_sec":{"type":["number","null"],"format":"double"},"end_sec":{"type":["number","null"],"format":"double"},"sheet_name":{"type":["string","null"],"description":"Worksheet name for spreadsheet chunks."},"section":{"type":["string","null"]},"row_start":{"type":["integer","null"],"description":"First spreadsheet row covered by the chunk."},"row_end":{"type":["integer","null"],"description":"Last spreadsheet row covered by the chunk."},"col_start":{"type":["integer","null"],"description":"First spreadsheet column covered by the chunk."},"col_end":{"type":["integer","null"],"description":"Last spreadsheet column covered by the chunk."},"columns":{"type":["array","null"],"items":{"type":"string"}},"row_role":{"type":["string","null"]}},"description":"Source position for a returned chunk. Fields that do not apply to the source type are returned as null.","title":"FileSearchLocation"},"FileSearchRegionBbox":{"type":"object","properties":{"top":{"type":"number","format":"double"},"left":{"type":"number","format":"double"},"width":{"type":"number","format":"double"},"height":{"type":"number","format":"double"}},"description":"Bounding box for rendering the region. The origin is the top-left corner of the rendered page or image. Values are expressed as fractions of rendered dimensions, so draw with `x = left * renderedWidth`, `y = top * renderedHeight`, `width = width * renderedWidth`, and `height = height * renderedHeight`.","title":"FileSearchRegionBbox"},"FileSearchRegionExtraction":{"type":"string","enum":["ok","unavailable"],"description":"Whether this region's parsed content is included. \"unavailable\" marks a region whose extracted text was withheld because it could not be verified as reliable (for example a chart the parser could not read accurately): its text and description are null while bbox and image_url remain valid, so the original region can still be rendered. Null or absent means the content is included (\"ok\"); the field is never backfilled onto older data. When present, extraction supersedes confidence.","title":"FileSearchRegionExtraction"},"FileSearchRegion":{"type":"object","properties":{"region_id":{"type":["string","null"]},"type":{"type":["string","null"],"description":"Region category, such as `text`, `title`, `section_header`, `key_value`, `table`, `chart`, or `image`."},"page":{"type":["integer","null"],"description":"Page number where the region appears."},"bbox":{"oneOf":[{"$ref":"#/components/schemas/FileSearchRegionBbox"},{"type":"null"}],"description":"Bounding box for rendering the region. The origin is the top-left corner of the rendered page or image. Values are expressed as fractions of rendered dimensions, so draw with `x = left * renderedWidth`, `y = top * renderedHeight`, `width = width * renderedWidth`, and `height = height * renderedHeight`."},"text":{"type":["string","null"],"description":"Text extracted from the region when available."},"description":{"type":["string","null"],"description":"Generated description of the region when available."},"image_url":{"type":["string","null"],"description":"Image URL for the region when the extraction pipeline produced one."},"confidence":{"type":["number","null"],"format":"double","description":"Extraction confidence for the region when available."},"metadata":{"type":["object","null"],"additionalProperties":{"description":"Any type"}},"extraction":{"oneOf":[{"$ref":"#/components/schemas/FileSearchRegionExtraction"},{"type":"null"}],"description":"Whether this region's parsed content is included. \"unavailable\" marks a region whose extracted text was withheld because it could not be verified as reliable (for example a chart the parser could not read accurately): its text and description are null while bbox and image_url remain valid, so the original region can still be rendered. Null or absent means the content is included (\"ok\"); the field is never backfilled onto older data. When present, extraction supersedes confidence."}},"description":"Extracted layout region from a document, page, or image.","title":"FileSearchRegion"},"ChunkRelation":{"type":"object","properties":{"relation_id":{"type":"string","description":"Relation identifier."},"source_chunk_id":{"type":"string","description":"Chunk ID where the relation starts."},"target_chunk_id":{"type":"string","description":"Chunk ID where the relation points."},"target_document_id":{"type":["string","null"],"description":"Document ID for the target chunk when known."},"target_status":{"type":"string","description":"Whether the target chunk could be resolved."},"relation_type":{"type":"string","description":"Application-defined relation label."},"metadata":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Application-supplied metadata for the relation."},"created_at":{"type":["string","null"],"description":"Relation creation timestamp."},"updated_at":{"type":["string","null"],"description":"Relation update timestamp."}},"required":["relation_id","source_chunk_id","target_chunk_id","target_status","relation_type","metadata"],"description":"Graph relation between chunks.","title":"ChunkRelation"},"RelatedChunk":{"type":"object","properties":{"chunk_id":{"type":"string"},"document_id":{"type":["string","null"]},"text":{"type":["string","null"]},"location":{"oneOf":[{"$ref":"#/components/schemas/FileSearchLocation"},{"type":"null"}]},"metadata":{"type":["object","null"],"additionalProperties":{"description":"Any type"}}},"required":["chunk_id"],"title":"RelatedChunk"},"DocumentChunk":{"type":"object","properties":{"chunk_id":{"type":"string"},"chunk_index":{"type":["integer","null"]},"content":{"type":"string","default":""},"location":{"oneOf":[{"$ref":"#/components/schemas/FileSearchLocation"},{"type":"null"}]},"regions":{"type":["array","null"],"items":{"$ref":"#/components/schemas/FileSearchRegion"}},"custom_metadata":{"type":["object","null"],"additionalProperties":{"description":"Any type"}},"relations":{"type":["array","null"],"items":{"$ref":"#/components/schemas/ChunkRelation"}},"related_chunks":{"type":["array","null"],"items":{"$ref":"#/components/schemas/RelatedChunk"}},"metadata":{"type":["object","null"],"additionalProperties":{"description":"Any type"}},"page_start":{"type":["integer","null"]},"page_end":{"type":["integer","null"]},"start_sec":{"type":["number","null"],"format":"double"},"end_sec":{"type":["number","null"],"format":"double"},"tokens":{"type":["integer","null"]},"category":{"type":["string","null"]},"parent_chunk_index":{"type":["integer","null"]}},"required":["chunk_id","content"],"description":"A chunk returned by the get-document endpoint.","title":"DocumentChunk"},"DocumentMetadata":{"type":"object","properties":{"created_at":{"type":["string","null"]},"file_size":{"type":["integer","null"]},"file_type":{"type":["string","null"]},"filename":{"type":["string","null"]},"indexed_at":{"type":["string","null"]},"indexing_status":{"type":["string","null"]},"mime_type":{"type":["string","null"]},"summary":{"type":["string","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"uri":{"type":["string","null"]},"custom_metadata":{"type":["object","null"],"additionalProperties":{"description":"Any type"}}},"title":"DocumentMetadata"},"GetDocumentResponse":{"type":"object","properties":{"chunk_count":{"type":"integer"},"chunks":{"type":"array","items":{"$ref":"#/components/schemas/DocumentChunk"}},"collection_name":{"type":"string"},"document_id":{"type":"string"},"metadata":{"$ref":"#/components/schemas/DocumentMetadata"},"regions":{"type":["array","null"],"items":{"$ref":"#/components/schemas/FileSearchRegion"}}},"required":["chunk_count","chunks","collection_name","document_id","metadata"],"title":"GetDocumentResponse"},"DocumentDeleteResponse":{"type":"object","properties":{"document_id":{"type":["string","null"]},"documents_deleted":{"type":["integer","null"]},"message":{"type":"string"},"success":{"type":"boolean"}},"required":["message","success"],"title":"DocumentDeleteResponse"},"UpdateChunkMetadataRequestV3":{"type":"object","properties":{"custom_metadata":{"type":"object","additionalProperties":{"description":"Any type"},"description":"The custom metadata object. Keys that Captain uses for its own chunk attributes are reserved and rejected with 400."},"metadata":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Deprecated alias for `custom_metadata`.","deprecated":true}},"description":"Custom metadata for one chunk or document. Send `custom_metadata`. The `metadata` key is a deprecated alias for the same object; sending both with different values is rejected with 400.","title":"UpdateChunkMetadataRequestV3"},"DocumentMetadataResponseV3":{"type":"object","properties":{"custom_metadata":{"type":"object","additionalProperties":{"description":"Any type"}},"document_id":{"type":"string"},"filterable":{"type":"boolean","default":false},"updated_at":{"type":["string","null"]}},"required":["document_id"],"description":"Response for the document-metadata write endpoints (CAP-659).","title":"DocumentMetadataResponseV3"},"BatchDocumentMetadataItemV3":{"type":"object","properties":{"item_id":{"type":"string","minLength":1,"description":"Non-empty string, unique within the request. Echoed on the matching result. Not an idempotency key."},"document_id":{"type":"string","description":"A document ID returned by an indexing job or the document list. Filenames and guessed IDs are not accepted."},"metadata":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Custom metadata for this item. Reserved keys are rejected the same way the single-item endpoint rejects them."}},"required":["item_id","document_id","metadata"],"title":"BatchDocumentMetadataItemV3"},"BatchDocumentMetadataRequestV3":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/BatchDocumentMetadataItemV3"},"description":"1 to 100 items. The request body may not exceed 1 MiB of UTF-8 JSON."}},"required":["items"],"description":"Always an object with one key, `items`, even for a single item. A bare item object is rejected with 400.","title":"BatchDocumentMetadataRequestV3"},"BatchDocumentMetadataSuccessV3Status":{"type":"string","enum":["succeeded"],"title":"BatchDocumentMetadataSuccessV3Status"},"BatchItemErrorV3":{"type":"object","properties":{"code":{"type":"string","description":"Stable error code. Item-level codes are the ones the matching single-item endpoint uses for the same failure, plus `outcome_unknown` and `relation_identity_ambiguous`."},"message":{"type":"string"}},"required":["code","message"],"title":"BatchItemErrorV3"},"BatchDocumentMetadataResultV3":{"oneOf":[{"type":"object","properties":{"status":{"$ref":"#/components/schemas/BatchDocumentMetadataSuccessV3Status"},"item_id":{"type":"string","description":"Echoed from the request item."},"http_status":{"type":"integer","description":"The status the matching single-item endpoint would have returned for this item."},"data":{"$ref":"#/components/schemas/DocumentMetadataResponseV3","description":"The same shape the single-item document metadata endpoints return, including `filterable`."}},"required":["status","item_id","http_status","data"],"description":"A succeeded item: carries `data` and never `error`."},{"type":"object","properties":{"status":{"type":"string","enum":["failed"],"description":"Discriminator value: failed"},"item_id":{"type":"string","description":"Echoed from the request item."},"http_status":{"type":"integer","description":"The status the matching single-item endpoint would have returned for this item."},"error":{"$ref":"#/components/schemas/BatchItemErrorV3"}},"required":["status","item_id","http_status","error"],"description":"A failed or unknown item: carries `error` and never `data`. `failed` is a definite failure; `unknown` (http_status 500, code `outcome_unknown`) means the write's outcome could not be confirmed, so read the target back before replaying."},{"type":"object","properties":{"status":{"type":"string","enum":["unknown"],"description":"Discriminator value: unknown"},"item_id":{"type":"string","description":"Echoed from the request item."},"http_status":{"type":"integer","description":"The status the matching single-item endpoint would have returned for this item."},"error":{"$ref":"#/components/schemas/BatchItemErrorV3"}},"required":["status","item_id","http_status","error"],"description":"A failed or unknown item: carries `error` and never `data`. `failed` is a definite failure; `unknown` (http_status 500, code `outcome_unknown`) means the write's outcome could not be confirmed, so read the target back before replaying."}],"discriminator":{"propertyName":"status"},"description":"One entry per request item, in request order. Exactly one of `data` (status `succeeded`) or `error` (status `failed` or `unknown`) is present; a result never carries both or neither.","title":"BatchDocumentMetadataResultV3"},"BatchDocumentMetadataResponseV3":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/BatchDocumentMetadataResultV3"},"description":"One result per request item, in request order. Never empty for an accepted batch."}},"required":["results"],"title":"BatchDocumentMetadataResponseV3"},"BatchRequestErrorV3":{"type":"object","properties":{"error":{"$ref":"#/components/schemas/BatchItemErrorV3"}},"required":["error"],"description":"Body of a request-level rejection. The whole request was refused before any write, so there is no `results` array.","title":"BatchRequestErrorV3"},"ListChunksResponseV3":{"type":"object","properties":{"collection_name":{"type":"string"},"document_id":{"type":"string"},"chunks":{"type":"array","items":{"$ref":"#/components/schemas/DocumentChunkV3"}},"total_results":{"type":"integer"},"limit":{"type":"integer"},"cursor":{"type":"integer","default":0},"next_cursor":{"type":["integer","null"]},"warnings":{"type":"array","items":{"type":"string"}}},"required":["collection_name","document_id","total_results","limit"],"title":"ListChunksResponseV3"},"GetChunkResponseV3":{"type":"object","properties":{"collection_name":{"type":"string"},"chunk":{"$ref":"#/components/schemas/DocumentChunkV3"},"warnings":{"type":"array","items":{"type":"string"}}},"required":["collection_name","chunk"],"title":"GetChunkResponseV3"},"ChunkMetadataResponseV3":{"type":"object","properties":{"chunk_id":{"type":"string"},"custom_metadata":{"type":"object","additionalProperties":{"description":"Any type"},"description":"The stored custom metadata object."},"metadata":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Deprecated alias for `custom_metadata`; carries the same object.","deprecated":true},"updated_at":{"type":["string","null"]},"filterable":{"type":"boolean","default":false,"description":"True when the metadata also reached the search index, so query filters can match it. False when the metadata is stored but filters may not match it yet."}},"required":["chunk_id"],"title":"ChunkMetadataResponseV3"},"DeleteChunkMetadataResponseV3":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}},"required":["success","message"],"title":"DeleteChunkMetadataResponseV3"},"BatchChunkMetadataItemV3":{"type":"object","properties":{"item_id":{"type":"string","minLength":1,"description":"Non-empty string, unique within the request. Echoed on the matching result. Not an idempotency key."},"chunk_id":{"type":"string","description":"A chunk ID returned by the chunk list or a query result."},"metadata":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Custom metadata for this item. Reserved keys are rejected the same way the single-item endpoint rejects them."}},"required":["item_id","chunk_id","metadata"],"title":"BatchChunkMetadataItemV3"},"BatchChunkMetadataRequestV3":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/BatchChunkMetadataItemV3"},"description":"1 to 100 items. The request body may not exceed 1 MiB of UTF-8 JSON."}},"required":["items"],"description":"Always an object with one key, `items`, even for a single item. A bare item object is rejected with 400.","title":"BatchChunkMetadataRequestV3"},"BatchChunkMetadataSuccessV3Status":{"type":"string","enum":["succeeded"],"title":"BatchChunkMetadataSuccessV3Status"},"BatchChunkMetadataResultV3":{"oneOf":[{"type":"object","properties":{"status":{"$ref":"#/components/schemas/BatchChunkMetadataSuccessV3Status"},"item_id":{"type":"string","description":"Echoed from the request item."},"http_status":{"type":"integer","description":"The status the matching single-item endpoint would have returned for this item."},"data":{"$ref":"#/components/schemas/ChunkMetadataResponseV3","description":"The same shape the single-item chunk metadata endpoints return, including `custom_metadata` and `filterable`."}},"required":["status","item_id","http_status","data"],"description":"A succeeded item: carries `data` and never `error`."},{"type":"object","properties":{"status":{"type":"string","enum":["failed"],"description":"Discriminator value: failed"},"item_id":{"type":"string","description":"Echoed from the request item."},"http_status":{"type":"integer","description":"The status the matching single-item endpoint would have returned for this item."},"error":{"$ref":"#/components/schemas/BatchItemErrorV3"}},"required":["status","item_id","http_status","error"],"description":"A failed or unknown item: carries `error` and never `data`. `failed` is a definite failure; `unknown` (http_status 500, code `outcome_unknown`) means the write's outcome could not be confirmed, so read the target back before replaying."},{"type":"object","properties":{"status":{"type":"string","enum":["unknown"],"description":"Discriminator value: unknown"},"item_id":{"type":"string","description":"Echoed from the request item."},"http_status":{"type":"integer","description":"The status the matching single-item endpoint would have returned for this item."},"error":{"$ref":"#/components/schemas/BatchItemErrorV3"}},"required":["status","item_id","http_status","error"],"description":"A failed or unknown item: carries `error` and never `data`. `failed` is a definite failure; `unknown` (http_status 500, code `outcome_unknown`) means the write's outcome could not be confirmed, so read the target back before replaying."}],"discriminator":{"propertyName":"status"},"description":"One entry per request item, in request order. Exactly one of `data` (status `succeeded`) or `error` (status `failed` or `unknown`) is present; a result never carries both or neither.","title":"BatchChunkMetadataResultV3"},"BatchChunkMetadataResponseV3":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/BatchChunkMetadataResultV3"},"description":"One result per request item, in request order. Never empty for an accepted batch."}},"required":["results"],"title":"BatchChunkMetadataResponseV3"},"V3CollectionsCollectionNameChunksChunkIdRelationsGetParametersRelationDirection":{"type":"string","enum":["outgoing","incoming","both"],"default":"outgoing","title":"V3CollectionsCollectionNameChunksChunkIdRelationsGetParametersRelationDirection"},"ChunkRelationListResponseV3":{"type":"object","properties":{"chunk_id":{"type":"string"},"relations":{"type":"array","items":{"$ref":"#/components/schemas/ChunkRelationFromV3"}}},"required":["chunk_id"],"title":"ChunkRelationListResponseV3"},"CreateChunkRelationRequestV3Metadata":{"type":"object","properties":{},"title":"CreateChunkRelationRequestV3Metadata"},"CreateChunkRelationRequestV3":{"type":"object","properties":{"target_chunk_id":{"type":"string"},"target_document_id":{"type":["string","null"]},"relation_type":{"type":"string"},"metadata":{"$ref":"#/components/schemas/CreateChunkRelationRequestV3Metadata"}},"required":["target_chunk_id","relation_type"],"title":"CreateChunkRelationRequestV3"},"ChunkRelationResponseV3":{"type":"object","properties":{"relation":{"$ref":"#/components/schemas/ChunkRelationFromV3"}},"required":["relation"],"title":"ChunkRelationResponseV3"},"DeleteChunkRelationResponseV3":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}},"required":["success","message"],"title":"DeleteChunkRelationResponseV3"},"BatchRelationUpsertItemV3":{"type":"object","properties":{"item_id":{"type":"string","minLength":1,"description":"Non-empty string, unique within the request. Echoed on the matching result. Not an idempotency key."},"source_chunk_id":{"type":"string","description":"Chunk ID where the relation starts."},"target_chunk_id":{"type":"string","description":"Chunk ID where the relation points. Must differ from `source_chunk_id`."},"relation_type":{"type":"string","minLength":1,"maxLength":255,"description":"Application-defined relation label. Part of the relation's identity together with the source and target chunk."},"metadata":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Required. On create, the relation's metadata. On update, replaces the existing relation's entire metadata object: omitted keys are removed, and `{}` clears it."},"target_document_id":{"type":["string","null"],"description":"Optional. When supplied, the document must contain the target chunk. It does not change the relation's identity."}},"required":["item_id","source_chunk_id","target_chunk_id","relation_type","metadata"],"title":"BatchRelationUpsertItemV3"},"BatchRelationUpsertRequestV3":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/BatchRelationUpsertItemV3"},"description":"1 to 100 items. The request body may not exceed 1 MiB of UTF-8 JSON."}},"required":["items"],"description":"Always an object with one key, `items`, even for a single item. A bare item object is rejected with 400.","title":"BatchRelationUpsertRequestV3"},"BatchRelationUpsertSuccessV3Status":{"type":"string","enum":["succeeded"],"title":"BatchRelationUpsertSuccessV3Status"},"BatchRelationUpsertResultV3":{"oneOf":[{"type":"object","properties":{"status":{"$ref":"#/components/schemas/BatchRelationUpsertSuccessV3Status"},"item_id":{"type":"string","description":"Echoed from the request item."},"http_status":{"type":"integer","description":"The status the matching single-item endpoint would have returned for this item."},"data":{"$ref":"#/components/schemas/ChunkRelationResponseV3","description":"The same `relation` object the single-item create endpoint returns."}},"required":["status","item_id","http_status","data"],"description":"A succeeded item: carries `data` and never `error`. `http_status` is 201 for a created relation and 200 for an updated one."},{"type":"object","properties":{"status":{"type":"string","enum":["failed"],"description":"Discriminator value: failed"},"item_id":{"type":"string","description":"Echoed from the request item."},"http_status":{"type":"integer","description":"The status the matching single-item endpoint would have returned for this item."},"error":{"$ref":"#/components/schemas/BatchItemErrorV3"}},"required":["status","item_id","http_status","error"],"description":"A failed or unknown item: carries `error` and never `data`. `failed` is a definite failure; `unknown` (http_status 500, code `outcome_unknown`) means the write's outcome could not be confirmed, so read the target back before replaying."},{"type":"object","properties":{"status":{"type":"string","enum":["unknown"],"description":"Discriminator value: unknown"},"item_id":{"type":"string","description":"Echoed from the request item."},"http_status":{"type":"integer","description":"The status the matching single-item endpoint would have returned for this item."},"error":{"$ref":"#/components/schemas/BatchItemErrorV3"}},"required":["status","item_id","http_status","error"],"description":"A failed or unknown item: carries `error` and never `data`. `failed` is a definite failure; `unknown` (http_status 500, code `outcome_unknown`) means the write's outcome could not be confirmed, so read the target back before replaying."}],"discriminator":{"propertyName":"status"},"description":"One entry per request item, in request order. Exactly one of `data` (status `succeeded`) or `error` (status `failed` or `unknown`) is present; a result never carries both or neither.","title":"BatchRelationUpsertResultV3"},"BatchRelationUpsertResponseV3":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/BatchRelationUpsertResultV3"},"description":"One result per request item, in request order. Never empty for an accepted batch."}},"required":["results"],"title":"BatchRelationUpsertResponseV3"},"S3SyncConnectorResponseDocsStorageType":{"type":"string","enum":["s3","gcs","r2","supabase","backblaze","azure"],"description":"The sync's cloud storage type. Returned by the list endpoint (GET /v2/syncs) only; other sync endpoints omit this field.","title":"S3SyncConnectorResponseDocsStorageType"},"S3SyncConnectorResponseDocsAuthMethod":{"type":"string","enum":["iam_role","access_key","service_account","account_key"],"description":"How the sync authenticates to the bucket: 'iam_role' (AWS cross-account assume-role), 'access_key' (S3-compatible key pair), or 'service_account' (GCS service-account JSON).","title":"S3SyncConnectorResponseDocsAuthMethod"},"S3SyncConnectorResponseDocsProcessingType":{"type":"string","enum":["advanced","basic"],"title":"S3SyncConnectorResponseDocsProcessingType"},"S3SyncConnectorResponseDocsDeletionPolicy":{"type":"string","enum":["mirror","archive","ignore"],"title":"S3SyncConnectorResponseDocsDeletionPolicy"},"S3SyncConnectorResponseDocsStatus":{"type":"string","enum":["active","paused","inactive"],"title":"S3SyncConnectorResponseDocsStatus"},"S3SyncConnectorResponseDocsSyncState":{"type":"string","enum":["idle","running","error"],"title":"S3SyncConnectorResponseDocsSyncState"},"S3SyncConnectorResponseDocs":{"type":"object","properties":{"sync_id":{"type":"string"},"collection_name":{"type":"string"},"bucket":{"type":"string"},"prefix":{"type":"string"},"region":{"type":"string"},"storage_type":{"$ref":"#/components/schemas/S3SyncConnectorResponseDocsStorageType","description":"The sync's cloud storage type. Returned by the list endpoint (GET /v2/syncs) only; other sync endpoints omit this field."},"auth_method":{"$ref":"#/components/schemas/S3SyncConnectorResponseDocsAuthMethod","description":"How the sync authenticates to the bucket: 'iam_role' (AWS cross-account assume-role), 'access_key' (S3-compatible key pair), or 'service_account' (GCS service-account JSON)."},"account_name":{"type":["string","null"],"description":"Azure Blob syncs only: the storage account name. Null for other providers."},"endpoint_url":{"type":["string","null"],"description":"S3-compatible endpoint URL (access-key syncs on non-AWS providers); null for AWS S3. Returned by the list endpoint (GET /v2/syncs) only; other sync endpoints omit this field."},"processing_type":{"$ref":"#/components/schemas/S3SyncConnectorResponseDocsProcessingType"},"include_patterns":{"type":"array","items":{"type":"string"}},"exclude_patterns":{"type":"array","items":{"type":"string"}},"deletion_policy":{"$ref":"#/components/schemas/S3SyncConnectorResponseDocsDeletionPolicy"},"status":{"$ref":"#/components/schemas/S3SyncConnectorResponseDocsStatus"},"secret_set":{"type":"boolean","description":"True once an event-webhook secret has been minted."},"sns_subscribe_url":{"type":["string","null"],"description":"SNS subscribe URL; only surfaced by the subscribe-webhook endpoint."},"last_backfill_job_id":{"type":["string","null"]},"last_reconcile_at":{"type":["string","null"]},"sync_interval_minutes":{"type":["integer","null"],"description":"Effective (already-clamped) cadence; null = manual."},"next_sync_at":{"type":["integer","null"],"description":"Epoch ms of the next due scheduled reconcile."},"sync_state":{"oneOf":[{"$ref":"#/components/schemas/S3SyncConnectorResponseDocsSyncState"},{"type":"null"}]},"last_sync_at":{"type":["integer","null"]},"last_sync_error":{"type":["string","null"]},"created_at":{"type":"string"},"updated_at":{"type":["string","null"]}},"title":"S3SyncConnectorResponseDocs"},"S3SyncListResponseDocs":{"type":"object","properties":{"connections":{"type":"array","items":{"$ref":"#/components/schemas/S3SyncConnectorResponseDocs"}}},"title":"S3SyncListResponseDocs"},"S3SyncUpdateRequestDocsDeletionPolicy":{"type":"string","enum":["mirror","archive","ignore"],"description":"New deletion-propagation policy.","title":"S3SyncUpdateRequestDocsDeletionPolicy"},"S3SyncUpdateRequestDocsStatus":{"type":"string","enum":["active","paused"],"description":"'paused' stops syncing without deleting the sync; 'active' resumes.","title":"S3SyncUpdateRequestDocsStatus"},"S3SyncUpdateRequestDocs":{"type":"object","properties":{"prefix":{"type":"string","description":"New key prefix to scope the sync."},"include_patterns":{"type":"array","items":{"type":"string"},"description":"Replacement include glob patterns."},"exclude_patterns":{"type":"array","items":{"type":"string"},"description":"Replacement exclude glob patterns."},"deletion_policy":{"$ref":"#/components/schemas/S3SyncUpdateRequestDocsDeletionPolicy","description":"New deletion-propagation policy."},"status":{"$ref":"#/components/schemas/S3SyncUpdateRequestDocsStatus","description":"'paused' stops syncing without deleting the sync; 'active' resumes."},"custom_metadata":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Replacement static metadata."},"sync_interval_minutes":{"type":["integer","null"],"description":"New cadence in minutes. MINIMUM 5 (below 5 clamps to 5; >=5 honored exactly). null = manual. Read the sync back for the effective value."},"account_key":{"type":["string","null"],"description":"Azure Blob syncs only: a new storage-account key (key1 or key2). Validated against the container before it replaces the stored key: the supported path for Azure key rotation. Rejected with 422 on non-Azure syncs. Never returned."}},"title":"S3SyncUpdateRequestDocs"},"S3SyncSubscribeRequestDocs":{"type":"object","properties":{"sns_topic_arn":{"type":["string","null"],"description":"ARN of your SNS topic that S3 event notifications are published to. Bound to the connector so events from this topic resolve here. AWS S3 only."},"rotate_secret":{"type":"boolean","default":false,"description":"Webhook providers (GCS/R2/Supabase/Backblaze/Azure) only: mint a FRESH webhook secret, revoking the current ingest_url. Use if the URL may have leaked. The response returns the new ingest_url; the old one stops working immediately. Re-point your provider's webhook at the new URL."}},"description":"Optional body. AWS S3 requires sns_topic_arn; webhook providers (GCS/R2/Supabase/Backblaze) enroll with an empty body.","title":"S3SyncSubscribeRequestDocs"},"S3SyncSubscribeResponseDocs":{"type":"object","properties":{"sync_id":{"type":"string"},"queue_arn":{"type":["string","null"],"description":"Captain's SQS queue ARN to subscribe your SNS topic to (AWS S3 real-time events). Subscribe your topic to this ARN; Captain consumes it directly (AWS-native, no HTTP endpoint). Null for webhook providers."},"topic_arn_bound":{"type":["string","null"],"description":"The SNS topic ARN bound to this connector (echoed back when provided). Null for webhook providers."},"ingest_url":{"type":["string","null"],"description":"Webhook-provider ingest URL (GCS push / R2 / Supabase / Backblaze): point the provider's change notifications at this URL. The URL embeds this connector's secret; keep it private. Null for AWS S3."},"secret_set":{"type":"boolean"},"instructions":{"type":"array","items":{"type":"string"},"description":"Provider-native setup steps for wiring real-time change events (S3: SNS -> Captain's SQS queue; webhook providers: pointing notifications at the ingest_url)."}},"title":"S3SyncSubscribeResponseDocs"},"S3SyncReconcileResponseDocs":{"type":"object","properties":{"sync_id":{"type":"string"},"job_id":{"type":["string","null"],"description":"Index job spawned for the deltas, if any."},"added":{"type":"integer"},"modified":{"type":"integer"},"removed":{"type":"integer"},"unchanged":{"type":"integer"},"deleted_documents":{"type":"integer","description":"Documents removed from the collection (mirror) or archived (archive) this pass."}},"title":"S3SyncReconcileResponseDocs"},"S3SyncDeleteResponseDocsStatus":{"type":"string","enum":["inactive"],"title":"S3SyncDeleteResponseDocsStatus"},"S3SyncDeleteResponseDocs":{"type":"object","properties":{"sync_id":{"type":"string"},"status":{"$ref":"#/components/schemas/S3SyncDeleteResponseDocsStatus"},"deactivated_at":{"type":"string"}},"title":"S3SyncDeleteResponseDocs"},"S3SyncCreateRequestDocsStorageType":{"type":"string","enum":["s3","r2","supabase","backblaze"],"default":"s3","description":"Cloud storage type. 's3' = AWS S3 (assume-role or access-key). 'r2'/'supabase'/'backblaze' are S3-compatible and require access-key auth with an endpoint_url.","title":"S3SyncCreateRequestDocsStorageType"},"S3SyncCreateRequestDocsAuth":{"type":"object","description":"Auth for reading the bucket: assume-role (AWS S3) or access-key (S3 or S3-compatible). Non-S3 stores require access-key auth.","title":"S3SyncCreateRequestDocsAuth"},"S3SyncCreateRequestDocsProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Parsing tier. 'advanced' = full document understanding; 'basic' = faster/cheaper.","title":"S3SyncCreateRequestDocsProcessingType"},"S3SyncCreateRequestDocsDeletionPolicy":{"type":"string","enum":["mirror","archive","ignore"],"default":"mirror","description":"How to propagate objects removed from the source: `mirror` removes them from the collection so they no longer appear in search; `archive` keeps the document's content but marks it archived, excluded from search by default and surfaced with `include_archived: true`; `ignore` leaves the indexed copy in place.","title":"S3SyncCreateRequestDocsDeletionPolicy"},"S3SyncCreateRequestDocs":{"type":"object","properties":{"bucket":{"type":"string","description":"Bucket to keep in sync with the collection."},"prefix":{"type":"string","default":"","description":"Key prefix to scope the sync (e.g. 'docs/2024/'). Empty syncs the whole bucket."},"region":{"type":"string","default":"us-east-1","description":"Region of the bucket (AWS region for S3, or the provider's region, e.g. 'auto' for R2, 'us-west-004' for Backblaze B2)."},"storage_type":{"$ref":"#/components/schemas/S3SyncCreateRequestDocsStorageType","default":"s3","description":"Cloud storage type. 's3' = AWS S3 (assume-role or access-key). 'r2'/'supabase'/'backblaze' are S3-compatible and require access-key auth with an endpoint_url."},"auth":{"$ref":"#/components/schemas/S3SyncCreateRequestDocsAuth","description":"Auth for reading the bucket: assume-role (AWS S3) or access-key (S3 or S3-compatible). Non-S3 stores require access-key auth."},"processing_type":{"$ref":"#/components/schemas/S3SyncCreateRequestDocsProcessingType","description":"Parsing tier. 'advanced' = full document understanding; 'basic' = faster/cheaper."},"include_patterns":{"type":"array","items":{"type":"string"},"description":"Glob patterns; only matching keys are synced. Empty includes everything under the prefix."},"exclude_patterns":{"type":"array","items":{"type":"string"},"description":"Glob patterns; matching keys are excluded."},"deletion_policy":{"$ref":"#/components/schemas/S3SyncCreateRequestDocsDeletionPolicy","default":"mirror","description":"How to propagate objects removed from the source: `mirror` removes them from the collection so they no longer appear in search; `archive` keeps the document's content but marks it archived, excluded from search by default and surfaced with `include_archived: true`; `ignore` leaves the indexed copy in place."},"metadata_mapping":{"type":["object","null"],"additionalProperties":{"type":"string"},"description":"Maps an S3 object tag/key to a Captain metadata field name."},"custom_metadata":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Static metadata applied to every synced document."},"sync_interval_minutes":{"type":["integer","null"],"description":"Scheduled reconcile cadence. MINIMUM 5 minutes (the scheduler ticks every 5 min); values below 5 are silently raised to 5; >=5 honored exactly. null/omitted = manual (events + on-demand only). For sub-5-min propagation use the event webhook."}},"required":["bucket","auth","processing_type"],"title":"S3SyncCreateRequestDocs"},"GcsSyncCreateRequestDocsProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Parsing tier. 'advanced' = full document understanding; 'basic' = faster/cheaper.","title":"GcsSyncCreateRequestDocsProcessingType"},"GcsSyncCreateRequestDocsDeletionPolicy":{"type":"string","enum":["mirror","archive","ignore"],"default":"mirror","description":"How to propagate objects removed from GCS: `mirror` removes them from the collection so they no longer appear in search; `archive` keeps the document's content but marks it archived, excluded from search by default and surfaced with `include_archived: true`; `ignore` leaves the indexed copy in place.","title":"GcsSyncCreateRequestDocsDeletionPolicy"},"GcsSyncCreateRequestDocsCustomMetadata":{"type":"object","properties":{},"description":"Static metadata applied to every synced document.","title":"GcsSyncCreateRequestDocsCustomMetadata"},"GCSSyncCreateRequestDocs":{"type":"object","properties":{"bucket":{"type":"string","description":"GCS bucket to keep in sync with the collection."},"prefix":{"type":"string","default":"","description":"Object-name prefix to scope the sync (e.g. 'docs/2024/'). Empty syncs the whole bucket."},"service_account_json":{"type":"string","description":"Google service-account key JSON (type='service_account') with read access to the bucket (roles/storage.objectViewer). Stored securely in Secrets Manager, never returned."},"processing_type":{"$ref":"#/components/schemas/GcsSyncCreateRequestDocsProcessingType","description":"Parsing tier. 'advanced' = full document understanding; 'basic' = faster/cheaper."},"include_patterns":{"type":"array","items":{"type":"string"},"description":"Glob patterns; only matching object names are synced."},"exclude_patterns":{"type":"array","items":{"type":"string"},"description":"Glob patterns; matching object names are excluded."},"deletion_policy":{"$ref":"#/components/schemas/GcsSyncCreateRequestDocsDeletionPolicy","default":"mirror","description":"How to propagate objects removed from GCS: `mirror` removes them from the collection so they no longer appear in search; `archive` keeps the document's content but marks it archived, excluded from search by default and surfaced with `include_archived: true`; `ignore` leaves the indexed copy in place."},"metadata_mapping":{"type":["object","null"],"additionalProperties":{"type":"string"},"description":"Maps a GCS object metadata key to a Captain metadata field name."},"custom_metadata":{"oneOf":[{"$ref":"#/components/schemas/GcsSyncCreateRequestDocsCustomMetadata"},{"type":"null"}],"description":"Static metadata applied to every synced document."},"sync_interval_minutes":{"type":["integer","null"],"description":"Scheduled reconcile cadence in minutes (minimum 5; below 5 clamps to 5; null = manual)."}},"required":["bucket","service_account_json","processing_type"],"description":"Create a Google Cloud Storage Sync. GCS authenticates with a service-account JSON (a single credential blob), not an access-key pair or an assume-role, so there is no auth, region, or endpoint_url here. The JSON is stored in Secrets Manager, never on the sync.","title":"GCSSyncCreateRequestDocs"},"AzureSyncCreateRequestDocsProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Parsing tier. 'advanced' = full document understanding; 'basic' = faster/cheaper.","title":"AzureSyncCreateRequestDocsProcessingType"},"AzureSyncCreateRequestDocsDeletionPolicy":{"type":"string","enum":["mirror","archive","ignore"],"default":"mirror","description":"How to propagate blobs removed from Azure: `mirror` removes them from the collection so they no longer appear in search; `archive` keeps the document's content but marks it archived, excluded from search by default and surfaced with `include_archived: true`; `ignore` leaves the indexed copy in place.","title":"AzureSyncCreateRequestDocsDeletionPolicy"},"AzureSyncCreateRequestDocsCustomMetadata":{"type":"object","properties":{},"description":"Static metadata applied to every synced document.","title":"AzureSyncCreateRequestDocsCustomMetadata"},"AzureSyncCreateRequestDocs":{"type":"object","properties":{"container":{"type":"string","description":"Azure Blob container to keep in sync with the collection (3-63 chars, lowercase letters, digits, single hyphens). Echoed as `bucket` in sync responses."},"account_name":{"type":"string","description":"Azure storage account name (the `<account>` in https://<account>.blob.core.windows.net; 3-24 lowercase letters and digits)."},"account_key":{"type":"string","description":"Storage account access key (key1 or key2) with read access to the container. Stored securely, never returned. Rotate later with PATCH /v2/syncs/{sync_id}."},"prefix":{"type":"string","default":"","description":"Object-name prefix to scope the sync (e.g. 'docs/2024/'). Empty syncs the whole bucket."},"processing_type":{"$ref":"#/components/schemas/AzureSyncCreateRequestDocsProcessingType","description":"Parsing tier. 'advanced' = full document understanding; 'basic' = faster/cheaper."},"include_patterns":{"type":"array","items":{"type":"string"},"description":"Glob patterns; only matching blob names are synced."},"exclude_patterns":{"type":"array","items":{"type":"string"},"description":"Glob patterns; matching blob names are excluded."},"deletion_policy":{"$ref":"#/components/schemas/AzureSyncCreateRequestDocsDeletionPolicy","default":"mirror","description":"How to propagate blobs removed from Azure: `mirror` removes them from the collection so they no longer appear in search; `archive` keeps the document's content but marks it archived, excluded from search by default and surfaced with `include_archived: true`; `ignore` leaves the indexed copy in place."},"metadata_mapping":{"type":["object","null"],"additionalProperties":{"type":"string"},"description":"Maps an Azure blob metadata key to a Captain metadata field name."},"custom_metadata":{"oneOf":[{"$ref":"#/components/schemas/AzureSyncCreateRequestDocsCustomMetadata"},{"type":"null"}],"description":"Static metadata applied to every synced document."},"sync_interval_minutes":{"type":["integer","null"],"default":60,"description":"Scheduled reconcile cadence in minutes (minimum 5; below 5 clamps to 5). Defaults to 60 for Azure so reconcile backstops any missed Event Grid delivery; null = manual (no scheduled reconcile)."}},"required":["container","account_name","account_key","processing_type"],"description":"Create an Azure Blob Storage Sync. Azure authenticates with the storage account's name and one of its two account keys, so there is no assume-role, region, or endpoint_url. The key is stored securely and never returned; rotate it later with PATCH /v2/syncs/{sync_id} (account_key). The container is echoed back as `bucket` in sync responses (the provider-generic container field).","title":"AzureSyncCreateRequestDocs"},"R2SyncCreateRequestDocsJurisdiction":{"type":"string","enum":["default","eu","fedramp","us"],"default":"default","description":"R2 jurisdiction; selects the endpoint.","title":"R2SyncCreateRequestDocsJurisdiction"},"R2SyncCreateRequestDocsProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Parsing tier.","title":"R2SyncCreateRequestDocsProcessingType"},"R2SyncCreateRequestDocsDeletionPolicy":{"type":"string","enum":["mirror","archive","ignore"],"default":"mirror","description":"How to propagate objects removed from the source: `mirror` removes them from the collection so they no longer appear in search; `archive` keeps the document's content but marks it archived, excluded from search by default and surfaced with `include_archived: true`; `ignore` leaves the indexed copy in place.","title":"R2SyncCreateRequestDocsDeletionPolicy"},"R2SyncCreateRequestDocs":{"type":"object","properties":{"bucket":{"type":"string","description":"Cloudflare R2 bucket to keep in sync with the collection."},"prefix":{"type":"string","default":"","description":"Key prefix to scope the sync. Empty syncs the whole bucket."},"account_id":{"type":"string","description":"Cloudflare account ID (from the R2 dashboard URL). Determines the endpoint."},"access_key_id":{"type":"string","description":"R2 S3 API token access key ID."},"secret_access_key":{"type":"string","description":"R2 S3 API token secret access key. Stored securely, never returned."},"jurisdiction":{"$ref":"#/components/schemas/R2SyncCreateRequestDocsJurisdiction","default":"default","description":"R2 jurisdiction; selects the endpoint."},"processing_type":{"$ref":"#/components/schemas/R2SyncCreateRequestDocsProcessingType","description":"Parsing tier."},"include_patterns":{"type":"array","items":{"type":"string"},"description":"Glob patterns; only matching keys are synced."},"exclude_patterns":{"type":"array","items":{"type":"string"},"description":"Glob patterns; matching keys are excluded."},"deletion_policy":{"$ref":"#/components/schemas/R2SyncCreateRequestDocsDeletionPolicy","default":"mirror","description":"How to propagate objects removed from the source: `mirror` removes them from the collection so they no longer appear in search; `archive` keeps the document's content but marks it archived, excluded from search by default and surfaced with `include_archived: true`; `ignore` leaves the indexed copy in place."},"custom_metadata":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Static metadata applied to every synced document."},"sync_interval_minutes":{"type":["integer","null"],"description":"Scheduled reconcile cadence (minimum 5; null = manual)."}},"required":["bucket","account_id","access_key_id","secret_access_key","processing_type"],"title":"R2SyncCreateRequestDocs"},"SupabaseSyncCreateRequestDocsProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Parsing tier.","title":"SupabaseSyncCreateRequestDocsProcessingType"},"SupabaseSyncCreateRequestDocsDeletionPolicy":{"type":"string","enum":["mirror","archive","ignore"],"default":"mirror","description":"How to propagate objects removed from the source: `mirror` removes them from the collection so they no longer appear in search; `archive` keeps the document's content but marks it archived, excluded from search by default and surfaced with `include_archived: true`; `ignore` leaves the indexed copy in place.","title":"SupabaseSyncCreateRequestDocsDeletionPolicy"},"SupabaseSyncCreateRequestDocs":{"type":"object","properties":{"bucket":{"type":"string","description":"Supabase Storage bucket to keep in sync with the collection."},"prefix":{"type":"string","default":"","description":"Key prefix to scope the sync. Empty syncs the whole bucket."},"endpoint_url":{"type":"string","description":"Supabase S3 endpoint, e.g. https://PROJECT_REF.storage.supabase.co/storage/v1/s3"},"region":{"type":"string","default":"us-east-1","description":"Region for the S3 protocol."},"access_key_id":{"type":"string","description":"Supabase S3 access key ID."},"secret_access_key":{"type":"string","description":"Supabase S3 secret access key. Stored securely, never returned."},"processing_type":{"$ref":"#/components/schemas/SupabaseSyncCreateRequestDocsProcessingType","description":"Parsing tier."},"include_patterns":{"type":"array","items":{"type":"string"},"description":"Glob patterns; only matching keys are synced."},"exclude_patterns":{"type":"array","items":{"type":"string"},"description":"Glob patterns; matching keys are excluded."},"deletion_policy":{"$ref":"#/components/schemas/SupabaseSyncCreateRequestDocsDeletionPolicy","default":"mirror","description":"How to propagate objects removed from the source: `mirror` removes them from the collection so they no longer appear in search; `archive` keeps the document's content but marks it archived, excluded from search by default and surfaced with `include_archived: true`; `ignore` leaves the indexed copy in place."},"custom_metadata":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Static metadata applied to every synced document."},"sync_interval_minutes":{"type":["integer","null"],"description":"Scheduled reconcile cadence (minimum 5; null = manual)."}},"required":["bucket","endpoint_url","access_key_id","secret_access_key","processing_type"],"title":"SupabaseSyncCreateRequestDocs"},"BackblazeSyncCreateRequestDocsProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Parsing tier.","title":"BackblazeSyncCreateRequestDocsProcessingType"},"BackblazeSyncCreateRequestDocsDeletionPolicy":{"type":"string","enum":["mirror","archive","ignore"],"default":"mirror","description":"How to propagate objects removed from the source: `mirror` removes them from the collection so they no longer appear in search; `archive` keeps the document's content but marks it archived, excluded from search by default and surfaced with `include_archived: true`; `ignore` leaves the indexed copy in place.","title":"BackblazeSyncCreateRequestDocsDeletionPolicy"},"BackblazeSyncCreateRequestDocs":{"type":"object","properties":{"bucket":{"type":"string","description":"Backblaze B2 bucket to keep in sync with the collection."},"prefix":{"type":"string","default":"","description":"Key prefix to scope the sync. Empty syncs the whole bucket."},"endpoint_url":{"type":"string","description":"Backblaze B2 S3 endpoint, e.g. https://s3.REGION.backblazeb2.com"},"region":{"type":"string","default":"us-east-1","description":"Region of the bucket (e.g. 'us-west-004'), matching the endpoint."},"access_key_id":{"type":"string","description":"Backblaze B2 Application Key ID (S3 access key ID)."},"secret_access_key":{"type":"string","description":"Backblaze B2 Application Key (S3 secret). Stored securely, never returned."},"processing_type":{"$ref":"#/components/schemas/BackblazeSyncCreateRequestDocsProcessingType","description":"Parsing tier."},"include_patterns":{"type":"array","items":{"type":"string"},"description":"Glob patterns; only matching keys are synced."},"exclude_patterns":{"type":"array","items":{"type":"string"},"description":"Glob patterns; matching keys are excluded."},"deletion_policy":{"$ref":"#/components/schemas/BackblazeSyncCreateRequestDocsDeletionPolicy","default":"mirror","description":"How to propagate objects removed from the source: `mirror` removes them from the collection so they no longer appear in search; `archive` keeps the document's content but marks it archived, excluded from search by default and surfaced with `include_archived: true`; `ignore` leaves the indexed copy in place."},"custom_metadata":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Static metadata applied to every synced document."},"sync_interval_minutes":{"type":["integer","null"],"description":"Scheduled reconcile cadence (minimum 5; null = manual)."}},"required":["bucket","endpoint_url","access_key_id","secret_access_key","processing_type"],"title":"BackblazeSyncCreateRequestDocs"},"S3AssumeRoleAuth":{"type":"object","properties":{"external_id":{"type":"string","description":"External ID Captain issued you when you enrolled the AWS integration. Prevents the confused-deputy problem — your role's trust policy must require this exact value via an sts:ExternalId condition."},"role_arn":{"type":"string","description":"ARN of the IAM role in your AWS account for Captain to assume (e.g. 'arn:aws:iam::123456789012:role/CaptainS3ReadRole'). The role's trust policy must allow Captain's principal and require the external_id below."},"type":{"type":"string","enum":["assume_role"],"description":"Auth type discriminator. Currently only 'assume_role' is supported."}},"required":["external_id","role_arn","type"],"title":"S3AssumeRoleAuth"},"IndexS3RequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexS3RequestCustomMetadata"},"IndexS3RequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexS3RequestProcessingType"},"IndexS3RequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexS3RequestPiiEngine"},"PIIField":{"type":"object","properties":{"name":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{1,39}$","minLength":2,"maxLength":40,"description":"Tag for this category. Uppercase letters, digits and underscores, 2 to 40 characters, unique within the request and not one of the built-in tags. Masked values are replaced with the tag in angle brackets (a field named EMPLOYEE_ID produces <EMPLOYEE_ID>) and the masking report lists them under this name."},"description":{"type":"string","minLength":1,"maxLength":300,"description":"What the category covers, in plain language, as you would explain it to a colleague. This is what decides whether a value is masked, so say what the values look like and where they appear."},"examples":{"type":["array","null"],"items":{"type":"string","maxLength":80},"description":"Up to 10 sample values, used only to make the description concrete. They are not a pattern: values that do not look like the examples are still masked when the description covers them."}},"required":["name","description"],"description":"A customer-defined PII category to mask in addition to the built-in ones.","title":"PIIField"},"IndexS3Request":{"type":"object","properties":{"auth":{"oneOf":[{"$ref":"#/components/schemas/S3AssumeRoleAuth"},{"type":"null"}],"description":"Cross-account role-assumption auth. When provided, Captain calls sts:AssumeRole on the supplied role_arn (with the supplied external_id) instead of using static IAM-user keys. No long-lived secrets cross the boundary; recommended for production. Mutually exclusive with aws_access_key_id/aws_secret_access_key."},"aws_access_key_id":{"type":["string","null"],"description":"AWS access key ID with read access to the bucket. Use this for long-lived IAM-user credentials. Omit when using the role-based 'auth' block."},"aws_secret_access_key":{"type":["string","null"],"description":"AWS secret access key. Use this for long-lived IAM-user credentials. Omit when using the role-based 'auth' block."},"bucket_name":{"type":"string"},"bucket_region":{"type":"string","default":"us-east-1"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexS3RequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"max_files":{"type":["integer","null"]},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"processing_type":{"$ref":"#/components/schemas/IndexS3RequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexS3RequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["bucket_name","processing_type"],"title":"IndexS3Request"},"IndexJobResponse":{"type":"object","properties":{"job_id":{"type":"string"},"status":{"type":"string","default":"pending"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"description":"Any type"},"description":"The custom_metadata Captain accepted for this job, echoed back as validated. Null when none was supplied."}},"required":["job_id"],"title":"IndexJobResponse"},"IndexS3FileRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexS3FileRequestCustomMetadata"},"IndexS3FileRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexS3FileRequestProcessingType"},"IndexS3FileRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexS3FileRequestPiiEngine"},"IndexS3FileRequest":{"type":"object","properties":{"auth":{"oneOf":[{"$ref":"#/components/schemas/S3AssumeRoleAuth"},{"type":"null"}],"description":"Cross-account role-assumption auth. When provided, Captain calls sts:AssumeRole on the supplied role_arn (with the supplied external_id) instead of using static IAM-user keys. Mutually exclusive with aws_access_key_id/aws_secret_access_key."},"aws_access_key_id":{"type":["string","null"],"description":"AWS access key ID with read access to the bucket. Use this for long-lived IAM-user credentials. Omit when using the role-based 'auth' block."},"aws_secret_access_key":{"type":["string","null"],"description":"AWS secret access key. Use this for long-lived IAM-user credentials. Omit when using the role-based 'auth' block."},"bucket_name":{"type":"string"},"bucket_region":{"type":"string","default":"us-east-1"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexS3FileRequestCustomMetadata"},"description":"Custom metadata to attach to all chunks from this file. Keys must be strings. Values: str, int, float, bool, or List[str]."},"file_uri":{"type":"string"},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"processing_type":{"$ref":"#/components/schemas/IndexS3FileRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"source_identity":{"type":["string","null"],"minLength":1,"maxLength":1024,"description":"Stable identity for this document, independent of where the object is read from. Indexing any location with the same source_identity updates the same document instead of creating another, and skip_existing matches on it. Defaults to the object's own URI. Opaque to Captain; one line, no newlines."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexS3FileRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["bucket_name","file_uri","processing_type"],"title":"IndexS3FileRequest"},"IndexS3DirectoryRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexS3DirectoryRequestCustomMetadata"},"IndexS3DirectoryRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexS3DirectoryRequestProcessingType"},"IndexS3DirectoryRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexS3DirectoryRequestPiiEngine"},"IndexS3DirectoryRequest":{"type":"object","properties":{"auth":{"oneOf":[{"$ref":"#/components/schemas/S3AssumeRoleAuth"},{"type":"null"}],"description":"Cross-account role-assumption auth. When provided, Captain calls sts:AssumeRole on the supplied role_arn (with the supplied external_id) instead of using static IAM-user keys. Mutually exclusive with aws_access_key_id/aws_secret_access_key."},"aws_access_key_id":{"type":["string","null"],"description":"AWS access key ID with read access to the bucket. Use this for long-lived IAM-user credentials. Omit when using the role-based 'auth' block."},"aws_secret_access_key":{"type":["string","null"],"description":"AWS secret access key. Use this for long-lived IAM-user credentials. Omit when using the role-based 'auth' block."},"bucket_name":{"type":"string"},"bucket_region":{"type":"string","default":"us-east-1"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexS3DirectoryRequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"directory_path":{"type":"string","description":"Path to the directory within the bucket. Accepts either a relative path (e.g., 'reports/2024/january') or a full S3 URI (e.g., 's3://my-bucket/reports/2024/january'). All files within this directory and its subdirectories will be indexed."},"max_files":{"type":["integer","null"]},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"processing_type":{"$ref":"#/components/schemas/IndexS3DirectoryRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexS3DirectoryRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["bucket_name","directory_path","processing_type"],"title":"IndexS3DirectoryRequest"},"IndexS3ManifestRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexS3ManifestRequestCustomMetadata"},"IndexS3ManifestRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexS3ManifestRequestPiiEngine"},"IndexS3ManifestRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexS3ManifestRequestProcessingType"},"IndexS3ManifestRequest":{"type":"object","properties":{"auth":{"oneOf":[{"$ref":"#/components/schemas/S3AssumeRoleAuth"},{"type":"null"}],"description":"Cross-account role-assumption auth. When provided, Captain calls sts:AssumeRole on the supplied role_arn (with the supplied external_id) instead of using static IAM-user keys. Mutually exclusive with aws_access_key_id/aws_secret_access_key."},"aws_access_key_id":{"type":["string","null"],"description":"AWS access key ID with read access to the bucket. Use this for long-lived IAM-user credentials. Omit when using the role-based 'auth' block."},"aws_secret_access_key":{"type":["string","null"],"description":"AWS secret access key. Use this for long-lived IAM-user credentials. Omit when using the role-based 'auth' block."},"bucket_name":{"type":"string"},"bucket_region":{"type":"string","default":"us-east-1"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexS3ManifestRequestCustomMetadata"},"description":"Custom metadata attached to every indexed chunk. A line's own custom_metadata is merged over it for that file. Keys are strings; values: str, int, float, bool, or List[str]."},"manifest_uri":{"type":"string","description":"S3 URI of the manifest, inside bucket_name (s3://bucket/path/manifest.jsonl). UTF-8 JSON Lines, uncompressed, one object per line: {\"uri\": ...} plus optional source_identity, custom_metadata, checksum, version_id, size and etag. Up to 1,000,000 lines, 500 MB total and 10 KB per line."},"mask_pii":{"type":"boolean","default":false,"description":"When true, mask detected PII (emails, names, SSNs, etc.) in parsed text before embedding and storing."},"max_files":{"type":["integer","null"],"minimum":1,"description":"Stop after this many manifest lines, in file order."},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection will be deleted and re-indexed with the latest changes. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"pii_engine":{"$ref":"#/components/schemas/IndexS3ManifestRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"processing_type":{"$ref":"#/components/schemas/IndexS3ManifestRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["bucket_name","manifest_uri","processing_type"],"title":"IndexS3ManifestRequest"},"IndexGcsRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexGcsRequestCustomMetadata"},"IndexGcsRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexGcsRequestProcessingType"},"IndexGcsRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexGcsRequestPiiEngine"},"IndexGCSRequest":{"type":"object","properties":{"bucket_name":{"type":"string"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexGcsRequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"max_files":{"type":["integer","null"]},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"processing_type":{"$ref":"#/components/schemas/IndexGcsRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"service_account_json":{"type":"string"},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexGcsRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["bucket_name","processing_type","service_account_json"],"title":"IndexGCSRequest"},"IndexGcsFileRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexGcsFileRequestCustomMetadata"},"IndexGcsFileRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexGcsFileRequestProcessingType"},"IndexGcsFileRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexGcsFileRequestPiiEngine"},"IndexGCSFileRequest":{"type":"object","properties":{"bucket_name":{"type":"string"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexGcsFileRequestCustomMetadata"},"description":"Custom metadata to attach to all chunks from this file. Keys must be strings. Values: str, int, float, bool, or List[str]."},"file_uri":{"type":"string"},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"processing_type":{"$ref":"#/components/schemas/IndexGcsFileRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"service_account_json":{"type":"string"},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"source_identity":{"type":["string","null"],"minLength":1,"maxLength":1024,"description":"Stable identity for this document, independent of where the object is read from. Indexing any location with the same source_identity updates the same document instead of creating another, and skip_existing matches on it. Defaults to the object's own URI. Opaque to Captain; one line, no newlines."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexGcsFileRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["bucket_name","file_uri","processing_type","service_account_json"],"title":"IndexGCSFileRequest"},"IndexGcsDirectoryRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexGcsDirectoryRequestCustomMetadata"},"IndexGcsDirectoryRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexGcsDirectoryRequestProcessingType"},"IndexGcsDirectoryRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexGcsDirectoryRequestPiiEngine"},"IndexGCSDirectoryRequest":{"type":"object","properties":{"bucket_name":{"type":"string"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexGcsDirectoryRequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"directory_path":{"type":"string","description":"Path to the directory within the bucket. Accepts either a relative path (e.g., 'reports/2024/january') or a full GCS URI (e.g., 'gs://my-bucket/reports/2024/january'). All files within this directory and its subdirectories will be indexed."},"max_files":{"type":["integer","null"]},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"processing_type":{"$ref":"#/components/schemas/IndexGcsDirectoryRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"service_account_json":{"type":"string"},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexGcsDirectoryRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["bucket_name","directory_path","processing_type","service_account_json"],"title":"IndexGCSDirectoryRequest"},"IndexGcsManifestRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexGcsManifestRequestCustomMetadata"},"IndexGcsManifestRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexGcsManifestRequestPiiEngine"},"IndexGcsManifestRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexGcsManifestRequestProcessingType"},"IndexGCSManifestRequest":{"type":"object","properties":{"bucket_name":{"type":"string"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexGcsManifestRequestCustomMetadata"},"description":"Custom metadata attached to every indexed chunk. A line's own custom_metadata is merged over it for that file. Keys are strings; values: str, int, float, bool, or List[str]."},"manifest_uri":{"type":"string","description":"GCS URI of the manifest, inside bucket_name (gs://bucket/path/manifest.jsonl). UTF-8 JSON Lines, uncompressed, one object per line: {\"uri\": ...} plus optional source_identity, custom_metadata, checksum, version_id, size and etag. Up to 1,000,000 lines, 500 MB total and 10 KB per line."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"max_files":{"type":["integer","null"],"minimum":1,"description":"Stop after this many manifest lines, in file order."},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"pii_engine":{"$ref":"#/components/schemas/IndexGcsManifestRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"processing_type":{"$ref":"#/components/schemas/IndexGcsManifestRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"service_account_json":{"type":"string"},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["bucket_name","manifest_uri","processing_type","service_account_json"],"title":"IndexGCSManifestRequest"},"IndexAzureRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexAzureRequestCustomMetadata"},"IndexAzureRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexAzureRequestProcessingType"},"IndexAzureRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexAzureRequestPiiEngine"},"IndexAzureRequest":{"type":"object","properties":{"account_key":{"type":"string"},"account_name":{"type":"string"},"container_name":{"type":"string"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexAzureRequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"max_files":{"type":["integer","null"]},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"processing_type":{"$ref":"#/components/schemas/IndexAzureRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexAzureRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["account_key","account_name","container_name","processing_type"],"title":"IndexAzureRequest"},"IndexAzureFileRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexAzureFileRequestCustomMetadata"},"IndexAzureFileRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexAzureFileRequestProcessingType"},"IndexAzureFileRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexAzureFileRequestPiiEngine"},"IndexAzureFileRequest":{"type":"object","properties":{"account_key":{"type":"string"},"account_name":{"type":"string"},"container_name":{"type":"string"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexAzureFileRequestCustomMetadata"},"description":"Custom metadata to attach to all chunks from this file. Keys must be strings. Values: str, int, float, bool, or List[str]."},"file_uri":{"type":"string"},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"processing_type":{"$ref":"#/components/schemas/IndexAzureFileRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"source_identity":{"type":["string","null"],"minLength":1,"maxLength":1024,"description":"Stable identity for this document, independent of where the object is read from. Indexing any location with the same source_identity updates the same document instead of creating another, and skip_existing matches on it. Defaults to the object's own URI. Opaque to Captain; one line, no newlines."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexAzureFileRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["account_key","account_name","container_name","file_uri","processing_type"],"title":"IndexAzureFileRequest"},"IndexAzureDirectoryRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexAzureDirectoryRequestCustomMetadata"},"IndexAzureDirectoryRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexAzureDirectoryRequestProcessingType"},"IndexAzureDirectoryRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexAzureDirectoryRequestPiiEngine"},"IndexAzureDirectoryRequest":{"type":"object","properties":{"account_key":{"type":"string"},"account_name":{"type":"string"},"container_name":{"type":"string"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexAzureDirectoryRequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"directory_path":{"type":"string","description":"Path to the directory within the container. Accepts either a relative path (e.g., 'reports/2024/january') or a full Azure Blob URI (e.g., 'https://account.blob.core.windows.net/container/reports/2024/january'). All blobs within this prefix will be indexed."},"max_files":{"type":["integer","null"]},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"processing_type":{"$ref":"#/components/schemas/IndexAzureDirectoryRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexAzureDirectoryRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["account_key","account_name","container_name","directory_path","processing_type"],"title":"IndexAzureDirectoryRequest"},"IndexAzureManifestRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexAzureManifestRequestCustomMetadata"},"IndexAzureManifestRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexAzureManifestRequestPiiEngine"},"IndexAzureManifestRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexAzureManifestRequestProcessingType"},"IndexAzureManifestRequest":{"type":"object","properties":{"account_key":{"type":"string"},"account_name":{"type":"string"},"container_name":{"type":"string"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexAzureManifestRequestCustomMetadata"},"description":"Custom metadata attached to every indexed chunk. A line's own custom_metadata is merged over it for that file. Keys are strings; values: str, int, float, bool, or List[str]."},"manifest_uri":{"type":"string","description":"URL of the manifest blob, inside container_name (https://{account}.blob.core.windows.net/{container}/path/manifest.jsonl). UTF-8 JSON Lines, uncompressed, one object per line: {\"uri\": ...} plus optional source_identity, custom_metadata, checksum, version_id, size and etag. Up to 1,000,000 lines, 500 MB total and 10 KB per line."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"max_files":{"type":["integer","null"],"minimum":1,"description":"Stop after this many manifest lines, in file order."},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"pii_engine":{"$ref":"#/components/schemas/IndexAzureManifestRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"processing_type":{"$ref":"#/components/schemas/IndexAzureManifestRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["account_key","account_name","container_name","manifest_uri","processing_type"],"title":"IndexAzureManifestRequest"},"IndexR2RequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexR2RequestCustomMetadata"},"IndexR2RequestJurisdiction":{"type":"string","enum":["default","eu","fedramp","us"],"default":"default","description":"R2 jurisdiction. 'default' for global, 'eu' for EU-only, 'fedramp' for FedRAMP, 'us' for US-only. Determines the S3-compatible endpoint URL.","title":"IndexR2RequestJurisdiction"},"IndexR2RequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexR2RequestProcessingType"},"IndexR2RequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexR2RequestPiiEngine"},"IndexR2Request":{"type":"object","properties":{"access_key_id":{"type":"string","description":"R2 S3 API token access key ID"},"account_id":{"type":"string","description":"Cloudflare account ID (found in R2 dashboard URL)"},"bucket_name":{"type":"string"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexR2RequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"jurisdiction":{"oneOf":[{"$ref":"#/components/schemas/IndexR2RequestJurisdiction"},{"type":"null"}],"default":"default","description":"R2 jurisdiction. 'default' for global, 'eu' for EU-only, 'fedramp' for FedRAMP, 'us' for US-only. Determines the S3-compatible endpoint URL."},"max_files":{"type":["integer","null"]},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"processing_type":{"$ref":"#/components/schemas/IndexR2RequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"secret_access_key":{"type":"string","description":"R2 S3 API token secret access key"},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexR2RequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["access_key_id","account_id","bucket_name","processing_type","secret_access_key"],"title":"IndexR2Request"},"IndexR2FileRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexR2FileRequestCustomMetadata"},"IndexR2FileRequestJurisdiction":{"type":"string","enum":["default","eu","fedramp","us"],"default":"default","title":"IndexR2FileRequestJurisdiction"},"IndexR2FileRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexR2FileRequestProcessingType"},"IndexR2FileRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexR2FileRequestPiiEngine"},"IndexR2FileRequest":{"type":"object","properties":{"access_key_id":{"type":"string"},"account_id":{"type":"string"},"bucket_name":{"type":"string"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexR2FileRequestCustomMetadata"},"description":"Custom metadata to attach to all chunks from this file. Keys must be strings. Values: str, int, float, bool, or List[str]."},"file_uri":{"type":"string","description":"R2 object URI in the format r2://bucket-name/path/to/file.pdf"},"jurisdiction":{"oneOf":[{"$ref":"#/components/schemas/IndexR2FileRequestJurisdiction"},{"type":"null"}],"default":"default"},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"processing_type":{"$ref":"#/components/schemas/IndexR2FileRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"secret_access_key":{"type":"string"},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"source_identity":{"type":["string","null"],"minLength":1,"maxLength":1024,"description":"Stable identity for this document, independent of where the object is read from. Indexing any location with the same source_identity updates the same document instead of creating another, and skip_existing matches on it. Defaults to the object's own URI. Opaque to Captain; one line, no newlines."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexR2FileRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["access_key_id","account_id","bucket_name","file_uri","processing_type","secret_access_key"],"title":"IndexR2FileRequest"},"IndexR2DirectoryRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexR2DirectoryRequestCustomMetadata"},"IndexR2DirectoryRequestJurisdiction":{"type":"string","enum":["default","eu","fedramp","us"],"default":"default","title":"IndexR2DirectoryRequestJurisdiction"},"IndexR2DirectoryRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexR2DirectoryRequestProcessingType"},"IndexR2DirectoryRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexR2DirectoryRequestPiiEngine"},"IndexR2DirectoryRequest":{"type":"object","properties":{"access_key_id":{"type":"string"},"account_id":{"type":"string"},"bucket_name":{"type":"string"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexR2DirectoryRequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"directory_path":{"type":"string","description":"Path to the directory within the bucket. Accepts either a relative path (e.g., 'reports/2024/january') or a full R2 URI (e.g., 'r2://my-bucket/reports/2024/january'). All files within this directory and its subdirectories will be indexed."},"jurisdiction":{"oneOf":[{"$ref":"#/components/schemas/IndexR2DirectoryRequestJurisdiction"},{"type":"null"}],"default":"default"},"max_files":{"type":["integer","null"]},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"processing_type":{"$ref":"#/components/schemas/IndexR2DirectoryRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"secret_access_key":{"type":"string"},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexR2DirectoryRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["access_key_id","account_id","bucket_name","directory_path","processing_type","secret_access_key"],"title":"IndexR2DirectoryRequest"},"IndexR2ManifestRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexR2ManifestRequestCustomMetadata"},"IndexR2ManifestRequestJurisdiction":{"type":"string","enum":["default","eu","fedramp","us"],"default":"default","title":"IndexR2ManifestRequestJurisdiction"},"IndexR2ManifestRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexR2ManifestRequestPiiEngine"},"IndexR2ManifestRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexR2ManifestRequestProcessingType"},"IndexR2ManifestRequest":{"type":"object","properties":{"access_key_id":{"type":"string"},"account_id":{"type":"string"},"bucket_name":{"type":"string"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexR2ManifestRequestCustomMetadata"},"description":"Custom metadata attached to every indexed chunk. A line's own custom_metadata is merged over it for that file. Keys are strings; values: str, int, float, bool, or List[str]."},"jurisdiction":{"oneOf":[{"$ref":"#/components/schemas/IndexR2ManifestRequestJurisdiction"},{"type":"null"}],"default":"default"},"manifest_uri":{"type":"string","description":"URI of the manifest, inside bucket_name (r2://bucket/path/manifest.jsonl or s3://bucket/path/manifest.jsonl). UTF-8 JSON Lines, uncompressed, one object per line: {\"uri\": ...} plus optional source_identity, custom_metadata, checksum, version_id, size and etag. Up to 1,000,000 lines, 500 MB total and 10 KB per line."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"max_files":{"type":["integer","null"],"minimum":1,"description":"Stop after this many manifest lines, in file order."},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"pii_engine":{"$ref":"#/components/schemas/IndexR2ManifestRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"processing_type":{"$ref":"#/components/schemas/IndexR2ManifestRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"secret_access_key":{"type":"string"},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["access_key_id","account_id","bucket_name","manifest_uri","processing_type","secret_access_key"],"title":"IndexR2ManifestRequest"},"IndexSupabaseRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexSupabaseRequestCustomMetadata"},"IndexSupabaseRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexSupabaseRequestProcessingType"},"IndexSupabaseRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexSupabaseRequestPiiEngine"},"IndexSupabaseRequest":{"type":"object","properties":{"access_key_id":{"type":"string","description":"Supabase S3 access key ID (Storage → S3 Connection → access key)."},"bucket_name":{"type":"string"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexSupabaseRequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"endpoint_url":{"type":"string","description":"S3-compatible endpoint URL for your Supabase project's Storage S3 connection, e.g. https://{project_ref}.storage.supabase.co/storage/v1/s3 (Storage → S3 Connection). Required."},"max_files":{"type":["integer","null"]},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"processing_type":{"$ref":"#/components/schemas/IndexSupabaseRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"region":{"type":"string","default":"us-east-1","description":"Region configured for your Supabase project's S3 endpoint (Storage → S3 Connection). Required by the S3 protocol; defaults to 'us-east-1'."},"secret_access_key":{"type":"string","description":"Supabase S3 secret access key (shown once when the S3 access key is created)."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexSupabaseRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["access_key_id","bucket_name","endpoint_url","processing_type","secret_access_key"],"title":"IndexSupabaseRequest"},"IndexSupabaseFileRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexSupabaseFileRequestCustomMetadata"},"IndexSupabaseFileRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexSupabaseFileRequestProcessingType"},"IndexSupabaseFileRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexSupabaseFileRequestPiiEngine"},"IndexSupabaseFileRequest":{"type":"object","properties":{"access_key_id":{"type":"string","description":"Supabase S3 access key ID (Storage → S3 Connection → access key)."},"bucket_name":{"type":"string"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexSupabaseFileRequestCustomMetadata"},"description":"Custom metadata to attach to all chunks from this file. Keys must be strings. Values: str, int, float, bool, or List[str]."},"endpoint_url":{"type":"string","description":"S3-compatible endpoint URL for your Supabase project's Storage S3 connection, e.g. https://{project_ref}.storage.supabase.co/storage/v1/s3 (Storage → S3 Connection). Required."},"file_uri":{"type":"string","description":"Path to the object within the bucket, e.g. 'reports/annual-review.pdf'."},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"processing_type":{"$ref":"#/components/schemas/IndexSupabaseFileRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"region":{"type":"string","default":"us-east-1","description":"Region configured for your Supabase project's S3 endpoint (Storage → S3 Connection). Required by the S3 protocol; defaults to 'us-east-1'."},"secret_access_key":{"type":"string","description":"Supabase S3 secret access key (shown once when the S3 access key is created)."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"source_identity":{"type":["string","null"],"minLength":1,"maxLength":1024,"description":"Stable identity for this document, independent of where the object is read from. Indexing any location with the same source_identity updates the same document instead of creating another, and skip_existing matches on it. Defaults to the object's own URI. Opaque to Captain; one line, no newlines."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexSupabaseFileRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["access_key_id","bucket_name","endpoint_url","file_uri","processing_type","secret_access_key"],"title":"IndexSupabaseFileRequest"},"IndexSupabaseDirectoryRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexSupabaseDirectoryRequestCustomMetadata"},"IndexSupabaseDirectoryRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexSupabaseDirectoryRequestProcessingType"},"IndexSupabaseDirectoryRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexSupabaseDirectoryRequestPiiEngine"},"IndexSupabaseDirectoryRequest":{"type":"object","properties":{"access_key_id":{"type":"string","description":"Supabase S3 access key ID (Storage → S3 Connection → access key)."},"bucket_name":{"type":"string"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexSupabaseDirectoryRequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"directory_path":{"type":"string","description":"Path to the directory within the bucket (e.g., 'reports/2024/january'). All files within this directory and its subdirectories will be indexed."},"endpoint_url":{"type":"string","description":"S3-compatible endpoint URL for your Supabase project's Storage S3 connection, e.g. https://{project_ref}.storage.supabase.co/storage/v1/s3 (Storage → S3 Connection). Required."},"max_files":{"type":["integer","null"]},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"processing_type":{"$ref":"#/components/schemas/IndexSupabaseDirectoryRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"region":{"type":"string","default":"us-east-1","description":"Region configured for your Supabase project's S3 endpoint (Storage → S3 Connection). Required by the S3 protocol; defaults to 'us-east-1'."},"secret_access_key":{"type":"string","description":"Supabase S3 secret access key (shown once when the S3 access key is created)."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexSupabaseDirectoryRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["access_key_id","bucket_name","directory_path","endpoint_url","processing_type","secret_access_key"],"title":"IndexSupabaseDirectoryRequest"},"IndexSupabaseManifestRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexSupabaseManifestRequestCustomMetadata"},"IndexSupabaseManifestRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexSupabaseManifestRequestPiiEngine"},"IndexSupabaseManifestRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexSupabaseManifestRequestProcessingType"},"IndexSupabaseManifestRequest":{"type":"object","properties":{"access_key_id":{"type":"string","description":"Supabase S3 access key ID (Storage → S3 Connection → access key)."},"bucket_name":{"type":"string"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexSupabaseManifestRequestCustomMetadata"},"description":"Custom metadata attached to every indexed chunk. A line's own custom_metadata is merged over it for that file. Keys are strings; values: str, int, float, bool, or List[str]."},"endpoint_url":{"type":"string","description":"S3-compatible endpoint URL for your Supabase project's Storage S3 connection, e.g. https://{project_ref}.storage.supabase.co/storage/v1/s3 (Storage → S3 Connection). Required."},"manifest_uri":{"type":"string","description":"URI of the manifest, inside bucket_name (s3://bucket/path/manifest.jsonl or supabase://bucket/path/manifest.jsonl). UTF-8 JSON Lines, uncompressed, one object per line: {\"uri\": ...} plus optional source_identity, custom_metadata, checksum, version_id, size and etag. Up to 1,000,000 lines, 500 MB total and 10 KB per line."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"max_files":{"type":["integer","null"],"minimum":1,"description":"Stop after this many manifest lines, in file order."},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"pii_engine":{"$ref":"#/components/schemas/IndexSupabaseManifestRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"processing_type":{"$ref":"#/components/schemas/IndexSupabaseManifestRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"region":{"type":"string","default":"us-east-1","description":"Region configured for your Supabase project's S3 endpoint (Storage → S3 Connection). Required by the S3 protocol; defaults to 'us-east-1'."},"secret_access_key":{"type":"string","description":"Supabase S3 secret access key (shown once when the S3 access key is created)."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["access_key_id","bucket_name","endpoint_url","manifest_uri","processing_type","secret_access_key"],"title":"IndexSupabaseManifestRequest"},"IndexBackblazeRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexBackblazeRequestCustomMetadata"},"IndexBackblazeRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexBackblazeRequestProcessingType"},"IndexBackblazeRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexBackblazeRequestPiiEngine"},"IndexBackblazeRequest":{"type":"object","properties":{"access_key_id":{"type":"string","description":"Backblaze B2 Application Key ID (used as the S3 access key ID). Create one on the App Keys page — the master application key cannot be used with the S3-compatible API."},"bucket_name":{"type":"string"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexBackblazeRequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"endpoint_url":{"type":"string","description":"S3-compatible endpoint URL for your Backblaze B2 bucket, in the form https://s3.{region}.backblazeb2.com (e.g. https://s3.us-west-004.backblazeb2.com). Required."},"max_files":{"type":["integer","null"]},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"processing_type":{"$ref":"#/components/schemas/IndexBackblazeRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"region":{"type":"string","default":"us-east-1","description":"Region of your Backblaze B2 bucket (e.g. 'us-west-004'), matching the endpoint URL. Required by the S3 protocol; defaults to 'us-east-1'."},"secret_access_key":{"type":"string","description":"Backblaze B2 Application Key (used as the S3 secret access key; shown once when the key is created)."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexBackblazeRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["access_key_id","bucket_name","endpoint_url","processing_type","secret_access_key"],"title":"IndexBackblazeRequest"},"IndexBackblazeFileRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexBackblazeFileRequestCustomMetadata"},"IndexBackblazeFileRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexBackblazeFileRequestProcessingType"},"IndexBackblazeFileRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexBackblazeFileRequestPiiEngine"},"IndexBackblazeFileRequest":{"type":"object","properties":{"access_key_id":{"type":"string","description":"Backblaze B2 Application Key ID (used as the S3 access key ID). Create one on the App Keys page — the master application key cannot be used with the S3-compatible API."},"bucket_name":{"type":"string"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexBackblazeFileRequestCustomMetadata"},"description":"Custom metadata to attach to all chunks from this file. Keys must be strings. Values: str, int, float, bool, or List[str]."},"endpoint_url":{"type":"string","description":"S3-compatible endpoint URL for your Backblaze B2 bucket, in the form https://s3.{region}.backblazeb2.com (e.g. https://s3.us-west-004.backblazeb2.com). Required."},"file_uri":{"type":"string","description":"Object key within the bucket, e.g. 'reports/annual-review.pdf'. A full s3://bucket/key URI is also accepted."},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"processing_type":{"$ref":"#/components/schemas/IndexBackblazeFileRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"region":{"type":"string","default":"us-east-1","description":"Region of your Backblaze B2 bucket (e.g. 'us-west-004'), matching the endpoint URL. Required by the S3 protocol; defaults to 'us-east-1'."},"secret_access_key":{"type":"string","description":"Backblaze B2 Application Key (used as the S3 secret access key; shown once when the key is created)."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"source_identity":{"type":["string","null"],"minLength":1,"maxLength":1024,"description":"Stable identity for this document, independent of where the object is read from. Indexing any location with the same source_identity updates the same document instead of creating another, and skip_existing matches on it. Defaults to the object's own URI. Opaque to Captain; one line, no newlines."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexBackblazeFileRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["access_key_id","bucket_name","endpoint_url","file_uri","processing_type","secret_access_key"],"title":"IndexBackblazeFileRequest"},"IndexBackblazeDirectoryRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexBackblazeDirectoryRequestCustomMetadata"},"IndexBackblazeDirectoryRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexBackblazeDirectoryRequestProcessingType"},"IndexBackblazeDirectoryRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexBackblazeDirectoryRequestPiiEngine"},"IndexBackblazeDirectoryRequest":{"type":"object","properties":{"access_key_id":{"type":"string","description":"Backblaze B2 Application Key ID (used as the S3 access key ID). Create one on the App Keys page — the master application key cannot be used with the S3-compatible API."},"bucket_name":{"type":"string"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexBackblazeDirectoryRequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"directory_path":{"type":"string","description":"Path to the directory within the bucket (e.g., 'reports/2024/january'). All files within this directory and its subdirectories will be indexed."},"endpoint_url":{"type":"string","description":"S3-compatible endpoint URL for your Backblaze B2 bucket, in the form https://s3.{region}.backblazeb2.com (e.g. https://s3.us-west-004.backblazeb2.com). Required."},"max_files":{"type":["integer","null"]},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"processing_type":{"$ref":"#/components/schemas/IndexBackblazeDirectoryRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"region":{"type":"string","default":"us-east-1","description":"Region of your Backblaze B2 bucket (e.g. 'us-west-004'), matching the endpoint URL. Required by the S3 protocol; defaults to 'us-east-1'."},"secret_access_key":{"type":"string","description":"Backblaze B2 Application Key (used as the S3 secret access key; shown once when the key is created)."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexBackblazeDirectoryRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["access_key_id","bucket_name","directory_path","endpoint_url","processing_type","secret_access_key"],"title":"IndexBackblazeDirectoryRequest"},"IndexBackblazeManifestRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexBackblazeManifestRequestCustomMetadata"},"IndexBackblazeManifestRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexBackblazeManifestRequestPiiEngine"},"IndexBackblazeManifestRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexBackblazeManifestRequestProcessingType"},"IndexBackblazeManifestRequest":{"type":"object","properties":{"access_key_id":{"type":"string","description":"Backblaze B2 Application Key ID (used as the S3 access key ID). Create one on the App Keys page — the master application key cannot be used with the S3-compatible API."},"bucket_name":{"type":"string"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexBackblazeManifestRequestCustomMetadata"},"description":"Custom metadata attached to every indexed chunk. A line's own custom_metadata is merged over it for that file. Keys are strings; values: str, int, float, bool, or List[str]."},"endpoint_url":{"type":"string","description":"S3-compatible endpoint URL for your Backblaze B2 bucket, in the form https://s3.{region}.backblazeb2.com (e.g. https://s3.us-west-004.backblazeb2.com). Required."},"manifest_uri":{"type":"string","description":"S3 URI of the manifest, inside bucket_name (s3://bucket/path/manifest.jsonl). UTF-8 JSON Lines, uncompressed, one object per line: {\"uri\": ...} plus optional source_identity, custom_metadata, checksum, version_id, size and etag. Up to 1,000,000 lines, 500 MB total and 10 KB per line."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"max_files":{"type":["integer","null"],"minimum":1,"description":"Stop after this many manifest lines, in file order."},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"pii_engine":{"$ref":"#/components/schemas/IndexBackblazeManifestRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"processing_type":{"$ref":"#/components/schemas/IndexBackblazeManifestRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"region":{"type":"string","default":"us-east-1","description":"Region of your Backblaze B2 bucket (e.g. 'us-west-004'), matching the endpoint URL. Required by the S3 protocol; defaults to 'us-east-1'."},"secret_access_key":{"type":"string","description":"Backblaze B2 Application Key (used as the S3 secret access key; shown once when the key is created)."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["access_key_id","bucket_name","endpoint_url","manifest_uri","processing_type","secret_access_key"],"title":"IndexBackblazeManifestRequest"},"IndexDropboxRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexDropboxRequestCustomMetadata"},"IndexDropboxRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexDropboxRequestProcessingType"},"IndexDropboxRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexDropboxRequestPiiEngine"},"IndexDropboxRequest":{"type":"object","properties":{"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexDropboxRequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"dropbox_access_token":{"type":"string","description":"Dropbox access token with files.metadata.read and files.content.read scopes. Generate one from the Dropbox App Console (Settings tab -> Generated access token). Tokens are short-lived and scoped to the token owner's account, ideal for one-shot indexing jobs."},"max_files":{"type":["integer","null"]},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"processing_type":{"$ref":"#/components/schemas/IndexDropboxRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexDropboxRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["dropbox_access_token","processing_type"],"title":"IndexDropboxRequest"},"IndexDropboxFileRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexDropboxFileRequestCustomMetadata"},"IndexDropboxFileRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexDropboxFileRequestProcessingType"},"IndexDropboxFileRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexDropboxFileRequestPiiEngine"},"IndexDropboxFileRequest":{"type":"object","properties":{"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexDropboxFileRequestCustomMetadata"},"description":"Custom metadata to attach to all chunks from this file. Keys must be strings. Values: str, int, float, bool, or List[str]."},"dropbox_access_token":{"type":"string","description":"Dropbox access token with files.metadata.read and files.content.read scopes. Generate one from the Dropbox App Console (Settings tab -> Generated access token). Tokens are short-lived and scoped to the token owner's account, ideal for one-shot indexing jobs."},"file_path":{"type":"string","description":"Path to a single file within the Dropbox account (e.g. '/Reports/annual-review.pdf')."},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"processing_type":{"$ref":"#/components/schemas/IndexDropboxFileRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"source_identity":{"type":["string","null"],"minLength":1,"maxLength":1024,"description":"Stable identity for this document, independent of where the object is read from. Indexing any location with the same source_identity updates the same document instead of creating another, and skip_existing matches on it. Defaults to the object's own URI. Opaque to Captain; one line, no newlines."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexDropboxFileRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["dropbox_access_token","file_path","processing_type"],"title":"IndexDropboxFileRequest"},"IndexDropboxDirectoryRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexDropboxDirectoryRequestCustomMetadata"},"IndexDropboxDirectoryRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexDropboxDirectoryRequestProcessingType"},"IndexDropboxDirectoryRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexDropboxDirectoryRequestPiiEngine"},"IndexDropboxDirectoryRequest":{"type":"object","properties":{"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexDropboxDirectoryRequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"directory_path":{"type":"string","description":"Path to a folder within the Dropbox account (e.g. '/Reports/2024'). All files within this folder and its subfolders are indexed recursively."},"dropbox_access_token":{"type":"string","description":"Dropbox access token with files.metadata.read and files.content.read scopes. Generate one from the Dropbox App Console (Settings tab -> Generated access token). Tokens are short-lived and scoped to the token owner's account, ideal for one-shot indexing jobs."},"max_files":{"type":["integer","null"]},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"processing_type":{"$ref":"#/components/schemas/IndexDropboxDirectoryRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexDropboxDirectoryRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"}},"required":["directory_path","dropbox_access_token","processing_type"],"title":"IndexDropboxDirectoryRequest"},"IndexGDriveRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexGDriveRequestProcessingType"},"IndexGDriveRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexGDriveRequestPiiEngine"},"IndexGDriveRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexGDriveRequestCustomMetadata"},"IndexGDriveRequest":{"type":"object","properties":{"service_account_json":{"type":"string","description":"Google Cloud service-account JSON (as a string). Its OAuth client ID must be authorized for the drive.readonly scope in the customer's Workspace Domain-wide Delegation settings."},"subject_email":{"type":"string","description":"Email of the Workspace user to impersonate. Must belong to the domain that authorized the service account. Drive content is read as this user."},"processing_type":{"$ref":"#/components/schemas/IndexGDriveRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"max_files":{"type":["integer","null"]},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexGDriveRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexGDriveRequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser')."}},"required":["service_account_json","subject_email","processing_type"],"title":"IndexGDriveRequest"},"IndexGDriveFileRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexGDriveFileRequestProcessingType"},"IndexGDriveFileRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexGDriveFileRequestPiiEngine"},"IndexGDriveFileRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexGDriveFileRequestCustomMetadata"},"IndexGDriveFileRequest":{"type":"object","properties":{"service_account_json":{"type":"string","description":"Google Cloud service-account JSON (as a string). Its OAuth client ID must be authorized for the drive.readonly scope in the customer's Workspace Domain-wide Delegation settings."},"subject_email":{"type":"string","description":"Email of the Workspace user to impersonate. Must belong to the domain that authorized the service account. Drive content is read as this user."},"file_id":{"type":"string","description":"Google Drive file ID (the '/d/<id>/' segment of a file URL). Native Google Docs/Sheets/Slides are exported to PDF/XLSX automatically."},"processing_type":{"$ref":"#/components/schemas/IndexGDriveFileRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexGDriveFileRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexGDriveFileRequestCustomMetadata"},"description":"Custom metadata to attach to all chunks from this file. Keys must be strings. Values: str, int, float, bool, or List[str]."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser')."}},"required":["service_account_json","subject_email","file_id","processing_type"],"title":"IndexGDriveFileRequest"},"IndexGDriveDirectoryRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexGDriveDirectoryRequestProcessingType"},"IndexGDriveDirectoryRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexGDriveDirectoryRequestPiiEngine"},"IndexGDriveDirectoryRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexGDriveDirectoryRequestCustomMetadata"},"IndexGDriveDirectoryRequest":{"type":"object","properties":{"service_account_json":{"type":"string","description":"Google Cloud service-account JSON (as a string). Its OAuth client ID must be authorized for the drive.readonly scope in the customer's Workspace Domain-wide Delegation settings."},"subject_email":{"type":"string","description":"Email of the Workspace user to impersonate. Must belong to the domain that authorized the service account. Drive content is read as this user."},"folder_id":{"type":"string","description":"Google Drive folder ID (the trailing segment of a folder URL, e.g. '1AbC...'). All files within it and its subfolders are indexed."},"processing_type":{"$ref":"#/components/schemas/IndexGDriveDirectoryRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"max_files":{"type":["integer","null"]},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexGDriveDirectoryRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexGDriveDirectoryRequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser')."}},"required":["service_account_json","subject_email","folder_id","processing_type"],"title":"IndexGDriveDirectoryRequest"},"IndexSharePointRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexSharePointRequestProcessingType"},"IndexSharePointRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexSharePointRequestPiiEngine"},"IndexSharePointRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexSharePointRequestCustomMetadata"},"IndexSharePointRequest":{"type":"object","properties":{"tenant_id":{"type":"string","description":"Microsoft Entra ID tenant (directory) ID of the customer's Microsoft 365 environment. A GUID, or the tenant domain (e.g. 'contoso.onmicrosoft.com')."},"client_id":{"type":"string","description":"Application (client) ID of the Entra ID App Registration the customer's admin created for Captain."},"client_secret":{"type":"string","description":"Client secret generated for that App Registration. Used once per job to mint app-only Microsoft Graph tokens; never stored."},"processing_type":{"$ref":"#/components/schemas/IndexSharePointRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexSharePointRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexSharePointRequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser')."},"site_url":{"type":"string","description":"SharePoint site URL (e.g. 'https://contoso.sharepoint.com/sites/Sales') or an already-resolved Graph site ID. The site's default document library is indexed unless drive_id is given. With Sites.Selected, the admin must have granted this app access to this site."},"drive_id":{"type":["string","null"],"description":"Optional Graph drive ID of a specific document library, when the site has more than the default 'Documents' library."},"max_files":{"type":["integer","null"]}},"required":["tenant_id","client_id","client_secret","processing_type","site_url"],"title":"IndexSharePointRequest"},"IndexSharePointFileRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexSharePointFileRequestProcessingType"},"IndexSharePointFileRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexSharePointFileRequestPiiEngine"},"IndexSharePointFileRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexSharePointFileRequestCustomMetadata"},"IndexSharePointFileRequest":{"type":"object","properties":{"tenant_id":{"type":"string","description":"Microsoft Entra ID tenant (directory) ID of the customer's Microsoft 365 environment. A GUID, or the tenant domain (e.g. 'contoso.onmicrosoft.com')."},"client_id":{"type":"string","description":"Application (client) ID of the Entra ID App Registration the customer's admin created for Captain."},"client_secret":{"type":"string","description":"Client secret generated for that App Registration. Used once per job to mint app-only Microsoft Graph tokens; never stored."},"processing_type":{"$ref":"#/components/schemas/IndexSharePointFileRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexSharePointFileRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexSharePointFileRequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser')."},"site_url":{"type":"string","description":"SharePoint site URL (e.g. 'https://contoso.sharepoint.com/sites/Sales') or an already-resolved Graph site ID. The site's default document library is indexed unless drive_id is given. With Sites.Selected, the admin must have granted this app access to this site."},"drive_id":{"type":["string","null"],"description":"Optional Graph drive ID of a specific document library, when the site has more than the default 'Documents' library."},"item_id":{"type":"string","description":"Graph driveItem ID of the single file to index."}},"required":["tenant_id","client_id","client_secret","processing_type","site_url","item_id"],"title":"IndexSharePointFileRequest"},"IndexSharePointDirectoryRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexSharePointDirectoryRequestProcessingType"},"IndexSharePointDirectoryRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexSharePointDirectoryRequestPiiEngine"},"IndexSharePointDirectoryRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexSharePointDirectoryRequestCustomMetadata"},"IndexSharePointDirectoryRequest":{"type":"object","properties":{"tenant_id":{"type":"string","description":"Microsoft Entra ID tenant (directory) ID of the customer's Microsoft 365 environment. A GUID, or the tenant domain (e.g. 'contoso.onmicrosoft.com')."},"client_id":{"type":"string","description":"Application (client) ID of the Entra ID App Registration the customer's admin created for Captain."},"client_secret":{"type":"string","description":"Client secret generated for that App Registration. Used once per job to mint app-only Microsoft Graph tokens; never stored."},"processing_type":{"$ref":"#/components/schemas/IndexSharePointDirectoryRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexSharePointDirectoryRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexSharePointDirectoryRequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser')."},"site_url":{"type":"string","description":"SharePoint site URL (e.g. 'https://contoso.sharepoint.com/sites/Sales') or an already-resolved Graph site ID. The site's default document library is indexed unless drive_id is given. With Sites.Selected, the admin must have granted this app access to this site."},"drive_id":{"type":["string","null"],"description":"Optional Graph drive ID of a specific document library, when the site has more than the default 'Documents' library."},"folder_id":{"type":"string","description":"Graph driveItem ID of the folder to index. All files within it and its subfolders are indexed."},"max_files":{"type":["integer","null"]}},"required":["tenant_id","client_id","client_secret","processing_type","site_url","folder_id"],"title":"IndexSharePointDirectoryRequest"},"IndexOneDriveRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexOneDriveRequestProcessingType"},"IndexOneDriveRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexOneDriveRequestPiiEngine"},"IndexOneDriveRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexOneDriveRequestCustomMetadata"},"IndexOneDriveRequest":{"type":"object","properties":{"tenant_id":{"type":"string","description":"Microsoft Entra ID tenant (directory) ID of the customer's Microsoft 365 environment. A GUID, or the tenant domain (e.g. 'contoso.onmicrosoft.com')."},"client_id":{"type":"string","description":"Application (client) ID of the Entra ID App Registration the customer's admin created for Captain."},"client_secret":{"type":"string","description":"Client secret generated for that App Registration. Used once per job to mint app-only Microsoft Graph tokens; never stored."},"processing_type":{"$ref":"#/components/schemas/IndexOneDriveRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexOneDriveRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexOneDriveRequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser')."},"user_email":{"type":"string","description":"Email (user principal name) of the OneDrive for Business user whose drive to index. Requires the Files.Read.All application permission."},"max_files":{"type":["integer","null"]}},"required":["tenant_id","client_id","client_secret","processing_type","user_email"],"title":"IndexOneDriveRequest"},"IndexOneDriveFileRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexOneDriveFileRequestProcessingType"},"IndexOneDriveFileRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexOneDriveFileRequestPiiEngine"},"IndexOneDriveFileRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexOneDriveFileRequestCustomMetadata"},"IndexOneDriveFileRequest":{"type":"object","properties":{"tenant_id":{"type":"string","description":"Microsoft Entra ID tenant (directory) ID of the customer's Microsoft 365 environment. A GUID, or the tenant domain (e.g. 'contoso.onmicrosoft.com')."},"client_id":{"type":"string","description":"Application (client) ID of the Entra ID App Registration the customer's admin created for Captain."},"client_secret":{"type":"string","description":"Client secret generated for that App Registration. Used once per job to mint app-only Microsoft Graph tokens; never stored."},"processing_type":{"$ref":"#/components/schemas/IndexOneDriveFileRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexOneDriveFileRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexOneDriveFileRequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser')."},"user_email":{"type":"string","description":"Email (user principal name) of the OneDrive for Business user whose drive to index. Requires the Files.Read.All application permission."},"item_id":{"type":"string","description":"Graph driveItem ID of the single file to index."}},"required":["tenant_id","client_id","client_secret","processing_type","user_email","item_id"],"title":"IndexOneDriveFileRequest"},"IndexOneDriveDirectoryRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexOneDriveDirectoryRequestProcessingType"},"IndexOneDriveDirectoryRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexOneDriveDirectoryRequestPiiEngine"},"IndexOneDriveDirectoryRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexOneDriveDirectoryRequestCustomMetadata"},"IndexOneDriveDirectoryRequest":{"type":"object","properties":{"tenant_id":{"type":"string","description":"Microsoft Entra ID tenant (directory) ID of the customer's Microsoft 365 environment. A GUID, or the tenant domain (e.g. 'contoso.onmicrosoft.com')."},"client_id":{"type":"string","description":"Application (client) ID of the Entra ID App Registration the customer's admin created for Captain."},"client_secret":{"type":"string","description":"Client secret generated for that App Registration. Used once per job to mint app-only Microsoft Graph tokens; never stored."},"processing_type":{"$ref":"#/components/schemas/IndexOneDriveDirectoryRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"skip_existing":{"type":"boolean","default":true,"description":"When true, files already indexed in the collection are skipped and will not be re-indexed with incoming changes. When false, all incoming files are indexed regardless of whether they already exist."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexOneDriveDirectoryRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"overwrite_existing":{"type":"boolean","default":false,"description":"When true, files that already exist in the collection are re-indexed and replaced with zero downtime: the new version is built alongside the live one and atomically swapped in when complete, so the previous version keeps serving search results throughout the rebuild. The document keeps the same document_id across overwrites, and its status reads 'updating' in the document listing while the rebuild runs. Requires skip_existing=false. Setting both to true returns a 400 error."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexOneDriveDirectoryRequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser')."},"user_email":{"type":"string","description":"Email (user principal name) of the OneDrive for Business user whose drive to index. Requires the Files.Read.All application permission."},"folder_id":{"type":"string","description":"Graph driveItem ID of the folder to index. All files within it and its subfolders are indexed."},"max_files":{"type":["integer","null"]}},"required":["tenant_id","client_id","client_secret","processing_type","user_email","folder_id"],"title":"IndexOneDriveDirectoryRequest"},"IndexUrlRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexUrlRequestCustomMetadata"},"IndexUrlRequestProcessingType":{"type":"string","enum":["advanced","basic"],"description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing.","title":"IndexUrlRequestProcessingType"},"IndexUrlRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexUrlRequestPiiEngine"},"IndexURLRequest":{"type":"object","properties":{"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexUrlRequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"parsing_script":{"type":["string","null"],"description":"Relative path to a JS parsing script for JSON files (e.g. 'research/paper-parser'). When provided, .json files are processed through a sandboxed V8 isolate. Without this, .json files are indexed as raw text."},"processing_type":{"$ref":"#/components/schemas/IndexUrlRequestProcessingType","description":"Document processing type. 'advanced' uses agentic OCR with AI-enhanced extraction for complex layouts, tables, figures, charts, and documents containing images. 'basic' provides reliable OCR optimized for general document indexing and high-volume processing."},"transcription_language":{"type":["string","null"],"description":"AWS Transcribe language code for the spoken audio (e.g. 'es-US', 'pt-BR'). Omit to auto-detect per file. Video and audio files only. Supported codes: https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html"},"url":{"type":["string","null"],"description":"A single public URL to a hosted document. Supported types: PDF, DOCX, DOC, XLSX, XLS, CSV, TSV, TXT, MD, JSON, YAML, YML, PNG, JPG, JPEG, GIF, BMP, TIFF. Provide either 'url' or 'urls', not both."},"urls":{"type":["array","null"],"items":{"type":"string"},"description":"A list of public URLs to hosted documents. Provide either 'url' or 'urls', not both."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexUrlRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."}},"required":["processing_type"],"title":"IndexURLRequest"},"IndexYoutubeRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexYoutubeRequestCustomMetadata"},"IndexYoutubeRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexYoutubeRequestPiiEngine"},"IndexYoutubeRequestMode":{"type":"string","enum":["transcript","audio","video"],"default":"transcript","description":"How to index each video. 'transcript' (default): fetch the caption track and index it as text, billed as basic text pages. 'audio': pull the audio track through the multimodal audio pipeline, billed at 5 credits per audio minute. 'video': pull the video (frame descriptions plus transcription) through the multimodal video pipeline, billed at 20 credits per video minute. Media modes cost orders of magnitude more than transcript mode for the same video; the default is transcript and will not change.","title":"IndexYoutubeRequestMode"},"IndexYoutubeRequestOnMissingTranscript":{"type":"string","enum":["fail","audio","video"],"default":"fail","description":"Only applies when mode='transcript'. What to do for a video whose captions are disabled or absent. 'fail' (default): that video fails. 'audio' / 'video': fall back to indexing that video through the corresponding media pipeline instead, billed at media rates. Any fallback is recorded per video in the job's youtube record (mode_used, fell_back_from) so the billing change is visible. Setting this together with a media mode is rejected with a validation error.","title":"IndexYoutubeRequestOnMissingTranscript"},"IndexYoutubeRequest":{"type":"object","properties":{"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexYoutubeRequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"languages":{"type":["array","null"],"items":{"type":"string"},"description":"Preferred transcript languages in priority order (ISO 639-1 codes). Defaults to English. Only specify if you need a non-English transcript (e.g., ['fr', 'de']). Falls back to auto-generated captions if manual transcript unavailable."},"url":{"type":["string","null"],"description":"A single YouTube video URL (youtube.com/watch?v=, youtu.be/, youtube.com/shorts/). Provide either 'url' or 'urls', not both."},"urls":{"type":["array","null"],"items":{"type":"string"},"description":"A list of YouTube video URLs to index. Provide either 'url' or 'urls', not both."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexYoutubeRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."},"mode":{"$ref":"#/components/schemas/IndexYoutubeRequestMode","default":"transcript","description":"How to index each video. 'transcript' (default): fetch the caption track and index it as text, billed as basic text pages. 'audio': pull the audio track through the multimodal audio pipeline, billed at 5 credits per audio minute. 'video': pull the video (frame descriptions plus transcription) through the multimodal video pipeline, billed at 20 credits per video minute. Media modes cost orders of magnitude more than transcript mode for the same video; the default is transcript and will not change."},"on_missing_transcript":{"$ref":"#/components/schemas/IndexYoutubeRequestOnMissingTranscript","default":"fail","description":"Only applies when mode='transcript'. What to do for a video whose captions are disabled or absent. 'fail' (default): that video fails. 'audio' / 'video': fall back to indexing that video through the corresponding media pipeline instead, billed at media rates. Any fallback is recorded per video in the job's youtube record (mode_used, fell_back_from) so the billing change is visible. Setting this together with a media mode is rejected with a validation error."}},"title":"IndexYoutubeRequest"},"IndexTextRequestCustomMetadata":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}],"title":"IndexTextRequestCustomMetadata"},"IndexTextRequestPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"IndexTextRequestPiiEngine"},"IndexTextRequest":{"type":"object","properties":{"content":{"type":"string","description":"The text content to index."},"custom_metadata":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/IndexTextRequestCustomMetadata"},"description":"Custom metadata to attach to all indexed chunks. Keys must be strings. Values: str, int, float, bool, or List[str]."},"filename":{"type":["string","null"],"description":"Optional filename for the text document. Defaults to 'snippet-{N}.txt' where N auto-increments."},"mask_pii":{"type":"boolean","default":false,"description":"When true, detected PII (emails, phone numbers, SSNs, credit cards, names, and locations) is masked in the parsed content before it is embedded and stored — replaced with entity tags like <PERSON> and <EMAIL_ADDRESS>. For images (including images embedded in PDFs), PII text visible in the image is also pixel-redacted. Opt-in; defaults to false, which leaves content unchanged."},"pii_engine":{"$ref":"#/components/schemas/IndexTextRequestPiiEngine","default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true."},"pii_fallback":{"type":"boolean","default":true,"description":"What happens to a file when the Jev engine cannot be reached. true (default): the file is masked by captain-presidio instead, without custom fields, and the job reports engine captain-presidio with fallback true. false: the file fails to index rather than being stored with less than the requested masking. Only meaningful with pii_engine captain-jev."},"pii_fields":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PIIField"},"description":"Additional PII categories to mask for this job, on top of the built-in set. Requires mask_pii to be true. Up to 20 fields. Each masked value is replaced with the field's tag in angle brackets and appears in the masking report under the field's name."},"pii_instructions":{"type":["string","null"],"maxLength":1000,"description":"Plain-language guidance that steers what counts as personal data for this job, for the built-in categories and any pii_fields. For example: 'Names of hospital staff may stay; patient names, record numbers and bed assignments must be masked.' Requires mask_pii to be true. Up to 1,000 characters."}},"required":["content"],"title":"IndexTextRequest"},"V2CollectionsCollectionNameIndexFilePostRequestBodyContentMultipartFormDataSchemaPiiEngine":{"type":"string","enum":["captain-jev","captain-presidio"],"default":"captain-jev","description":"Masking engine for this job. captain-jev (default): TypeSafe's Jev classifier reads every token of the text in context, decides which values are personal data and which kind each one is; supports pii_fields and pii_instructions. captain-presidio (legacy): pattern recognizers and a named-entity model, runs entirely inside Captain, built-in categories only; rejects pii_fields and pii_instructions with 422. Requires mask_pii to be true.","title":"V2CollectionsCollectionNameIndexFilePostRequestBodyContentMultipartFormDataSchemaPiiEngine"},"ValidateParsingScriptResponse":{"type":"object","properties":{"error":{"type":["string","null"],"description":"Human-readable error message when valid=false. Null when valid=true."},"error_type":{"type":["string","null"],"description":"Error category when valid=false: 'syntax_error', 'no_export'. Null when valid=true."},"valid":{"type":"boolean","description":"True if the script passes all validation checks"}},"required":["valid"],"title":"ValidateParsingScriptResponse"},"V2JobsGetParametersStatusSchema":{"type":"string","enum":["running","pending","processing","completed","completed_with_errors","failed","cancelled","timed_out"],"description":"Filter by job status (running, pending, processing, completed, completed_with_errors, failed, cancelled, timed_out).","title":"V2JobsGetParametersStatusSchema"},"JobSummaryV2":{"type":"object","properties":{"job_id":{"type":"string"},"status":{"type":"string","description":"running | pending | processing | completed | completed_with_errors | failed | cancelled | timed_out"},"job_type":{"type":["string","null"],"description":"The indexing job type, e.g. index_s3, index_gcs_file, index_youtube."},"storage_type":{"type":["string","null"]},"collection_name":{"type":["string","null"]},"environment":{"type":["string","null"],"description":"The environment the job was submitted from: development, staging, or production."},"job_name":{"type":["string","null"]},"created_at":{"type":["string","null"]},"finished_at":{"type":["string","null"]},"files_total":{"type":["integer","null"]},"files_indexed":{"type":["integer","null"]},"files_failed":{"type":["integer","null"]},"files_skipped":{"type":["integer","null"]},"error":{"type":["string","null"]}},"required":["job_id","status"],"description":"A single indexing job with its status and file counts.","title":"JobSummaryV2"},"JobListResponseV2":{"type":"object","properties":{"jobs":{"type":"array","items":{"$ref":"#/components/schemas/JobSummaryV2"}},"total_count":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"}},"required":["jobs","total_count","limit","offset"],"description":"A page of your indexing jobs.","title":"JobListResponseV2"},"BillingCredits":{"type":"object","properties":{"remaining":{"type":"number","format":"double","description":"Credits remaining in the billing period after this job."},"used_advanced":{"type":"integer","description":"Advanced pages processed by this job (2.5 credits each)."},"used_basic":{"type":"integer","description":"Basic pages processed by this job (1 credit each)."},"used_total":{"type":"number","format":"double","description":"Total credits consumed: (basic * 1) + (advanced * 2.5)."}},"required":["remaining","used_advanced","used_basic","used_total"],"description":"Credit usage for a completed indexing job","title":"BillingCredits"},"JobBilling":{"type":"object","properties":{"credits":{"$ref":"#/components/schemas/BillingCredits","description":"Credits consumed by this job and the remaining balance."},"included_credits":{"type":"integer","description":"Total credits included in the current billing period."},"period_end":{"type":["integer","null"],"description":"Billing period end, as a Unix timestamp in milliseconds."},"period_start":{"type":["integer","null"],"description":"Billing period start, as a Unix timestamp in milliseconds."}},"required":["credits","included_credits"],"description":"Billing/credit information for a completed indexing job.\nReturned when job status is 'completed'.","title":"JobBilling"},"JobManifestIssue":{"type":"object","properties":{"line":{"type":["integer","null"],"description":"1-based line number in the manifest, for a line that could not be used."},"uri":{"type":["string","null"],"description":"The object the line named, for an object that could not be read."},"reason":{"type":"string","description":"Why it was not indexed."}},"required":["reason"],"description":"One manifest line, or one object it named, that was not indexed.","title":"JobManifestIssue"},"JobManifestReport":{"type":"object","properties":{"lines":{"type":"integer","description":"Non-empty lines read from the manifest."},"accepted":{"type":"integer","description":"Lines that were usable."},"rejected":{"type":"integer","description":"Lines that could not be used: invalid JSON, a uri outside the bucket, a duplicate uri, an unknown key, or a value over a per-line limit."},"unreachable":{"type":"integer","description":"Usable lines whose object was not indexed: missing, access denied, an unsupported file type, or a checksum that does not match the object."},"rejected_sample":{"type":"array","items":{"$ref":"#/components/schemas/JobManifestIssue"},"description":"Up to 20 rejected lines, each with its line number and reason."},"unreachable_sample":{"type":"array","items":{"$ref":"#/components/schemas/JobManifestIssue"},"description":"Up to 20 unreachable objects, each with its uri and reason."}},"required":["lines","accepted","rejected","unreachable"],"description":"What a manifest job did with the lines of its manifest.","title":"JobManifestReport"},"JobIdentityConflict":{"type":"object","properties":{"source_identity":{"type":"string","description":"The identity that is already in the collection."},"file_name":{"type":["string","null"]},"existing_checksum":{"type":["string","null"],"description":"Checksum of the version already indexed."},"candidate_checksum":{"type":["string","null"],"description":"Checksum of the object this job was given."}},"required":["source_identity"],"title":"JobIdentityConflict"},"JobIdentityConflicts":{"type":"object","properties":{"count":{"type":"integer"},"sample":{"type":"array","items":{"$ref":"#/components/schemas/JobIdentityConflict"},"description":"Up to 20 of them."}},"required":["count"],"description":"Files whose source_identity is already in the collection with different\ncontent. They are neither skipped nor indexed.","title":"JobIdentityConflicts"},"FileStatus":{"type":"object","properties":{"document_id":{"type":["string","null"],"description":"Document ID assigned once the file is indexed. Use it with `GET /v2/collections/{collection_name}/documents/{document_id}`."},"error_code":{"type":["string","null"],"description":"Machine-readable error code. Present when the file failed."},"error_message":{"type":["string","null"],"description":"Human-readable error message. Present when the file failed."},"progress_message":{"type":["string","null"],"description":"Human-readable progress for this file."},"stage":{"type":["string","null"],"description":"Pipeline stage this file is in. One of `scanning`, `extracting`, `indexing`, `embedding`, `finalizing`, ending at `completed` (indexed or skipped; `status` carries which) or `failed`."},"status":{"type":"string","description":"Status of this file. One of `queued`, `processing`, `completed`, `failed`, `skipped`, `cancelled`."},"updated_at":{"type":["string","null"],"description":"RFC 3339 timestamp of the last update to this file's status."},"uri":{"type":"string","description":"Source URI of the file, e.g. `s3://bucket/path/file.pdf`."}},"required":["status","uri"],"description":"Status of an individual file in an indexing job","title":"FileStatus"},"FilesPagination":{"type":"object","properties":{"limit":{"type":["integer","null"],"description":"Maximum number of files returned in this page."},"next_cursor":{"type":["string","null"],"description":"Cursor for the next page of files. Pass it as the `files_cursor` query parameter. Null when there are no more files."},"total_estimated":{"type":["integer","null"],"description":"Estimated total number of files in the job."}},"title":"FilesPagination"},"JobProgress":{"type":"object","properties":{"current_stage":{"type":"string","description":"Current pipeline stage. One of `scanning`, `extracting`, `indexing`, `embedding`, `finalizing`, ending at `completed`, `failed`, or `cancelled` once the job is terminal."},"elapsed_seconds":{"type":["integer","null"],"description":"Seconds elapsed since processing began."},"files_failed":{"type":["integer","null"],"description":"Number of files that failed processing."},"files_processed":{"type":["integer","null"],"description":"Number of files processed so far."},"files_skipped":{"type":["integer","null"],"description":"Number of files skipped, e.g. unsupported file types."},"files_total":{"type":["integer","null"],"description":"Total number of files the job will process."},"stage_description":{"type":"string","description":"Human-readable description of the current stage."}},"required":["current_stage","stage_description"],"description":"Detailed progress information for running jobs","title":"JobProgress"},"FailedFileDetail":{"type":"object","properties":{"error":{"type":["string","null"],"description":"Why the file failed."},"file_name":{"type":["string","null"],"description":"Name of the file that failed."}},"description":"Detail about a file that failed indexing","title":"FailedFileDetail"},"JobResult":{"type":"object","properties":{"duration_seconds":{"type":["integer","null"],"description":"Total processing time in seconds."},"failed_files":{"type":["array","null"],"items":{"$ref":"#/components/schemas/FailedFileDetail"},"description":"Details for each file that failed."},"files_failed":{"type":["integer","null"],"description":"Number of files that failed."},"files_indexed":{"type":["integer","null"],"description":"Number of files indexed successfully."},"files_skipped":{"type":["integer","null"],"description":"Number of files skipped."},"warnings":{"type":["array","null"],"items":{"type":"string"},"description":"Non-fatal warnings raised during the job."}},"description":"Final result data when job is completed","title":"JobResult"},"YoutubeVideoRecord":{"type":"object","properties":{"video_id":{"type":"string"},"url":{"type":["string","null"]},"mode_used":{"type":"string","description":"The pipeline this video actually ran through, which determines how it bills: 'transcript' (basic text pages), 'audio' (5 credits/minute), 'video' (20 credits/minute), or 'failed' (dropped at submission; nothing indexed, nothing billed)."},"fell_back_from":{"type":["string","null"],"description":"'transcript' when on_missing_transcript escalated this video to a media mode; null when the requested mode ran directly."},"transcript_available":{"type":["boolean","null"],"description":"Whether the video has captions. Null when availability was not determined (media modes probe best-effort)."},"languages":{"type":"array","items":{"type":"string"},"default":[],"description":"Caption languages available or used for this video."},"error":{"type":["string","null"],"description":"Set only when mode_used is 'failed': why this video was dropped."}},"required":["video_id","mode_used"],"description":"Per-video processing record on YouTube indexing jobs.","title":"YoutubeVideoRecord"},"PiiReportHintV2Engine":{"type":"string","enum":["captain-jev","captain-presidio"],"description":"The engine that masked this job: captain-jev or captain-presidio. Null for jobs that predate engine reporting.","title":"PiiReportHintV2Engine"},"PiiReportHintV2":{"type":"object","properties":{"state":{"type":"string","description":"`retained`, `deleted`, or `expired`."},"url":{"type":["string","null"],"description":"`/v2/jobs/{job_id}/pii` while retained."},"deleted_at":{"type":["string","null"],"description":"Set when `state` is `deleted` (RFC3339)."},"engine":{"oneOf":[{"$ref":"#/components/schemas/PiiReportHintV2Engine"},{"type":"null"}],"description":"The engine that masked this job: captain-jev or captain-presidio. Null for jobs that predate engine reporting."},"fallback":{"type":["boolean","null"],"description":"True when at least one file in the job fell back from Jev to Presidio because Jev was unreachable. Null for jobs that predate engine reporting."}},"required":["state"],"title":"PiiReportHintV2"},"JobStatusResponse":{"type":"object","properties":{"billing":{"oneOf":[{"$ref":"#/components/schemas/JobBilling"},{"type":"null"}],"description":"Credit usage for this job. Present only when the job has completed."},"cancelled_at":{"type":["string","null"],"description":"RFC 3339 timestamp when the job was cancelled."},"collection_name":{"type":["string","null"],"description":"Name of the collection this job is indexing into."},"manifest":{"oneOf":[{"$ref":"#/components/schemas/JobManifestReport"},{"type":"null"}],"description":"Manifest jobs only: how many manifest lines were accepted, rejected or unreachable, with a sample of each. Null until the manifest has been read, and for every other kind of job."},"identity_conflicts":{"oneOf":[{"$ref":"#/components/schemas/JobIdentityConflicts"},{"type":"null"}],"description":"Files whose source_identity is already in the collection with different content. They are neither skipped nor indexed; send overwrite_existing: true to replace the indexed version. Null when there are none."},"completed_at":{"type":["string","null"],"description":"RFC 3339 timestamp when the job reached a terminal state."},"created_at":{"type":["string","null"],"description":"RFC 3339 timestamp when the job was created."},"error_code":{"type":["string","null"],"description":"Machine-readable error code. Present when the job failed."},"error_message":{"type":["string","null"],"description":"Human-readable error message. Present when the job failed."},"estimated_time_remaining_seconds":{"type":["integer","null"],"description":"Estimated seconds until the job finishes. 0 once the job is in a terminal state."},"files":{"type":["array","null"],"items":{"$ref":"#/components/schemas/FileStatus"},"description":"Per-file status for the files in this job. Paginated: control the page with the `files_limit` and `files_cursor` query parameters."},"files_page":{"oneOf":[{"$ref":"#/components/schemas/FilesPagination"},{"type":"null"}],"description":"Pagination details for `files`. Pass `next_cursor` as the `files_cursor` query parameter to fetch the next page."},"job_id":{"type":"string","description":"Unique identifier for the indexing job, as returned by the indexing endpoint that started it."},"job_type":{"type":["string","null"],"description":"The indexing operation that created this job, e.g. `index_s3_directory`. Matches the endpoint the job was started from."},"progress":{"oneOf":[{"$ref":"#/components/schemas/JobProgress"},{"type":"null"}],"description":"Detailed progress for a running job: the current pipeline stage and per-file counts."},"progress_message":{"type":["string","null"],"description":"Human-readable summary of the job's current progress."},"result":{"oneOf":[{"$ref":"#/components/schemas/JobResult"},{"type":"null"}],"description":"Final file counts and duration once the job reaches a terminal state."},"started_at":{"type":["string","null"],"description":"RFC 3339 timestamp when processing began. Null while the job is pending."},"status":{"type":"string","description":"Current job status.\n\n- `pending`: queued, not yet started\n- `running`: in progress; see `progress` for the current stage\n- `completed`: all files indexed successfully\n- `completed_with_errors`: finished, but some files failed; see `files` and `result`\n- `failed`: the job failed; see `error_code` and `error_message`\n- `cancelled`: cancelled via `DELETE /v2/jobs/{job_id}`\n- `timed_out`: execution exceeded the time limit"},"updated_at":{"type":["string","null"],"description":"RFC 3339 timestamp when the job was last updated."},"custom_metadata":{"type":["object","null"],"additionalProperties":{"description":"Any type"}},"youtube":{"type":["array","null"],"items":{"$ref":"#/components/schemas/YoutubeVideoRecord"},"description":"Per-video records for YouTube indexing jobs: which pipeline each video actually ran through and whether an on_missing_transcript fallback fired (a fallback changes what the job bills, so it is always visible here). Absent for non-YouTube jobs."},"pii_report":{"oneOf":[{"$ref":"#/components/schemas/PiiReportHintV2"},{"type":"null"}],"description":"Pointer to the job's PII masking report. Present only for jobs that ran with `mask_pii: true`."}},"required":["job_id","status"],"title":"JobStatusResponse"},"JobRollbackResponse":{"type":"object","properties":{"files_removed":{"type":["array","null"],"items":{"type":"string"}},"job_id":{"type":"string"},"message":{"type":["string","null"]},"rolled_back_at":{"type":["string","null"]},"status":{"type":"string"}},"required":["job_id","status"],"title":"JobRollbackResponse"},"JobCancelResponse":{"type":"object","properties":{"cancelled_at":{"type":["string","null"]},"cleanup_initiated":{"type":["boolean","null"]},"job_id":{"type":"string"},"message":{"type":"string"},"status":{"type":"string"}},"required":["job_id","message","status"],"title":"JobCancelResponse"},"PiiReportObjectV2":{"type":"object","properties":{"key_suffix":{"type":"string","description":"`doc.json` for the document, or `chunk-{n}.json` for one text chunk."},"url":{"type":"string","description":"Signed download URL, valid for up to 300 seconds."},"expires_at":{"type":"string","description":"When `url` stops working (RFC3339)."}},"required":["key_suffix","url","expires_at"],"title":"PiiReportObjectV2"},"PiiReportFileV2":{"type":"object","properties":{"file_id":{"type":"string"},"entity_count":{"type":"integer","description":"Entities recorded for this file."},"truncated":{"type":"boolean","description":"`true` when an object hit the 5000-entity cap."},"objects":{"type":"array","items":{"$ref":"#/components/schemas/PiiReportObjectV2"}}},"required":["file_id","entity_count","truncated","objects"],"title":"PiiReportFileV2"},"PiiReportResponseV2Engine":{"type":"string","enum":["captain-jev","captain-presidio"],"description":"The engine that masked this job: captain-jev or captain-presidio. Null for jobs that predate engine reporting.","title":"PiiReportResponseV2Engine"},"PiiReportResponseV2":{"type":"object","properties":{"job_id":{"type":"string"},"state":{"type":"string","description":"Always `retained` on a 200."},"entity_count":{"type":"integer","description":"Entities across all files."},"files":{"type":"array","items":{"$ref":"#/components/schemas/PiiReportFileV2"}},"incomplete":{"type":"boolean","default":false,"description":"`true` while the job is still running or reported failed files, so objects may still be missing."},"truncated_objects":{"type":"boolean","default":false,"description":"`true` when only the first 500 of the job's report objects are listed."},"expires_in_seconds":{"type":"integer","description":"Lifetime of every `url` in the response (up to 300)."},"engine":{"oneOf":[{"$ref":"#/components/schemas/PiiReportResponseV2Engine"},{"type":"null"}],"description":"The engine that masked this job: captain-jev or captain-presidio. Null for jobs that predate engine reporting."},"fallback":{"type":["boolean","null"],"description":"True when at least one file in the job fell back from Jev to Presidio because Jev was unreachable. Null for jobs that predate engine reporting."}},"required":["job_id","state","entity_count","files","expires_in_seconds"],"title":"PiiReportResponseV2"},"HttpErrorResponseV2":{"type":"object","properties":{"error":{"type":"string","description":"Always `HTTP_ERROR`."},"message":{"type":"string"},"status_code":{"type":"integer"},"path":{"type":"string","description":"Request path."}},"required":["error","message","status_code"],"description":"Error body for 401 and 404.","title":"HttpErrorResponseV2"},"PiiReportErrorV2":{"type":"object","properties":{"code":{"type":"string","description":"Machine-readable reason, listed per status code below."},"message":{"type":"string"},"deleted_at":{"type":["string","null"],"description":"Only on 410 `deleted`: when the report was destroyed (RFC3339)."},"path":{"type":"string","description":"Request path."}},"required":["code","message"],"description":"Error body returned by the masking report endpoints for 403, 409, 410, and 503.","title":"PiiReportErrorV2"},"PiiReportDeleteResponseV2":{"type":"object","properties":{"job_id":{"type":"string"},"deleted":{"type":"boolean"},"deleted_at":{"type":"string","description":"When the report was destroyed (RFC3339)."},"objects_deleted":{"type":"integer"}},"required":["job_id","deleted","deleted_at","objects_deleted"],"title":"PiiReportDeleteResponseV2"},"EvalUploadRequestV3ContentType":{"type":"string","enum":["application/x-ndjson","application/jsonl","application/octet-stream"],"default":"application/x-ndjson","title":"EvalUploadRequestV3ContentType"},"EvalUploadRequestV3":{"type":"object","properties":{"byte_size":{"type":"integer","minimum":1,"maximum":52428800,"description":"Exact number of bytes the PUT will send. Enforced on PUT."},"content_type":{"$ref":"#/components/schemas/EvalUploadRequestV3ContentType","default":"application/x-ndjson"},"filename":{"type":"string","minLength":8,"maxLength":512,"description":"Must end in `.ndjson`."}},"required":["byte_size","filename"],"title":"EvalUploadRequestV3"},"EvalUploadHeadersV3":{"type":"object","properties":{"Content-Length":{"type":"string"},"Content-Type":{"type":"string"}},"required":["Content-Length","Content-Type"],"title":"EvalUploadHeadersV3"},"EvalUploadResponseV3":{"type":"object","properties":{"byte_size":{"type":"integer"},"collection_name":{"type":"string"},"expires_at":{"type":"string"},"filename":{"type":"string"},"headers":{"$ref":"#/components/schemas/EvalUploadHeadersV3"},"upload_id":{"type":"string"},"upload_url":{"type":"string","description":"Signed, PUT-only, single-use URL on *.captainusercontent.com. Opaque."}},"required":["byte_size","collection_name","expires_at","filename","headers","upload_id","upload_url"],"title":"EvalUploadResponseV3"},"EvalConfigV3Filter":{"type":"object","properties":{},"title":"EvalConfigV3Filter"},"EvalConfigV3RelationDirection":{"type":"string","enum":["outgoing","incoming","both"],"default":"outgoing","title":"EvalConfigV3RelationDirection"},"EvalConfigV3Rerank":{"oneOf":[{"type":"boolean"},{"$ref":"#/components/schemas/RerankOptions"}],"title":"EvalConfigV3Rerank"},"EvalConfigV3":{"type":"object","properties":{"boost":{"type":["array","null"],"items":{"$ref":"#/components/schemas/BoostClauseV3"}},"exclude_chunk_types":{"type":["array","null"],"items":{"type":"string"}},"filter":{"oneOf":[{"$ref":"#/components/schemas/EvalConfigV3Filter"},{"type":"null"}]},"include":{"$ref":"#/components/schemas/QueryIncludeV3"},"limit":{"type":"integer","minimum":1,"maximum":100,"default":10},"max_chunks_per_document":{"type":["integer","null"],"minimum":1,"maximum":100},"name":{"type":"string","pattern":"^[a-z0-9][a-z0-9_-]{0,63}$"},"relation_direction":{"$ref":"#/components/schemas/EvalConfigV3RelationDirection","default":"outgoing"},"relation_types":{"type":["array","null"],"items":{"type":"string"}},"rerank":{"$ref":"#/components/schemas/EvalConfigV3Rerank","default":false},"semantic_ratio":{"type":"number","format":"double","minimum":0,"maximum":1,"default":0.5}},"required":["name"],"description":"`configs[]` = the Query v3 request body minus `query`, plus a name.","title":"EvalConfigV3"},"CreateEvalRequestV3":{"type":"object","properties":{"configs":{"type":"array","items":{"$ref":"#/components/schemas/EvalConfigV3"}},"environment":{"type":["string","null"],"maxLength":64,"description":"Echo-only label for the scorecard. Does not switch collections."},"upload_id":{"type":"string","minLength":5,"maxLength":64}},"required":["configs","upload_id"],"title":"CreateEvalRequestV3"},"EvalBillingV3":{"type":"object","properties":{"billable_units":{"type":"integer"},"failed_configs":{"type":"array","items":{"type":"string"}},"skipped_units":{"type":"integer"}},"required":["billable_units","skipped_units"],"title":"EvalBillingV3"},"ResolvedQueryConfigV3BoostItems":{"type":"object","properties":{},"title":"ResolvedQueryConfigV3BoostItems"},"ResolvedQueryConfigV3Filter":{"type":"object","properties":{},"title":"ResolvedQueryConfigV3Filter"},"ResolvedRerankV3":{"type":"object","properties":{"candidate_limit":{"type":["integer","null"]},"enabled":{"type":"boolean"},"model":{"type":["string","null"]}},"required":["enabled"],"title":"ResolvedRerankV3"},"ResolvedQueryConfigV3":{"type":"object","properties":{"boost":{"type":"array","items":{"$ref":"#/components/schemas/ResolvedQueryConfigV3BoostItems"}},"exclude_chunk_types":{"type":"array","items":{"type":"string"}},"filter":{"oneOf":[{"$ref":"#/components/schemas/ResolvedQueryConfigV3Filter"},{"type":"null"}]},"include":{"type":"object","additionalProperties":{"type":"boolean"}},"limit":{"type":"integer"},"max_chunks_per_document":{"type":["integer","null"]},"relation_direction":{"type":"string","default":"outgoing"},"relation_types":{"type":["array","null"],"items":{"type":"string"}},"rerank":{"$ref":"#/components/schemas/ResolvedRerankV3"},"semantic_ratio":{"type":"number","format":"double"}},"required":["limit","rerank","semantic_ratio"],"description":"Every Query v3 field, defaults filled in, rerank always in object form.","title":"ResolvedQueryConfigV3"},"ResolvedConfigV3":{"type":"object","properties":{"explicit_fields":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"query":{"$ref":"#/components/schemas/ResolvedQueryConfigV3"}},"required":["explicit_fields","name","query"],"title":"ResolvedConfigV3"},"EvalItemV3Filters":{"type":"object","properties":{},"title":"EvalItemV3Filters"},"EvalUnitResultV3Status":{"type":"string","enum":["pending","running","scored","failed"],"title":"EvalUnitResultV3Status"},"EvalUnitResultV3":{"type":"object","properties":{"error_code":{"type":["string","null"]},"error_message":{"type":["string","null"]},"hit":{"type":["boolean","null"]},"latency_ms":{"type":["integer","null"]},"rank":{"type":["integer","null"]},"retrieved_document_ids":{"type":["array","null"],"items":{"type":"string"}},"status":{"$ref":"#/components/schemas/EvalUnitResultV3Status"}},"required":["status"],"title":"EvalUnitResultV3"},"EvalItemV3Status":{"type":"string","enum":["pending","running","scored","error"],"title":"EvalItemV3Status"},"EvalItemV3":{"type":"object","properties":{"error_code":{"type":["string","null"]},"error_message":{"type":["string","null"]},"expected_document_ids":{"type":["array","null"],"items":{"type":"string"}},"expected_files":{"type":"array","items":{"type":"string"}},"filters":{"oneOf":[{"$ref":"#/components/schemas/EvalItemV3Filters"},{"type":"null"}]},"id":{"type":"string"},"query":{"type":"string"},"results":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/EvalUnitResultV3"}},"status":{"$ref":"#/components/schemas/EvalItemV3Status"}},"required":["expected_files","id","query","status"],"title":"EvalItemV3"},"EvalItemsPageV3":{"type":"object","properties":{"limit":{"type":"integer"},"next_cursor":{"type":["string","null"]},"total":{"type":"integer"}},"required":["limit","total"],"title":"EvalItemsPageV3"},"EvalPreviewV3":{"type":"object","properties":{"billable_units":{"type":"integer"},"cases":{"type":"integer"},"cases_error":{"type":"integer"},"configs":{"type":"integer"},"units":{"type":"integer"}},"required":["billable_units","cases","cases_error","configs","units"],"title":"EvalPreviewV3"},"EvalProgressV3":{"type":"object","properties":{"cases_error":{"type":"integer"},"cases_total":{"type":"integer"},"configs_failed":{"type":"integer"},"configs_total":{"type":"integer"},"elapsed_seconds":{"type":"integer"},"eta_seconds":{"type":["integer","null"]},"percent":{"type":"integer"},"qps":{"type":["number","null"],"format":"double"},"units_completed":{"type":"integer"},"units_error":{"type":"integer"},"units_failed":{"type":"integer"},"units_total":{"type":"integer"}},"required":["cases_error","cases_total","configs_failed","configs_total","elapsed_seconds","percent","units_completed","units_error","units_failed","units_total"],"title":"EvalProgressV3"},"EvalScorecardV3Status":{"type":"string","enum":["scored","error"],"title":"EvalScorecardV3Status"},"EvalScorecardV3":{"type":"object","properties":{"chunk_count":{"type":"integer"},"collection_name":{"type":"string"},"document_count":{"type":"integer"},"environment":{"type":["string","null"]},"error":{"type":"integer"},"error_code":{"type":["string","null"]},"error_message":{"type":["string","null"]},"explicit_fields":{"type":"array","items":{"type":"string"}},"failed":{"type":"integer"},"latency_p50_ms":{"type":["integer","null"]},"latency_p95_ms":{"type":["integer","null"]},"mrr":{"type":["number","null"],"format":"double"},"name":{"type":"string"},"ndcg_at_10":{"type":["number","null"],"format":"double"},"query":{"$ref":"#/components/schemas/ResolvedQueryConfigV3"},"question_set_size":{"type":"integer"},"recall_at_1":{"type":["number","null"],"format":"double"},"recall_at_10":{"type":["number","null"],"format":"double"},"recall_at_3":{"type":["number","null"],"format":"double"},"scored":{"type":"integer"},"status":{"$ref":"#/components/schemas/EvalScorecardV3Status"}},"required":["chunk_count","collection_name","document_count","error","explicit_fields","failed","name","query","question_set_size","scored","status"],"title":"EvalScorecardV3"},"EvalResponseV3Status":{"type":"string","enum":["pending","running","completed","completed_with_errors","failed"],"title":"EvalResponseV3Status"},"EvalResponseV3":{"type":"object","properties":{"billing":{"oneOf":[{"$ref":"#/components/schemas/EvalBillingV3"},{"type":"null"}]},"collection_name":{"type":"string"},"completed_at":{"type":["string","null"]},"configs":{"type":"array","items":{"$ref":"#/components/schemas/ResolvedConfigV3"}},"created_at":{"type":"string"},"environment":{"type":["string","null"]},"error_code":{"type":["string","null"]},"error_message":{"type":["string","null"]},"eval_id":{"type":"string"},"idempotency_key":{"type":"string"},"items":{"type":"array","items":{"$ref":"#/components/schemas/EvalItemV3"}},"items_page":{"$ref":"#/components/schemas/EvalItemsPageV3"},"preview":{"$ref":"#/components/schemas/EvalPreviewV3"},"progress":{"$ref":"#/components/schemas/EvalProgressV3"},"request_id":{"type":"string"},"scorecards":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/EvalScorecardV3"}},"started_at":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/EvalResponseV3Status"},"updated_at":{"type":"string"},"upload_id":{"type":"string"}},"required":["collection_name","configs","created_at","eval_id","idempotency_key","items_page","preview","progress","request_id","status","updated_at","upload_id"],"description":"One shape for the 201 accept body, the 200 idempotent replay, and GET.","title":"EvalResponseV3"},"EvalListRowV3Status":{"type":"string","enum":["pending","running","completed","completed_with_errors","failed"],"title":"EvalListRowV3Status"},"EvalListRowV3":{"type":"object","properties":{"billing":{"oneOf":[{"$ref":"#/components/schemas/EvalBillingV3"},{"type":"null"}]},"cases":{"type":"integer"},"cases_error":{"type":"integer"},"collection_name":{"type":"string"},"completed_at":{"type":["string","null"]},"config_names":{"type":"array","items":{"type":"string"}},"created_at":{"type":"string"},"environment":{"type":["string","null"]},"error_code":{"type":["string","null"]},"eval_id":{"type":"string"},"progress":{"$ref":"#/components/schemas/EvalProgressV3"},"scorecards":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/EvalScorecardV3"}},"started_at":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/EvalListRowV3Status"},"units":{"type":"integer"},"updated_at":{"type":"string"}},"required":["cases","cases_error","collection_name","created_at","eval_id","progress","status","units","updated_at"],"description":"One row of GET /v3/evals.\n\nThe top-line numbers a list needs. Per-case results and stored answers stay\non GET /v3/evals/{eval_id}, so a page of rows costs one query regardless of\nhow many cases each eval ran.","title":"EvalListRowV3"},"EvalListResponseV3":{"type":"object","properties":{"count":{"type":"integer","description":"Rows on this page. There is no total; page until next_cursor is null."},"evals":{"type":"array","items":{"$ref":"#/components/schemas/EvalListRowV3"}},"next_cursor":{"type":["string","null"],"description":"Pass as `cursor` to continue. Null on the last page."}},"required":["count"],"description":"A page of evaluations, newest first.","title":"EvalListResponseV3"},"EvalAnswerV3Request":{"type":"object","properties":{},"description":"The exact Query v3 request body the unit sent.","title":"EvalAnswerV3Request"},"EvalAnswerV3Response":{"type":"object","properties":{},"description":"The exact Query v3 response body the unit received.","title":"EvalAnswerV3Response"},"EvalAnswerV3Status":{"type":"string","enum":["pending","running","scored","failed"],"title":"EvalAnswerV3Status"},"EvalAnswerV3":{"type":"object","properties":{"config_name":{"type":"string"},"eval_id":{"type":"string"},"id":{"type":"string","description":"The case id (`items[].id`)."},"query_id":{"type":["string","null"]},"request":{"$ref":"#/components/schemas/EvalAnswerV3Request","description":"The exact Query v3 request body the unit sent."},"response":{"$ref":"#/components/schemas/EvalAnswerV3Response","description":"The exact Query v3 response body the unit received."},"status":{"$ref":"#/components/schemas/EvalAnswerV3Status"}},"required":["config_name","eval_id","id","request","response","status"],"description":"The complete query response one unit received, kept on the eval.","title":"EvalAnswerV3"},"AppApiRoutesV2OdysseyEventsFeedResponseEventsItems":{"type":"object","properties":{},"title":"AppApiRoutesV2OdysseyEventsFeedResponseEventsItems"},"app__api__routes__v2__odyssey__events__FeedResponse":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/AppApiRoutesV2OdysseyEventsFeedResponseEventsItems"}},"has_more":{"type":"boolean","default":false},"next_cursor":{"type":["string","null"]},"page_size":{"type":["integer","null"]}},"title":"app__api__routes__v2__odyssey__events__FeedResponse"},"OdysseyEventCompany":{"type":"object","properties":{"name":{"type":"string"},"domain":{"type":"string"},"entity_id":{"type":"string","description":"Odyssey entity ID — usable with /datasets/odyssey/general/{entity_id}/* endpoints"},"industry":{"type":["string","null"]},"location":{"type":["string","null"]},"role":{"type":"string","description":"Company's role in the event, e.g. primary_subject"}},"required":["name","domain","entity_id","role"],"title":"OdysseyEventCompany"},"OdysseyEventData":{"type":"object","properties":{"amount":{"type":["number","null"],"format":"double"},"round":{"type":["string","null"]},"lead_investor":{"type":["string","null"]},"investors":{"type":"array","items":{"type":"string"}},"valuation":{"type":["number","null"],"format":"double"}},"description":"Type-specific structured fields; funding events carry amount/round/investors, other types leave them null.","title":"OdysseyEventData"},"OdysseyEventDetail":{"type":"object","properties":{"id":{"type":"string"},"event_id":{"type":"string"},"type":{"type":"string","description":"Event type, e.g. funding_round, product_launch, acquisition"},"title":{"type":"string"},"subhead":{"type":["string","null"]},"company":{"$ref":"#/components/schemas/OdysseyEventCompany"},"event_data":{"$ref":"#/components/schemas/OdysseyEventData"},"sector":{"type":["string","null"]},"published_at":{"type":"string","format":"date-time"},"confidence":{"type":"number","format":"double","description":"Extraction confidence, 0-1"},"url":{"type":"string"}},"required":["id","event_id","type","title","company","published_at"],"title":"OdysseyEventDetail"},"AppApiRoutesV2OdysseyFeedFeedResponseArticlesItems":{"type":"object","properties":{},"title":"AppApiRoutesV2OdysseyFeedFeedResponseArticlesItems"},"app__api__routes__v2__odyssey__feed__FeedResponse":{"type":"object","properties":{"articles":{"type":"array","items":{"$ref":"#/components/schemas/AppApiRoutesV2OdysseyFeedFeedResponseArticlesItems"}},"has_more":{"type":"boolean","default":false},"next_cursor":{"type":["string","null"]},"page_size":{"type":["integer","null"]}},"title":"app__api__routes__v2__odyssey__feed__FeedResponse"},"OdysseyArticleCompanyMention":{"type":"object","properties":{"name":{"type":"string"},"domain":{"type":"string"},"entity_id":{"type":"string"},"role":{"type":"string"},"confidence":{"type":"number","format":"double"},"resolution":{"type":"string","description":"How the entity was resolved, e.g. exact_domain"},"industry":{"type":["string","null"]},"location":{"type":["string","null"]},"employee_count":{"type":["integer","null"]},"total_funding_raised":{"type":["integer","null"]}},"required":["name","domain","entity_id","role","confidence","resolution"],"title":"OdysseyArticleCompanyMention"},"OdysseyArticleDetail":{"type":"object","properties":{"id":{"type":"string"},"article_id":{"type":"string"},"title":{"type":"string"},"subhead":{"type":["string","null"]},"publication":{"type":"string"},"author":{"type":["string","null"]},"url":{"type":"string"},"published_at":{"type":"string","format":"date-time"},"topics":{"type":["array","null"],"items":{"type":"string"}},"has_entities":{"type":"boolean"},"body_source":{"type":"string"},"enriched":{"type":"boolean"},"detail_url":{"type":"string"},"companies_mentioned":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyArticleCompanyMention"}},"article_type":{"type":"string"},"sector":{"type":["string","null"]}},"required":["id","article_id","title","publication","url","published_at"],"title":"OdysseyArticleDetail"},"SubscribeRequest":{"type":"object","properties":{"callback_url":{"type":"string","description":"HTTPS URL to POST watchlist.match events to"},"feeds":{"type":["array","null"],"items":{"type":"string"},"description":"subset of ['events','publications']; default both"},"secret":{"type":["string","null"],"description":"HMAC-SHA256 signing secret (write-only; never echoed back)"},"watchlist_domains":{"type":"array","items":{"type":"string"},"description":"domains to watch, e.g. ['stripe.com']"}},"required":["callback_url","watchlist_domains"],"title":"SubscribeRequest"},"WebhookSubscribeResponse":{"type":"object","properties":{"id":{"type":"string"},"callback_url":{"type":"string"},"watchlist_count":{"type":"integer"},"feeds":{"type":"array","items":{"type":"string"}},"status":{"type":"string"},"created_at":{"type":"string","format":"date-time"}},"required":["id","callback_url","watchlist_count","feeds","status","created_at"],"title":"WebhookSubscribeResponse"},"WebhookSubscription":{"type":"object","properties":{"id":{"type":"string"},"callback_url":{"type":"string"},"watchlist_domains":{"type":"array","items":{"type":"string"}},"watchlist_count":{"type":"integer"},"feeds":{"type":"array","items":{"type":"string"}},"status":{"type":"string"},"secret_set":{"type":"boolean","description":"Whether an HMAC signing secret is configured; the secret itself is never returned"},"created_at":{"type":"string","format":"date-time"}},"required":["id","callback_url","watchlist_domains","watchlist_count","feeds","status","secret_set","created_at"],"title":"WebhookSubscription"},"WebhookSubscriptionList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookSubscription"}},"count":{"type":"integer"}},"required":["data","count"],"title":"WebhookSubscriptionList"},"CompanySearchResult":{"type":"object","properties":{"description":{"type":["string","null"]},"employee_count":{"type":["integer","null"]},"entity_id":{"type":["string","null"]},"founded":{"type":["integer","null"]},"industry":{"type":["string","null"]},"latest_funding_stage":{"type":["string","null"]},"linkedin_url":{"type":["string","null"]},"location":{"type":["string","null"]},"name":{"type":"string"},"size":{"type":["string","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"total_funding_raised":{"type":["number","null"],"format":"double","description":"Total capital raised (incl. debt). Null for large/public companies where the figure is misleading."},"website":{"type":["string","null"]}},"required":["name"],"description":"Company search result — surface-level fields for discovery.","title":"CompanySearchResult"},"CompanySearchResponse":{"type":"object","properties":{"limit":{"type":"integer","default":10},"query":{"type":"string"},"results":{"type":"array","items":{"$ref":"#/components/schemas/CompanySearchResult"}},"search_mode":{"type":["string","null"]},"total_count":{"type":"integer","default":0}},"required":["query"],"description":"Company search response.","title":"CompanySearchResponse"},"OdysseyCompaniesFullResponseEmployeeReviewsScoreCultureValuesByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"culture_values_score":{"type":"number","format":"double"}},"title":"OdysseyCompaniesFullResponseEmployeeReviewsScoreCultureValuesByMonthItems"},"OdysseyCompaniesFullResponseLinkedinFollowersCountByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"follower_count":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseLinkedinFollowersCountByMonthItems"},"OdysseyCompaniesFullResponseCompetitorsItems":{"type":"object","properties":{"company_name":{"type":"string"}},"title":"OdysseyCompaniesFullResponseCompetitorsItems"},"OdysseyCompaniesFullResponseRevenueAnnualSource1AnnualRevenue":{"type":"object","properties":{"annual_revenue":{"type":"integer"},"annual_revenue_currency":{"type":"string"}},"title":"OdysseyCompaniesFullResponseRevenueAnnualSource1AnnualRevenue"},"OdysseyCompaniesFullResponseRevenueAnnualSource5AnnualRevenue":{"type":"object","properties":{"annual_revenue":{"type":"integer"},"annual_revenue_currency":{"type":"string"}},"title":"OdysseyCompaniesFullResponseRevenueAnnualSource5AnnualRevenue"},"OdysseyCompaniesFullResponseRevenueAnnual":{"type":"object","properties":{"source_1_annual_revenue":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseRevenueAnnualSource1AnnualRevenue"},"source_5_annual_revenue":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseRevenueAnnualSource5AnnualRevenue"}},"title":"OdysseyCompaniesFullResponseRevenueAnnual"},"OdysseyCompaniesFullResponseAcquisitionListSource5Items":{"type":"object","properties":{"acquiree_name":{"type":"string"},"announced_date":{"type":"string"}},"title":"OdysseyCompaniesFullResponseAcquisitionListSource5Items"},"OdysseyCompaniesFullResponseEmployeeReviewsScoreDiversityInclusionChange":{"type":"object","properties":{"current":{"type":"number","format":"double"},"change_quarterly":{"type":"integer"},"change_yearly":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseEmployeeReviewsScoreDiversityInclusionChange"},"OdysseyCompaniesFullResponseAcquisitionListSource1Items":{"type":"object","properties":{"acquiree_name":{"type":"string"},"announced_date":{"type":"string"}},"title":"OdysseyCompaniesFullResponseAcquisitionListSource1Items"},"OdysseyCompaniesFullResponseEmployeesCountBreakdownBySeniority":{"type":"object","properties":{"employees_count_clevel":{"type":"integer"},"employees_count_head":{"type":"integer"},"employees_count_senior":{"type":"integer"},"employees_count_partner":{"type":"integer"},"employees_count_intern":{"type":"integer"},"employees_count_specialist":{"type":"integer"},"employees_count_owner":{"type":"integer"},"employees_count_vp":{"type":"integer"},"employees_count_director":{"type":"integer"},"employees_count_manager":{"type":"integer"},"employees_count_founder":{"type":"integer"},"employees_count_other_management":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseEmployeesCountBreakdownBySeniority"},"OdysseyCompaniesFullResponseAcquisitionListSource2Items":{"type":"object","properties":{"acquiree_name":{"type":"string"},"announced_date":{"type":"string"}},"title":"OdysseyCompaniesFullResponseAcquisitionListSource2Items"},"OdysseyCompaniesFullResponseEmployeesCountBreakdownBySeniorityByMonthItemsEmployeesCountBreakdownBySeniority":{"type":"object","properties":{"employees_count_clevel":{"type":"integer"},"employees_count_head":{"type":"integer"},"employees_count_senior":{"type":"integer"},"employees_count_partner":{"type":"integer"},"employees_count_intern":{"type":"integer"},"employees_count_specialist":{"type":"integer"},"employees_count_owner":{"type":"integer"},"employees_count_vp":{"type":"integer"},"employees_count_director":{"type":"integer"},"employees_count_manager":{"type":"integer"},"employees_count_founder":{"type":"integer"},"employees_count_other_management":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseEmployeesCountBreakdownBySeniorityByMonthItemsEmployeesCountBreakdownBySeniority"},"OdysseyCompaniesFullResponseEmployeesCountBreakdownBySeniorityByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"employees_count_breakdown_by_seniority":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeesCountBreakdownBySeniorityByMonthItemsEmployeesCountBreakdownBySeniority"}},"title":"OdysseyCompaniesFullResponseEmployeesCountBreakdownBySeniorityByMonthItems"},"OdysseyCompaniesFullResponseDeparturesCountByMonthItems":{"type":"object","properties":{"departures_count":{"type":"integer"},"date":{"type":"string"}},"title":"OdysseyCompaniesFullResponseDeparturesCountByMonthItems"},"OdysseyCompaniesFullResponseEmployeeReviewsScoreSeniorManagementByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"senior_management_score":{"type":"number","format":"double"}},"title":"OdysseyCompaniesFullResponseEmployeeReviewsScoreSeniorManagementByMonthItems"},"OdysseyCompaniesFullResponseLinkedinFollowersCountChange":{"type":"object","properties":{"change_quarterly_percentage":{"type":"number","format":"double"},"current":{"type":"integer"},"change_monthly_percentage":{"type":"number","format":"double"},"change_monthly":{"type":"integer"},"change_quarterly":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseLinkedinFollowersCountChange"},"OdysseyCompaniesFullResponseStatus":{"type":"object","properties":{"value":{"type":"string"},"comment":{"type":"string"}},"title":"OdysseyCompaniesFullResponseStatus"},"OdysseyCompaniesFullResponseEmployeeReviewsScoreCeoApprovalChange":{"type":"object","properties":{"current":{"type":"number","format":"double"},"change_quarterly":{"type":"integer"},"change_yearly":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseEmployeeReviewsScoreCeoApprovalChange"},"OdysseyCompaniesFullResponseTopNextCompaniesItems":{"type":"object","properties":{"count":{"type":"integer"},"company_name":{"type":"string"}},"title":"OdysseyCompaniesFullResponseTopNextCompaniesItems"},"OdysseyCompaniesFullResponseEmployeeReviewsScoreCeoApprovalByMonthItems":{"type":"object","properties":{"ceo_approval_score":{"type":"number","format":"double"},"date":{"type":"string"}},"title":"OdysseyCompaniesFullResponseEmployeeReviewsScoreCeoApprovalByMonthItems"},"OdysseyCompaniesFullResponseProductReviewsScoreChange":{"type":"object","properties":{"current":{"type":"number","format":"double"},"change_quarterly":{"type":"number","format":"double"},"change_monthly":{"type":"number","format":"double"}},"title":"OdysseyCompaniesFullResponseProductReviewsScoreChange"},"OdysseyCompaniesFullResponseTopPreviousCompaniesItems":{"type":"object","properties":{"count":{"type":"integer"},"company_name":{"type":"string"}},"title":"OdysseyCompaniesFullResponseTopPreviousCompaniesItems"},"OdysseyCompaniesFullResponseLastFundingRoundInvestorsItems":{"type":"object","properties":{"name":{"type":"string"},"is_lead":{"type":"boolean"},"entity":{"type":"string"}},"title":"OdysseyCompaniesFullResponseLastFundingRoundInvestorsItems"},"OdysseyCompaniesFullResponseLastFundingRound":{"type":"object","properties":{"type":{"type":"string"},"investors":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseLastFundingRoundInvestorsItems"}},"announced_date":{"type":"string"},"num_investors":{"type":"integer"},"num_partners":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseLastFundingRound"},"OdysseyCompaniesFullResponseEmployeeReviewsScoreBreakdown":{"type":"object","properties":{"work_life_balance":{"type":"number","format":"double"},"diversity_inclusion":{"type":"number","format":"double"},"compensation_benefits":{"type":"number","format":"double"},"culture_values":{"type":"number","format":"double"},"ceo_approval":{"type":"number","format":"double"},"business_outlook":{"type":"number","format":"double"},"senior_management":{"type":"number","format":"double"},"recommend":{"type":"number","format":"double"},"career_opportunities":{"type":"number","format":"double"}},"title":"OdysseyCompaniesFullResponseEmployeeReviewsScoreBreakdown"},"OdysseyCompaniesFullResponseIncomeStatementsItems":{"type":"object","properties":{"period_display_end_date":{"type":"string"},"revenue":{"type":"integer"},"cost_of_goods_sold_currency":{"type":"string"},"period_end_date":{"type":"string"},"period_type":{"type":"string"}},"title":"OdysseyCompaniesFullResponseIncomeStatementsItems"},"OdysseyCompaniesFullResponseFundingRoundsItemsInvestorsItems":{"type":"object","properties":{"name":{"type":"string"},"entity":{"type":"string"}},"title":"OdysseyCompaniesFullResponseFundingRoundsItemsInvestorsItems"},"OdysseyCompaniesFullResponseFundingRoundsItems":{"type":"object","properties":{"type":{"type":"string"},"amount_raised":{"type":"integer"},"amount_raised_currency":{"type":"string"},"investors":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseFundingRoundsItemsInvestorsItems"}},"announced_date":{"type":"string"},"num_investors":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseFundingRoundsItems"},"OdysseyCompaniesFullResponseEmployeeReviewsScoreRecommendByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"recommend_score":{"type":"number","format":"double"}},"title":"OdysseyCompaniesFullResponseEmployeeReviewsScoreRecommendByMonthItems"},"OdysseyCompaniesFullResponseEmployeesCountBreakdownByDepartmentByMonthItemsEmployeesCountBreakdownByDepartment":{"type":"object","properties":{"employees_count_administrative":{"type":"integer"},"employees_count_medical":{"type":"integer"},"employees_count_legal":{"type":"integer"},"employees_count_finance":{"type":"integer"},"employees_count_customer_service":{"type":"integer"},"employees_count_real_estate":{"type":"integer"},"employees_count_technical":{"type":"integer"},"employees_count_sales":{"type":"integer"},"employees_count_marketing":{"type":"integer"},"employees_count_research":{"type":"integer"},"employees_count_other_department":{"type":"integer"},"employees_count_trades":{"type":"integer"},"employees_count_hr":{"type":"integer"},"employees_count_consulting":{"type":"integer"},"employees_count_product":{"type":"integer"},"employees_count_education":{"type":"integer"},"employees_count_general_management":{"type":"integer"},"employees_count_project_management":{"type":"integer"},"employees_count_design":{"type":"integer"},"employees_count_operations":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseEmployeesCountBreakdownByDepartmentByMonthItemsEmployeesCountBreakdownByDepartment"},"OdysseyCompaniesFullResponseEmployeesCountBreakdownByDepartmentByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"employees_count_breakdown_by_department":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeesCountBreakdownByDepartmentByMonthItemsEmployeesCountBreakdownByDepartment"}},"title":"OdysseyCompaniesFullResponseEmployeesCountBreakdownByDepartmentByMonthItems"},"OdysseyCompaniesFullResponseEmployeeReviewsScoreAggregatedByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"aggregated_score":{"type":"number","format":"double"}},"title":"OdysseyCompaniesFullResponseEmployeeReviewsScoreAggregatedByMonthItems"},"OdysseyCompaniesFullResponseEmployeesCountBreakdownByRegion":{"type":"object","properties":{"employees_count_australia_new_zealand":{"type":"integer"},"employees_count_melanesia":{"type":"integer"},"employees_count_western_asia":{"type":"integer"},"employees_count_sub_saharan_africa":{"type":"integer"},"employees_count_northern_africa":{"type":"integer"},"employees_count_south_eastern_asia":{"type":"integer"},"employees_count_central_asia":{"type":"integer"},"employees_count_southern_asia":{"type":"integer"},"employees_count_northern_america":{"type":"integer"},"employees_count_unknown":{"type":"integer"},"employees_count_southern_europe":{"type":"integer"},"employees_count_latin_america":{"type":"integer"},"employees_count_northern_europe":{"type":"integer"},"employees_count_polynesia":{"type":"integer"},"employees_count_western_europe":{"type":"integer"},"employees_count_micronesia":{"type":"integer"},"employees_count_eastern_europe":{"type":"integer"},"employees_count_eastern_asia":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseEmployeesCountBreakdownByRegion"},"OdysseyCompaniesFullResponseActiveJobPostingsCountChange":{"type":"object","properties":{"change_quarterly_percentage":{"type":"number","format":"double"},"current":{"type":"integer"},"change_monthly_percentage":{"type":"number","format":"double"},"change_monthly":{"type":"integer"},"change_quarterly":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseActiveJobPostingsCountChange"},"OdysseyCompaniesFullResponseEmployeeReviewsScoreWorkLifeBalanceChange":{"type":"object","properties":{"current":{"type":"number","format":"double"},"change_quarterly":{"type":"number","format":"double"},"change_yearly":{"type":"number","format":"double"}},"title":"OdysseyCompaniesFullResponseEmployeeReviewsScoreWorkLifeBalanceChange"},"OdysseyCompaniesFullResponseEmployeeReviewsScoreCareerOpportunitiesChange":{"type":"object","properties":{"current":{"type":"number","format":"double"},"change_quarterly":{"type":"number","format":"double"},"change_yearly":{"type":"number","format":"double"}},"title":"OdysseyCompaniesFullResponseEmployeeReviewsScoreCareerOpportunitiesChange"},"OdysseyCompaniesFullResponseEmployeeReviewsScoreBusinessOutlookChange":{"type":"object","properties":{"current":{"type":"number","format":"double"},"change_quarterly":{"type":"integer"},"change_yearly":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseEmployeeReviewsScoreBusinessOutlookChange"},"OdysseyCompaniesFullResponseAffiliatedEntitiesItems":{"type":"object","properties":{"display_name":{"type":"string"},"relationship":{"type":"string"}},"title":"OdysseyCompaniesFullResponseAffiliatedEntitiesItems"},"OdysseyCompaniesFullResponseEmployeeReviewsScoreCompensationBenefitsByMonthItems":{"type":"object","properties":{"compensation_benefits_score":{"type":"number","format":"double"},"date":{"type":"string"}},"title":"OdysseyCompaniesFullResponseEmployeeReviewsScoreCompensationBenefitsByMonthItems"},"OdysseyCompaniesFullResponseKeyExecutiveDeparturesItems":{"type":"object","properties":{"member_position_title":{"type":"string"},"member_full_name":{"type":"string"},"departure_date":{"type":"string"}},"title":"OdysseyCompaniesFullResponseKeyExecutiveDeparturesItems"},"OdysseyCompaniesFullResponseCompanyLocationsFullItems":{"type":"object","properties":{"location_address":{"type":"string"},"is_primary":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseCompanyLocationsFullItems"},"OdysseyCompaniesFullResponseKeyExecutiveArrivalsItems":{"type":"object","properties":{"member_position_title":{"type":"string"},"member_full_name":{"type":"string"},"arrival_date":{"type":"string"}},"title":"OdysseyCompaniesFullResponseKeyExecutiveArrivalsItems"},"OdysseyCompaniesFullResponseEmployeesCountChange":{"type":"object","properties":{"change_quarterly_percentage":{"type":"number","format":"double"},"current":{"type":"integer"},"change_monthly_percentage":{"type":"number","format":"double"},"change_monthly":{"type":"integer"},"change_quarterly":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseEmployeesCountChange"},"OdysseyCompaniesFullResponseEmployeesCountBreakdownByRegionByMonthItemsEmployeesCountBreakdownByRegion":{"type":"object","properties":{"employees_count_australia_new_zealand":{"type":"integer"},"employees_count_melanesia":{"type":"integer"},"employees_count_western_asia":{"type":"integer"},"employees_count_sub_saharan_africa":{"type":"integer"},"employees_count_northern_africa":{"type":"integer"},"employees_count_south_eastern_asia":{"type":"integer"},"employees_count_central_asia":{"type":"integer"},"employees_count_southern_asia":{"type":"integer"},"employees_count_northern_america":{"type":"integer"},"employees_count_unknown":{"type":"integer"},"employees_count_southern_europe":{"type":"integer"},"employees_count_latin_america":{"type":"integer"},"employees_count_northern_europe":{"type":"integer"},"employees_count_polynesia":{"type":"integer"},"employees_count_western_europe":{"type":"integer"},"employees_count_micronesia":{"type":"integer"},"employees_count_eastern_europe":{"type":"integer"},"employees_count_eastern_asia":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseEmployeesCountBreakdownByRegionByMonthItemsEmployeesCountBreakdownByRegion"},"OdysseyCompaniesFullResponseEmployeesCountBreakdownByRegionByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"employees_count_breakdown_by_region":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeesCountBreakdownByRegionByMonthItemsEmployeesCountBreakdownByRegion"}},"title":"OdysseyCompaniesFullResponseEmployeesCountBreakdownByRegionByMonthItems"},"OdysseyCompaniesFullResponseFundingDetailsItems":{"type":"object","properties":{"funding_type":{"type":"string"},"funding_raised":{"type":"integer"},"funding_round_date":{"type":"string"}},"title":"OdysseyCompaniesFullResponseFundingDetailsItems"},"OdysseyCompaniesFullResponseEmployeesCountByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"employees_count":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseEmployeesCountByMonthItems"},"OdysseyCompaniesFullResponseEmployeeAttritionRateByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"employee_attrition_rate":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseEmployeeAttritionRateByMonthItems"},"OdysseyCompaniesFullResponseEmployeeReviewsScoreDistribution":{"type":"object","properties":{"score_2":{"type":"integer"},"score_1":{"type":"integer"},"score_4":{"type":"integer"},"score_3":{"type":"integer"},"score_5":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseEmployeeReviewsScoreDistribution"},"OdysseyCompaniesFullResponseEmployeeReviewsScoreSeniorManagementChange":{"type":"object","properties":{"current":{"type":"number","format":"double"},"change_quarterly":{"type":"number","format":"double"},"change_yearly":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseEmployeeReviewsScoreSeniorManagementChange"},"OdysseyCompaniesFullResponseEmployeeReviewsScoreWorkLifeBalanceByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"work_life_balance_score":{"type":"number","format":"double"}},"title":"OdysseyCompaniesFullResponseEmployeeReviewsScoreWorkLifeBalanceByMonthItems"},"OdysseyCompaniesFullResponseBaseSalaryItems":{"type":"object","properties":{"pay_period":{"type":"string"},"currency":{"type":"string"},"salary_p25":{"type":"number","format":"double"},"title":{"type":"string"},"salary_p75":{"type":"number","format":"double"},"salary_median":{"type":"number","format":"double"}},"title":"OdysseyCompaniesFullResponseBaseSalaryItems"},"OdysseyCompaniesFullResponseProductReviewsScoreByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"product_reviews_score":{"type":"number","format":"double"}},"title":"OdysseyCompaniesFullResponseProductReviewsScoreByMonthItems"},"OdysseyCompaniesFullResponseEmployeeReviewsScoreCareerOpportunitiesByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"career_opportunities_score":{"type":"number","format":"double"}},"title":"OdysseyCompaniesFullResponseEmployeeReviewsScoreCareerOpportunitiesByMonthItems"},"OdysseyCompaniesFullResponseEmployeesCountByCountryItems":{"type":"object","properties":{"employee_count":{"type":"integer"},"country":{"type":"string"}},"title":"OdysseyCompaniesFullResponseEmployeesCountByCountryItems"},"OdysseyCompaniesFullResponseKeyEmployeeChangeEventsItems":{"type":"object","properties":{"employee_change_event_name":{"type":"string"},"employee_change_event_url":{"type":"string"},"employee_change_event_date":{"type":"string"}},"title":"OdysseyCompaniesFullResponseKeyEmployeeChangeEventsItems"},"OdysseyCompaniesFullResponseEmployeeReviewsScoreRecommendChange":{"type":"object","properties":{"current":{"type":"number","format":"double"},"change_quarterly":{"type":"integer"},"change_yearly":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseEmployeeReviewsScoreRecommendChange"},"OdysseyCompaniesFullResponseEmployeeReviewsScoreDiversityInclusionByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"diversity_inclusion_score":{"type":"number","format":"double"}},"title":"OdysseyCompaniesFullResponseEmployeeReviewsScoreDiversityInclusionByMonthItems"},"OdysseyCompaniesFullResponseActiveJobPostingsCountByMonthItems":{"type":"object","properties":{"active_job_postings_count":{"type":"integer"},"date":{"type":"string"}},"title":"OdysseyCompaniesFullResponseActiveJobPostingsCountByMonthItems"},"OdysseyCompaniesFullResponseEmployeeReviewsScoreCompensationBenefitsChange":{"type":"object","properties":{"current":{"type":"number","format":"double"},"change_quarterly":{"type":"number","format":"double"},"change_yearly":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseEmployeeReviewsScoreCompensationBenefitsChange"},"OdysseyCompaniesFullResponseEmployeeCountByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"employees_count":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseEmployeeCountByMonthItems"},"OdysseyCompaniesFullResponseEmployeeReviewsScoreAggregatedChange":{"type":"object","properties":{"current":{"type":"number","format":"double"},"change_quarterly":{"type":"integer"},"change_yearly":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseEmployeeReviewsScoreAggregatedChange"},"OdysseyCompaniesFullResponseEmployeeReviewsScoreCultureValuesChange":{"type":"object","properties":{"current":{"type":"number","format":"double"},"change_quarterly":{"type":"integer"},"change_yearly":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseEmployeeReviewsScoreCultureValuesChange"},"OdysseyCompaniesFullResponseEmployeesCountBreakdownByDepartment":{"type":"object","properties":{"employees_count_administrative":{"type":"integer"},"employees_count_medical":{"type":"integer"},"employees_count_legal":{"type":"integer"},"employees_count_finance":{"type":"integer"},"employees_count_customer_service":{"type":"integer"},"employees_count_real_estate":{"type":"integer"},"employees_count_technical":{"type":"integer"},"employees_count_sales":{"type":"integer"},"employees_count_marketing":{"type":"integer"},"employees_count_research":{"type":"integer"},"employees_count_other_department":{"type":"integer"},"employees_count_trades":{"type":"integer"},"employees_count_hr":{"type":"integer"},"employees_count_consulting":{"type":"integer"},"employees_count_product":{"type":"integer"},"employees_count_education":{"type":"integer"},"employees_count_general_management":{"type":"integer"},"employees_count_project_management":{"type":"integer"},"employees_count_design":{"type":"integer"},"employees_count_operations":{"type":"integer"}},"title":"OdysseyCompaniesFullResponseEmployeesCountBreakdownByDepartment"},"OdysseyCompaniesFullResponseEmployeeReviewsScoreBusinessOutlookByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"business_outlook_score":{"type":"number","format":"double"}},"title":"OdysseyCompaniesFullResponseEmployeeReviewsScoreBusinessOutlookByMonthItems"},"OdysseyCompaniesFullResponseEmployeesCountInferredByMonthItems":{"type":"object","properties":{"employees_count_inferred":{"type":"integer"},"date":{"type":"string"}},"title":"OdysseyCompaniesFullResponseEmployeesCountInferredByMonthItems"},"OdysseyCompaniesFullResponseLocation":{"type":"object","properties":{"name":{"type":"string"},"locality":{"type":"string"},"country":{"type":"string"},"region":{"type":"string"}},"title":"OdysseyCompaniesFullResponseLocation"},"OdysseyCompaniesFullResponseNewsArticlesItems":{"type":"object","properties":{"source":{"type":"string"},"article_url":{"type":"string"},"headline":{"type":"string"},"published_date":{"type":"string"}},"title":"OdysseyCompaniesFullResponseNewsArticlesItems"},"OdysseyCompaniesFullResponse":{"type":"object","properties":{"hq_region":{"type":"array","items":{"type":"string"}},"unique_domain":{"type":"boolean"},"description_enriched":{"type":"string"},"num_news_articles":{"type":"integer"},"employee_reviews_score_culture_values_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeReviewsScoreCultureValuesByMonthItems"}},"website_domain":{"type":"string"},"number_funding_rounds":{"type":"integer"},"type":{"type":"string"},"linkedin_followers_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseLinkedinFollowersCountByMonthItems"}},"competitors":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseCompetitorsItems"}},"last_funding_date":{"type":"string"},"is_b2b":{"type":"integer"},"company_logo":{"type":"string"},"revenue_annual":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseRevenueAnnual"},"hq_state":{"type":"string"},"acquisition_list_source_5":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseAcquisitionListSource5Items"}},"followers_count_linkedin":{"type":"integer"},"employee_reviews_score_diversity_inclusion_change":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeReviewsScoreDiversityInclusionChange"},"alternative_domains":{"type":"array","items":{"type":"string"}},"employee_count":{"type":"integer"},"facebook_url":{"type":"string"},"hq_location":{"type":"string"},"hq_city":{"type":"string"},"acquisition_list_source_1":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseAcquisitionListSource1Items"}},"employees_count_breakdown_by_seniority":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeesCountBreakdownBySeniority"},"acquisition_list_source_2":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseAcquisitionListSource2Items"}},"employees_count_breakdown_by_seniority_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeesCountBreakdownBySeniorityByMonthItems"}},"departures_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseDeparturesCountByMonthItems"}},"employee_reviews_score_senior_management_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeReviewsScoreSeniorManagementByMonthItems"}},"latest_funding_stage":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"pricing_available":{"type":"boolean"},"size":{"type":"string"},"_truncated_fields":{"type":"array","items":{"type":"string"}},"company_name":{"type":"string"},"linkedin_followers_count_change":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseLinkedinFollowersCountChange"},"youtube_url":{"type":"array","items":{"type":"string"}},"naics":{"type":"string"},"hq_country_iso2":{"type":"string"},"status":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseStatus"},"hq_country_iso3":{"type":"string"},"free_trial_available":{"type":"boolean"},"created_at":{"type":"string"},"industry":{"type":"string"},"alternative_names":{"type":"array","items":{"type":"string"}},"hq_full_address":{"type":"string"},"employee_reviews_score_ceo_approval_change":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeReviewsScoreCeoApprovalChange"},"top_next_companies":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseTopNextCompaniesItems"}},"employee_reviews_score_ceo_approval_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeReviewsScoreCeoApprovalByMonthItems"}},"canonical_linkedin_url":{"type":"string"},"headline":{"type":"string"},"twitter_url":{"type":"string"},"num_technologies_used":{"type":"integer"},"expired_domain":{"type":"boolean"},"company_employee_reviews_count":{"type":"integer"},"product_reviews_score_change":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseProductReviewsScoreChange"},"website":{"type":"string"},"top_previous_companies":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseTopPreviousCompaniesItems"}},"documentation_exist":{"type":"boolean"},"num_acquisitions_source_5":{"type":"integer"},"founded":{"type":"string"},"last_funding_round":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseLastFundingRound"},"employee_reviews_score_breakdown":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeReviewsScoreBreakdown"},"income_statements":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseIncomeStatementsItems"}},"company_phone_numbers":{"type":"array","items":{"type":"string"}},"funding_rounds":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseFundingRoundsItems"}},"employee_reviews_score_recommend_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeReviewsScoreRecommendByMonthItems"}},"github_url":{"type":"array","items":{"type":"string"}},"is_public":{"type":"boolean"},"num_acquisitions_source_2":{"type":"integer"},"num_acquisitions_source_1":{"type":"integer"},"employees_count_inferred":{"type":"integer"},"ownership_status":{"type":"string"},"linkedin_shorthand_name":{"type":"string"},"hq_zipcode":{"type":"string"},"company_logo_url":{"type":"string"},"employees_count_breakdown_by_department_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeesCountBreakdownByDepartmentByMonthItems"}},"hq_street":{"type":"string"},"inferred_revenue":{"type":"string"},"employee_reviews_score_aggregated_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeReviewsScoreAggregatedByMonthItems"}},"employees_count_breakdown_by_region":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeesCountBreakdownByRegion"},"crunchbase_url":{"type":"string"},"categories_and_keywords":{"type":"array","items":{"type":"string"}},"industry_v2":{"type":"string"},"active_job_postings_count_change":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseActiveJobPostingsCountChange"},"employee_reviews_score_work_life_balance_change":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeReviewsScoreWorkLifeBalanceChange"},"employee_reviews_score_career_opportunities_change":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeReviewsScoreCareerOpportunitiesChange"},"employee_reviews_score_business_outlook_change":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeReviewsScoreBusinessOutlookChange"},"affiliated_entities":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseAffiliatedEntitiesItems"}},"display_name":{"type":"string"},"employee_reviews_score_compensation_benefits_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeReviewsScoreCompensationBenefitsByMonthItems"}},"company_name_alias":{"type":"array","items":{"type":"string"}},"website_alias":{"type":"array","items":{"type":"string"}},"company_legal_name":{"type":"string"},"instagram_url":{"type":"array","items":{"type":"string"}},"last_updated_at":{"type":"string"},"key_executive_departures":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseKeyExecutiveDeparturesItems"}},"is_downloadable":{"type":"boolean"},"name":{"type":"string"},"company_locations_full":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseCompanyLocationsFullItems"}},"size_range":{"type":"string"},"linkedin_url":{"type":"string"},"key_executive_arrivals":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseKeyExecutiveArrivalsItems"}},"unique_website":{"type":"boolean"},"company_emails":{"type":"array","items":{"type":"string"}},"description_metadata_raw":{"type":"string"},"naics_codes":{"type":"array","items":{"type":"string"}},"employees_count_change":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeesCountChange"},"employees_count_breakdown_by_region_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeesCountBreakdownByRegionByMonthItems"}},"departures_count":{"type":"integer"},"funding_details":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseFundingDetailsItems"}},"description":{"type":"string"},"employees_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeesCountByMonthItems"}},"employee_attrition_rate_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeAttritionRateByMonthItems"}},"company_employee_reviews_aggregate_score":{"type":"number","format":"double"},"sic":{"type":"string"},"employee_reviews_score_distribution":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeReviewsScoreDistribution"},"demo_available":{"type":"boolean"},"employee_reviews_score_senior_management_change":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeReviewsScoreSeniorManagementChange"},"employee_reviews_score_work_life_balance_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeReviewsScoreWorkLifeBalanceByMonthItems"}},"sic_codes":{"type":"array","items":{"type":"string"}},"hq_country":{"type":"string"},"base_salary":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseBaseSalaryItems"}},"founded_year":{"type":"string"},"product_reviews_score_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseProductReviewsScoreByMonthItems"}},"employee_reviews_score_career_opportunities_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeReviewsScoreCareerOpportunitiesByMonthItems"}},"employees_count_by_country":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeesCountByCountryItems"}},"summary":{"type":"string"},"key_employee_change_events":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseKeyEmployeeChangeEventsItems"}},"employee_reviews_score_recommend_change":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeReviewsScoreRecommendChange"},"canonical_linkedin_shorthand_name":{"type":"string"},"active_job_postings_count":{"type":"integer"},"followers_count_owler":{"type":"integer"},"employee_reviews_score_diversity_inclusion_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeReviewsScoreDiversityInclusionByMonthItems"}},"active_job_postings_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseActiveJobPostingsCountByMonthItems"}},"employee_reviews_score_compensation_benefits_change":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeReviewsScoreCompensationBenefitsChange"},"product_reviews_count":{"type":"integer"},"employee_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeCountByMonthItems"}},"employee_reviews_score_aggregated_change":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeReviewsScoreAggregatedChange"},"employee_reviews_score_culture_values_change":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeReviewsScoreCultureValuesChange"},"employees_count_breakdown_by_department":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeesCountBreakdownByDepartment"},"employee_reviews_score_business_outlook_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeeReviewsScoreBusinessOutlookByMonthItems"}},"employees_count_inferred_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseEmployeesCountInferredByMonthItems"}},"total_funding_raised":{"type":"integer"},"location":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseLocation"},"mobile_apps_exist":{"type":"boolean"},"news_articles":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCompaniesFullResponseNewsArticlesItems"}},"online_reviews_exist":{"type":"boolean"},"employees_count":{"type":"integer"},"employee_attrition_rate":{"type":"integer"},"id":{"type":"string"},"entity_id":{"type":"string"}},"title":"OdysseyCompaniesFullResponse"},"CompanyOverviewHeadquarters":{"type":"object","properties":{},"title":"CompanyOverviewHeadquarters"},"CompanyOverviewSocialProfiles":{"type":"object","properties":{},"title":"CompanyOverviewSocialProfiles"},"CompanyOverview":{"type":"object","properties":{"cached_at":{"type":["string","null"]},"company_type":{"type":["string","null"]},"data_sources":{"type":"array","items":{"type":"string"}},"description":{"type":["string","null"]},"display_name":{"type":["string","null"]},"employee_count":{"type":["integer","null"]},"entity_id":{"type":"string"},"entity_type":{"type":"string","default":"company"},"founded":{"type":["integer","null"]},"headquarters":{"oneOf":[{"$ref":"#/components/schemas/CompanyOverviewHeadquarters"},{"type":"null"}]},"industry":{"type":["string","null"]},"social_profiles":{"oneOf":[{"$ref":"#/components/schemas/CompanyOverviewSocialProfiles"},{"type":"null"}]},"website":{"type":["string","null"]}},"required":["entity_id"],"description":"Company overview/bio response.","title":"CompanyOverview"},"Investor":{"type":"object","properties":{"description":{"type":["string","null"]},"investor_type":{"type":["string","null"]},"name":{"type":"string"},"website":{"type":["string","null"]}},"required":["name"],"description":"Investor information.","title":"Investor"},"InvestorsList":{"type":"object","properties":{"data_sources":{"type":"array","items":{"type":"string"}},"entity_id":{"type":"string"},"investors":{"type":"array","items":{"$ref":"#/components/schemas/Investor"}},"total_count":{"type":"integer","default":0}},"required":["entity_id"],"description":"List of investors response.","title":"InvestorsList"},"odyssey_companies_service_providers_Response_200":{"type":"object","properties":{},"title":"odyssey_companies_service_providers_Response_200"},"odyssey_companies_service_providers_deal_Response_200":{"type":"object","properties":{},"title":"odyssey_companies_service_providers_deal_Response_200"},"FundingRound":{"type":"object","properties":{"amount":{"type":["number","null"],"format":"double"},"date":{"type":["string","null"]},"investors":{"type":"array","items":{"type":"string"}},"round_type":{"type":["string","null"]},"valuation":{"type":["number","null"],"format":"double"}},"description":"Single funding round.","title":"FundingRound"},"WebSource":{"type":"object","properties":{"snippet":{"type":["string","null"]},"title":{"type":["string","null"]},"url":{"type":["string","null"]}},"description":"Web source reference for supplementary data.","title":"WebSource"},"FundingHistory":{"type":"object","properties":{"data_sources":{"type":"array","items":{"type":"string"}},"entity_id":{"type":"string"},"last_funding_date":{"type":["string","null"]},"latest_stage":{"type":["string","null"]},"num_rounds":{"type":["integer","null"]},"rounds":{"type":"array","items":{"$ref":"#/components/schemas/FundingRound"}},"total_raised":{"type":["number","null"],"format":"double"},"web_sources":{"type":"array","items":{"$ref":"#/components/schemas/WebSource"}}},"required":["entity_id"],"description":"Company funding history response.","title":"FundingHistory"},"odyssey_companies_debt_financing_recent_Response_200":{"type":"object","properties":{},"title":"odyssey_companies_debt_financing_recent_Response_200"},"CompanyDeal":{"type":"object","properties":{"amount":{"type":["number","null"],"format":"double"},"date":{"type":["string","null"]},"deal_type":{"type":"string"},"investors":{"type":"array","items":{"type":"string"}},"round_name":{"type":["string","null"]},"status":{"type":["string","null"]},"target_company":{"type":["string","null"]}},"required":["deal_type"],"description":"A deal (funding round or acquisition) for a company.","title":"CompanyDeal"},"CompanyDealsList":{"type":"object","properties":{"data_sources":{"type":"array","items":{"type":"string"}},"deals":{"type":"array","items":{"$ref":"#/components/schemas/CompanyDeal"}},"entity_id":{"type":"string"},"total_count":{"type":"integer","default":0}},"required":["entity_id"],"description":"List of deals (funding rounds + acquisitions) for a company.","title":"CompanyDealsList"},"FinancialData":{"type":"object","properties":{"assets":{"type":["number","null"],"format":"double"},"data_sources":{"type":"array","items":{"type":"string"}},"entity_id":{"type":"string"},"filing_date":{"type":["string","null"]},"fiscal_year":{"type":["integer","null"]},"inferred_revenue":{"type":["string","null"]},"liabilities":{"type":["number","null"],"format":"double"},"net_income":{"type":["number","null"],"format":"double"},"revenue":{"type":["number","null"],"format":"double"},"source":{"type":"string","default":"sec_edgar"}},"required":["entity_id"],"description":"Company financial data response.","title":"FinancialData"},"Competitor":{"type":"object","properties":{"name":{"type":"string"},"similarity_score":{"type":["number","null"],"format":"double"},"website":{"type":["string","null"]}},"required":["name"],"description":"Competitor information.","title":"Competitor"},"CompetitorsList":{"type":"object","properties":{"competitors":{"type":"array","items":{"$ref":"#/components/schemas/Competitor"}},"data_sources":{"type":"array","items":{"type":"string"}},"entity_id":{"type":"string"}},"required":["entity_id"],"description":"List of competitors response.","title":"CompetitorsList"},"PersonSearchResult":{"type":"object","properties":{"company":{"type":["string","null"]},"description":{"type":["string","null"]},"entity_id":{"type":"string"},"followers":{"type":["integer","null"]},"full_name":{"type":"string"},"headline":{"type":["string","null"]},"linkedin_url":{"type":["string","null"]},"location":{"type":["string","null"]},"school":{"type":["string","null"]}},"required":["entity_id","full_name"],"description":"Single person search result.","title":"PersonSearchResult"},"PersonSearchResponse":{"type":"object","properties":{"has_more":{"type":"boolean","default":false},"limit":{"type":"integer","default":10},"offset":{"type":"integer","default":0},"query":{"type":"string"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PersonSearchResult"}},"total_results":{"type":"integer","default":0}},"required":["query"],"description":"Person search results.","title":"PersonSearchResponse"},"PersonBioResponseCurrentCompany":{"type":"object","properties":{},"title":"PersonBioResponseCurrentCompany"},"PersonEducationItem":{"type":"object","properties":{"activities":{"type":["string","null"]},"degree":{"type":["string","null"]},"end_date":{"type":["string","null"]},"field_of_study":{"type":["string","null"]},"gpa":{"type":["string","null"]},"school":{"type":["string","null"]},"start_date":{"type":["string","null"]}},"description":"Single education entry.","title":"PersonEducationItem"},"PersonExperienceItem":{"type":"object","properties":{"company":{"type":["string","null"]},"company_id":{"type":["string","null"]},"description":{"type":["string","null"]},"duration_months":{"type":["integer","null"]},"end_date":{"type":["string","null"]},"is_current":{"type":["boolean","null"]},"location":{"type":["string","null"]},"start_date":{"type":["string","null"]},"title":{"type":["string","null"]}},"description":"Single work experience entry.","title":"PersonExperienceItem"},"PersonBioResponse":{"type":"object","properties":{"connection_count":{"type":["integer","null"]},"current_company":{"oneOf":[{"$ref":"#/components/schemas/PersonBioResponseCurrentCompany"},{"type":"null"}]},"education":{"type":"array","items":{"$ref":"#/components/schemas/PersonEducationItem"}},"emails":{"type":"array","items":{"type":"string"}},"entity_id":{"type":"string"},"experience":{"type":"array","items":{"$ref":"#/components/schemas/PersonExperienceItem"}},"facebook_url":{"type":["string","null"]},"follower_count":{"type":["integer","null"]},"full_name":{"type":["string","null"]},"github_url":{"type":["string","null"]},"headline":{"type":["string","null"]},"linkedin_url":{"type":["string","null"]},"location":{"type":["object","null"],"additionalProperties":{"type":"string"}},"phone_numbers":{"type":"array","items":{"type":"string"}},"profile_image_url":{"type":["string","null"]},"social_profiles":{"type":"object","additionalProperties":{"type":"string"}},"summary":{"type":["string","null"]},"total_degrees":{"type":"integer","default":0},"total_positions":{"type":"integer","default":0},"total_years_experience":{"type":["number","null"],"format":"double"},"twitter_url":{"type":["string","null"]}},"required":["entity_id"],"description":"Complete person profile with contact info, work history, and education.","title":"PersonBioResponse"},"DealSearchResult":{"type":"object","properties":{"amount":{"type":["number","null"],"format":"double"},"company_name":{"type":["string","null"]},"currency":{"type":["string","null"],"default":"USD"},"deal_date":{"type":["string","null"]},"deal_id":{"type":"string"},"deal_type":{"type":["string","null"]}},"required":["deal_id"],"description":"Single search result","title":"DealSearchResult"},"DealSearchResponse":{"type":"object","properties":{"data_sources":{"type":"array","items":{"type":"string"}},"message":{"type":["string","null"]},"page":{"type":"integer","default":1},"page_size":{"type":"integer","default":20},"query":{"type":["string","null"]},"results":{"type":"array","items":{"$ref":"#/components/schemas/DealSearchResult"}},"total_results":{"type":"integer","default":0}},"description":"Deal search response","title":"DealSearchResponse"},"DealOverview":{"type":"object","properties":{"amount":{"type":["number","null"],"format":"double"},"cached_at":{"type":["string","null"]},"company_id":{"type":["string","null"]},"company_name":{"type":["string","null"]},"currency":{"type":["string","null"],"default":"USD"},"data_sources":{"type":"array","items":{"type":"string"}},"deal_date":{"type":["string","null"]},"deal_id":{"type":"string"},"deal_type":{"type":["string","null"]},"description":{"type":["string","null"]},"entity_type":{"type":"string","default":"deal"},"lead_investors":{"type":["array","null"],"items":{"type":"string"}},"num_investors":{"type":["integer","null"]},"status":{"type":["string","null"]}},"required":["deal_id"],"description":"Deal overview response","title":"DealOverview"},"DealParticipant":{"type":"object","properties":{"amount_invested":{"type":["number","null"],"format":"double"},"entity_id":{"type":["string","null"]},"name":{"type":["string","null"]},"role":{"type":["string","null"]}},"description":"Investor or participant in a deal","title":"DealParticipant"},"DealParticipantsResponse":{"type":"object","properties":{"company_name":{"type":["string","null"]},"deal_id":{"type":"string"},"participants":{"type":"array","items":{"$ref":"#/components/schemas/DealParticipant"}},"total_participants":{"type":"integer","default":0}},"required":["deal_id"],"description":"Deal participants response","title":"DealParticipantsResponse"},"OdysseyDealsServiceProvidersResponseServiceProvidersItems":{"type":"object","properties":{"title":{"type":"string"},"url":{"type":"string"},"excerpts":{"type":"array","items":{"type":"string"}},"source":{"type":"string"}},"title":"OdysseyDealsServiceProvidersResponseServiceProvidersItems"},"OdysseyDealsServiceProvidersResponse":{"type":"object","properties":{"deal_id":{"type":"string"},"company_name":{"type":"string"},"service_providers":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyDealsServiceProvidersResponseServiceProvidersItems"}},"total":{"type":"integer"},"data_sources":{"type":"array","items":{"type":"string"}}},"title":"OdysseyDealsServiceProvidersResponse"},"DealTerms":{"type":"object","properties":{"amount":{"type":["number","null"],"format":"double"},"currency":{"type":["string","null"],"default":"USD"},"deal_type":{"type":["string","null"]},"equity_percentage":{"type":["number","null"],"format":"double"},"valuation_post_money":{"type":["number","null"],"format":"double"},"valuation_pre_money":{"type":["number","null"],"format":"double"}},"description":"Deal terms and structure","title":"DealTerms"},"DealTermsResponse":{"type":"object","properties":{"company_name":{"type":["string","null"]},"deal_id":{"type":"string"},"terms":{"oneOf":[{"$ref":"#/components/schemas/DealTerms"},{"type":"null"}]}},"required":["deal_id"],"description":"Deal terms response","title":"DealTermsResponse"},"OdysseyDealsStockInfoResponseSearchResultsItems":{"type":"object","properties":{"title":{"type":"string"},"url":{"type":"string"},"snippet":{"type":"string"}},"title":"OdysseyDealsStockInfoResponseSearchResultsItems"},"OdysseyDealsStockInfoResponse":{"type":"object","properties":{"deal_id":{"type":"string"},"company_name":{"type":"string"},"search_results":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyDealsStockInfoResponseSearchResultsItems"}},"data_sources":{"type":"array","items":{"type":"string"}}},"title":"OdysseyDealsStockInfoResponse"},"OdysseyDealsDebtLendersResponse":{"type":"object","properties":{"deal_id":{"type":"string"},"company_name":{"type":["string","null"]},"is_debt_round":{"type":"boolean"},"lenders":{"type":"array","items":{"description":"Any type"}},"total":{"type":"integer"},"data_sources":{"type":"array","items":{"description":"Any type"}}},"title":"OdysseyDealsDebtLendersResponse"},"InvestorSearchResultEnrichmentData":{"type":"object","properties":{},"title":"InvestorSearchResultEnrichmentData"},"InvestorSearchResultMarketData":{"type":"object","properties":{},"title":"InvestorSearchResultMarketData"},"InvestorSearchResult":{"type":"object","properties":{"enrichment_data":{"oneOf":[{"$ref":"#/components/schemas/InvestorSearchResultEnrichmentData"},{"type":"null"}]},"headquarters":{"type":["string","null"]},"investor_id":{"type":"string"},"investor_type":{"type":["string","null"]},"market_data":{"oneOf":[{"$ref":"#/components/schemas/InvestorSearchResultMarketData"},{"type":"null"}]},"name":{"type":"string"},"notable_portfolio":{"type":["array","null"],"items":{"type":"string"}},"total_investments":{"type":["integer","null"]}},"required":["investor_id","name"],"description":"Single search result","title":"InvestorSearchResult"},"InvestorSearchResponse":{"type":"object","properties":{"page":{"type":"integer","default":1},"page_size":{"type":"integer","default":20},"query":{"type":["string","null"]},"results":{"type":"array","items":{"$ref":"#/components/schemas/InvestorSearchResult"}},"total_results":{"type":"integer","default":0}},"description":"Investor search response","title":"InvestorSearchResponse"},"InvestorOverviewEnrichmentData":{"type":"object","properties":{},"title":"InvestorOverviewEnrichmentData"},"InvestorType":{"type":"object","properties":{"sector_focus":{"type":["array","null"],"items":{"type":"string"}},"stage_focus":{"type":["array","null"],"items":{"type":"string"}},"type":{"type":"string"}},"required":["type"],"description":"Investor type classification","title":"InvestorType"},"InvestorOverviewMarketData":{"type":"object","properties":{},"title":"InvestorOverviewMarketData"},"InvestorOverview":{"type":"object","properties":{"active_portfolio_count":{"type":["integer","null"]},"assets_under_management":{"type":["number","null"],"format":"double"},"cached_at":{"type":["string","null"]},"crunchbase_url":{"type":["string","null"]},"description":{"type":["string","null"]},"display_name":{"type":["string","null"]},"enrichment_data":{"oneOf":[{"$ref":"#/components/schemas/InvestorOverviewEnrichmentData"},{"type":"null"}]},"entity_type":{"type":"string","default":"investor"},"founded":{"type":["integer","null"]},"headquarters":{"type":["object","null"],"additionalProperties":{"type":"string"}},"investor_id":{"type":"string"},"investor_type":{"oneOf":[{"$ref":"#/components/schemas/InvestorType"},{"type":"null"}]},"linkedin_url":{"type":["string","null"]},"market_data":{"oneOf":[{"$ref":"#/components/schemas/InvestorOverviewMarketData"},{"type":"null"}]},"name":{"type":"string"},"notable_exits":{"type":["array","null"],"items":{"type":"string"}},"total_funds":{"type":["integer","null"]},"total_investments":{"type":["integer","null"]},"website":{"type":["string","null"]}},"required":["investor_id","name"],"description":"Investor overview response","title":"InvestorOverview"},"PortfolioCompanyRawData":{"type":"object","properties":{},"title":"PortfolioCompanyRawData"},"PortfolioCompany":{"type":"object","properties":{"amount_invested":{"type":["number","null"],"format":"double"},"company_id":{"type":["string","null"]},"company_name":{"type":"string"},"deal_type":{"type":["string","null"]},"investment_date":{"type":["string","null"]},"raw_data":{"oneOf":[{"$ref":"#/components/schemas/PortfolioCompanyRawData"},{"type":"null"}]},"status":{"type":["string","null"]}},"required":["company_name"],"description":"Portfolio company information","title":"PortfolioCompany"},"PortfolioResponse":{"type":"object","properties":{"active_companies":{"type":"integer","default":0},"investor_id":{"type":"string"},"investor_name":{"type":["string","null"]},"page":{"type":"integer","default":1},"page_size":{"type":"integer","default":50},"portfolio":{"type":"array","items":{"$ref":"#/components/schemas/PortfolioCompany"}},"total_companies":{"type":"integer","default":0},"total_in_database":{"type":["integer","null"]}},"required":["investor_id"],"description":"Portfolio companies response","title":"PortfolioResponse"},"InvestorPreferences":{"type":"object","properties":{"check_size_max":{"type":["number","null"],"format":"double"},"check_size_min":{"type":["number","null"],"format":"double"},"geographies":{"type":["array","null"],"items":{"type":"string"}},"investor_id":{"type":"string"},"investor_name":{"type":["string","null"]},"sectors":{"type":["array","null"],"items":{"type":"string"}},"stages":{"type":["array","null"],"items":{"type":"string"}}},"required":["investor_id"],"description":"Investment preferences response","title":"InvestorPreferences"},"Fund":{"type":"object","properties":{"fund_id":{"type":["string","null"]},"fund_name":{"type":"string"},"fund_size":{"type":["number","null"],"format":"double"},"status":{"type":["string","null"]},"vintage_year":{"type":["integer","null"]}},"required":["fund_name"],"description":"Fund managed by investor","title":"Fund"},"FundsResponse":{"type":"object","properties":{"funds":{"type":"array","items":{"$ref":"#/components/schemas/Fund"}},"investor_id":{"type":"string"},"investor_name":{"type":["string","null"]},"total_aum":{"type":["number","null"],"format":"double"},"total_funds":{"type":"integer","default":0}},"required":["investor_id"],"description":"Managed funds response","title":"FundsResponse"},"LatestFundResponse":{"type":"object","properties":{"investor_id":{"type":"string"},"investor_name":{"type":["string","null"]},"latest_fund":{"oneOf":[{"$ref":"#/components/schemas/Fund"},{"type":"null"}]}},"required":["investor_id"],"description":"Latest fund response","title":"LatestFundResponse"},"ServiceProvider":{"type":"object","properties":{"name":{"type":"string"},"provider_id":{"type":["string","null"]},"relationship_start":{"type":["string","null"]},"service_type":{"type":["string","null"]}},"required":["name"],"description":"Service provider information","title":"ServiceProvider"},"ServiceProvidersResponse":{"type":"object","properties":{"investor_id":{"type":"string"},"investor_name":{"type":["string","null"]},"service_providers":{"type":"array","items":{"$ref":"#/components/schemas/ServiceProvider"}},"total_providers":{"type":"integer","default":0}},"required":["investor_id"],"description":"Service providers response","title":"ServiceProvidersResponse"},"BoardSeat":{"type":"object","properties":{"company_id":{"type":["string","null"]},"company_name":{"type":"string"},"end_date":{"type":["string","null"]},"person_id":{"type":["string","null"]},"person_name":{"type":["string","null"]},"role":{"type":["string","null"]},"start_date":{"type":["string","null"]}},"required":["company_name"],"description":"Board seat information","title":"BoardSeat"},"BoardSeatsResponse":{"type":"object","properties":{"board_seats":{"type":"array","items":{"$ref":"#/components/schemas/BoardSeat"}},"investor_id":{"type":"string"},"investor_name":{"type":["string","null"]},"total_seats":{"type":"integer","default":0}},"required":["investor_id"],"description":"Board seats response","title":"BoardSeatsResponse"},"OdysseyFundsSearchResponseResultsItemsLocation":{"type":"object","properties":{"name":{"type":"string"},"locality":{"type":"string"},"country":{"type":"string"},"region":{"type":"string"}},"title":"OdysseyFundsSearchResponseResultsItemsLocation"},"OdysseyFundsSearchResponseResultsItemsEnrichmentDataLinkedinFollowersCountByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"follower_count":{"type":"integer"}},"title":"OdysseyFundsSearchResponseResultsItemsEnrichmentDataLinkedinFollowersCountByMonthItems"},"OdysseyFundsSearchResponseResultsItemsEnrichmentDataActiveJobPostingsCountChange":{"type":"object","properties":{"current":{"type":"integer"},"change_yearly":{"type":"integer"},"change_monthly":{"type":"integer"},"change_quarterly":{"type":"integer"}},"title":"OdysseyFundsSearchResponseResultsItemsEnrichmentDataActiveJobPostingsCountChange"},"OdysseyFundsSearchResponseResultsItemsEnrichmentDataLinkedinFollowersCountChange":{"type":"object","properties":{"current":{"type":"integer"},"change_quarterly":{"type":"integer"},"change_yearly_percentage":{"type":"integer"},"change_quarterly_percentage":{"type":"integer"},"change_monthly_percentage":{"type":"integer"},"change_yearly":{"type":"integer"},"change_monthly":{"type":"integer"}},"title":"OdysseyFundsSearchResponseResultsItemsEnrichmentDataLinkedinFollowersCountChange"},"OdysseyFundsSearchResponseResultsItemsEnrichmentDataCompanyLocationsFullItems":{"type":"object","properties":{"location_address":{"type":"string"},"is_primary":{"type":"integer"}},"title":"OdysseyFundsSearchResponseResultsItemsEnrichmentDataCompanyLocationsFullItems"},"OdysseyFundsSearchResponseResultsItemsEnrichmentDataEmployeesCountChange":{"type":"object","properties":{"current":{"type":"integer"},"change_quarterly":{"type":"integer"},"change_yearly_percentage":{"type":"integer"},"change_quarterly_percentage":{"type":"integer"},"change_monthly_percentage":{"type":"integer"},"change_yearly":{"type":"integer"},"change_monthly":{"type":"integer"}},"title":"OdysseyFundsSearchResponseResultsItemsEnrichmentDataEmployeesCountChange"},"OdysseyFundsSearchResponseResultsItemsEnrichmentDataEmployeesCountByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"employees_count":{"type":"integer"}},"title":"OdysseyFundsSearchResponseResultsItemsEnrichmentDataEmployeesCountByMonthItems"},"OdysseyFundsSearchResponseResultsItemsEnrichmentDataTopNextCompaniesItems":{"type":"object","properties":{"count":{"type":"integer"},"company_name":{"type":"string"}},"title":"OdysseyFundsSearchResponseResultsItemsEnrichmentDataTopNextCompaniesItems"},"OdysseyFundsSearchResponseResultsItemsEnrichmentDataEmployeeCountByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"employees_count":{"type":"integer"}},"title":"OdysseyFundsSearchResponseResultsItemsEnrichmentDataEmployeeCountByMonthItems"},"OdysseyFundsSearchResponseResultsItemsEnrichmentDataLocation":{"type":"object","properties":{"name":{"type":"string"},"locality":{"type":"string"},"country":{"type":"string"},"region":{"type":"string"}},"title":"OdysseyFundsSearchResponseResultsItemsEnrichmentDataLocation"},"OdysseyFundsSearchResponseResultsItemsEnrichmentData":{"type":"object","properties":{"linkedin_shorthand_name":{"type":"string"},"hq_region":{"type":"array","items":{"type":"string"}},"company_logo_url":{"type":"string"},"unique_domain":{"type":"boolean"},"description_enriched":{"type":"string"},"num_news_articles":{"type":"integer"},"website_domain":{"type":"string"},"type":{"type":"string"},"linkedin_followers_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsSearchResponseResultsItemsEnrichmentDataLinkedinFollowersCountByMonthItems"}},"is_b2b":{"type":"integer"},"company_logo":{"type":"string"},"hq_state":{"type":"string"},"followers_count_linkedin":{"type":"integer"},"alternative_domains":{"type":"array","items":{"type":"string"}},"employee_count":{"type":"integer"},"categories_and_keywords":{"type":"array","items":{"type":"string"}},"hq_location":{"type":"string"},"industry_v2":{"type":"string"},"hq_city":{"type":"string"},"active_job_postings_count_change":{"$ref":"#/components/schemas/OdysseyFundsSearchResponseResultsItemsEnrichmentDataActiveJobPostingsCountChange"},"display_name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"company_name_alias":{"type":"array","items":{"type":"string"}},"website_alias":{"type":"array","items":{"type":"string"}},"pricing_available":{"type":"boolean"},"size":{"type":"string"},"last_updated_at":{"type":"string"},"company_name":{"type":"string"},"is_downloadable":{"type":"boolean"},"linkedin_followers_count_change":{"$ref":"#/components/schemas/OdysseyFundsSearchResponseResultsItemsEnrichmentDataLinkedinFollowersCountChange"},"name":{"type":"string"},"company_locations_full":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsSearchResponseResultsItemsEnrichmentDataCompanyLocationsFullItems"}},"size_range":{"type":"string"},"linkedin_url":{"type":"string"},"unique_website":{"type":"boolean"},"hq_country_iso2":{"type":"string"},"company_emails":{"type":"array","items":{"type":"string"}},"description_metadata_raw":{"type":"string"},"hq_country_iso3":{"type":"string"},"employees_count_change":{"$ref":"#/components/schemas/OdysseyFundsSearchResponseResultsItemsEnrichmentDataEmployeesCountChange"},"free_trial_available":{"type":"boolean"},"funding_details":{"type":"array","items":{"description":"Any type"}},"created_at":{"type":"string"},"description":{"type":"string"},"employees_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsSearchResponseResultsItemsEnrichmentDataEmployeesCountByMonthItems"}},"industry":{"type":"string"},"alternative_names":{"type":"array","items":{"type":"string"}},"hq_full_address":{"type":"string"},"demo_available":{"type":"boolean"},"hq_country":{"type":"string"},"founded_year":{"type":"string"},"top_next_companies":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsSearchResponseResultsItemsEnrichmentDataTopNextCompaniesItems"}},"canonical_linkedin_url":{"type":"string"},"headline":{"type":"string"},"expired_domain":{"type":"boolean"},"summary":{"type":"string"},"website":{"type":"string"},"canonical_linkedin_shorthand_name":{"type":"string"},"active_job_postings_count":{"type":"integer"},"documentation_exist":{"type":"boolean"},"employee_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsSearchResponseResultsItemsEnrichmentDataEmployeeCountByMonthItems"}},"founded":{"type":"string"},"company_phone_numbers":{"type":"array","items":{"type":"string"}},"website_url":{"type":"string"},"is_public":{"type":"boolean"},"location":{"$ref":"#/components/schemas/OdysseyFundsSearchResponseResultsItemsEnrichmentDataLocation"},"mobile_apps_exist":{"type":"boolean"},"online_reviews_exist":{"type":"boolean"},"employees_count":{"type":"integer"}},"title":"OdysseyFundsSearchResponseResultsItemsEnrichmentData"},"OdysseyFundsSearchResponseResultsItems":{"type":"object","properties":{"entity_id":{"type":["string","null"]},"display_name":{"type":"string"},"website":{"type":"string"},"industry":{"type":"string"},"employee_count":{"type":"integer"},"location":{"$ref":"#/components/schemas/OdysseyFundsSearchResponseResultsItemsLocation"},"source":{"type":"string"},"enrichment_data":{"$ref":"#/components/schemas/OdysseyFundsSearchResponseResultsItemsEnrichmentData"}},"title":"OdysseyFundsSearchResponseResultsItems"},"OdysseyFundsSearchResponse":{"type":"object","properties":{"query":{"type":"string"},"results":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsSearchResponseResultsItems"}},"total":{"type":"integer"},"limit":{"type":"integer"}},"title":"OdysseyFundsSearchResponse"},"OdysseyFundsBioResponseDataStatus":{"type":"object","properties":{"value":{"type":"string"},"comment":{"type":"string"}},"title":"OdysseyFundsBioResponseDataStatus"},"OdysseyFundsBioResponseDataCompanyLocationsFullItems":{"type":"object","properties":{"location_address":{"type":"string"},"is_primary":{"type":"integer"}},"title":"OdysseyFundsBioResponseDataCompanyLocationsFullItems"},"OdysseyFundsBioResponseDataTechnologiesUsedItems":{"type":"object","properties":{"technology":{"type":"string"},"first_verified_at":{"type":"string"},"last_verified_at":{"type":"string"}},"title":"OdysseyFundsBioResponseDataTechnologiesUsedItems"},"OdysseyFundsBioResponseDataRevenueAnnualSource5AnnualRevenue":{"type":"object","properties":{"annual_revenue":{"type":"integer"},"annual_revenue_currency":{"type":"string"}},"title":"OdysseyFundsBioResponseDataRevenueAnnualSource5AnnualRevenue"},"OdysseyFundsBioResponseDataRevenueAnnual":{"type":"object","properties":{"source_5_annual_revenue":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataRevenueAnnualSource5AnnualRevenue"},"source_1_annual_revenue":{"type":["string","null"]}},"title":"OdysseyFundsBioResponseDataRevenueAnnual"},"OdysseyFundsBioResponseDataCompetitorsItems":{"type":"object","properties":{"company_name":{"type":"string"},"similarity_score":{"type":["string","null"]}},"title":"OdysseyFundsBioResponseDataCompetitorsItems"},"OdysseyFundsBioResponseDataNewsArticlesItems":{"type":"object","properties":{"headline":{"type":"string"},"published_date":{"type":"string"},"summary":{"type":["string","null"]},"article_url":{"type":"string"},"source":{"type":"string"}},"title":"OdysseyFundsBioResponseDataNewsArticlesItems"},"OdysseyFundsBioResponseDataActiveJobPostingsItems":{"type":"object","properties":{"job_posting_id":{"type":"integer"},"job_posting_title":{"type":"string"}},"title":"OdysseyFundsBioResponseDataActiveJobPostingsItems"},"OdysseyFundsBioResponseDataActiveJobPostingsCountChange":{"type":"object","properties":{"current":{"type":"integer"},"change_monthly":{"type":"integer"},"change_monthly_percentage":{"type":"number","format":"double"},"change_quarterly":{"type":"integer"},"change_quarterly_percentage":{"type":"number","format":"double"},"change_yearly":{"type":"integer"},"change_yearly_percentage":{"type":"number","format":"double"}},"title":"OdysseyFundsBioResponseDataActiveJobPostingsCountChange"},"OdysseyFundsBioResponseDataActiveJobPostingsCountByMonthItems":{"type":"object","properties":{"active_job_postings_count":{"type":"integer"},"date":{"type":"string"}},"title":"OdysseyFundsBioResponseDataActiveJobPostingsCountByMonthItems"},"OdysseyFundsBioResponseDataLinkedinFollowersCountChange":{"type":"object","properties":{"current":{"type":"integer"},"change_monthly":{"type":"integer"},"change_monthly_percentage":{"type":"number","format":"double"},"change_quarterly":{"type":"integer"},"change_quarterly_percentage":{"type":"number","format":"double"},"change_yearly":{"type":"integer"},"change_yearly_percentage":{"type":"number","format":"double"}},"title":"OdysseyFundsBioResponseDataLinkedinFollowersCountChange"},"OdysseyFundsBioResponseDataLinkedinFollowersCountByMonthItems":{"type":"object","properties":{"follower_count":{"type":"integer"},"date":{"type":"string"}},"title":"OdysseyFundsBioResponseDataLinkedinFollowersCountByMonthItems"},"OdysseyFundsBioResponseDataEmployeesCountInferredByMonthItems":{"type":"object","properties":{"employees_count_inferred":{"type":"integer"},"date":{"type":"string"}},"title":"OdysseyFundsBioResponseDataEmployeesCountInferredByMonthItems"},"OdysseyFundsBioResponseDataDeparturesCountByMonthItems":{"type":"object","properties":{"departures_count":{"type":"integer"},"date":{"type":"string"}},"title":"OdysseyFundsBioResponseDataDeparturesCountByMonthItems"},"OdysseyFundsBioResponseDataEmployeeAttritionRateByMonthItems":{"type":"object","properties":{"employee_attrition_rate":{"type":"number","format":"double"},"date":{"type":"string"}},"title":"OdysseyFundsBioResponseDataEmployeeAttritionRateByMonthItems"},"OdysseyFundsBioResponseDataTopPreviousCompaniesItems":{"type":"object","properties":{"company_name":{"type":"string"},"count":{"type":"integer"}},"title":"OdysseyFundsBioResponseDataTopPreviousCompaniesItems"},"OdysseyFundsBioResponseDataTopNextCompaniesItems":{"type":"object","properties":{"company_name":{"type":"string"},"count":{"type":"integer"}},"title":"OdysseyFundsBioResponseDataTopNextCompaniesItems"},"OdysseyFundsBioResponseDataKeyExecutivesItems":{"type":"object","properties":{"member_full_name":{"type":"string"},"member_position_title":{"type":"string"}},"title":"OdysseyFundsBioResponseDataKeyExecutivesItems"},"OdysseyFundsBioResponseDataKeyEmployeeChangeEventsItems":{"type":"object","properties":{"employee_change_event_name":{"type":"string"},"employee_change_event_date":{"type":"string"},"employee_change_event_url":{"type":"string"}},"title":"OdysseyFundsBioResponseDataKeyEmployeeChangeEventsItems"},"OdysseyFundsBioResponseDataKeyExecutiveArrivalsItems":{"type":"object","properties":{"member_full_name":{"type":"string"},"member_position_title":{"type":"string"},"arrival_date":{"type":"string"}},"title":"OdysseyFundsBioResponseDataKeyExecutiveArrivalsItems"},"OdysseyFundsBioResponseDataKeyExecutiveDeparturesItems":{"type":"object","properties":{"member_full_name":{"type":"string"},"member_position_title":{"type":"string"},"departure_date":{"type":"string"}},"title":"OdysseyFundsBioResponseDataKeyExecutiveDeparturesItems"},"OdysseyFundsBioResponseDataEmployeesCountChange":{"type":"object","properties":{"current":{"type":"integer"},"change_monthly":{"type":"integer"},"change_monthly_percentage":{"type":"number","format":"double"},"change_quarterly":{"type":"integer"},"change_quarterly_percentage":{"type":"number","format":"double"},"change_yearly":{"type":"integer"},"change_yearly_percentage":{"type":"number","format":"double"}},"title":"OdysseyFundsBioResponseDataEmployeesCountChange"},"OdysseyFundsBioResponseDataEmployeesCountByMonthItems":{"type":"object","properties":{"employees_count":{"type":"integer"},"date":{"type":"string"}},"title":"OdysseyFundsBioResponseDataEmployeesCountByMonthItems"},"OdysseyFundsBioResponseDataEmployeesCountBreakdownBySeniority":{"type":"object","properties":{"employees_count_owner":{"type":"integer"},"employees_count_founder":{"type":"integer"},"employees_count_clevel":{"type":"integer"},"employees_count_partner":{"type":"integer"},"employees_count_vp":{"type":"integer"},"employees_count_head":{"type":"integer"},"employees_count_director":{"type":"integer"},"employees_count_manager":{"type":"integer"},"employees_count_senior":{"type":"integer"},"employees_count_intern":{"type":"integer"},"employees_count_specialist":{"type":"integer"},"employees_count_other_management":{"type":"integer"}},"title":"OdysseyFundsBioResponseDataEmployeesCountBreakdownBySeniority"},"OdysseyFundsBioResponseDataEmployeesCountBreakdownBySeniorityByMonthItemsEmployeesCountBreakdownBySeniority":{"type":"object","properties":{"employees_count_owner":{"type":"integer"},"employees_count_founder":{"type":"integer"},"employees_count_clevel":{"type":"integer"},"employees_count_partner":{"type":"integer"},"employees_count_vp":{"type":"integer"},"employees_count_head":{"type":"integer"},"employees_count_director":{"type":"integer"},"employees_count_manager":{"type":"integer"},"employees_count_senior":{"type":"integer"},"employees_count_intern":{"type":"integer"},"employees_count_specialist":{"type":"integer"},"employees_count_other_management":{"type":"integer"}},"title":"OdysseyFundsBioResponseDataEmployeesCountBreakdownBySeniorityByMonthItemsEmployeesCountBreakdownBySeniority"},"OdysseyFundsBioResponseDataEmployeesCountBreakdownBySeniorityByMonthItems":{"type":"object","properties":{"employees_count_breakdown_by_seniority":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataEmployeesCountBreakdownBySeniorityByMonthItemsEmployeesCountBreakdownBySeniority"},"date":{"type":"string"}},"title":"OdysseyFundsBioResponseDataEmployeesCountBreakdownBySeniorityByMonthItems"},"OdysseyFundsBioResponseDataEmployeesCountBreakdownByDepartment":{"type":"object","properties":{"employees_count_medical":{"type":"integer"},"employees_count_sales":{"type":"integer"},"employees_count_hr":{"type":"integer"},"employees_count_legal":{"type":"integer"},"employees_count_marketing":{"type":"integer"},"employees_count_finance":{"type":"integer"},"employees_count_technical":{"type":"integer"},"employees_count_consulting":{"type":"integer"},"employees_count_operations":{"type":"integer"},"employees_count_product":{"type":"integer"},"employees_count_general_management":{"type":"integer"},"employees_count_administrative":{"type":"integer"},"employees_count_customer_service":{"type":"integer"},"employees_count_project_management":{"type":"integer"},"employees_count_design":{"type":"integer"},"employees_count_research":{"type":"integer"},"employees_count_trades":{"type":"integer"},"employees_count_real_estate":{"type":"integer"},"employees_count_education":{"type":"integer"},"employees_count_other_department":{"type":"integer"}},"title":"OdysseyFundsBioResponseDataEmployeesCountBreakdownByDepartment"},"OdysseyFundsBioResponseDataEmployeesCountBreakdownByDepartmentByMonthItemsEmployeesCountBreakdownByDepartment":{"type":"object","properties":{"employees_count_medical":{"type":"integer"},"employees_count_sales":{"type":"integer"},"employees_count_hr":{"type":"integer"},"employees_count_legal":{"type":"integer"},"employees_count_marketing":{"type":"integer"},"employees_count_finance":{"type":"integer"},"employees_count_technical":{"type":"integer"},"employees_count_consulting":{"type":"integer"},"employees_count_operations":{"type":"integer"},"employees_count_product":{"type":"integer"},"employees_count_general_management":{"type":"integer"},"employees_count_administrative":{"type":"integer"},"employees_count_customer_service":{"type":"integer"},"employees_count_project_management":{"type":"integer"},"employees_count_design":{"type":"integer"},"employees_count_research":{"type":"integer"},"employees_count_trades":{"type":"integer"},"employees_count_real_estate":{"type":"integer"},"employees_count_education":{"type":"integer"},"employees_count_other_department":{"type":"integer"}},"title":"OdysseyFundsBioResponseDataEmployeesCountBreakdownByDepartmentByMonthItemsEmployeesCountBreakdownByDepartment"},"OdysseyFundsBioResponseDataEmployeesCountBreakdownByDepartmentByMonthItems":{"type":"object","properties":{"employees_count_breakdown_by_department":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataEmployeesCountBreakdownByDepartmentByMonthItemsEmployeesCountBreakdownByDepartment"},"date":{"type":"string"}},"title":"OdysseyFundsBioResponseDataEmployeesCountBreakdownByDepartmentByMonthItems"},"OdysseyFundsBioResponseDataEmployeesCountBreakdownByRegion":{"type":"object","properties":{"employees_count_eastern_europe":{"type":"integer"},"employees_count_latin_america":{"type":"integer"},"employees_count_southern_europe":{"type":"integer"},"employees_count_sub_saharan_africa":{"type":"integer"},"employees_count_central_asia":{"type":"integer"},"employees_count_northern_america":{"type":"integer"},"employees_count_australia_new_zealand":{"type":"integer"},"employees_count_northern_europe":{"type":"integer"},"employees_count_south_eastern_asia":{"type":"integer"},"employees_count_polynesia":{"type":"integer"},"employees_count_southern_asia":{"type":"integer"},"employees_count_northern_africa":{"type":"integer"},"employees_count_melanesia":{"type":"integer"},"employees_count_western_europe":{"type":"integer"},"employees_count_western_asia":{"type":"integer"},"employees_count_eastern_asia":{"type":"integer"},"employees_count_micronesia":{"type":"integer"},"employees_count_unknown":{"type":"integer"}},"title":"OdysseyFundsBioResponseDataEmployeesCountBreakdownByRegion"},"OdysseyFundsBioResponseDataEmployeesCountBreakdownByRegionByMonthItemsEmployeesCountBreakdownByRegion":{"type":"object","properties":{"employees_count_eastern_europe":{"type":"integer"},"employees_count_latin_america":{"type":"integer"},"employees_count_southern_europe":{"type":"integer"},"employees_count_sub_saharan_africa":{"type":"integer"},"employees_count_central_asia":{"type":"integer"},"employees_count_northern_america":{"type":"integer"},"employees_count_australia_new_zealand":{"type":"integer"},"employees_count_northern_europe":{"type":"integer"},"employees_count_south_eastern_asia":{"type":"integer"},"employees_count_polynesia":{"type":"integer"},"employees_count_southern_asia":{"type":"integer"},"employees_count_northern_africa":{"type":"integer"},"employees_count_melanesia":{"type":"integer"},"employees_count_western_europe":{"type":"integer"},"employees_count_western_asia":{"type":"integer"},"employees_count_eastern_asia":{"type":"integer"},"employees_count_micronesia":{"type":"integer"},"employees_count_unknown":{"type":"integer"}},"title":"OdysseyFundsBioResponseDataEmployeesCountBreakdownByRegionByMonthItemsEmployeesCountBreakdownByRegion"},"OdysseyFundsBioResponseDataEmployeesCountBreakdownByRegionByMonthItems":{"type":"object","properties":{"employees_count_breakdown_by_region":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataEmployeesCountBreakdownByRegionByMonthItemsEmployeesCountBreakdownByRegion"},"date":{"type":"string"}},"title":"OdysseyFundsBioResponseDataEmployeesCountBreakdownByRegionByMonthItems"},"OdysseyFundsBioResponseDataEmployeesCountByCountryItems":{"type":"object","properties":{"country":{"type":"string"},"employee_count":{"type":"integer"}},"title":"OdysseyFundsBioResponseDataEmployeesCountByCountryItems"},"OdysseyFundsBioResponseDataEmployeesCountByCountryByMonthItemsEmployeesCountByCountryItems":{"type":"object","properties":{"country":{"type":"string"},"employee_count":{"type":"integer"}},"title":"OdysseyFundsBioResponseDataEmployeesCountByCountryByMonthItemsEmployeesCountByCountryItems"},"OdysseyFundsBioResponseDataEmployeesCountByCountryByMonthItems":{"type":"object","properties":{"employees_count_by_country":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataEmployeesCountByCountryByMonthItemsEmployeesCountByCountryItems"}},"date":{"type":"string"}},"title":"OdysseyFundsBioResponseDataEmployeesCountByCountryByMonthItems"},"OdysseyFundsBioResponseDataEmployeeCountByMonthItems":{"type":"object","properties":{"employees_count":{"type":"integer"},"date":{"type":"string"}},"title":"OdysseyFundsBioResponseDataEmployeeCountByMonthItems"},"OdysseyFundsBioResponseDataLocation":{"type":"object","properties":{"name":{"type":"string"},"locality":{"type":"string"},"region":{"type":"string"},"country":{"type":"string"}},"title":"OdysseyFundsBioResponseDataLocation"},"OdysseyFundsBioResponseDataAffiliatedEntitiesItems":{"type":"object","properties":{"display_name":{"type":"string"},"relationship":{"type":"string"}},"title":"OdysseyFundsBioResponseDataAffiliatedEntitiesItems"},"OdysseyFundsBioResponseData":{"type":"object","properties":{"company_name":{"type":"string"},"company_name_alias":{"type":"array","items":{"type":"string"}},"company_legal_name":{"type":"string"},"created_at":{"type":"string"},"last_updated_at":{"type":"string"},"website_alias":{"type":"array","items":{"type":"string"}},"unique_website":{"type":"boolean"},"unique_domain":{"type":"boolean"},"expired_domain":{"type":"boolean"},"linkedin_shorthand_name":{"type":"string"},"canonical_linkedin_url":{"type":"string"},"canonical_linkedin_shorthand_name":{"type":"string"},"instagram_url":{"type":"array","items":{"type":"string"}},"youtube_url":{"type":"array","items":{"type":"string"}},"company_logo":{"type":"string"},"company_logo_url":{"type":"string"},"is_b2b":{"type":"integer"},"is_public":{"type":"boolean"},"description":{"type":"string"},"description_enriched":{"type":"string"},"description_metadata_raw":{"type":"string"},"categories_and_keywords":{"type":"array","items":{"type":"string"}},"status":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataStatus"},"founded_year":{"type":"string"},"size_range":{"type":"string"},"employees_count":{"type":"integer"},"followers_count_linkedin":{"type":"integer"},"followers_count_owler":{"type":"integer"},"hq_region":{"type":"array","items":{"type":"string"}},"hq_country":{"type":"string"},"hq_country_iso2":{"type":"string"},"hq_country_iso3":{"type":"string"},"hq_location":{"type":"string"},"hq_full_address":{"type":"string"},"hq_city":{"type":"string"},"hq_state":{"type":"string"},"hq_street":{"type":"string"},"hq_zipcode":{"type":"string"},"company_locations_full":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataCompanyLocationsFullItems"}},"num_technologies_used":{"type":"integer"},"technologies_used":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataTechnologiesUsedItems"}},"revenue_annual":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataRevenueAnnual"},"ownership_status":{"type":"string"},"competitors":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataCompetitorsItems"}},"company_phone_numbers":{"type":"array","items":{"type":"string"}},"company_emails":{"type":"array","items":{"type":"string"}},"pricing_available":{"type":"boolean"},"free_trial_available":{"type":"boolean"},"demo_available":{"type":"boolean"},"is_downloadable":{"type":"boolean"},"mobile_apps_exist":{"type":"boolean"},"online_reviews_exist":{"type":"boolean"},"documentation_exist":{"type":"boolean"},"num_news_articles":{"type":"integer"},"news_articles":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataNewsArticlesItems"}},"active_job_postings_count":{"type":"integer"},"active_job_postings":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataActiveJobPostingsItems"}},"active_job_postings_count_change":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataActiveJobPostingsCountChange"},"active_job_postings_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataActiveJobPostingsCountByMonthItems"}},"linkedin_followers_count_change":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataLinkedinFollowersCountChange"},"linkedin_followers_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataLinkedinFollowersCountByMonthItems"}},"employees_count_inferred":{"type":"integer"},"employees_count_inferred_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataEmployeesCountInferredByMonthItems"}},"departures_count":{"type":"integer"},"departures_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataDeparturesCountByMonthItems"}},"employee_attrition_rate":{"type":"number","format":"double"},"employee_attrition_rate_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataEmployeeAttritionRateByMonthItems"}},"top_previous_companies":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataTopPreviousCompaniesItems"}},"top_next_companies":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataTopNextCompaniesItems"}},"key_executives":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataKeyExecutivesItems"}},"key_employee_change_events":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataKeyEmployeeChangeEventsItems"}},"key_executive_arrivals":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataKeyExecutiveArrivalsItems"}},"key_executive_departures":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataKeyExecutiveDeparturesItems"}},"employees_count_change":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataEmployeesCountChange"},"employees_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataEmployeesCountByMonthItems"}},"employees_count_breakdown_by_seniority":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataEmployeesCountBreakdownBySeniority"},"employees_count_breakdown_by_seniority_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataEmployeesCountBreakdownBySeniorityByMonthItems"}},"employees_count_breakdown_by_department":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataEmployeesCountBreakdownByDepartment"},"employees_count_breakdown_by_department_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataEmployeesCountBreakdownByDepartmentByMonthItems"}},"employees_count_breakdown_by_region":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataEmployeesCountBreakdownByRegion"},"employees_count_breakdown_by_region_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataEmployeesCountBreakdownByRegionByMonthItems"}},"employees_count_by_country":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataEmployeesCountByCountryItems"}},"employees_count_by_country_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataEmployeesCountByCountryByMonthItems"}},"display_name":{"type":"string"},"name":{"type":"string"},"website":{"type":"string"},"website_url":{"type":"string"},"website_domain":{"type":"string"},"summary":{"type":"string"},"headline":{"type":"string"},"employee_count":{"type":"integer"},"employee_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataEmployeeCountByMonthItems"}},"industry":{"type":"string"},"industry_v2":{"type":"string"},"founded":{"type":"string"},"size":{"type":"string"},"inferred_revenue":{"type":"string"},"type":{"type":"string"},"linkedin_url":{"type":"string"},"twitter_url":{"type":"string"},"facebook_url":{"type":"string"},"crunchbase_url":{"type":"string"},"alternative_names":{"type":"array","items":{"type":"string"}},"alternative_domains":{"type":"array","items":{"type":"string"}},"tags":{"type":"array","items":{"type":"string"}},"location":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataLocation"},"affiliated_entities":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsBioResponseDataAffiliatedEntitiesItems"}},"funding_details":{"type":"array","items":{"description":"Any type"}},"_truncated_fields":{"type":"array","items":{"type":"string"}}},"title":"OdysseyFundsBioResponseData"},"OdysseyFundsBioResponse":{"type":"object","properties":{"entity_id":{"type":"string"},"identifier":{"type":"string"},"entity_type":{"type":"string"},"data":{"$ref":"#/components/schemas/OdysseyFundsBioResponseData"},"source":{"type":"string"}},"title":"OdysseyFundsBioResponse"},"OdysseyFundsActiveInvestmentsResponseInvestmentsItems":{"type":"object","properties":{"company_name":{"type":"string"},"company_id":{"type":["string","null"]},"investment_date":{"type":["string","null"]},"funding_amount":{"type":["string","null"]},"status":{"type":"string"},"source":{"type":"string"},"url":{"type":"string"},"excerpts":{"type":"array","items":{"type":"string"}}},"title":"OdysseyFundsActiveInvestmentsResponseInvestmentsItems"},"OdysseyFundsActiveInvestmentsResponse":{"type":"object","properties":{"entity_id":{"type":"string"},"investments":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundsActiveInvestmentsResponseInvestmentsItems"}},"total":{"type":"integer"},"limit":{"type":"integer"},"data_sources":{"type":"array","items":{"type":"string"}}},"title":"OdysseyFundsActiveInvestmentsResponse"},"OdysseyLpsSearchResponseResultsItemsLocation":{"type":"object","properties":{"name":{"type":"string"},"locality":{"type":"string"},"country":{"type":"string"},"region":{"type":"string"}},"title":"OdysseyLpsSearchResponseResultsItemsLocation"},"OdysseyLpsSearchResponseResultsItemsEnrichmentDataLinkedinFollowersCountByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"follower_count":{"type":"integer"}},"title":"OdysseyLpsSearchResponseResultsItemsEnrichmentDataLinkedinFollowersCountByMonthItems"},"OdysseyLpsSearchResponseResultsItemsEnrichmentDataActiveJobPostingsCountChange":{"type":"object","properties":{"current":{"type":"integer"},"change_yearly":{"type":"integer"},"change_monthly":{"type":"integer"},"change_quarterly":{"type":"integer"}},"title":"OdysseyLpsSearchResponseResultsItemsEnrichmentDataActiveJobPostingsCountChange"},"OdysseyLpsSearchResponseResultsItemsEnrichmentDataLinkedinFollowersCountChange":{"type":"object","properties":{"current":{"type":"integer"},"change_quarterly":{"type":"integer"},"change_yearly_percentage":{"type":"integer"},"change_quarterly_percentage":{"type":"integer"},"change_monthly_percentage":{"type":"integer"},"change_yearly":{"type":"integer"},"change_monthly":{"type":"integer"}},"title":"OdysseyLpsSearchResponseResultsItemsEnrichmentDataLinkedinFollowersCountChange"},"OdysseyLpsSearchResponseResultsItemsEnrichmentDataCompanyLocationsFullItems":{"type":"object","properties":{"location_address":{"type":"string"},"is_primary":{"type":"integer"}},"title":"OdysseyLpsSearchResponseResultsItemsEnrichmentDataCompanyLocationsFullItems"},"OdysseyLpsSearchResponseResultsItemsEnrichmentDataEmployeesCountChange":{"type":"object","properties":{"current":{"type":"integer"},"change_quarterly":{"type":"integer"},"change_yearly_percentage":{"type":"integer"},"change_quarterly_percentage":{"type":"integer"},"change_monthly_percentage":{"type":"integer"},"change_yearly":{"type":"integer"},"change_monthly":{"type":"integer"}},"title":"OdysseyLpsSearchResponseResultsItemsEnrichmentDataEmployeesCountChange"},"OdysseyLpsSearchResponseResultsItemsEnrichmentDataEmployeesCountByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"employees_count":{"type":"integer"}},"title":"OdysseyLpsSearchResponseResultsItemsEnrichmentDataEmployeesCountByMonthItems"},"OdysseyLpsSearchResponseResultsItemsEnrichmentDataTopNextCompaniesItems":{"type":"object","properties":{"count":{"type":"integer"},"company_name":{"type":"string"}},"title":"OdysseyLpsSearchResponseResultsItemsEnrichmentDataTopNextCompaniesItems"},"OdysseyLpsSearchResponseResultsItemsEnrichmentDataEmployeeCountByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"employees_count":{"type":"integer"}},"title":"OdysseyLpsSearchResponseResultsItemsEnrichmentDataEmployeeCountByMonthItems"},"OdysseyLpsSearchResponseResultsItemsEnrichmentDataLocation":{"type":"object","properties":{"name":{"type":"string"},"locality":{"type":"string"},"country":{"type":"string"},"region":{"type":"string"}},"title":"OdysseyLpsSearchResponseResultsItemsEnrichmentDataLocation"},"OdysseyLpsSearchResponseResultsItemsEnrichmentData":{"type":"object","properties":{"linkedin_shorthand_name":{"type":"string"},"hq_region":{"type":"array","items":{"type":"string"}},"company_logo_url":{"type":"string"},"unique_domain":{"type":"boolean"},"description_enriched":{"type":"string"},"num_news_articles":{"type":"integer"},"website_domain":{"type":"string"},"type":{"type":"string"},"linkedin_followers_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyLpsSearchResponseResultsItemsEnrichmentDataLinkedinFollowersCountByMonthItems"}},"is_b2b":{"type":"integer"},"company_logo":{"type":"string"},"hq_state":{"type":"string"},"followers_count_linkedin":{"type":"integer"},"alternative_domains":{"type":"array","items":{"type":"string"}},"employee_count":{"type":"integer"},"categories_and_keywords":{"type":"array","items":{"type":"string"}},"hq_location":{"type":"string"},"industry_v2":{"type":"string"},"hq_city":{"type":"string"},"active_job_postings_count_change":{"$ref":"#/components/schemas/OdysseyLpsSearchResponseResultsItemsEnrichmentDataActiveJobPostingsCountChange"},"display_name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"company_name_alias":{"type":"array","items":{"type":"string"}},"website_alias":{"type":"array","items":{"type":"string"}},"pricing_available":{"type":"boolean"},"size":{"type":"string"},"last_updated_at":{"type":"string"},"company_name":{"type":"string"},"is_downloadable":{"type":"boolean"},"linkedin_followers_count_change":{"$ref":"#/components/schemas/OdysseyLpsSearchResponseResultsItemsEnrichmentDataLinkedinFollowersCountChange"},"name":{"type":"string"},"company_locations_full":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyLpsSearchResponseResultsItemsEnrichmentDataCompanyLocationsFullItems"}},"size_range":{"type":"string"},"linkedin_url":{"type":"string"},"unique_website":{"type":"boolean"},"hq_country_iso2":{"type":"string"},"company_emails":{"type":"array","items":{"type":"string"}},"description_metadata_raw":{"type":"string"},"hq_country_iso3":{"type":"string"},"employees_count_change":{"$ref":"#/components/schemas/OdysseyLpsSearchResponseResultsItemsEnrichmentDataEmployeesCountChange"},"free_trial_available":{"type":"boolean"},"funding_details":{"type":"array","items":{"description":"Any type"}},"created_at":{"type":"string"},"description":{"type":"string"},"employees_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyLpsSearchResponseResultsItemsEnrichmentDataEmployeesCountByMonthItems"}},"industry":{"type":"string"},"alternative_names":{"type":"array","items":{"type":"string"}},"hq_full_address":{"type":"string"},"demo_available":{"type":"boolean"},"hq_country":{"type":"string"},"founded_year":{"type":"string"},"top_next_companies":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyLpsSearchResponseResultsItemsEnrichmentDataTopNextCompaniesItems"}},"canonical_linkedin_url":{"type":"string"},"headline":{"type":"string"},"expired_domain":{"type":"boolean"},"summary":{"type":"string"},"website":{"type":"string"},"canonical_linkedin_shorthand_name":{"type":"string"},"active_job_postings_count":{"type":"integer"},"documentation_exist":{"type":"boolean"},"employee_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyLpsSearchResponseResultsItemsEnrichmentDataEmployeeCountByMonthItems"}},"founded":{"type":"string"},"company_phone_numbers":{"type":"array","items":{"type":"string"}},"website_url":{"type":"string"},"is_public":{"type":"boolean"},"location":{"$ref":"#/components/schemas/OdysseyLpsSearchResponseResultsItemsEnrichmentDataLocation"},"mobile_apps_exist":{"type":"boolean"},"online_reviews_exist":{"type":"boolean"},"employees_count":{"type":"integer"}},"title":"OdysseyLpsSearchResponseResultsItemsEnrichmentData"},"OdysseyLpsSearchResponseResultsItems":{"type":"object","properties":{"entity_id":{"type":["string","null"]},"display_name":{"type":"string"},"website":{"type":"string"},"industry":{"type":"string"},"employee_count":{"type":"integer"},"location":{"$ref":"#/components/schemas/OdysseyLpsSearchResponseResultsItemsLocation"},"type":{"type":"string"},"source":{"type":"string"},"enrichment_data":{"$ref":"#/components/schemas/OdysseyLpsSearchResponseResultsItemsEnrichmentData"}},"title":"OdysseyLpsSearchResponseResultsItems"},"OdysseyLpsSearchResponse":{"type":"object","properties":{"query":{"type":"string"},"results":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyLpsSearchResponseResultsItems"}},"total":{"type":"integer"},"limit":{"type":"integer"},"note":{"type":"string"}},"title":"OdysseyLpsSearchResponse"},"OdysseyLpsBioResponseData":{"type":"object","properties":{},"title":"OdysseyLpsBioResponseData"},"OdysseyLpsBioResponse":{"type":"object","properties":{"entity_id":{"type":"string"},"identifier":{"type":"string"},"entity_type":{"type":"string"},"display_name":{"type":["string","null"]},"data":{"$ref":"#/components/schemas/OdysseyLpsBioResponseData"},"note":{"type":"string"}},"title":"OdysseyLpsBioResponse"},"OdysseyServiceProvidersSearchResponseResultsItemsLocation":{"type":"object","properties":{"name":{"type":"string"},"locality":{"type":"string"},"country":{"type":"string"},"region":{"type":"string"}},"title":"OdysseyServiceProvidersSearchResponseResultsItemsLocation"},"OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataLinkedinFollowersCountByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"follower_count":{"type":"integer"}},"title":"OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataLinkedinFollowersCountByMonthItems"},"OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataActiveJobPostingsCountChange":{"type":"object","properties":{"current":{"type":"integer"},"change_yearly":{"type":"integer"},"change_monthly":{"type":"integer"},"change_quarterly":{"type":"integer"}},"title":"OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataActiveJobPostingsCountChange"},"OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataLinkedinFollowersCountChange":{"type":"object","properties":{"current":{"type":"integer"},"change_quarterly":{"type":"integer"},"change_yearly_percentage":{"type":"integer"},"change_quarterly_percentage":{"type":"integer"},"change_monthly_percentage":{"type":"integer"},"change_yearly":{"type":"integer"},"change_monthly":{"type":"integer"}},"title":"OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataLinkedinFollowersCountChange"},"OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataCompanyLocationsFullItems":{"type":"object","properties":{"location_address":{"type":"string"},"is_primary":{"type":"integer"}},"title":"OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataCompanyLocationsFullItems"},"OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataEmployeesCountChange":{"type":"object","properties":{"current":{"type":"integer"},"change_quarterly":{"type":"integer"},"change_yearly_percentage":{"type":"integer"},"change_quarterly_percentage":{"type":"integer"},"change_monthly_percentage":{"type":"integer"},"change_yearly":{"type":"integer"},"change_monthly":{"type":"integer"}},"title":"OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataEmployeesCountChange"},"OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataEmployeesCountByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"employees_count":{"type":"integer"}},"title":"OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataEmployeesCountByMonthItems"},"OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataTopNextCompaniesItems":{"type":"object","properties":{"count":{"type":"integer"},"company_name":{"type":"string"}},"title":"OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataTopNextCompaniesItems"},"OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataEmployeeCountByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"employees_count":{"type":"integer"}},"title":"OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataEmployeeCountByMonthItems"},"OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataLocation":{"type":"object","properties":{"name":{"type":"string"},"locality":{"type":"string"},"country":{"type":"string"},"region":{"type":"string"}},"title":"OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataLocation"},"OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentData":{"type":"object","properties":{"linkedin_shorthand_name":{"type":"string"},"hq_region":{"type":"array","items":{"type":"string"}},"company_logo_url":{"type":"string"},"unique_domain":{"type":"boolean"},"description_enriched":{"type":"string"},"num_news_articles":{"type":"integer"},"website_domain":{"type":"string"},"type":{"type":"string"},"linkedin_followers_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataLinkedinFollowersCountByMonthItems"}},"is_b2b":{"type":"integer"},"company_logo":{"type":"string"},"hq_state":{"type":"string"},"followers_count_linkedin":{"type":"integer"},"alternative_domains":{"type":"array","items":{"type":"string"}},"employee_count":{"type":"integer"},"categories_and_keywords":{"type":"array","items":{"type":"string"}},"hq_location":{"type":"string"},"industry_v2":{"type":"string"},"hq_city":{"type":"string"},"active_job_postings_count_change":{"$ref":"#/components/schemas/OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataActiveJobPostingsCountChange"},"display_name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"company_name_alias":{"type":"array","items":{"type":"string"}},"website_alias":{"type":"array","items":{"type":"string"}},"pricing_available":{"type":"boolean"},"size":{"type":"string"},"last_updated_at":{"type":"string"},"company_name":{"type":"string"},"is_downloadable":{"type":"boolean"},"linkedin_followers_count_change":{"$ref":"#/components/schemas/OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataLinkedinFollowersCountChange"},"name":{"type":"string"},"company_locations_full":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataCompanyLocationsFullItems"}},"size_range":{"type":"string"},"linkedin_url":{"type":"string"},"unique_website":{"type":"boolean"},"hq_country_iso2":{"type":"string"},"company_emails":{"type":"array","items":{"type":"string"}},"description_metadata_raw":{"type":"string"},"hq_country_iso3":{"type":"string"},"employees_count_change":{"$ref":"#/components/schemas/OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataEmployeesCountChange"},"free_trial_available":{"type":"boolean"},"funding_details":{"type":"array","items":{"description":"Any type"}},"created_at":{"type":"string"},"description":{"type":"string"},"employees_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataEmployeesCountByMonthItems"}},"industry":{"type":"string"},"alternative_names":{"type":"array","items":{"type":"string"}},"hq_full_address":{"type":"string"},"demo_available":{"type":"boolean"},"hq_country":{"type":"string"},"founded_year":{"type":"string"},"top_next_companies":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataTopNextCompaniesItems"}},"canonical_linkedin_url":{"type":"string"},"headline":{"type":"string"},"expired_domain":{"type":"boolean"},"summary":{"type":"string"},"website":{"type":"string"},"canonical_linkedin_shorthand_name":{"type":"string"},"active_job_postings_count":{"type":"integer"},"documentation_exist":{"type":"boolean"},"employee_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataEmployeeCountByMonthItems"}},"founded":{"type":"string"},"company_phone_numbers":{"type":"array","items":{"type":"string"}},"website_url":{"type":"string"},"is_public":{"type":"boolean"},"location":{"$ref":"#/components/schemas/OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentDataLocation"},"mobile_apps_exist":{"type":"boolean"},"online_reviews_exist":{"type":"boolean"},"employees_count":{"type":"integer"}},"title":"OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentData"},"OdysseyServiceProvidersSearchResponseResultsItems":{"type":"object","properties":{"entity_id":{"type":["string","null"]},"display_name":{"type":"string"},"industry":{"type":"string"},"industry_v2":{"type":"string"},"website":{"type":"string"},"employee_count":{"type":"integer"},"founded":{"type":"string"},"location":{"$ref":"#/components/schemas/OdysseyServiceProvidersSearchResponseResultsItemsLocation"},"linkedin_url":{"type":"string"},"description":{"type":"string"},"source":{"type":"string"},"enrichment_data":{"$ref":"#/components/schemas/OdysseyServiceProvidersSearchResponseResultsItemsEnrichmentData"}},"title":"OdysseyServiceProvidersSearchResponseResultsItems"},"OdysseyServiceProvidersSearchResponse":{"type":"object","properties":{"query":{"type":"string"},"provider_type":{"type":["string","null"]},"results":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersSearchResponseResultsItems"}},"total":{"type":"integer"},"limit":{"type":"integer"}},"title":"OdysseyServiceProvidersSearchResponse"},"OdysseyServiceProvidersBioResponseLocation":{"type":"object","properties":{"name":{"type":"string"},"locality":{"type":"string"},"country":{"type":"string"},"region":{"type":"string"}},"title":"OdysseyServiceProvidersBioResponseLocation"},"OdysseyServiceProvidersBioResponseEnrichmentDataLinkedinFollowersCountByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"follower_count":{"type":"integer"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataLinkedinFollowersCountByMonthItems"},"OdysseyServiceProvidersBioResponseEnrichmentDataCompetitorsItems":{"type":"object","properties":{"company_name":{"type":"string"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataCompetitorsItems"},"OdysseyServiceProvidersBioResponseEnrichmentDataRevenueAnnualSource1AnnualRevenue":{"type":"object","properties":{"annual_revenue":{"type":"integer"},"annual_revenue_currency":{"type":"string"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataRevenueAnnualSource1AnnualRevenue"},"OdysseyServiceProvidersBioResponseEnrichmentDataRevenueAnnualSource5AnnualRevenue":{"type":"object","properties":{"annual_revenue":{"type":"integer"},"annual_revenue_currency":{"type":"string"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataRevenueAnnualSource5AnnualRevenue"},"OdysseyServiceProvidersBioResponseEnrichmentDataRevenueAnnual":{"type":"object","properties":{"source_1_annual_revenue":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataRevenueAnnualSource1AnnualRevenue"},"source_5_annual_revenue":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataRevenueAnnualSource5AnnualRevenue"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataRevenueAnnual"},"OdysseyServiceProvidersBioResponseEnrichmentDataActiveJobPostingsItems":{"type":"object","properties":{"job_posting_id":{"type":"integer"},"job_posting_title":{"type":"string"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataActiveJobPostingsItems"},"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownBySeniority":{"type":"object","properties":{"employees_count_clevel":{"type":"integer"},"employees_count_head":{"type":"integer"},"employees_count_senior":{"type":"integer"},"employees_count_partner":{"type":"integer"},"employees_count_intern":{"type":"integer"},"employees_count_specialist":{"type":"integer"},"employees_count_owner":{"type":"integer"},"employees_count_vp":{"type":"integer"},"employees_count_director":{"type":"integer"},"employees_count_manager":{"type":"integer"},"employees_count_founder":{"type":"integer"},"employees_count_other_management":{"type":"integer"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownBySeniority"},"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownBySeniorityByMonthItemsEmployeesCountBreakdownBySeniority":{"type":"object","properties":{"employees_count_clevel":{"type":"integer"},"employees_count_head":{"type":"integer"},"employees_count_senior":{"type":"integer"},"employees_count_partner":{"type":"integer"},"employees_count_intern":{"type":"integer"},"employees_count_specialist":{"type":"integer"},"employees_count_owner":{"type":"integer"},"employees_count_vp":{"type":"integer"},"employees_count_director":{"type":"integer"},"employees_count_manager":{"type":"integer"},"employees_count_founder":{"type":"integer"},"employees_count_other_management":{"type":"integer"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownBySeniorityByMonthItemsEmployeesCountBreakdownBySeniority"},"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownBySeniorityByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"employees_count_breakdown_by_seniority":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownBySeniorityByMonthItemsEmployeesCountBreakdownBySeniority"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownBySeniorityByMonthItems"},"OdysseyServiceProvidersBioResponseEnrichmentDataDeparturesCountByMonthItems":{"type":"object","properties":{"departures_count":{"type":"integer"},"date":{"type":"string"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataDeparturesCountByMonthItems"},"OdysseyServiceProvidersBioResponseEnrichmentDataLinkedinFollowersCountChange":{"type":"object","properties":{"current":{"type":"integer"},"change_quarterly":{"type":"integer"},"change_yearly_percentage":{"type":"number","format":"double"},"change_quarterly_percentage":{"type":"number","format":"double"},"change_monthly_percentage":{"type":"number","format":"double"},"change_yearly":{"type":"integer"},"change_monthly":{"type":"integer"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataLinkedinFollowersCountChange"},"OdysseyServiceProvidersBioResponseEnrichmentDataTopNextCompaniesItems":{"type":"object","properties":{"count":{"type":"integer"},"company_name":{"type":"string"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataTopNextCompaniesItems"},"OdysseyServiceProvidersBioResponseEnrichmentDataProductReviewsScoreChange":{"type":"object","properties":{"current":{"type":"integer"},"change_yearly":{"type":"integer"},"change_monthly":{"type":"integer"},"change_quarterly":{"type":"integer"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataProductReviewsScoreChange"},"OdysseyServiceProvidersBioResponseEnrichmentDataTopPreviousCompaniesItems":{"type":"object","properties":{"count":{"type":"integer"},"company_name":{"type":"string"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataTopPreviousCompaniesItems"},"OdysseyServiceProvidersBioResponseEnrichmentDataIncomeStatementsItems":{"type":"object","properties":{"period_display_end_date":{"type":"string"},"revenue":{"type":"integer"},"cost_of_goods_sold_currency":{"type":"string"},"period_end_date":{"type":"string"},"period_type":{"type":"string"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataIncomeStatementsItems"},"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownByDepartmentByMonthItemsEmployeesCountBreakdownByDepartment":{"type":"object","properties":{"employees_count_administrative":{"type":"integer"},"employees_count_medical":{"type":"integer"},"employees_count_legal":{"type":"integer"},"employees_count_finance":{"type":"integer"},"employees_count_customer_service":{"type":"integer"},"employees_count_real_estate":{"type":"integer"},"employees_count_technical":{"type":"integer"},"employees_count_sales":{"type":"integer"},"employees_count_marketing":{"type":"integer"},"employees_count_research":{"type":"integer"},"employees_count_other_department":{"type":"integer"},"employees_count_trades":{"type":"integer"},"employees_count_hr":{"type":"integer"},"employees_count_consulting":{"type":"integer"},"employees_count_product":{"type":"integer"},"employees_count_education":{"type":"integer"},"employees_count_general_management":{"type":"integer"},"employees_count_project_management":{"type":"integer"},"employees_count_design":{"type":"integer"},"employees_count_operations":{"type":"integer"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownByDepartmentByMonthItemsEmployeesCountBreakdownByDepartment"},"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownByDepartmentByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"employees_count_breakdown_by_department":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownByDepartmentByMonthItemsEmployeesCountBreakdownByDepartment"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownByDepartmentByMonthItems"},"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownByRegion":{"type":"object","properties":{"employees_count_australia_new_zealand":{"type":"integer"},"employees_count_melanesia":{"type":"integer"},"employees_count_western_asia":{"type":"integer"},"employees_count_sub_saharan_africa":{"type":"integer"},"employees_count_northern_africa":{"type":"integer"},"employees_count_south_eastern_asia":{"type":"integer"},"employees_count_central_asia":{"type":"integer"},"employees_count_southern_asia":{"type":"integer"},"employees_count_northern_america":{"type":"integer"},"employees_count_unknown":{"type":"integer"},"employees_count_southern_europe":{"type":"integer"},"employees_count_latin_america":{"type":"integer"},"employees_count_northern_europe":{"type":"integer"},"employees_count_polynesia":{"type":"integer"},"employees_count_western_europe":{"type":"integer"},"employees_count_micronesia":{"type":"integer"},"employees_count_eastern_europe":{"type":"integer"},"employees_count_eastern_asia":{"type":"integer"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownByRegion"},"OdysseyServiceProvidersBioResponseEnrichmentDataActiveJobPostingsCountChange":{"type":"object","properties":{"current":{"type":"integer"},"change_quarterly":{"type":"integer"},"change_yearly_percentage":{"type":"number","format":"double"},"change_quarterly_percentage":{"type":"number","format":"double"},"change_monthly_percentage":{"type":"number","format":"double"},"change_yearly":{"type":"integer"},"change_monthly":{"type":"integer"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataActiveJobPostingsCountChange"},"OdysseyServiceProvidersBioResponseEnrichmentDataAffiliatedEntitiesItems":{"type":"object","properties":{"display_name":{"type":"string"},"relationship":{"type":"string"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataAffiliatedEntitiesItems"},"OdysseyServiceProvidersBioResponseEnrichmentDataKeyExecutiveDeparturesItems":{"type":"object","properties":{"member_position_title":{"type":"string"},"member_full_name":{"type":"string"},"departure_date":{"type":"string"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataKeyExecutiveDeparturesItems"},"OdysseyServiceProvidersBioResponseEnrichmentDataCompanyLocationsFullItems":{"type":"object","properties":{"location_address":{"type":"string"},"is_primary":{"type":"integer"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataCompanyLocationsFullItems"},"OdysseyServiceProvidersBioResponseEnrichmentDataTechnologiesUsedItems":{"type":"object","properties":{"last_verified_at":{"type":"string"},"technology":{"type":"string"},"first_verified_at":{"type":"string"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataTechnologiesUsedItems"},"OdysseyServiceProvidersBioResponseEnrichmentDataKeyExecutiveArrivalsItems":{"type":"object","properties":{"member_position_title":{"type":"string"},"member_full_name":{"type":"string"},"arrival_date":{"type":"string"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataKeyExecutiveArrivalsItems"},"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountChange":{"type":"object","properties":{"current":{"type":"integer"},"change_quarterly":{"type":"integer"},"change_yearly_percentage":{"type":"number","format":"double"},"change_quarterly_percentage":{"type":"number","format":"double"},"change_monthly_percentage":{"type":"number","format":"double"},"change_yearly":{"type":"integer"},"change_monthly":{"type":"integer"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountChange"},"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownByRegionByMonthItemsEmployeesCountBreakdownByRegion":{"type":"object","properties":{"employees_count_australia_new_zealand":{"type":"integer"},"employees_count_melanesia":{"type":"integer"},"employees_count_western_asia":{"type":"integer"},"employees_count_sub_saharan_africa":{"type":"integer"},"employees_count_northern_africa":{"type":"integer"},"employees_count_south_eastern_asia":{"type":"integer"},"employees_count_central_asia":{"type":"integer"},"employees_count_southern_asia":{"type":"integer"},"employees_count_northern_america":{"type":"integer"},"employees_count_unknown":{"type":"integer"},"employees_count_southern_europe":{"type":"integer"},"employees_count_latin_america":{"type":"integer"},"employees_count_northern_europe":{"type":"integer"},"employees_count_polynesia":{"type":"integer"},"employees_count_western_europe":{"type":"integer"},"employees_count_micronesia":{"type":"integer"},"employees_count_eastern_europe":{"type":"integer"},"employees_count_eastern_asia":{"type":"integer"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownByRegionByMonthItemsEmployeesCountBreakdownByRegion"},"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownByRegionByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"employees_count_breakdown_by_region":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownByRegionByMonthItemsEmployeesCountBreakdownByRegion"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownByRegionByMonthItems"},"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"employees_count":{"type":"integer"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountByMonthItems"},"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeeAttritionRateByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"employee_attrition_rate":{"type":"integer"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeeAttritionRateByMonthItems"},"OdysseyServiceProvidersBioResponseEnrichmentDataProductReviewsScoreByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"product_reviews_score":{"type":"integer"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataProductReviewsScoreByMonthItems"},"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountByCountryItems":{"type":"object","properties":{"employee_count":{"type":"integer"},"country":{"type":"string"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountByCountryItems"},"OdysseyServiceProvidersBioResponseEnrichmentDataKeyEmployeeChangeEventsItems":{"type":"object","properties":{"employee_change_event_name":{"type":"string"},"employee_change_event_url":{"type":"string"},"employee_change_event_date":{"type":"string"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataKeyEmployeeChangeEventsItems"},"OdysseyServiceProvidersBioResponseEnrichmentDataActiveJobPostingsCountByMonthItems":{"type":"object","properties":{"active_job_postings_count":{"type":"integer"},"date":{"type":"string"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataActiveJobPostingsCountByMonthItems"},"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeeCountByMonthItems":{"type":"object","properties":{"date":{"type":"string"},"employees_count":{"type":"integer"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeeCountByMonthItems"},"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownByDepartment":{"type":"object","properties":{"employees_count_administrative":{"type":"integer"},"employees_count_medical":{"type":"integer"},"employees_count_legal":{"type":"integer"},"employees_count_finance":{"type":"integer"},"employees_count_customer_service":{"type":"integer"},"employees_count_real_estate":{"type":"integer"},"employees_count_technical":{"type":"integer"},"employees_count_sales":{"type":"integer"},"employees_count_marketing":{"type":"integer"},"employees_count_research":{"type":"integer"},"employees_count_other_department":{"type":"integer"},"employees_count_trades":{"type":"integer"},"employees_count_hr":{"type":"integer"},"employees_count_consulting":{"type":"integer"},"employees_count_product":{"type":"integer"},"employees_count_education":{"type":"integer"},"employees_count_general_management":{"type":"integer"},"employees_count_project_management":{"type":"integer"},"employees_count_design":{"type":"integer"},"employees_count_operations":{"type":"integer"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownByDepartment"},"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountInferredByMonthItems":{"type":"object","properties":{"employees_count_inferred":{"type":"integer"},"date":{"type":"string"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountInferredByMonthItems"},"OdysseyServiceProvidersBioResponseEnrichmentDataLocation":{"type":"object","properties":{"name":{"type":"string"},"locality":{"type":"string"},"country":{"type":"string"},"region":{"type":"string"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataLocation"},"OdysseyServiceProvidersBioResponseEnrichmentDataNewsArticlesItems":{"type":"object","properties":{"source":{"type":"string"},"article_url":{"type":"string"},"headline":{"type":"string"},"published_date":{"type":"string"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentDataNewsArticlesItems"},"OdysseyServiceProvidersBioResponseEnrichmentData":{"type":"object","properties":{"hq_region":{"type":"array","items":{"type":"string"}},"unique_domain":{"type":"boolean"},"description_enriched":{"type":"string"},"num_news_articles":{"type":"integer"},"website_domain":{"type":"string"},"type":{"type":"string"},"linkedin_followers_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataLinkedinFollowersCountByMonthItems"}},"competitors":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataCompetitorsItems"}},"is_b2b":{"type":"integer"},"company_logo":{"type":"string"},"revenue_annual":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataRevenueAnnual"},"hq_state":{"type":"string"},"followers_count_linkedin":{"type":"integer"},"alternative_domains":{"type":"array","items":{"type":"string"}},"active_job_postings":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataActiveJobPostingsItems"}},"employee_count":{"type":"integer"},"facebook_url":{"type":"string"},"hq_location":{"type":"string"},"hq_city":{"type":"string"},"employees_count_breakdown_by_seniority":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownBySeniority"},"employees_count_breakdown_by_seniority_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownBySeniorityByMonthItems"}},"departures_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataDeparturesCountByMonthItems"}},"tags":{"type":"array","items":{"type":"string"}},"pricing_available":{"type":"boolean"},"size":{"type":"string"},"_truncated_fields":{"type":"array","items":{"type":"string"}},"company_name":{"type":"string"},"linkedin_followers_count_change":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataLinkedinFollowersCountChange"},"youtube_url":{"type":"array","items":{"type":"string"}},"hq_country_iso2":{"type":"string"},"hq_country_iso3":{"type":"string"},"free_trial_available":{"type":"boolean"},"created_at":{"type":"string"},"industry":{"type":"string"},"alternative_names":{"type":"array","items":{"type":"string"}},"hq_full_address":{"type":"string"},"top_next_companies":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataTopNextCompaniesItems"}},"canonical_linkedin_url":{"type":"string"},"headline":{"type":"string"},"twitter_url":{"type":"string"},"num_technologies_used":{"type":"integer"},"expired_domain":{"type":"boolean"},"product_reviews_score_change":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataProductReviewsScoreChange"},"website":{"type":"string"},"top_previous_companies":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataTopPreviousCompaniesItems"}},"documentation_exist":{"type":"boolean"},"founded":{"type":"string"},"income_statements":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataIncomeStatementsItems"}},"company_phone_numbers":{"type":"array","items":{"type":"string"}},"website_url":{"type":"string"},"is_public":{"type":"boolean"},"employees_count_inferred":{"type":"integer"},"ownership_status":{"type":"string"},"linkedin_shorthand_name":{"type":"string"},"hq_zipcode":{"type":"string"},"company_logo_url":{"type":"string"},"employees_count_breakdown_by_department_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownByDepartmentByMonthItems"}},"hq_street":{"type":"string"},"inferred_revenue":{"type":"string"},"employees_count_breakdown_by_region":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownByRegion"},"crunchbase_url":{"type":"string"},"categories_and_keywords":{"type":"array","items":{"type":"string"}},"industry_v2":{"type":"string"},"active_job_postings_count_change":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataActiveJobPostingsCountChange"},"affiliated_entities":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataAffiliatedEntitiesItems"}},"display_name":{"type":"string"},"company_name_alias":{"type":"array","items":{"type":"string"}},"website_alias":{"type":"array","items":{"type":"string"}},"company_legal_name":{"type":"string"},"instagram_url":{"type":"array","items":{"type":"string"}},"last_updated_at":{"type":"string"},"key_executive_departures":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataKeyExecutiveDeparturesItems"}},"is_downloadable":{"type":"boolean"},"name":{"type":"string"},"company_locations_full":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataCompanyLocationsFullItems"}},"technologies_used":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataTechnologiesUsedItems"}},"size_range":{"type":"string"},"linkedin_url":{"type":"string"},"key_executive_arrivals":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataKeyExecutiveArrivalsItems"}},"unique_website":{"type":"boolean"},"company_emails":{"type":"array","items":{"type":"string"}},"description_metadata_raw":{"type":"string"},"employees_count_change":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountChange"},"employees_count_breakdown_by_region_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownByRegionByMonthItems"}},"departures_count":{"type":"integer"},"funding_details":{"type":"array","items":{"description":"Any type"}},"description":{"type":"string"},"employees_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountByMonthItems"}},"employee_attrition_rate_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataEmployeeAttritionRateByMonthItems"}},"demo_available":{"type":"boolean"},"hq_country":{"type":"string"},"founded_year":{"type":"string"},"product_reviews_score_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataProductReviewsScoreByMonthItems"}},"employees_count_by_country":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountByCountryItems"}},"summary":{"type":"string"},"key_employee_change_events":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataKeyEmployeeChangeEventsItems"}},"canonical_linkedin_shorthand_name":{"type":"string"},"active_job_postings_count":{"type":"integer"},"followers_count_owler":{"type":"integer"},"active_job_postings_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataActiveJobPostingsCountByMonthItems"}},"product_reviews_count":{"type":"integer"},"employee_count_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataEmployeeCountByMonthItems"}},"pinterest_url":{"type":"array","items":{"type":"string"}},"employees_count_breakdown_by_department":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountBreakdownByDepartment"},"employees_count_inferred_by_month":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataEmployeesCountInferredByMonthItems"}},"location":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataLocation"},"mobile_apps_exist":{"type":"boolean"},"news_articles":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentDataNewsArticlesItems"}},"online_reviews_exist":{"type":"boolean"},"employees_count":{"type":"integer"},"employee_attrition_rate":{"type":"integer"}},"title":"OdysseyServiceProvidersBioResponseEnrichmentData"},"OdysseyServiceProvidersBioResponse":{"type":"object","properties":{"entity_id":{"type":"string"},"identifier":{"type":"string"},"entity_type":{"type":"string"},"display_name":{"type":"string"},"website":{"type":"string"},"industry":{"type":"string"},"employee_count":{"type":"integer"},"location":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseLocation"},"description":{"type":"string"},"founded":{"type":"string"},"linkedin_url":{"type":"string"},"source":{"type":"string"},"enrichment_data":{"$ref":"#/components/schemas/OdysseyServiceProvidersBioResponseEnrichmentData"}},"title":"OdysseyServiceProvidersBioResponse"},"OdysseyServiceProvidersCompaniesResponseCompaniesItems":{"type":"object","properties":{"title":{"type":"string"},"url":{"type":"string"},"excerpts":{"type":"array","items":{"type":"string"}},"source":{"type":"string"}},"title":"OdysseyServiceProvidersCompaniesResponseCompaniesItems"},"OdysseyServiceProvidersCompaniesResponse":{"type":"object","properties":{"entity_id":{"type":"string"},"companies":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersCompaniesResponseCompaniesItems"}},"total":{"type":"integer"},"limit":{"type":"integer"},"data_sources":{"type":"array","items":{"type":"string"}}},"title":"OdysseyServiceProvidersCompaniesResponse"},"OdysseyServiceProvidersDealsResponseDealsItems":{"type":"object","properties":{"title":{"type":"string"},"url":{"type":"string"},"excerpts":{"type":"array","items":{"type":"string"}},"source":{"type":"string"}},"title":"OdysseyServiceProvidersDealsResponseDealsItems"},"OdysseyServiceProvidersDealsResponse":{"type":"object","properties":{"entity_id":{"type":"string"},"deals":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersDealsResponseDealsItems"}},"total":{"type":"integer"},"limit":{"type":"integer"},"data_sources":{"type":"array","items":{"type":"string"}}},"title":"OdysseyServiceProvidersDealsResponse"},"OdysseyServiceProvidersInvestorsResponseInvestorsItems":{"type":"object","properties":{"title":{"type":"string"},"url":{"type":"string"},"excerpts":{"type":"array","items":{"type":"string"}},"source":{"type":"string"}},"title":"OdysseyServiceProvidersInvestorsResponseInvestorsItems"},"OdysseyServiceProvidersInvestorsResponse":{"type":"object","properties":{"entity_id":{"type":"string"},"investors":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersInvestorsResponseInvestorsItems"}},"total":{"type":"integer"},"limit":{"type":"integer"},"data_sources":{"type":"array","items":{"type":"string"}}},"title":"OdysseyServiceProvidersInvestorsResponse"},"OdysseyServiceProvidersFundsResponseFundsItems":{"type":"object","properties":{"title":{"type":"string"},"url":{"type":"string"},"excerpts":{"type":"array","items":{"type":"string"}},"source":{"type":"string"}},"title":"OdysseyServiceProvidersFundsResponseFundsItems"},"OdysseyServiceProvidersFundsResponse":{"type":"object","properties":{"entity_id":{"type":"string"},"funds":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyServiceProvidersFundsResponseFundsItems"}},"total":{"type":"integer"},"limit":{"type":"integer"},"data_sources":{"type":"array","items":{"type":"string"}}},"title":"OdysseyServiceProvidersFundsResponse"},"PatentDetail":{"type":"object","properties":{"abstract":{"type":["string","null"]},"assignee":{"type":["string","null"]},"filing_date":{"type":["string","null"]},"inventors":{"type":"array","items":{"type":"string"}},"patent_number":{"type":"string"},"patent_url":{"type":["string","null"]},"publication_date":{"type":["string","null"]},"title":{"type":"string"}},"required":["patent_number","title"],"description":"Individual patent details.","title":"PatentDetail"},"PatentSearchResponse":{"type":"object","properties":{"error":{"type":["string","null"]},"patents":{"type":"array","items":{"$ref":"#/components/schemas/PatentDetail"}},"query":{"type":"string"},"total_results":{"type":"integer"}},"required":["patents","query","total_results"],"description":"Response for patent search.","title":"PatentSearchResponse"},"PatentByIdResponse":{"type":"object","properties":{"error":{"type":["string","null"]},"patent":{"oneOf":[{"$ref":"#/components/schemas/PatentDetail"},{"type":"null"}]}},"description":"Response for single patent lookup.","title":"PatentByIdResponse"},"OdysseyPatentsGetFileResponseSearchResultsItems":{"type":"object","properties":{"title":{"type":"string"},"url":{"type":"string"}},"title":"OdysseyPatentsGetFileResponseSearchResultsItems"},"OdysseyPatentsGetFileResponse":{"type":"object","properties":{"patent_id":{"type":"string"},"patent_url":{"type":"string"},"pdf_url":{"type":"string"},"source":{"type":"string"},"search_results":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyPatentsGetFileResponseSearchResultsItems"}}},"title":"OdysseyPatentsGetFileResponse"},"NewsArticle":{"type":"object","properties":{"news_id":{"type":"string"},"published_date":{"type":["string","null"]},"snippet":{"type":["string","null"]},"source":{"type":["string","null"]},"title":{"type":"string"},"url":{"type":["string","null"]}},"required":["news_id","title"],"title":"NewsArticle"},"NewsSearchResponse":{"type":"object","properties":{"limit":{"type":"integer","default":10},"query":{"type":"string"},"results":{"type":"array","items":{"$ref":"#/components/schemas/NewsArticle"}},"total":{"type":"integer","default":0}},"required":["query"],"title":"NewsSearchResponse"},"OdysseyCreditAnalysisNewsDetailResponse":{"type":"object","properties":{"news_id":{"type":"string"},"title":{"type":"string"},"url":{"type":"string"},"snippet":{"type":"string"},"source":{"type":"string"},"query":{"type":"string"},"cached_at":{"type":"number","format":"double"}},"title":"OdysseyCreditAnalysisNewsDetailResponse"},"CreditNewsBulkResponse":{"type":"object","properties":{"results":{"type":"array","items":{"description":"Any type"}},"total":{"type":"integer"}},"title":"CreditNewsBulkResponse"},"OdysseyCreditAnalysisAgreementsSearchResponse":{"type":"object","properties":{"results":{"type":"array","items":{"description":"Any type"}},"total":{"type":"integer"},"error":{"type":"string"}},"title":"OdysseyCreditAnalysisAgreementsSearchResponse"},"OdysseyCreditAnalysisAgreementDetailResponse":{"type":"object","properties":{"company":{"type":"string"},"error":{"type":"string"}},"title":"OdysseyCreditAnalysisAgreementDetailResponse"},"OdysseyCreditAnalysisBdcSearchResponseResultsItems":{"type":"object","properties":{"company":{"type":"string"},"bdc_name":{"type":"string"},"filing_date":{"type":"string"},"source":{"type":"string"},"note":{"type":"string"}},"title":"OdysseyCreditAnalysisBdcSearchResponseResultsItems"},"OdysseyCreditAnalysisBdcSearchResponse":{"type":"object","properties":{"query":{"type":"string"},"total_results":{"type":"integer"},"results":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCreditAnalysisBdcSearchResponseResultsItems"}}},"title":"OdysseyCreditAnalysisBdcSearchResponse"},"OdysseyCreditAnalysisListBdcsResponseBdcsItems":{"type":"object","properties":{"ticker":{"type":"string"},"name":{"type":"string"},"cik":{"type":"string"}},"title":"OdysseyCreditAnalysisListBdcsResponseBdcsItems"},"OdysseyCreditAnalysisListBdcsResponse":{"type":"object","properties":{"bdcs":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCreditAnalysisListBdcsResponseBdcsItems"}},"total":{"type":"integer"}},"title":"OdysseyCreditAnalysisListBdcsResponse"},"OdysseyCreditAnalysisBdcPortfolioResponseInvestmentsItems":{"type":"object","properties":{"spread_bps":{"type":"string"},"industry":{"type":"string"},"maturity_date":{"type":"string"},"reference_rate":{"type":"string"},"acquisition_date":{"type":"string"},"cost_mm":{"type":"string"},"principal_mm":{"type":"string"},"investment_type":{"type":"string"},"coupon_pct":{"type":"string"},"fair_value_mm":{"type":"string"},"non_accrual":{"type":"boolean"},"company":{"type":"string"},"seniority":{"type":"string"}},"title":"OdysseyCreditAnalysisBdcPortfolioResponseInvestmentsItems"},"OdysseyCreditAnalysisBdcPortfolioResponse":{"type":"object","properties":{"bdc":{"type":"string"},"non_accrual_count":{"type":"string"},"ticker":{"type":"string"},"filing_date":{"type":"string"},"total_investments":{"type":"string"},"filing_type":{"type":"string"},"investments":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCreditAnalysisBdcPortfolioResponseInvestmentsItems"}},"total_fair_value":{"type":"string"}},"title":"OdysseyCreditAnalysisBdcPortfolioResponse"},"OdysseyCreditAnalysisBdcStatsResponseSeniorityBreakdown":{"type":"object","properties":{"first_lien":{"type":"integer"},"equity":{"type":"integer"},"mezzanine":{"type":"integer"}},"title":"OdysseyCreditAnalysisBdcStatsResponseSeniorityBreakdown"},"OdysseyCreditAnalysisBdcStatsResponseTopIndustriesItems":{"type":"object","properties":{"industry":{"type":"string"},"count":{"type":"integer"}},"title":"OdysseyCreditAnalysisBdcStatsResponseTopIndustriesItems"},"OdysseyCreditAnalysisBdcStatsResponse":{"type":"object","properties":{"bdc":{"type":"string"},"ticker":{"type":"string"},"filing_date":{"type":"string"},"total_investments":{"type":"integer"},"total_fair_value_mm":{"type":"number","format":"double"},"non_accrual_count":{"type":"integer"},"non_accrual_rate_pct":{"type":"number","format":"double"},"weighted_avg_spread_bps":{"type":"integer"},"seniority_breakdown":{"$ref":"#/components/schemas/OdysseyCreditAnalysisBdcStatsResponseSeniorityBreakdown"},"top_industries":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCreditAnalysisBdcStatsResponseTopIndustriesItems"}}},"title":"OdysseyCreditAnalysisBdcStatsResponse"},"OdysseyCreditAnalysisBorrowerLookupResponse":{"type":"object","properties":{"borrower":{"type":"string"},"total_positions":{"type":"integer"},"total_lenders":{"type":"integer"},"positions":{"type":"array","items":{"description":"Any type"}}},"title":"OdysseyCreditAnalysisBorrowerLookupResponse"},"OdysseyCreditAnalysisFundsSearchResponseResultsItems":{"type":"object","properties":{"fund_name":{"type":"string"},"filing_date":{"type":"string"},"form_type":{"type":"string"},"file_number":{"type":"string"}},"title":"OdysseyCreditAnalysisFundsSearchResponseResultsItems"},"OdysseyCreditAnalysisFundsSearchResponse":{"type":"object","properties":{"query":{"type":"string"},"strategy":{"type":["string","null"]},"total":{"type":"integer"},"results":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCreditAnalysisFundsSearchResponseResultsItems"}}},"title":"OdysseyCreditAnalysisFundsSearchResponse"},"OdysseyCreditAnalysisFundFormationsResponse":{"type":"object","properties":{"results":{"type":"array","items":{"description":"Any type"}},"total":{"type":"integer"}},"title":"OdysseyCreditAnalysisFundFormationsResponse"},"OdysseyCreditAnalysisListManagersResponseManagersItems":{"type":"object","properties":{"name":{"type":"string"},"strategy":{"type":"string"},"cik":{"type":"string"}},"title":"OdysseyCreditAnalysisListManagersResponseManagersItems"},"OdysseyCreditAnalysisListManagersResponse":{"type":"object","properties":{"managers":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCreditAnalysisListManagersResponseManagersItems"}},"total":{"type":"integer"}},"title":"OdysseyCreditAnalysisListManagersResponse"},"OdysseyCreditAnalysisManagerDetailResponse":{"type":"object","properties":{"name":{"type":"string"},"strategy":{"type":["string","null"]},"cik":{"type":["string","null"]},"form_d_filings_total":{"type":"integer"},"recent_filings":{"type":"array","items":{"description":"Any type"}}},"title":"OdysseyCreditAnalysisManagerDetailResponse"},"OdysseyCreditAnalysisMarketOverviewResponseBankLendingCiLoansAllBanksBn":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketOverviewResponseBankLendingCiLoansAllBanksBn"},"OdysseyCreditAnalysisMarketOverviewResponseBankLending":{"type":"object","properties":{"source":{"type":"string"},"frequency":{"type":"string"},"ci_loans_all_banks_bn":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketOverviewResponseBankLendingCiLoansAllBanksBn"}},"title":"OdysseyCreditAnalysisMarketOverviewResponseBankLending"},"OdysseyCreditAnalysisMarketOverviewResponseLendingStandardsNetWideningSpreads":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketOverviewResponseLendingStandardsNetWideningSpreads"},"OdysseyCreditAnalysisMarketOverviewResponseLendingStandardsNetTighteningLargeFirms":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketOverviewResponseLendingStandardsNetTighteningLargeFirms"},"OdysseyCreditAnalysisMarketOverviewResponseLendingStandardsNetTighteningSmallFirms":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketOverviewResponseLendingStandardsNetTighteningSmallFirms"},"OdysseyCreditAnalysisMarketOverviewResponseLendingStandards":{"type":"object","properties":{"net_widening_spreads":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketOverviewResponseLendingStandardsNetWideningSpreads"},"source":{"type":"string"},"net_tightening_large_firms":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketOverviewResponseLendingStandardsNetTighteningLargeFirms"},"net_tightening_small_firms":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketOverviewResponseLendingStandardsNetTighteningSmallFirms"},"frequency":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketOverviewResponseLendingStandards"},"OdysseyCreditAnalysisMarketOverviewResponseFinancialConditionsStlFinancialStressIndex":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketOverviewResponseFinancialConditionsStlFinancialStressIndex"},"OdysseyCreditAnalysisMarketOverviewResponseFinancialConditionsChicagoNfci":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketOverviewResponseFinancialConditionsChicagoNfci"},"OdysseyCreditAnalysisMarketOverviewResponseFinancialConditions":{"type":"object","properties":{"source":{"type":"string"},"stl_financial_stress_index":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketOverviewResponseFinancialConditionsStlFinancialStressIndex"},"chicago_nfci":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketOverviewResponseFinancialConditionsChicagoNfci"},"frequency":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketOverviewResponseFinancialConditions"},"OdysseyCreditAnalysisMarketOverviewResponseCreditSpreadsBbSpreadPct":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketOverviewResponseCreditSpreadsBbSpreadPct"},"OdysseyCreditAnalysisMarketOverviewResponseCreditSpreadsHighYieldOasPct":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketOverviewResponseCreditSpreadsHighYieldOasPct"},"OdysseyCreditAnalysisMarketOverviewResponseCreditSpreadsCccSpreadPct":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketOverviewResponseCreditSpreadsCccSpreadPct"},"OdysseyCreditAnalysisMarketOverviewResponseCreditSpreadsBbbSpreadPct":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketOverviewResponseCreditSpreadsBbbSpreadPct"},"OdysseyCreditAnalysisMarketOverviewResponseCreditSpreads":{"type":"object","properties":{"bb_spread_pct":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketOverviewResponseCreditSpreadsBbSpreadPct"},"source":{"type":"string"},"high_yield_oas_pct":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketOverviewResponseCreditSpreadsHighYieldOasPct"},"ccc_spread_pct":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketOverviewResponseCreditSpreadsCccSpreadPct"},"frequency":{"type":"string"},"bbb_spread_pct":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketOverviewResponseCreditSpreadsBbbSpreadPct"}},"title":"OdysseyCreditAnalysisMarketOverviewResponseCreditSpreads"},"OdysseyCreditAnalysisMarketOverviewResponseRatesTreasury10YPct":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketOverviewResponseRatesTreasury10YPct"},"OdysseyCreditAnalysisMarketOverviewResponseRatesSofrPct":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketOverviewResponseRatesSofrPct"},"OdysseyCreditAnalysisMarketOverviewResponseRates":{"type":"object","properties":{"source":{"type":"string"},"treasury_10y_pct":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketOverviewResponseRatesTreasury10YPct"},"sofr_pct":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketOverviewResponseRatesSofrPct"},"frequency":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketOverviewResponseRates"},"OdysseyCreditAnalysisMarketOverviewResponse":{"type":"object","properties":{"bank_lending":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketOverviewResponseBankLending"},"lending_standards":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketOverviewResponseLendingStandards"},"financial_conditions":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketOverviewResponseFinancialConditions"},"credit_spreads":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketOverviewResponseCreditSpreads"},"timestamp":{"type":"string"},"rates":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketOverviewResponseRates"}},"title":"OdysseyCreditAnalysisMarketOverviewResponse"},"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsBbSpreadCurrent":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsBbSpreadCurrent"},"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsBbSpreadHistoryItems":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsBbSpreadHistoryItems"},"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsBbSpread":{"type":"object","properties":{"name":{"type":"string"},"current":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketSpreadsResponseSpreadsBbSpreadCurrent"},"history":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketSpreadsResponseSpreadsBbSpreadHistoryItems"}}},"title":"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsBbSpread"},"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsHySpreadCurrent":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsHySpreadCurrent"},"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsHySpreadHistoryItems":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsHySpreadHistoryItems"},"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsHySpread":{"type":"object","properties":{"name":{"type":"string"},"current":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketSpreadsResponseSpreadsHySpreadCurrent"},"history":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketSpreadsResponseSpreadsHySpreadHistoryItems"}}},"title":"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsHySpread"},"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsCccSpreadCurrent":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsCccSpreadCurrent"},"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsCccSpreadHistoryItems":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsCccSpreadHistoryItems"},"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsCccSpread":{"type":"object","properties":{"name":{"type":"string"},"current":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketSpreadsResponseSpreadsCccSpreadCurrent"},"history":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketSpreadsResponseSpreadsCccSpreadHistoryItems"}}},"title":"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsCccSpread"},"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsBbbSpreadCurrent":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsBbbSpreadCurrent"},"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsBbbSpreadHistoryItems":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsBbbSpreadHistoryItems"},"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsBbbSpread":{"type":"object","properties":{"name":{"type":"string"},"current":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketSpreadsResponseSpreadsBbbSpreadCurrent"},"history":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketSpreadsResponseSpreadsBbbSpreadHistoryItems"}}},"title":"OdysseyCreditAnalysisMarketSpreadsResponseSpreadsBbbSpread"},"OdysseyCreditAnalysisMarketSpreadsResponseSpreads":{"type":"object","properties":{"bb_spread":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketSpreadsResponseSpreadsBbSpread"},"hy_spread":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketSpreadsResponseSpreadsHySpread"},"ccc_spread":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketSpreadsResponseSpreadsCccSpread"},"bbb_spread":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketSpreadsResponseSpreadsBbbSpread"}},"title":"OdysseyCreditAnalysisMarketSpreadsResponseSpreads"},"OdysseyCreditAnalysisMarketSpreadsResponse":{"type":"object","properties":{"spreads":{"$ref":"#/components/schemas/OdysseyCreditAnalysisMarketSpreadsResponseSpreads"},"source":{"type":"string"},"history_points":{"type":"string"}},"title":"OdysseyCreditAnalysisMarketSpreadsResponse"},"OdysseyCreditAnalysisLendingStandardsResponseStandardsLendingStandardsLargeHistoryItems":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"number","format":"double"}},"title":"OdysseyCreditAnalysisLendingStandardsResponseStandardsLendingStandardsLargeHistoryItems"},"OdysseyCreditAnalysisLendingStandardsResponseStandardsLendingStandardsLarge":{"type":"object","properties":{"name":{"type":"string"},"history":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCreditAnalysisLendingStandardsResponseStandardsLendingStandardsLargeHistoryItems"}}},"title":"OdysseyCreditAnalysisLendingStandardsResponseStandardsLendingStandardsLarge"},"OdysseyCreditAnalysisLendingStandardsResponseStandardsLendingStandardsSmallHistoryItems":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"number","format":"double"}},"title":"OdysseyCreditAnalysisLendingStandardsResponseStandardsLendingStandardsSmallHistoryItems"},"OdysseyCreditAnalysisLendingStandardsResponseStandardsLendingStandardsSmall":{"type":"object","properties":{"name":{"type":"string"},"history":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCreditAnalysisLendingStandardsResponseStandardsLendingStandardsSmallHistoryItems"}}},"title":"OdysseyCreditAnalysisLendingStandardsResponseStandardsLendingStandardsSmall"},"OdysseyCreditAnalysisLendingStandardsResponseStandardsSpreadWideningHistoryItems":{"type":"object","properties":{"date":{"type":"string"},"value":{"type":"number","format":"double"}},"title":"OdysseyCreditAnalysisLendingStandardsResponseStandardsSpreadWideningHistoryItems"},"OdysseyCreditAnalysisLendingStandardsResponseStandardsSpreadWidening":{"type":"object","properties":{"name":{"type":"string"},"history":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCreditAnalysisLendingStandardsResponseStandardsSpreadWideningHistoryItems"}}},"title":"OdysseyCreditAnalysisLendingStandardsResponseStandardsSpreadWidening"},"OdysseyCreditAnalysisLendingStandardsResponseStandards":{"type":"object","properties":{"lending_standards_large":{"$ref":"#/components/schemas/OdysseyCreditAnalysisLendingStandardsResponseStandardsLendingStandardsLarge"},"lending_standards_small":{"$ref":"#/components/schemas/OdysseyCreditAnalysisLendingStandardsResponseStandardsLendingStandardsSmall"},"spread_widening":{"$ref":"#/components/schemas/OdysseyCreditAnalysisLendingStandardsResponseStandardsSpreadWidening"}},"title":"OdysseyCreditAnalysisLendingStandardsResponseStandards"},"OdysseyCreditAnalysisLendingStandardsResponse":{"type":"object","properties":{"source":{"type":"string"},"frequency":{"type":"string"},"history_points":{"type":"integer"},"standards":{"$ref":"#/components/schemas/OdysseyCreditAnalysisLendingStandardsResponseStandards"}},"title":"OdysseyCreditAnalysisLendingStandardsResponse"},"OdysseyCreditAnalysisNportSearchResponse":{"type":"object","properties":{"query":{"type":"string"},"results":{"type":"array","items":{"description":"Any type"}},"total":{"type":"integer"}},"title":"OdysseyCreditAnalysisNportSearchResponse"},"OdysseyCreditAnalysisNportFundsResponseFundsItems":{"type":"object","properties":{"ticker":{"type":"string"},"name":{"type":"string"},"cik":{"type":"string"}},"title":"OdysseyCreditAnalysisNportFundsResponseFundsItems"},"OdysseyCreditAnalysisNportFundsResponse":{"type":"object","properties":{"funds":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCreditAnalysisNportFundsResponseFundsItems"}},"total":{"type":"integer"}},"title":"OdysseyCreditAnalysisNportFundsResponse"},"OdysseyCreditAnalysisRelationshipsSearchResponse":{"type":"object","properties":{"error":{"type":"string"},"known_lenders":{"type":"array","items":{"type":"string"}}},"title":"OdysseyCreditAnalysisRelationshipsSearchResponse"},"OdysseyCreditAnalysisUccPortalsResponsePortalsAkCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsAkCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsAk":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsAkCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsAk"},"OdysseyCreditAnalysisUccPortalsResponsePortalsAlCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsAlCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsAl":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsAlCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsAl"},"OdysseyCreditAnalysisUccPortalsResponsePortalsArCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsArCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsAr":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsArCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsAr"},"OdysseyCreditAnalysisUccPortalsResponsePortalsAzCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsAzCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsAz":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsAzCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsAz"},"OdysseyCreditAnalysisUccPortalsResponsePortalsCaCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsCaCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsCa":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsCaCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsCa"},"OdysseyCreditAnalysisUccPortalsResponsePortalsCoCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsCoCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsCo":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsCoCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsCo"},"OdysseyCreditAnalysisUccPortalsResponsePortalsCtCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsCtCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsCt":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsCtCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsCt"},"OdysseyCreditAnalysisUccPortalsResponsePortalsDcCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsDcCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsDc":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsDcCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsDc"},"OdysseyCreditAnalysisUccPortalsResponsePortalsDeCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsDeCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsDe":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsDeCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsDe"},"OdysseyCreditAnalysisUccPortalsResponsePortalsFlCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsFlCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsFl":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsFlCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsFl"},"OdysseyCreditAnalysisUccPortalsResponsePortalsGaCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsGaCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsGa":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsGaCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsGa"},"OdysseyCreditAnalysisUccPortalsResponsePortalsHiCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsHiCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsHi":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsHiCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsHi"},"OdysseyCreditAnalysisUccPortalsResponsePortalsIaCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsIaCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsIa":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsIaCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsIa"},"OdysseyCreditAnalysisUccPortalsResponsePortalsIdCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsIdCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsId":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsIdCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsId"},"OdysseyCreditAnalysisUccPortalsResponsePortalsIlCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsIlCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsIl":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsIlCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsIl"},"OdysseyCreditAnalysisUccPortalsResponsePortalsInCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsInCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsIn":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsInCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsIn"},"OdysseyCreditAnalysisUccPortalsResponsePortalsKsCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsKsCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsKs":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsKsCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsKs"},"OdysseyCreditAnalysisUccPortalsResponsePortalsKyCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsKyCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsKy":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsKyCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsKy"},"OdysseyCreditAnalysisUccPortalsResponsePortalsLaCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsLaCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsLa":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsLaCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsLa"},"OdysseyCreditAnalysisUccPortalsResponsePortalsMaCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsMaCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsMa":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsMaCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsMa"},"OdysseyCreditAnalysisUccPortalsResponsePortalsMdCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsMdCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsMd":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsMdCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsMd"},"OdysseyCreditAnalysisUccPortalsResponsePortalsMeCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsMeCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsMe":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsMeCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsMe"},"OdysseyCreditAnalysisUccPortalsResponsePortalsMiCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsMiCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsMi":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsMiCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsMi"},"OdysseyCreditAnalysisUccPortalsResponsePortalsMnCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsMnCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsMn":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsMnCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsMn"},"OdysseyCreditAnalysisUccPortalsResponsePortalsMoCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsMoCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsMo":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsMoCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsMo"},"OdysseyCreditAnalysisUccPortalsResponsePortalsMsCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsMsCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsMs":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsMsCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsMs"},"OdysseyCreditAnalysisUccPortalsResponsePortalsMtCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsMtCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsMt":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsMtCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsMt"},"OdysseyCreditAnalysisUccPortalsResponsePortalsNcCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsNcCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsNc":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsNcCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsNc"},"OdysseyCreditAnalysisUccPortalsResponsePortalsNdCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsNdCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsNd":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsNdCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsNd"},"OdysseyCreditAnalysisUccPortalsResponsePortalsNeCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsNeCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsNe":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsNeCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsNe"},"OdysseyCreditAnalysisUccPortalsResponsePortalsNhCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsNhCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsNh":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsNhCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsNh"},"OdysseyCreditAnalysisUccPortalsResponsePortalsNjCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsNjCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsNj":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsNjCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsNj"},"OdysseyCreditAnalysisUccPortalsResponsePortalsNmCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsNmCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsNm":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsNmCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsNm"},"OdysseyCreditAnalysisUccPortalsResponsePortalsNvCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsNvCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsNv":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsNvCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsNv"},"OdysseyCreditAnalysisUccPortalsResponsePortalsNyCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsNyCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsNy":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsNyCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsNy"},"OdysseyCreditAnalysisUccPortalsResponsePortalsOhCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsOhCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsOh":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsOhCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsOh"},"OdysseyCreditAnalysisUccPortalsResponsePortalsOkCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsOkCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsOk":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsOkCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsOk"},"OdysseyCreditAnalysisUccPortalsResponsePortalsOrCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsOrCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsOr":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsOrCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsOr"},"OdysseyCreditAnalysisUccPortalsResponsePortalsPaCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsPaCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsPa":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsPaCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsPa"},"OdysseyCreditAnalysisUccPortalsResponsePortalsRiCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsRiCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsRi":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsRiCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsRi"},"OdysseyCreditAnalysisUccPortalsResponsePortalsScCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsScCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsSc":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsScCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsSc"},"OdysseyCreditAnalysisUccPortalsResponsePortalsSdCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsSdCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsSd":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsSdCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsSd"},"OdysseyCreditAnalysisUccPortalsResponsePortalsTnCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsTnCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsTn":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsTnCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsTn"},"OdysseyCreditAnalysisUccPortalsResponsePortalsTxCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsTxCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsTx":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsTxCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsTx"},"OdysseyCreditAnalysisUccPortalsResponsePortalsVaCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsVaCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsVa":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsVaCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsVa"},"OdysseyCreditAnalysisUccPortalsResponsePortalsVtCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsVtCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsVt":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsVtCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsVt"},"OdysseyCreditAnalysisUccPortalsResponsePortalsWaCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsWaCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsWa":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsWaCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsWa"},"OdysseyCreditAnalysisUccPortalsResponsePortalsWiCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsWiCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsWi":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsWiCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsWi"},"OdysseyCreditAnalysisUccPortalsResponsePortalsWvCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsWvCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsWv":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsWvCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsWv"},"OdysseyCreditAnalysisUccPortalsResponsePortalsWyCost":{"type":"object","properties":{"value":{"type":"integer"},"currency":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsWyCost"},"OdysseyCreditAnalysisUccPortalsResponsePortalsWy":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"cost":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsWyCost"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortalsWy"},"OdysseyCreditAnalysisUccPortalsResponsePortals":{"type":"object","properties":{"AK":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsAk"},"AL":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsAl"},"AR":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsAr"},"AZ":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsAz"},"CA":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsCa"},"CO":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsCo"},"CT":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsCt"},"DC":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsDc"},"DE":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsDe"},"FL":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsFl"},"GA":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsGa"},"HI":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsHi"},"IA":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsIa"},"ID":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsId"},"IL":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsIl"},"IN":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsIn"},"KS":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsKs"},"KY":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsKy"},"LA":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsLa"},"MA":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsMa"},"MD":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsMd"},"ME":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsMe"},"MI":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsMi"},"MN":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsMn"},"MO":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsMo"},"MS":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsMs"},"MT":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsMt"},"NC":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsNc"},"ND":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsNd"},"NE":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsNe"},"NH":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsNh"},"NJ":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsNj"},"NM":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsNm"},"NV":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsNv"},"NY":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsNy"},"OH":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsOh"},"OK":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsOk"},"OR":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsOr"},"PA":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsPa"},"RI":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsRi"},"SC":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsSc"},"SD":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsSd"},"TN":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsTn"},"TX":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsTx"},"VA":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsVa"},"VT":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsVt"},"WA":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsWa"},"WI":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsWi"},"WV":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsWv"},"WY":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortalsWy"}},"title":"OdysseyCreditAnalysisUccPortalsResponsePortals"},"OdysseyCreditAnalysisUccPortalsResponse":{"type":"object","properties":{"portals":{"$ref":"#/components/schemas/OdysseyCreditAnalysisUccPortalsResponsePortals"},"known_lenders":{"type":"array","items":{"type":"string"}},"note":{"type":"string"}},"title":"OdysseyCreditAnalysisUccPortalsResponse"},"OdysseyCreditAnalysisSbaSearchResponseResultsItems":{"type":"object","properties":{"naicsdescription":{"type":"string"},"naicscode":{"type":"string"},"chargeoffdate":{"type":"string"},"borrstate":{"type":"string"},"terminmonths":{"type":"string"},"approvaldate":{"type":"string"},"grosschargeoffamount":{"type":"string"},"borrname":{"type":"string"},"initialinterestrate":{"type":"string"},"loanstatus":{"type":"string"},"grossapproval":{"type":"string"},"bankname":{"type":"string"},"jobssupported":{"type":"string"},"borrcity":{"type":"string"}},"title":"OdysseyCreditAnalysisSbaSearchResponseResultsItems"},"OdysseyCreditAnalysisSbaSearchResponse":{"type":"object","properties":{"total":{"type":"integer"},"results":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCreditAnalysisSbaSearchResponseResultsItems"}},"source":{"type":"string"}},"title":"OdysseyCreditAnalysisSbaSearchResponse"},"OdysseyCreditAnalysisSbaStatsResponseTopIndustriesItems":{"type":"object","properties":{"count":{"type":"string"},"industry":{"type":"string"}},"title":"OdysseyCreditAnalysisSbaStatsResponseTopIndustriesItems"},"OdysseyCreditAnalysisSbaStatsResponseTopStatesItems":{"type":"object","properties":{"count":{"type":"string"},"state":{"type":"string"}},"title":"OdysseyCreditAnalysisSbaStatsResponseTopStatesItems"},"OdysseyCreditAnalysisSbaStatsResponse":{"type":"object","properties":{"avg_loan_size_usd":{"type":"string"},"charged_off_count":{"type":"string"},"indexed_at":{"type":"string"},"top_industries":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCreditAnalysisSbaStatsResponseTopIndustriesItems"}},"total_chargeoff_usd":{"type":"string"},"total_loans":{"type":"string"},"total_jobs_supported":{"type":"string"},"top_states":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyCreditAnalysisSbaStatsResponseTopStatesItems"}},"total_approved_usd":{"type":"string"},"charged_off_pct":{"type":"string"}},"title":"OdysseyCreditAnalysisSbaStatsResponse"},"DivergenceAlert":{"type":"object","properties":{"credit_id":{"type":"string"},"display_name":{"type":["string","null"]},"period":{"type":"string"},"n_lenders":{"type":"integer"},"low_mark_pct":{"type":"number","format":"double","description":"Lowest lender mark (%)"},"high_mark_pct":{"type":"number","format":"double","description":"Highest lender mark (%)"},"spread_pts":{"type":"number","format":"double","description":"Divergence between lenders (points)"},"low_marker":{"type":["string","null"],"description":"Lender at the low mark"},"high_marker":{"type":["string","null"],"description":"Lender at the high mark"},"confidence":{"type":["string","null"],"description":"high (>=3 lenders) / medium (2 lenders)"},"alert":{"type":"string","default":"mark_divergence"}},"required":["credit_id","period","n_lenders","low_mark_pct","high_mark_pct","spread_pts"],"description":"A borrower marked materially differently across lenders in one period —\nthe sellable early-distress signal.","title":"DivergenceAlert"},"CoverageMeta":{"type":"object","properties":{"source":{"type":"string","default":"SEC BDC filings (public domain)"},"coverage":{"type":"string","default":"BDC filer registry"},"freshness":{"type":"string","default":"as-filed 10-Q, ~4wk after quarter-end"},"citations":{"type":"string","default":"per-mark SEC URL"}},"description":"Dataset provenance / freshness, echoed on every response.","title":"CoverageMeta"},"DivergenceFeedResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/DivergenceAlert"}},"next_cursor":{"type":["string","null"]},"has_more":{"type":"boolean","default":false},"page_size":{"type":"integer"},"_meta":{"$ref":"#/components/schemas/CoverageMeta"}},"required":["page_size"],"description":"Response for GET /credit-analysis/divergence — cursor-paged feed envelope.","title":"DivergenceFeedResponse"},"BorrowerProfileResponse":{"type":"object","properties":{"credit_id":{"type":"string"},"display_name":{"type":["string","null"]},"lenders_tracking":{"type":"integer","description":"Distinct lenders holding this borrower across history"},"quarters_observed":{"type":"integer","description":"Distinct filing periods with a mark"},"latest_period":{"type":["string","null"]},"latest_fair_value_usd":{"type":["number","null"],"format":"double","description":"Point-in-time FV summed over latest period"},"latest_lenders":{"type":"integer","default":0,"description":"Distinct lenders in the latest period"},"ody_company_id":{"type":["string","null"],"description":"Odyssey company id (future enrichment)"},"_meta":{"$ref":"#/components/schemas/CoverageMeta"}},"required":["credit_id","lenders_tracking","quarters_observed"],"description":"Response for GET /credit-analysis/borrowers/{credit_id}","title":"BorrowerProfileResponse"},"LedgerCitation":{"type":"object","properties":{"sec_accession":{"type":"string","description":"SEC accession number of the source filing"},"source_url":{"type":["string","null"],"description":"Direct URL to the filing document"}},"required":["sec_accession"],"description":"SEC provenance for a single mark — the moat is the citation, not the data.","title":"LedgerCitation"},"BorrowerMark":{"type":"object","properties":{"lender":{"type":"string","description":"BDC lender name"},"lender_cik":{"type":"integer","description":"SEC CIK of the lender"},"period":{"type":"string","description":"Filing period end (YYYY-MM-DD)"},"facility_class":{"type":"string","description":"first_lien, second_lien, sub_debt, revolver, equity, debt_other, ..."},"facility":{"type":["string","null"],"description":"Raw facility description from the filing"},"mark_pct":{"type":["number","null"],"format":"double","description":"Fair value as % of principal (0-100)"},"principal_usd":{"type":["number","null"],"format":"double","description":"Principal / par amount (USD)"},"fair_value_usd":{"type":["number","null"],"format":"double","description":"Reported fair value (USD)"},"citation":{"$ref":"#/components/schemas/LedgerCitation"}},"required":["lender","lender_cik","period","facility_class","citation"],"description":"One lender's fair-value mark on one facility of the borrower in one period.","title":"BorrowerMark"},"BorrowerMarksResponse":{"type":"object","properties":{"credit_id":{"type":"string"},"display_name":{"type":["string","null"]},"period":{"type":"string","description":"Requested period, or 'all'"},"lenders_observed":{"type":"integer"},"marks":{"type":"array","items":{"$ref":"#/components/schemas/BorrowerMark"}},"_meta":{"$ref":"#/components/schemas/CoverageMeta"}},"required":["credit_id","period","lenders_observed"],"description":"Response for GET /credit-analysis/borrowers/{credit_id}/marks","title":"BorrowerMarksResponse"},"TrendPoint":{"type":"object","properties":{"period":{"type":"string"},"n_lenders":{"type":"integer"},"min_mark_pct":{"type":["number","null"],"format":"double","description":"Lowest lender mark this period (%)"},"max_mark_pct":{"type":["number","null"],"format":"double","description":"Highest lender mark this period (%)"},"spread_pts":{"type":["number","null"],"format":"double","description":"Max-min divergence (points)"}},"required":["period","n_lenders"],"description":"One period's consensus mark for the borrower (for the widening-spread series).","title":"TrendPoint"},"BorrowerTrendResponse":{"type":"object","properties":{"credit_id":{"type":"string"},"display_name":{"type":["string","null"]},"series":{"type":"array","items":{"$ref":"#/components/schemas/TrendPoint"},"description":"Oldest→newest"},"trend":{"type":["string","null"],"description":"widening, narrowing, stable"},"_meta":{"$ref":"#/components/schemas/CoverageMeta"}},"required":["credit_id"],"description":"Response for GET /credit-analysis/borrowers/{credit_id}/trend","title":"BorrowerTrendResponse"},"LenderPosition":{"type":"object","properties":{"credit_id":{"type":"string"},"display_name":{"type":["string","null"]},"facility_class":{"type":"string"},"mark_pct":{"type":["number","null"],"format":"double","description":"Fair value as % of principal (0-100)"},"principal_usd":{"type":["number","null"],"format":"double"},"fair_value_usd":{"type":["number","null"],"format":"double"},"citation":{"oneOf":[{"$ref":"#/components/schemas/LedgerCitation"},{"type":"null"}]}},"required":["credit_id","facility_class"],"description":"One of a lender's marked positions (a borrower facility) in a period.","title":"LenderPosition"},"LenderPortfolioResponse":{"type":"object","properties":{"lender_cik":{"type":"integer"},"period":{"type":"string"},"count":{"type":"integer"},"positions":{"type":"array","items":{"$ref":"#/components/schemas/LenderPosition"},"description":"Lowest mark (most distressed) first"},"_meta":{"$ref":"#/components/schemas/CoverageMeta"}},"required":["lender_cik","period","count"],"description":"Response for GET /credit-analysis/lenders/{cik}/portfolio","title":"LenderPortfolioResponse"},"OdysseyFundamentalsSandboxResponseDataEntitiesItems":{"type":"object","properties":{"entity_id":{"type":"string"},"ticker":{"type":"string"},"company_name":{"type":"string"},"description":{"type":"string"}},"title":"OdysseyFundamentalsSandboxResponseDataEntitiesItems"},"OdysseyFundamentalsSandboxResponseData":{"type":"object","properties":{"entities":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundamentalsSandboxResponseDataEntitiesItems"}},"note":{"type":"string"}},"title":"OdysseyFundamentalsSandboxResponseData"},"OdysseyFundamentalsSandboxResponse":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/OdysseyFundamentalsSandboxResponseData"}},"title":"OdysseyFundamentalsSandboxResponse"},"OdysseyFundamentalsLookupTablesResponseDataTablesItems":{"type":"object","properties":{"table_id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"row_count":{"type":"integer"}},"title":"OdysseyFundamentalsLookupTablesResponseDataTablesItems"},"OdysseyFundamentalsLookupTablesResponseData":{"type":"object","properties":{"tables":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundamentalsLookupTablesResponseDataTablesItems"}}},"title":"OdysseyFundamentalsLookupTablesResponseData"},"OdysseyFundamentalsLookupTablesResponse":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/OdysseyFundamentalsLookupTablesResponseData"}},"title":"OdysseyFundamentalsLookupTablesResponse"},"OdysseyFundamentalsLookupTableValuesResponseDataRowsItems":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"}},"title":"OdysseyFundamentalsLookupTableValuesResponseDataRowsItems"},"OdysseyFundamentalsLookupTableValuesResponseData":{"type":"object","properties":{"table_id":{"type":"string"},"rows":{"type":"array","items":{"$ref":"#/components/schemas/OdysseyFundamentalsLookupTableValuesResponseDataRowsItems"}},"total":{"type":"integer"}},"title":"OdysseyFundamentalsLookupTableValuesResponseData"},"OdysseyFundamentalsLookupTableValuesResponse":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/OdysseyFundamentalsLookupTableValuesResponseData"}},"title":"OdysseyFundamentalsLookupTableValuesResponse"},"V2DatasetsScientificSourcesSearchGetParametersDatasetsSchema":{"oneOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}],"title":"V2DatasetsScientificSourcesSearchGetParametersDatasetsSchema"},"DatasetSearchResult":{"type":"object","properties":{"author":{"type":["string","null"],"description":"Article author/byline if available"},"date":{"type":["string","null"],"description":"Publication date if available"},"snippet":{"type":["string","null"],"description":"Text snippet from the search result"},"source":{"type":["string","null"],"description":"Source display name"},"title":{"type":"string"},"url":{"type":"string"}},"required":["title","url"],"description":"Individual search result from a dataset search","title":"DatasetSearchResult"},"BatchSearchResponse":{"type":"object","properties":{"datasets_searched":{"type":"array","items":{"type":"string"}},"errors":{"type":"object","additionalProperties":{"type":"string"}},"query":{"type":"string"},"results":{"type":"array","items":{"$ref":"#/components/schemas/DatasetSearchResult"}},"results_by_dataset":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/DatasetSearchResult"}}},"total_results":{"type":"integer","default":0}},"required":["query"],"description":"Response for POST /v2/datasets/batch-search","title":"BatchSearchResponse"},"DatasetArticleResponse":{"type":"object","properties":{"author":{"type":["string","null"]},"chars":{"type":["integer","null"]},"content":{"type":["string","null"],"description":"Full article content in markdown format"},"dataset":{"type":"string"},"date":{"type":["string","null"]},"error":{"type":["string","null"],"description":"Error message if request failed"},"title":{"type":["string","null"]},"url":{"type":"string"}},"required":["dataset","url"],"description":"Response for GET /v2/datasets/{dataset}/{url}","title":"DatasetArticleResponse"},"ScientificAskRequest":{"type":"object","properties":{"include_trials":{"type":"boolean","default":true,"description":"Whether the agent may call ClinicalTrials.gov."},"max_sources":{"type":"integer","minimum":1,"maximum":25,"default":10,"description":"Target number of cited sources in the final answer."},"question":{"type":"string","minLength":3,"maxLength":2000,"description":"Natural-language question."},"recency_years":{"type":["integer","null"],"minimum":1,"maximum":50,"default":10,"description":"Prefer evidence within the last N years where the question allows."},"stream":{"type":"boolean","default":false,"description":"If true, response is text/event-stream; otherwise JSON."}},"required":["question"],"description":"Request body for POST /v2/datasets/scientific/medical/ask","title":"ScientificAskRequest"},"ScientificSource":{"type":"object","properties":{"title":{"type":["string","null"]},"url":{"type":"string"},"snippet":{"type":["string","null"]},"dataset":{"type":["string","null"]},"published_at":{"type":["string","null"]},"authors":{"type":["array","null"],"items":{"type":"string"}},"metadata":{"type":["object","null"],"additionalProperties":{"description":"Any type"}}},"required":["url"],"description":"A single cited source surfaced by the agent.","title":"ScientificSource"},"ScientificAskResponse":{"type":"object","properties":{"answer":{"type":"string","description":"Synthesized answer with inline citations."},"domain":{"type":"string","description":"The scientific domain, e.g. 'medical'."},"gaps":{"type":"array","items":{"type":"string"},"description":"Things the agent could not find or verify."},"latency_ms":{"type":"integer","default":0,"description":"End-to-end wall-clock latency."},"sources":{"type":"array","items":{"$ref":"#/components/schemas/ScientificSource"}},"tool_calls":{"type":"integer","default":0,"description":"Number of tool calls the agent made."}},"required":["answer","domain"],"description":"Response for POST /v2/datasets/scientific/medical/ask (non-streaming).","title":"ScientificAskResponse"},"DatasetSearchResponse":{"type":"object","properties":{"dataset":{"type":"string"},"error":{"type":["string","null"],"description":"Error message if search failed"},"limit":{"type":"integer","default":10},"query":{"type":"string"},"results":{"type":"array","items":{"$ref":"#/components/schemas/DatasetSearchResult"}},"total_results":{"type":"integer","default":0}},"required":["dataset","query"],"description":"Response for GET /v2/datasets/{dataset}/search","title":"DatasetSearchResponse"},"BatchSearchRequest":{"type":"object","properties":{"author":{"type":["string","null"],"description":"Filter results by author/byline name. Appended as quoted phrase to search query."},"datasets":{"type":["array","null"],"items":{"type":"string"},"description":"List of dataset names to search across. Defaults to all datasets if not provided."},"limit":{"type":"integer","minimum":1,"maximum":100,"default":10,"description":"Max results per dataset"},"q":{"type":"string","description":"Search query"}},"required":["q"],"description":"Request body for POST /v2/datasets/batch-search","title":"BatchSearchRequest"}}}}