{"openapi": "3.1.0", "info": {"title": "Epstein Files Research Database", "description": "REST API for 1,416,848 documents (2,915,593 pages) from the DOJ Epstein Files Transparency Act production. Search, retrieve, analyze, and contribute annotations. No API key required.", "version": "1.0.0", "contact": {"email": "admin@epstein-data.com"}, "license": {"name": "CC BY-NC-SA 4.0"}}, "servers": [{"url": "https://epstein-data.com/api/corpus", "description": "Production"}], "paths": {"/search": {"get": {"operationId": "searchDocuments", "summary": "Full-text keyword search across 2.9M pages", "description": "FTS5 search supporting AND, OR, NOT, and \"quoted phrases\". Returns matching pages with text snippets and links to the document viewer.", "parameters": [{"name": "q", "in": "query", "required": true, "description": "Search query. Examples: 'flight logs', '\"Ghislaine Maxwell\" AND Paris', 'bank account NOT Deutsche'", "schema": {"type": "string"}}, {"name": "limit", "in": "query", "required": false, "description": "Max results (1-50)", "schema": {"type": "integer", "default": 20, "minimum": 1, "maximum": 50}}], "responses": {"200": {"description": "Search results with snippets", "content": {"application/json": {"schema": {"type": "object", "properties": {"query": {"type": "string"}, "count": {"type": "integer"}, "results": {"type": "array", "items": {"type": "object", "properties": {"efta_number": {"type": "string", "description": "Document Bates/EFTA identifier"}, "page_number": {"type": "integer", "description": "0-indexed page number"}, "snippet": {"type": "string", "description": "Text snippet with **bold** match highlights"}, "url": {"type": "string", "description": "CANONICAL CITATION LINK — use this URL when referencing this document (e.g. https://epstein-data.com/EFTA00701362). This is the document viewer with page images."}}}}}}}}}}}}, "/semantic": {"get": {"operationId": "semanticSearch", "summary": "AI semantic search — understands meaning, not just keywords", "description": "Uses BGE text embeddings and FAISS vector index to find conceptually related pages. Better for natural language queries like 'who visited the island' vs keyword searches.", "parameters": [{"name": "q", "in": "query", "required": true, "description": "Natural language query", "schema": {"type": "string"}}, {"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": 10, "minimum": 1, "maximum": 20}}], "responses": {"200": {"description": "Semantically similar pages", "content": {"application/json": {"schema": {"type": "object", "properties": {"result": {"type": "string", "description": "JSON response"}}}}}}}}}, "/document": {"get": {"operationId": "getDocument", "summary": "Get full text of a document by EFTA/Bates number", "description": "Returns the OCR text of every page (or a specific page) of a document. Use this after finding a document via search to read its contents.", "parameters": [{"name": "id", "in": "query", "required": true, "description": "Document identifier. Examples: 'EFTA00701362', 'HOUSE_OVERSIGHT_013484', 'DOJ-OGR-00005911'", "schema": {"type": "string"}}, {"name": "page", "in": "query", "required": false, "description": "Specific page (0-indexed). Omit for all pages.", "schema": {"type": "integer", "minimum": 0}}], "responses": {"200": {"description": "Document text with page-level content", "content": {"application/json": {"schema": {"type": "object", "properties": {"efta_number": {"type": "string"}, "page_count": {"type": "integer"}, "url": {"type": "string", "description": "Document viewer URL"}, "pdf_url": {"type": "string", "description": "Direct PDF download"}, "pages": {"type": "array", "items": {"type": "object", "properties": {"efta_number": {"type": "string"}, "page_number": {"type": "integer"}, "text_content": {"type": "string"}, "char_count": {"type": "integer"}}}}}}}}}}}}, "/metadata": {"get": {"operationId": "getDocumentMetadata", "summary": "Get document metadata: filename, author, email headers, dates", "description": "Returns concordance metadata for a document including original filename, custodian, email headers (from, to, cc, bcc, subject), and dates.", "parameters": [{"name": "id", "in": "query", "required": true, "description": "Document EFTA/Bates number", "schema": {"type": "string"}}], "responses": {"200": {"description": "Document metadata", "content": {"application/json": {"schema": {"type": "object", "properties": {"result": {"type": "string", "description": "JSON response"}}}}}}}}}, "/count": {"get": {"operationId": "countDocuments", "summary": "Count matching documents or get total corpus statistics", "parameters": [{"name": "q", "in": "query", "required": false, "description": "Search query. Omit for total corpus count.", "schema": {"type": "string"}}], "responses": {"200": {"description": "Document count", "content": {"application/json": {"schema": {"type": "object", "properties": {"result": {"type": "string", "description": "JSON response"}}}}}}}}}, "/images": {"get": {"operationId": "searchImages", "summary": "Search AI-generated descriptions of 92K images extracted from documents", "description": "Every image in the corpus has been analyzed by AI vision and given a text description. This searches those descriptions. Try: 'passport photo', 'handwritten note', 'building exterior', 'swimming pool'.", "parameters": [{"name": "q", "in": "query", "required": true, "description": "Describe what you're looking for visually", "schema": {"type": "string"}}, {"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": 20, "minimum": 1, "maximum": 50}}], "responses": {"200": {"description": "Matching images with descriptions", "content": {"application/json": {"schema": {"type": "object", "properties": {"result": {"type": "string", "description": "JSON response"}}}}}}}}}, "/emails": {"get": {"operationId": "searchEmails", "summary": "Search 1.87M email records by sender, recipient, subject, or date", "description": "Search parsed email metadata. All parameters optional but provide at least one. Supports sender/recipient name search, subject keyword search, and date range filtering.", "parameters": [{"name": "q", "in": "query", "required": false, "description": "Subject line keyword search", "schema": {"type": "string"}}, {"name": "sender", "in": "query", "required": false, "description": "Sender name or email (partial match)", "schema": {"type": "string"}}, {"name": "recipient", "in": "query", "required": false, "description": "Recipient name (searches To and CC fields)", "schema": {"type": "string"}}, {"name": "date_from", "in": "query", "required": false, "description": "Start date (YYYY-MM-DD)", "schema": {"type": "string", "format": "date"}}, {"name": "date_to", "in": "query", "required": false, "description": "End date (YYYY-MM-DD)", "schema": {"type": "string", "format": "date"}}, {"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": 20, "minimum": 1, "maximum": 50}}], "responses": {"200": {"description": "Matching email records", "content": {"application/json": {"schema": {"type": "object", "properties": {"result": {"type": "string", "description": "JSON response"}}}}}}}}}, "/transcripts": {"get": {"operationId": "searchTranscripts", "summary": "Search audio/video transcripts (190K words from 435 media files)", "description": "Search transcribed audio and video files including detective interviews, proffer agreements, and surveillance footage.", "parameters": [{"name": "q", "in": "query", "required": true, "schema": {"type": "string"}}, {"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": 10, "minimum": 1, "maximum": 20}}], "responses": {"200": {"description": "Matching transcripts with snippets", "content": {"application/json": {"schema": {"type": "object", "properties": {"result": {"type": "string", "description": "JSON response"}}}}}}}}}, "/handwriting": {"get": {"operationId": "searchHandwriting", "summary": "Search 362 handwritten page transcriptions (FD-302s, proffer notes)", "description": "AI-transcribed handwritten pages including FBI interview notes, proffer session notes, and handwritten letters.", "parameters": [{"name": "q", "in": "query", "required": true, "schema": {"type": "string"}}, {"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": 10, "minimum": 1, "maximum": 20}}], "responses": {"200": {"description": "Matching handwritten transcriptions", "content": {"application/json": {"schema": {"type": "object", "properties": {"result": {"type": "string", "description": "JSON response"}}}}}}}}}, "/entities": {"get": {"operationId": "searchEntities", "summary": "Search knowledge graph: 524 entities + 2,096 relationships", "description": "Search people, organizations, properties, and aircraft in the entity graph. Returns entity details and all known relationships (associates, employers, properties, flights).", "parameters": [{"name": "q", "in": "query", "required": true, "description": "Name or partial name. Examples: 'Ghislaine Maxwell', 'Deutsche Bank', 'Zorro Ranch'", "schema": {"type": "string"}}], "responses": {"200": {"description": "Matching entities with relationships", "content": {"application/json": {"schema": {"type": "object", "properties": {"result": {"type": "string", "description": "JSON response"}}}}}}}}}, "/redacted": {"get": {"operationId": "searchRedactedEntities", "summary": "Search 107K entities extracted from beneath redactions", "description": "Names, dates, and other entities that were extracted from redacted portions of documents using AI analysis.", "parameters": [{"name": "q", "in": "query", "required": false, "description": "Entity value to search for", "schema": {"type": "string"}}, {"name": "type", "in": "query", "required": false, "description": "Entity type filter: person, organization, date, location, phone, email, address, etc.", "schema": {"type": "string"}}, {"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": 20, "minimum": 1, "maximum": 50}}], "responses": {"200": {"description": "Extracted entities with source document references", "content": {"application/json": {"schema": {"type": "object", "properties": {"result": {"type": "string", "description": "JSON response"}}}}}}}}}, "/page-types": {"get": {"operationId": "getPageTypes", "summary": "Get AI-classified type of each page in a document", "description": "Returns the AI-classified type of each page: email, financial, legal, FBI form, handwritten, photograph, etc. Useful for understanding what a multi-page document contains.", "parameters": [{"name": "id", "in": "query", "required": true, "description": "Document EFTA/Bates number", "schema": {"type": "string"}}], "responses": {"200": {"description": "Per-page type classifications with confidence scores", "content": {"application/json": {"schema": {"type": "object", "properties": {"result": {"type": "string", "description": "JSON response"}}}}}}}}}, "/alt-ids": {"get": {"operationId": "getAlternateIds", "summary": "Get all alternate Bates/production numbers for a document", "description": "Documents often have multiple numbering systems from different legal productions (R1, JPM-SDNY, DB-SDNY, UBS, FBI serial, USAO, TD-DOJ). This finds all alternate identifiers so you can track the same document across productions.", "parameters": [{"name": "id", "in": "query", "required": true, "description": "Document EFTA/Bates number", "schema": {"type": "string"}}], "responses": {"200": {"description": "All alternate numbering systems for this document", "content": {"application/json": {"schema": {"type": "object", "properties": {"result": {"type": "string", "description": "JSON response"}}}}}}}}}, "/related": {"get": {"operationId": "getRelatedDocuments", "summary": "Find related documents — near-duplicates, same thread, similar content", "description": "Returns documents related to the given one, ranked by Jaccard text similarity. Finds near-duplicate documents, email threads, and content-similar pages across the corpus. Use this when a user asks 'what other documents are connected to this one?'", "parameters": [{"name": "id", "in": "query", "required": true, "description": "Document EFTA/Bates number", "schema": {"type": "string"}}, {"name": "limit", "in": "query", "required": false, "description": "Max results (1-50)", "schema": {"type": "integer", "default": 10, "minimum": 1, "maximum": 50}}], "responses": {"200": {"description": "Related documents with similarity scores and relationship types", "content": {"application/json": {"schema": {"type": "object", "properties": {"efta_number": {"type": "string"}, "url": {"type": "string", "description": "Document viewer URL"}, "count": {"type": "integer"}, "related": {"type": "array", "items": {"type": "object", "properties": {"related_efta": {"type": "string", "description": "Related document EFTA number"}, "jaccard": {"type": "number", "description": "Jaccard text similarity (0-1)"}, "relation_type": {"type": "string", "description": "Relationship: near_duplicate, thread, image_near_dup"}, "url": {"type": "string", "description": "CANONICAL CITATION LINK for the related document"}}}}}}}}}}}}, "/dossier": {"get": {"operationId": "getDocumentDossier", "summary": "Get everything about a document in one call", "description": "Get everything about a document: full text, metadata, page types, alt-IDs, related docs, redacted entities, document entities, emails, navigation, community annotations, and comments.", "parameters": [{"name": "id", "in": "query", "required": true, "description": "Document EFTA/Bates number", "schema": {"type": "string"}}], "responses": {"200": {"description": "Complete document dossier with text, metadata, classifications, cross-references, and related documents", "content": {"application/json": {"schema": {"type": "object", "properties": {"efta_number": {"type": "string"}, "url": {"type": "string", "description": "CANONICAL CITATION LINK for this document"}, "pdf_url": {"type": "string"}, "page_count": {"type": "integer"}, "pages": {"type": "array", "description": "Full text of each page"}, "metadata": {"type": "object", "description": "Production metadata: filename, author, custodian, email headers, dates"}, "page_types": {"type": "array", "description": "AI-classified type of each page"}, "alt_ids": {"type": "object", "description": "Alternate Bates numbers across legal productions"}, "related": {"type": "array", "description": "Related documents with similarity scores"}, "redacted_entities": {"type": "array", "description": "Entities extracted from redacted portions"}}}}}}}}}, "/multi-search": {"get": {"operationId": "multiSearch", "summary": "Run up to 5 keyword searches in one call", "description": "Submit multiple search queries at once instead of calling /search repeatedly. Each query runs independently and returns its own results. Use this when cross-referencing names, phrases, or identifiers from a document.", "parameters": [{"name": "q", "in": "query", "required": true, "description": "Search query. Repeat this parameter for multiple queries (max 5). Example: ?q=Darren+Indyke&q=Non-Prosecution+Agreement&q=probation+transfer", "schema": {"type": "string"}}], "responses": {"200": {"description": "Results for each query, keyed by query string", "content": {"application/json": {"schema": {"type": "object", "properties": {"queries": {"type": "integer", "description": "Number of queries executed"}, "searches": {"type": "object", "description": "Results keyed by query string, each with count and results array"}}}}}}}}}, "/similar-images": {"get": {"operationId": "findSimilarImages", "summary": "Find visually similar pages using CLIP embeddings (614K indexed)", "description": "Given a document page, find other pages that look visually similar. Uses CLIP embeddings across 614,700 indexed pages. Useful for finding duplicate documents, related forms, or similar photographs.", "parameters": [{"name": "id", "in": "query", "required": true, "description": "Document EFTA number", "schema": {"type": "string"}}, {"name": "page", "in": "query", "required": false, "description": "Page number (0-indexed)", "schema": {"type": "integer", "default": 0, "minimum": 0}}, {"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": 10, "minimum": 1, "maximum": 50}}], "responses": {"200": {"description": "Visually similar pages with similarity scores", "content": {"application/json": {"schema": {"type": "object", "properties": {"result": {"type": "string", "description": "JSON response"}}}}}}}}}, "/news": {"get": {"operationId": "getRecentNews", "summary": "Recent Epstein-related news from 300+ sources", "description": "Clustered news stories updated every 6 hours. Each story groups related articles from multiple sources.", "parameters": [{"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": 20, "minimum": 1, "maximum": 50}}], "responses": {"200": {"description": "Clustered news stories", "content": {"application/json": {"schema": {"type": "object", "properties": {"result": {"type": "string", "description": "JSON response"}}}}}}}}}, "/annotations": {"get": {"operationId": "getAnnotations", "summary": "Get all community annotations for a document", "description": "Returns community-contributed categories, people, dates, topics, entities, interest levels, OCR correction count, and flags. Also includes AI-extracted entities from the knowledge graph. Check this before adding duplicate annotations.", "parameters": [{"name": "efta", "in": "query", "required": true, "description": "EFTA number (e.g. EFTA00727491)", "schema": {"type": "string"}}], "responses": {"200": {"description": "Annotation data including categories, people, dates, topics, entities, interest, OCR count, flags"}}}}, "/comments": {"get": {"operationId": "getComments", "summary": "Get research comments on a document", "description": "Returns reader comments including researcher notes, cross-references, and contextual observations.", "parameters": [{"name": "efta", "in": "query", "required": true, "description": "EFTA number", "schema": {"type": "string"}}], "responses": {"200": {"description": "Array of comments with name, body, timestamp"}}}}, "/kg-suggestions": {"get": {"operationId": "getKgSuggestions", "summary": "Get community-suggested knowledge graph relationships", "description": "View relationship suggestions between entities submitted by researchers and AI agents. Filter by entity name or source document.", "parameters": [{"name": "entity", "in": "query", "required": false, "description": "Filter by entity name (partial match)", "schema": {"type": "string"}}, {"name": "efta", "in": "query", "required": false, "description": "Filter by source EFTA number", "schema": {"type": "string"}}, {"name": "limit", "in": "query", "required": false, "description": "Max results (default 50, max 200)", "schema": {"type": "integer"}}], "responses": {"200": {"description": "Suggested relationships with entity types, evidence, and source documents"}}}}, "/find-image": {"post": {"operationId": "reverseImageSearch", "summary": "Reverse image search — upload an image, find visually similar pages", "description": "Upload a base64-encoded image to find visually similar document pages using CLIP embeddings.", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["image_base64"], "properties": {"image_base64": {"type": "string", "description": "Base64-encoded image data"}, "limit": {"type": "integer", "default": 20, "minimum": 1, "maximum": 50}}}}}}, "responses": {"200": {"description": "Visually similar pages", "content": {"application/json": {"schema": {"type": "object", "properties": {"result": {"type": "string", "description": "JSON response"}}}}}}}}}, "/find-face": {"post": {"operationId": "faceSearch", "summary": "Face recognition search — upload a face photo, find that person across the corpus", "description": "Upload a base64-encoded photo of a face to find that person appearing in document images across the corpus using InsightFace recognition.", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["image_base64"], "properties": {"image_base64": {"type": "string", "description": "Base64-encoded image containing a face"}, "limit": {"type": "integer", "default": 20, "minimum": 1, "maximum": 50}}}}}}, "responses": {"200": {"description": "Documents containing matching faces", "content": {"application/json": {"schema": {"type": "object", "properties": {"result": {"type": "string", "description": "JSON response"}}}}}}}}}, "/resolve": {"get": {"operationId": "resolveEfta", "summary": "Resolve any EFTA reference to a canonical page with full context", "description": "Resolve any EFTA reference to a canonical page. Accepts EFTA numbers or alt-IDs (SDNY, JPM, UBS, FBI serial). Returns page text, classification, metadata, alt-IDs, prev/next links, entity mentions.", "parameters": [{"name": "id", "in": "query", "schema": {"type": "string"}, "description": "EFTA document number (e.g. EFTA01296884). Provide this OR alt_id."}, {"name": "alt_id", "in": "query", "schema": {"type": "string"}, "description": "Alternate production number (e.g. SDNY, JPM-SDNY, UBS, FBI serial). System tries all known ID types."}, {"name": "page", "in": "query", "schema": {"type": "integer", "minimum": 0}, "description": "Page number (0-indexed). Omit to get page index summary."}], "responses": {"200": {"description": "Resolved page with full context", "content": {"application/json": {"schema": {"type": "object", "properties": {"efta_number": {"type": "string"}, "resolved_via": {"type": "string"}, "dataset": {"type": "integer"}, "total_pages": {"type": "integer"}, "doc_type": {"type": "string"}, "viewer_url": {"type": "string"}, "pdf_url": {"type": "string"}, "page_number": {"type": "integer"}, "page_url": {"type": "string"}, "text_content": {"type": "string"}, "page_found": {"type": "boolean"}, "page_type": {"type": "string"}, "prev_page": {"type": "object"}, "next_page": {"type": "object"}, "alt_ids": {"type": "object"}, "metadata": {"type": "object"}, "mentioned_entities": {"type": "array"}, "related_documents": {"type": "array"}, "page_index": {"type": "array"}}}}}}}}}, "/annotate": {"post": {"operationId": "addAnnotation", "summary": "Add a community annotation to a document", "description": "Tag a document with people, dates, entities, topics, categories, or significance levels. Rate-limited per kind.", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["efta", "kind", "value"], "properties": {"efta": {"type": "string", "description": "EFTA number"}, "kind": {"type": "string", "enum": ["person", "date", "entity", "topic", "interest", "category"], "description": "Annotation type"}, "value": {"type": "string", "description": "The annotation value (name, date, category, etc.)"}, "extra": {"type": "string", "description": "Optional extra info: date description, entity type (organization/location), topic description"}}}}}}, "responses": {"200": {"description": "Success confirmation"}, "429": {"description": "Rate limited"}}}}, "/suggest-category": {"post": {"operationId": "suggestCategory", "summary": "Suggest a document type/category", "description": "Suggest what type of document this is. Categories: email, legal-filing, fbi-302, financial, photograph, flight-log, handwritten-note, deposition, passport, property-record, phone-record, medical, travel, media, contract, receipt, tax, law-enforcement, other. Rate limit: 1 per document per hour.", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["efta"], "properties": {"efta": {"type": "string", "description": "EFTA number"}, "suggested": {"type": "string", "description": "Category slug"}, "other_text": {"type": "string", "description": "Description if category is 'other'"}}}}}}, "responses": {"200": {"description": "Success"}, "429": {"description": "Rate limited"}}}}, "/ocr-correction": {"post": {"operationId": "correctOcr", "summary": "Submit corrected OCR text for a document page", "description": "Submit corrected transcription text for a page with OCR errors. Compare original text (from /document) against the page image. Especially valuable for handwritten notes, degraded scans, and old faxes. Rate limit: 1 per page per 6 hours.", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["efta", "page", "body"], "properties": {"efta": {"type": "string", "description": "EFTA number"}, "page": {"type": "integer", "description": "Page number (0-indexed)"}, "body": {"type": "string", "description": "Full corrected text for the page"}}}}}}, "responses": {"200": {"description": "Success"}, "429": {"description": "Rate limited"}}}}, "/flag-annotation": {"post": {"operationId": "flagAnnotation", "summary": "Flag an incorrect community annotation", "description": "Flag a community annotation as incorrect or inappropriate. Use get_annotations first to see existing annotations. Rate limit: 1 per annotation per hour.", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["efta", "target_kind", "target_value"], "properties": {"efta": {"type": "string", "description": "EFTA number"}, "target_kind": {"type": "string", "description": "Kind of annotation to flag (person, date, entity, etc.)"}, "target_value": {"type": "string", "description": "The specific annotation value to flag"}, "reason": {"type": "string", "description": "Optional reason for flagging"}}}}}}, "responses": {"200": {"description": "Success"}, "429": {"description": "Rate limited"}}}}, "/comment": {"post": {"operationId": "addComment", "summary": "Add a research comment to a document", "description": "Share observations, cross-references, or contextual analysis. Keep comments factual and evidence-based. Cite specific EFTA numbers when cross-referencing. Rate limit: 1 per document per 30 minutes.", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["page", "body"], "properties": {"page": {"type": "string", "description": "EFTA number (the document to comment on)"}, "name": {"type": "string", "description": "Display name (default: 'AI Agent')"}, "body": {"type": "string", "description": "Comment text"}}}}}}, "responses": {"200": {"description": "Success"}, "429": {"description": "Rate limited"}}}}, "/suggest-kg-link": {"post": {"operationId": "suggestKgLink", "summary": "Suggest a knowledge graph relationship between two entities", "description": "Propose a relationship between two entities in the knowledge graph (e.g. traveled_with, employed_by, victim_of). Include source EFTA and evidence text for verification.", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["entity1", "entity2", "relationship"], "properties": {"entity1": {"type": "string", "description": "First entity name"}, "entity1_type": {"type": "string", "enum": ["person", "organization", "location", "property", "aircraft", "shell_company"], "description": "Entity type (default: person)"}, "entity2": {"type": "string", "description": "Second entity name"}, "entity2_type": {"type": "string", "enum": ["person", "organization", "location", "property", "aircraft", "shell_company"], "description": "Entity type (default: person)"}, "relationship": {"type": "string", "enum": ["traveled_with", "employed_by", "victim_of", "paid_by", "associated_with", "communicated_with", "visited", "recruited_by", "represented_by", "related_to", "owned_by", "operated_at"]}, "source_efta": {"type": "string", "description": "EFTA number of the document supporting this relationship"}, "evidence": {"type": "string", "description": "Brief description of the evidence (max 500 chars)"}}}}}}, "responses": {"200": {"description": "Success"}, "429": {"description": "Rate limited"}}}}}}