{"openapi":"3.1.0","info":{"title":"talentkiwi public api","description":"\n## TalentKiwi Public API\n\nThe TalentKiwi API lets developers extract structured candidate data from documents and integrate directly with ATS systems to create projects for document generation.\n\n### Key Features\n- **Document Parsing**: Extract structured data from CVs, resumes, and recruitment documents\n- **Multi-format Support**: Process PDF, DOC, DOCX, and image files\n- **Flexible Processing**: Choose between synchronous and asynchronous parsing\n- **Multi-language Support**: Parse documents in various languages\n- **ATS Integration**: Trigger TalentKiwi project creation directly from your ATS\n- **Secure Access**: API key and shared-secret authentication\n\n### Authentication\n\nAll endpoints use `X-API-KEY`:\n```\nX-API-KEY: YOUR_API_KEY\n```\n\nATS endpoints (`/v1/ats/*`) additionally accept `X-Shared-Secret` for compatibility with\ncertain ATS integrations that send that header name by default:\n```\nX-Shared-Secret: YOUR_SHARED_SECRET\n```\n\n---\n\n## Document Parsing\n\nExtract structured data from candidate documents. Supports PDF, DOC, DOCX, and image files.\n\n- **Auth**: `X-API-KEY` header\n- **Endpoint**: `POST /v1/parse/`\n- **Modes**: synchronous (immediate result) or asynchronous (submit + poll)\n- **Rate limits**: usage is tracked and billed per your subscription plan\n\n<details>\n<summary>cURL — Synchronous</summary>\n\n```bash\ncurl -X POST \"https://api.talentkiwi.tech/v1/parse/\"   -H \"X-API-KEY: YOUR_API_KEY\"   -F \"cv=@resume.pdf\"   -F \"language=english\"   -F \"run_async=false\"\n```\n\n</details>\n\n<details>\n<summary>cURL — Asynchronous</summary>\n\n```bash\n# Submit job\nJOB_RESPONSE=$(curl -X POST \"https://api.talentkiwi.tech/v1/parse/\"   -H \"X-API-KEY: YOUR_API_KEY\"   -F \"cv=@resume.pdf\"   -F \"language=english\"   -F \"run_async=true\")\n\nJOB_ID=$(echo $JOB_RESPONSE | jq -r '.job_id')\n\n# Poll for completion\nwhile true; do\n  STATUS=$(curl -s -H \"X-API-KEY: YOUR_API_KEY\"     \"https://api.talentkiwi.tech/v1/parse/$JOB_ID/status\" | jq -r '.status')\n\n  if [ \"$STATUS\" = \"completed\" ]; then\n    break\n  elif [ \"$STATUS\" = \"failed\" ]; then\n    echo \"Job failed\"\n    exit 1\n  fi\n\n  sleep 5\ndone\n\n# Get results\ncurl -H \"X-API-KEY: YOUR_API_KEY\"   \"https://api.talentkiwi.tech/v1/parse/$JOB_ID/results\"\n```\n\n</details>\n\n<details>\n<summary>Python — Synchronous</summary>\n\n```python\nimport requests\n\nurl = \"https://api.talentkiwi.tech/v1/parse/?run_async=false\"\nheaders = {\"X-API-KEY\": \"YOUR_API_KEY\"}\nfiles = {\"cv\": (\"resume.pdf\", open(\"resume.pdf\", \"rb\"), \"application/pdf\")}\ndata = {\"language\": \"english\"}\n\nresponse = requests.post(url, headers=headers, files=files, data=data)\nresult = response.json()\nprint(f\"Candidate: {result['data']['personal_info']['full_name']}\")\n```\n\n</details>\n\n<details>\n<summary>Python — Asynchronous</summary>\n\n```python\nimport requests\nimport time\n\n# Submit job\nurl = \"https://api.talentkiwi.tech/v1/parse/?run_async=true\"\nheaders = {\"X-API-KEY\": \"YOUR_API_KEY\"}\nfiles = {\"cv\": (\"resume.pdf\", open(\"resume.pdf\", \"rb\"), \"application/pdf\")}\ndata = {\"language\": \"english\"}\n\nresponse = requests.post(url, headers=headers, files=files, data=data)\njob_id = response.json()[\"job_id\"]\n\n# Poll for completion\nwhile True:\n    status = requests.get(\n        f\"https://api.talentkiwi.tech/v1/parse/{job_id}/status\",\n        headers=headers,\n    ).json()[\"status\"]\n    if status == \"completed\":\n        break\n    elif status == \"failed\":\n        raise RuntimeError(\"Job failed\")\n    time.sleep(5)\n\n# Get results\nresult = requests.get(\n    f\"https://api.talentkiwi.tech/v1/parse/{job_id}/results\",\n    headers=headers,\n).json()\nprint(f\"Candidate: {result['data']['personal_info']['full_name']}\")\n```\n\n</details>\n\n<details>\n<summary>JavaScript — Synchronous</summary>\n\n```javascript\nconst formData = new FormData();\nformData.append('cv', file, file.name);\nformData.append('language', 'english');\n\nconst response = await fetch('https://api.talentkiwi.tech/v1/parse/?run_async=false', {\n  method: 'POST',\n  headers: { 'X-API-KEY': 'YOUR_API_KEY' },\n  body: formData,\n});\nconst data = await response.json();\nconsole.log('Candidate:', data.data.personal_info.full_name);\n```\n\n</details>\n\n<details>\n<summary>JavaScript — Asynchronous</summary>\n\n```javascript\nconst formData = new FormData();\nformData.append('cv', file, file.name);\nformData.append('language', 'english');\n\n// Submit job\nconst submitResponse = await fetch('https://api.talentkiwi.tech/v1/parse/?run_async=true', {\n  method: 'POST',\n  headers: { 'X-API-KEY': 'YOUR_API_KEY' },\n  body: formData,\n});\nconst { job_id } = await submitResponse.json();\n\n// Poll for completion\nwhile (true) {\n  const { status } = await fetch(`https://api.talentkiwi.tech/v1/parse/${job_id}/status`, {\n    headers: { 'X-API-KEY': 'YOUR_API_KEY' },\n  }).then(r => r.json());\n\n  if (status === 'completed') break;\n  if (status === 'failed') throw new Error('Job failed');\n  await new Promise(resolve => setTimeout(resolve, 5000));\n}\n\n// Get results\nconst result = await fetch(`https://api.talentkiwi.tech/v1/parse/${job_id}/results`, {\n  headers: { 'X-API-KEY': 'YOUR_API_KEY' },\n}).then(r => r.json());\nconsole.log('Candidate:', result.data.personal_info.full_name);\n```\n\n</details>\n\n---\n\n## ATS Integration\n\nTalentKiwi integrates directly with ATS systems, allowing them to create a TalentKiwi project for document generation without manual uploads. The integration resolves the consultant, creates a project, imports candidates in the background, and returns a redirect URL to the new project.\n\nEach supported ATS has its own endpoint under `/v1/ats/{provider}/`. HR4YOU is the first supported integration — more providers will follow.\n\n- **Auth**: `X-API-KEY` header (or `X-Shared-Secret` — accepted for ATS compatibility)\n- **Endpoint**: `POST /v1/ats/hr4you/create-pdf`\n- **Flow**: resolve consultant → create project → import candidates (background) → return redirect URL to the new project\n\n<details>\n<summary>cURL — create-pdf</summary>\n\n```bash\ncurl -X POST \"https://api.talentkiwi.tech/v1/ats/hr4you/create-pdf\"   -H \"X-Shared-Secret: YOUR_SHARED_SECRET\"   -H \"Content-Type: application/json\"   -d '{\n    \"userId\": 42,\n    \"applicantIds\": [101, 102],\n    \"projectId\": 7,\n    \"applicantDocumentTypeId\": 3\n  }'\n```\n\n</details>\n\n<details>\n<summary>Python — create-pdf</summary>\n\n```python\nimport requests\n\nurl = \"https://api.talentkiwi.tech/v1/ats/hr4you/create-pdf\"\nheaders = {\"X-Shared-Secret\": \"YOUR_SHARED_SECRET\"}\npayload = {\n    \"userId\": 42,                      # Consultant ID in the ATS\n    \"applicantIds\": [101, 102],        # Applicant IDs in the ATS\n    \"projectId\": 7,                    # Optional: job/project ID in the ATS\n    \"applicantDocumentTypeId\": 3,      # Document type for the uploaded PDF\n    \"projectApplicantStatusId\": 5,     # Optional: status to write back after generation\n}\n\nresponse = requests.post(url, json=payload, headers=headers)\nresult = response.json()\nprint(f\"Open project at: {result['redirectUrl']}\")\n```\n\n</details>\n\n<details>\n<summary>JavaScript — create-pdf</summary>\n\n```javascript\nconst response = await fetch('https://api.talentkiwi.tech/v1/ats/hr4you/create-pdf', {\n  method: 'POST',\n  headers: {\n    'X-Shared-Secret': 'YOUR_SHARED_SECRET',\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    userId: 42,                    // Consultant ID in the ATS\n    applicantIds: [101, 102],      // Applicant IDs in the ATS\n    projectId: 7,                  // Optional: job/project ID in the ATS\n    applicantDocumentTypeId: 3,    // Document type for the uploaded PDF\n    projectApplicantStatusId: 5,   // Optional: status to write back after generation\n  }),\n});\nconst { redirectUrl } = await response.json();\nconsole.log('Open project at:', redirectUrl);\n```\n\n</details>\n","version":"0.1.1","x-logo":{"url":"https://talentkiwi.tech/logo.svg","backgroundColor":"#f0f3fe","altText":"talentkiwi logo"}},"paths":{"/v1/parse/":{"post":{"tags":["Document Parsing","Parser"],"summary":"Submit a file for parsing (sync or async)","description":"Parse candidate documents (CVs, resumes, cover letters) and extract structured data.\n\n**Processing Modes:**\n- **Asynchronous (default)**: Submit job and poll for results using the provided status URL\n- **Synchronous**: Get immediate results (suitable for smaller files)\n\n**Supported Formats:**\n- PDF files (.pdf)\n- Microsoft Word documents (.doc, .docx) \n- Image files (.jpg, .jpeg, .png)\n- Plain text files (.txt)\n\n**File Requirements:**\n- Maximum total pages: 50 pages across all files\n- Files are automatically converted to PDF for processing\n\n**Language Support:**\nCurrently supported languages include German, English. More languages can be requested.","operationId":"create_parse_job","security":[{"API Key Authentication":[]}],"parameters":[{"name":"run_async","in":"query","required":false,"schema":{"type":"boolean","description":"**Processing mode**: Set to `false` for synchronous processing (immediate results). Use `true` for asynchronous processing (polling required).","default":true,"title":"Run Async"},"description":"**Processing mode**: Set to `false` for synchronous processing (immediate results). Use `true` for asynchronous processing (polling required).","example":true}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_parse_job"}}}},"responses":{"202":{"description":"**Asynchronous Success**: Job created and queued for processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreationResponse"},"example":{"job_id":"550e8400-e29b-41d4-a716-446655440000","status_url":"https://api.talentkiwi.tech/v1/parse/550e8400-e29b-41d4-a716-446655440000/status","result_url":"https://api.talentkiwi.tech/v1/parse/550e8400-e29b-41d4-a716-446655440000/results"}}}},"200":{"description":"**Synchronous Success**: Parsed data returned immediately","content":{"application/json":{"example":{"data":{"personal_info":{"full_name":"Matteo Guscetti","email":"matteo.guscetti@yahoo.com","nationality":"Schweiz","gender":"Männlich","civil_status":"","car_license":false,"birth_date":"1996-12-16","mobile_phone":"+41797251712","home_phone":"","street_and_number":"","city":"","state":"","country":"","postal_code":"","linkedin":"","availability":""},"professional_summary":"Erfahrener Data Scientist mit 2+ Jahren fundierter Expertise in der Entwicklung und Implementierung fortschrittlicher ML-Modelle, einschliesslich Reinforcement Learning und CNNs. Nachweisliche Erfolgsbilanz bei der Steigerung der Prognosegenauigkeit auf über 90% mittels XGBoost und der Leitung technischer Projekte. Kompetent in Python, R und SQL.","personal_impression":"Matteo Guscetti zeigte sich als selbstbewusster, ausgesprochen kommunikativer Kandidat mit hoher Teamfähigkeit. Seine offene, besonnene Art zeugt von exzellenter kultureller Passung und Lernbereitschaft.","experience":[{"id":"exp_1","company":"Siemens","position":"Data Scientist","employment_type":"Praktikum","start_date":"01.2022","end_date":"07.2022","city":"Zürich","state":"Zürich","country":"Schweiz","postal_code":"","description_1to1":"Entwicklung eines Reinforcement-Learning-Algorithmus zum Ausgleich von Stromnetzen mit hohem Anteil erneuerbarer Energien. Arbeitete mit automatisierten Test-Pipelines (pytest) und Toolkits zur Abhängigkeitsverwaltung (poetry)","reason_for_change":""}],"education":[{"id":"edu_1","institution":"Eidgenössische Technische Hochschule (ETH) Zürich","institution_type":"Universität","city":"Zürich","state":"Zürich","country":"Schweiz","postal_code":"","degree":"Master in Datenwissenschaft","degree_level":"Master","field_of_study":"Datenwissenschaft","start_date":"02.2020","end_date":"07.2022","concluded_successfully":true,"is_further_education":true,"gpa":"5.51/6","description_1to1":"Austauschsemester am Imperial College London im Herbst 2020."}],"skills":{"fields_of_experitse":["Data Science","Machine Learning","Business Development"],"hard_skills":["Reinforcement Learning","Quantitative Analyse","Startup Bewertung"],"it_skills":["Python","PyTorch","R","SQL","Git","CNN","XGBoost"],"soft_skills":["Teamführung","Kommunikation","Problemlösung"]},"languages":[{"language":"Italienisch","standard_proficiency":"C2","proficiency":"Muttersprache"},{"language":"Englisch","standard_proficiency":"B2","proficiency":"gut"}],"hobbies_interests":["Reisen","Fotografieren","Wandern"]},"status_code":200,"execution_time":2.34},"schema":{"$ref":"#/components/schemas/ParsingResultResponse"}}}},"400":{"description":"**Bad Request**: Invalid file format or size limits exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"401":{"description":"**Unauthorized**: Invalid or missing API key"},"422":{"description":"**Validation Error**: Request parameters are invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"429":{"description":"**Rate Limit Exceeded**: Too many requests"},"500":{"description":"**Internal Server Error**: Processing failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}}}}},"/v1/parse/{job_id}/status":{"get":{"tags":["Document Parsing","Parser"],"summary":"Get job status (for async jobs)","description":"Check the current status of an asynchronous document parsing job.\n\n**Job Statuses:**\n- `pending`: Job is queued and waiting to be processed\n- `running`: Job is currently being processed  \n- `completed`: Job finished successfully, results are available\n- `failed`: Job failed due to an error\n\n**Polling Recommendations:**\n- Check status every 5-10 seconds for small files\n- Check status every 15-20 seconds for larger files\n- Stop polling once status is `completed` or `failed`","operationId":"get_job_status","security":[{"API Key Authentication":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Current job status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobStatusResponse"},"examples":{"pending":{"summary":"Job Pending","value":{"job_id":"550e8400-e29b-41d4-a716-446655440000","status":"pending"}},"processing":{"summary":"Job Processing","value":{"job_id":"550e8400-e29b-41d4-a716-446655440000","status":"processing"}},"completed":{"summary":"Job Completed","value":{"job_id":"550e8400-e29b-41d4-a716-446655440000","status":"completed"}}}}}},"401":{"description":"**Unauthorized**: Invalid or missing API key"},"403":{"description":"**Forbidden**: Job does not belong to your API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"404":{"description":"**Not Found**: Job ID does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/parse/{job_id}/results":{"get":{"tags":["Document Parsing","Parser"],"summary":"Get job results (for async jobs)","description":"Retrieve the parsed results from a completed asynchronous job.\n\n**Prerequisites:**\n- Job must have `completed` status (check via `/status` endpoint)\n- Job must belong to your API key\n\n**Response Structure:**\nThe results contain structured candidate information including:\n- Personal details (name, contact information)\n- Work experience and employment history\n- Education background  \n- Skills and competencies\n- Additional parsed fields based on document content","operationId":"get_job_results","security":[{"API Key Authentication":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"**Success**: Parsed document data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParsingResultResponse"},"example":{"data":{"personal_info":{"full_name":"Matteo Guscetti","email":"matteo.guscetti@yahoo.com","nationality":"Schweiz","gender":"Männlich","civil_status":"","car_license":false,"birth_date":"1996-12-16","mobile_phone":"+41797251712","home_phone":"","street_and_number":"","city":"","state":"","country":"","postal_code":"","linkedin":"","availability":""},"professional_summary":"Erfahrener Data Scientist mit 2+ Jahren fundierter Expertise in der Entwicklung und Implementierung fortschrittlicher ML-Modelle, einschliesslich Reinforcement Learning und CNNs.","personal_impression":"Matteo Guscetti zeigte sich als selbstbewusster, ausgesprochen kommunikativer Kandidat mit hoher Teamfähigkeit.","experience":[{"id":"exp_1","company":"Siemens","position":"Data Scientist","employment_type":"Praktikum","start_date":"01.2022","end_date":"07.2022","city":"Zürich","state":"Zürich","country":"Schweiz","postal_code":"","description_1to1":"Entwicklung eines Reinforcement-Learning-Algorithmus zum Ausgleich von Stromnetzen mit hohem Anteil erneuerbarer Energien.","reason_for_change":""}],"education":[{"id":"edu_1","institution":"Eidgenössische Technische Hochschule (ETH) Zürich","institution_type":"Universität","city":"Zürich","state":"Zürich","country":"Schweiz","postal_code":"","degree":"Master in Datenwissenschaft","degree_level":"Master","field_of_study":"Datenwissenschaft","start_date":"02.2020","end_date":"07.2022","concluded_successfully":true,"is_further_education":true,"gpa":"5.51/6","description_1to1":"Austauschsemester am Imperial College London im Herbst 2020."}],"skills":{"fields_of_experitse":["Data Science","Machine Learning","Business Development"],"hard_skills":["Reinforcement Learning","Quantitative Analyse","Startup Bewertung"],"it_skills":["Python","PyTorch","R","SQL","Git","CNN","XGBoost"],"soft_skills":["Teamführung","Kommunikation","Problemlösung"]},"languages":[{"language":"Italienisch","standard_proficiency":"C2","proficiency":"Muttersprache"},{"language":"Englisch","standard_proficiency":"B2","proficiency":"gut"}],"hobbies_interests":["Reisen","Fotografieren","Wandern"]},"status_code":200,"execution_time":3.45}}}},"400":{"description":"**Bad Request**: Job is not ready for results retrieval","content":{"application/json":{"examples":{"failed":{"summary":"Failed Job","value":{"detail":"Job failed to process. Results are not available."}},"not_completed":{"summary":"Job In Progress","value":{"detail":"Job is not yet completed. Current status: running. Please try again later."}}},"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"401":{"description":"**Unauthorized**: Invalid or missing API key"},"403":{"description":"**Forbidden**: Job does not belong to your API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"404":{"description":"**Not Found**: Job ID does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ats/hr4you/create-pdf":{"post":{"tags":["ATS Integration","ATS Integration"],"summary":"Create PDF project from ATS applicants","description":"Receive an ATS ``create-pdf`` request, resolve/provision the consultant as a\nTalentKiwi user, create a project with the requested candidates, kick off background\nATS imports, and return a ``redirectUrl`` pointing at the new project.\n\nAuthentication is via the ``X-Shared-Secret`` header — the same SHA-256 hash\nlookup used for regular API keys.\n\nSteps:\n\n1. Resolve the organisation from the API key.\n2. Fetch org-level HR4YOU credentials from ``DomainResourceMapping``.\n3. Look up the consultant's e-mail via the HR4YOU ``/consultants/{userId}`` endpoint.\n4. Resolve or auto-provision the TalentKiwi user.\n5. Create a new project (default open project type).\n6. Optionally attach a job post (when ``projectId`` is provided).\n7. Create one candidate per ``applicantId``, tag with ATS info.\n8. Enqueue a background import per candidate.\n9. Return the redirect URL.","operationId":"create_pdf_v1_ats_hr4you_create_pdf_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePdfRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePdfResponse"}}}},"default":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePdfError"}}}}},"security":[{"API Key Authentication":[]},{"Shared Secret Authentication":[]}]}},"/":{"get":{"tags":["General"],"summary":"Root","description":"Get basic information about the API instance.\n\nReturns application metadata including version, name, and deployment information.\nUseful for verifying API connectivity and version compatibility.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"tags":["General"],"summary":"Performs a Health Check","description":"Perform a comprehensive health check of the API and its dependencies.\n\nVerifies:\n- API service availability\n- Database connectivity\n- Core system components\n\nReturns HTTP 200 if all systems are operational, HTTP 503 if any critical component is unavailable.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Body_create_parse_job":{"properties":{"cv":{"type":"string","format":"binary","title":"Cv","description":"**Primary document** to parse (CV, resume, etc.). Accepted formats: PDF, DOC, DOCX, JPG, PNG, TXT."},"other_files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Other Files","description":"**Additional supporting documents** (cover letters, portfolios, etc.). Same format restrictions apply.","default":[]},"language":{"type":"string","enum":["german","english"],"title":"Language","description":"**Document language** for optimal parsing accuracy. Supported: german, english.","default":"german"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"**Optional idempotency key** to prevent duplicate job creation. Use the same key for identical requests."}},"type":"object","required":["cv"],"title":"Body_create_parse_job"},"CreatePdfError":{"properties":{"message":{"type":"string","title":"Message"}},"type":"object","required":["message"],"title":"CreatePdfError","description":"Error response from ``POST /ats/create-pdf``."},"CreatePdfRequest":{"properties":{"userId":{"type":"integer","title":"Userid","description":"Consultant ID in the ATS"},"applicantIds":{"items":{"type":"integer"},"type":"array","minItems":1,"title":"Applicantids","description":"Applicant IDs in the ATS"},"projectId":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Projectid","description":"Project/job ID in the ATS; null = no job post"},"projectApplicantStatusId":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Projectapplicantstatusid","description":"Status to write back after PDF generation; null = skip"},"applicantDocumentTypeId":{"type":"integer","exclusiveMinimum":0.0,"title":"Applicantdocumenttypeid","description":"Document type for the uploaded PDF"}},"additionalProperties":false,"type":"object","required":["userId","applicantIds","applicantDocumentTypeId"],"title":"CreatePdfRequest","description":"Request body for ``POST /ats/create-pdf``."},"CreatePdfResponse":{"properties":{"redirectUrl":{"type":"string","title":"Redirecturl","description":"URL of the newly created project in the TalentKiwi UI"}},"type":"object","required":["redirectUrl"],"title":"CreatePdfResponse","description":"Successful response from ``POST /ats/create-pdf``."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"JobCreationResponse":{"properties":{"job_id":{"type":"string","title":"Job Id","description":"The unique identifier for the job."},"status_url":{"type":"string","title":"Status Url","description":"URL to check the status of the job."},"result_url":{"type":"string","title":"Result Url","description":"URL to retrieve the results of the job."}},"type":"object","required":["job_id","status_url","result_url"],"title":"JobCreationResponse","description":"Response model when a new parsing job is created asynchronously."},"JobStatusResponse":{"properties":{"job_id":{"type":"string","title":"Job Id","description":"The unique identifier for the job."},"status":{"type":"string","title":"Status","description":"The current status of the job (e.g., pending, completed, failed)."}},"type":"object","required":["job_id","status"],"title":"JobStatusResponse","description":"Response model for the job status endpoint."},"MessageResponse":{"properties":{"detail":{"type":"string","title":"Detail","description":"A brief description of the message or error."}},"type":"object","required":["detail"],"title":"MessageResponse","description":"Generic response model for messages or errors."},"ParsingResultResponse":{"properties":{"data":{"additionalProperties":true,"type":"object","title":"Data","description":"The parsed data from the file, represented as a list of records."},"status_code":{"type":"integer","title":"Status Code","description":"The status code of the response."},"execution_time":{"type":"number","title":"Execution Time","description":"The number of seconds the Core parsing logic took to execute."}},"type":"object","required":["data","status_code"],"title":"ParsingResultResponse","description":"Response model for a completed parsing job result."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"API Key Authentication":{"type":"apiKey","description":"\n    Enter your secret API key to authorise requests.\n\n    You can obtain your key by contacting us: gian@dionitech.com\n\n    **Example**: `sk_live_12345abcde...`\n    ","in":"header","name":"X-API-KEY"},"Shared Secret Authentication":{"type":"apiKey","description":"ATS shared secret for customer identification.","in":"header","name":"X-Shared-Secret"}}}}