{"openapi":"3.0.3","info":{"title":"Madita Public API","version":"1.0.0","description":"Programmatic access to your Madita organization: manage jobs and candidates, create and send interview invites, and read interview state and evaluations.\n\n**New here?** Step-by-step integration guides (quick start, authentication, polling, PII handling) live at [/guides](/guides). This reference is the exhaustive, always-current endpoint and field contract.\n\n**Authentication.** Every request needs a per-organization API key, sent as the `x-api-key` header (or `Authorization: Bearer <key>`). Keys are issued manually - email support@madita.ai to request one.\n\n**Rate limiting.** Each key has its own rate limit; exceeding it returns `429` with a `Retry-After` header.\n\n**Pagination.** List endpoints are keyset-paginated: pass `limit` and the `meta.nextCursor` from the previous response as `cursor`.\n\n**Webhooks** (outbound event delivery) are planned for a future version; v1 is REST + polling."},"servers":[{"url":"https://api.staging.madita.ai","description":"Staging"}],"tags":[{"name":"Jobs"},{"name":"Candidates"},{"name":"Interviews"},{"name":"Evaluations"}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"Per-organization API key. Email support@madita.ai to request one - keys are issued manually and scoped to a single organization."},"BearerAuth":{"type":"http","scheme":"bearer","description":"Alternatively pass the same API key as `Authorization: Bearer <key>`."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"nullable":true}},"required":["code","message"]},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["error","meta"]},"ResponseMeta":{"type":"object","properties":{"requestId":{"type":"string"},"nextCursor":{"type":"string","nullable":true}},"required":["requestId"]},"Job":{"type":"object","properties":{"id":{"type":"string","description":"Madita's ID for this job. Use it in later requests (candidates, invites) to reference this job."},"status":{"type":"string","enum":["draft","active","paused","closed"],"description":"Where the job is in its lifecycle: `draft` (not yet interviewing), `active` (live, accepting interviews), `paused`, or `closed`."},"title":{"type":"string","description":"The job title, shown to candidates and used by the interviewer. Required on create."},"description":{"type":"string","nullable":true,"description":"The job description text, used to generate suggested competencies and questions when the job is created in the dashboard."},"location":{"type":"string","nullable":true,"description":"Where the role is based, free text (for example a city, or \"Remote\")."},"interviewLanguage":{"type":"string","enum":["de","en"],"description":"Language the interview is conducted in."},"analysisLanguage":{"type":"string","nullable":true,"enum":["de","en",null],"description":"Language the evaluation output is written in."},"formality":{"type":"string","nullable":true,"enum":["du","sie",null],"description":"German formality register (`du` or `sie`)."},"tone":{"type":"string","nullable":true,"enum":["formal","neutral","casual",null],"description":"The interviewer's tone of voice during the interview."},"interviewStyle":{"type":"string","nullable":true,"enum":["concise","balanced","deep",null],"description":"Controls interview depth and length."},"externalReferenceId":{"type":"string","nullable":true,"description":"Your own job identifier (free text). Set it on create/update and use it to match a Madita job back to your system. Stored and returned, but not currently usable as a query filter."},"competencies":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"tier":{"type":"string","nullable":true,"enum":["essential","important","optional",null]},"covered":{"type":"boolean","nullable":true}},"required":["id","name","description","tier","covered"]},"description":"What the interview scores against. Each item has `name`, `description`, `tier` (`essential`/`important`/`optional`), and `covered`. Sent verbatim on create; the API does not auto-generate competencies from the description."},"hardFacts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"description":{"type":"string","nullable":true},"covered":{"type":"boolean"}},"required":["id","label","description","covered"]},"description":"Pass/fail criteria (for example work permit, driver's license)."},"knowledgeItems":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"body":{"type":"string"}},"required":["id","title","body"]},"description":"Background information the interviewer can reference."},"forbiddenTopics":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"body":{"type":"string"}},"required":["id","title","body"]},"description":"Topics the interviewer must not raise."},"generationStatus":{"type":"string","enum":["idle","generating","done","error"],"description":"State of the optional LLM config generation (see `generateFromDescription` on create). `idle` for a normally-created job; `generating` while extraction runs; `done` when it has filled the job; `error` if it failed. Poll this field after creating a job with `generateFromDescription: true`."},"generationStage":{"type":"string","nullable":true,"description":"Fine-grained progress within `generating` (for example `preparing`, `calling_llm`, `saving`, `done`). Null when no generation has run."},"createdAt":{"type":"string","description":"When the job was created (ISO 8601)."},"updatedAt":{"type":"string","description":"When the job was last updated (ISO 8601)."},"activatedAt":{"type":"string","nullable":true,"description":"When the job moved to `active` status (ISO 8601). Null until then."}},"required":["id","status","title","description","location","interviewLanguage","analysisLanguage","formality","tone","interviewStyle","externalReferenceId","competencies","hardFacts","knowledgeItems","forbiddenTopics","generationStatus","generationStage","createdAt","updatedAt","activatedAt"]},"Candidate":{"type":"object","properties":{"id":{"type":"string","description":"Madita's ID for this candidate. Use it in later requests (invite, decision)."},"jobId":{"type":"string","description":"The job this candidate is applying to."},"firstName":{"type":"string","description":"The candidate's first name. Required on create."},"lastName":{"type":"string","nullable":true,"description":"The candidate's last name, if provided."},"email":{"type":"string","nullable":true,"description":"The candidate's email address."},"phone":{"type":"string","nullable":true,"description":"The candidate's phone number."},"preferredLocale":{"type":"string","nullable":true,"enum":["de","en",null],"description":"Language the candidate prefers for their interview and communications."},"status":{"type":"string","enum":["new","link_generated","declined","descoped","interview_started","interview_completed","reviewed","decided","anonymized"],"description":"Where the candidate is in the Madita pipeline. `new` (created, no link yet), `link_generated` (interview invite minted), `declined` (candidate opted out of the AI interview), `interview_started`, `interview_completed`, `reviewed` (a recruiter has looked at the result), `decided` (a hiring decision was recorded), `anonymized` (PII removed for data retention)."},"overallScore":{"type":"number","nullable":true,"description":"The candidate's overall interview score, once evaluated. Null until then."},"currentJobTitle":{"type":"string","nullable":true,"description":"The candidate's current role, if known."},"currentLocation":{"type":"string","nullable":true,"description":"The candidate's current location, if known."},"documentUrl":{"type":"string","nullable":true,"description":"Link to the candidate's uploaded CV file."},"externalReferenceId":{"type":"string","nullable":true,"description":"Your own candidate/application identifier (free text, unique per organization). Set it on create and use it to match a Madita candidate back to your system. Stored and returned, but not currently usable as a query filter."},"cvParsingStatus":{"type":"string","nullable":true,"enum":["pending","completed","failed",null],"description":"Progress of parsing the uploaded CV: `pending`, `completed`, or `failed`."},"declineReason":{"type":"string","nullable":true,"description":"Why the candidate opted out of the interview, if they declined."},"declinedAt":{"type":"string","nullable":true,"description":"When the candidate declined the interview (ISO 8601), if they did."},"cvFullMarkdown":{"type":"string","nullable":true,"description":"The full parsed CV text. Returned ONLY on `GET /v1/candidates/{candidateId}`, never in list responses, because it is sensitive. Treat it as PII and do not log full candidate responses."},"createdAt":{"type":"string","description":"When the candidate was created (ISO 8601)."},"updatedAt":{"type":"string","description":"When the candidate was last updated (ISO 8601)."}},"required":["id","jobId","firstName","lastName","email","phone","preferredLocale","status","overallScore","currentJobTitle","currentLocation","documentUrl","externalReferenceId","cvParsingStatus","declineReason","declinedAt","createdAt","updatedAt"]},"Interview":{"type":"object","properties":{"id":{"type":"string","description":"Madita's ID for this interview session."},"candidateId":{"type":"string","description":"The candidate this interview belongs to."},"jobId":{"type":"string","description":"The job this interview belongs to."},"state":{"type":"string","description":"Where the interview is in its lifecycle: `pending`, `starting`, `active`, `paused`, `reconnecting`, `ending`, `ended`, then `postprocess_enqueued`, `postprocess_processing`, `postprocess_completed`, `postprocess_failed`. Terminal (the interview is over) means `ended` or any `postprocess_*` value; when polling whether the interview is done, treat those as terminal, then poll the evaluation."},"isActive":{"type":"boolean","description":"Whether the interview is currently in progress."},"kind":{"type":"string","enum":["real"],"description":"Always `real` for the public API. Internal test interviews are not exposed here."},"languageCode":{"type":"string","nullable":true,"description":"The language the interview was conducted in."},"startedAt":{"type":"string","nullable":true,"description":"When the interview started (ISO 8601). Null until it starts."},"endedAt":{"type":"string","nullable":true,"description":"When the interview ended (ISO 8601). Null until it ends."},"outcome":{"type":"string","nullable":true,"enum":["completed","ended_early","abandoned","no_response","minimal_response","technical_failure",null],"description":"How the interview ended, classified once at session end (null until then). `completed`, `ended_early`, `abandoned`, `no_response`, `minimal_response`, `technical_failure`. Use `state` (not `outcome`) to decide whether the interview is done; `outcome` answers how it ended."},"durationSeconds":{"type":"number","nullable":true,"description":"Interview length in seconds, computed from startedAt/endedAt. Null until the interview ends."},"createdAt":{"type":"string","description":"When this interview record was created (ISO 8601; may be earlier than startedAt)."}},"required":["id","candidateId","jobId","state","isActive","kind","languageCode","startedAt","endedAt","outcome","durationSeconds","createdAt"]},"Transcript":{"type":"object","properties":{"interviewId":{"type":"string","description":"The interview this transcript belongs to."},"source":{"type":"string","enum":["live","post_hoc"],"description":"Whether this is the live-session transcript or the post-processed (re-aligned) one. Madita prefers `post_hoc` once it is available, otherwise returns `live`."},"turns":{"type":"array","items":{"type":"object","properties":{"speaker":{"type":"string","enum":["candidate","agent"],"description":"Who said this turn."},"turnIndex":{"type":"number","description":"Order of this turn within the transcript, starting at 0."},"text":{"type":"string","description":"What was said."},"startMs":{"type":"number","nullable":true,"description":"Turn start position in the audio, in milliseconds from the start of the interview."},"endMs":{"type":"number","nullable":true,"description":"Turn end position in the audio, in milliseconds from the start of the interview."}},"required":["speaker","turnIndex","text","startMs","endMs"]},"description":"The ordered list of transcript turns."}},"required":["interviewId","source","turns"]},"EvidenceStatement":{"type":"object","properties":{"text":{"type":"string"},"timestamp":{"type":"string","description":"Position in the interview audio as \"MM:SS\"."},"relatedCompetency":{"type":"string"},"hasDetailLink":{"type":"string","enum":["language","integrity"]},"confidence":{"type":"string","enum":["high","limited","thin"]},"confidenceNote":{"type":"string"}},"required":["text"]},"EvidenceRef":{"type":"object","properties":{"label":{"type":"string"},"timestamp":{"type":"string","description":"Position in the interview audio as \"MM:SS\"."}},"required":["label","timestamp"]},"CompetencyAssessment":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"weight":{"type":"string","enum":["essential","important","optional"]},"score":{"type":"integer","nullable":true,"minimum":1,"maximum":5,"description":"1-5, or null if the competency was not covered in the interview."},"confidence":{"type":"string","enum":["high","limited","thin"]},"confidenceNote":{"type":"string"},"summary":{"type":"string"},"detail":{"type":"string"},"evidence":{"type":"array","items":{"type":"object","properties":{"quote":{"type":"string"},"timestamp":{"type":"string","description":"Position in the interview audio as \"MM:SS\"."}},"required":["quote","timestamp"]}}},"required":["id","name","weight","score","confidence","summary","detail","evidence"]},"QualificationFact":{"type":"object","properties":{"id":{"type":"string"},"fact":{"type":"string"},"requirement":{"type":"string"},"status":{"type":"string","enum":["fits","warning","fails"]},"statements":{"type":"array","items":{"$ref":"#/components/schemas/EvidenceStatement"}}},"required":["id","fact","status","statements"]},"TalentFlag":{"type":"object","properties":{"id":{"type":"string"},"category":{"type":"string","enum":["strength","concern","observation","unknown"]},"headline":{"type":"string"},"statements":{"type":"array","items":{"$ref":"#/components/schemas/EvidenceStatement"}}},"required":["id","category","headline","statements"]},"CandidateQuestion":{"type":"object","properties":{"id":{"type":"string"},"question":{"type":"string"},"timestamp":{"type":"string","description":"Position in the interview audio as \"MM:SS\"."},"coverage":{"type":"string","enum":["full","partial","none"]},"answer":{"type":"string"},"answerNote":{"type":"string"}},"required":["id","question","timestamp","coverage","answer"]},"AudioMarker":{"type":"object","properties":{"timestamp":{"type":"string","description":"Position in the interview audio as \"MM:SS\"."},"label":{"type":"string"},"kind":{"type":"string","enum":["highlight","warning"]}},"required":["timestamp","label","kind"]},"Evaluation":{"type":"object","properties":{"id":{"type":"string","description":"Madita's ID for this evaluation."},"sessionId":{"type":"string","description":"The interview session this evaluation is for."},"candidateId":{"type":"string","description":"The candidate this evaluation belongs to."},"jobId":{"type":"string","description":"The job this evaluation belongs to."},"status":{"type":"string","description":"Where the evaluation is in processing: `pending_enqueue`, `queued`, `running`, `complete`, `partial` (finished, but some sections are missing), `retryable`, `dead_lettered`, or `failed`. Poll until `complete` (or `partial`); `failed` and `dead_lettered` are terminal error states, so stop polling on either."},"outputLanguage":{"type":"string","description":"The language the evaluation output (summary, etc.) is written in."},"summaryMarkdown":{"type":"string","nullable":true,"description":"Human-readable summary of the evaluation. Null until the evaluation is complete."},"languageLevel":{"type":"string","nullable":true,"description":"CEFR estimate of the candidate's spoken language level (A1-C2). Null until the evaluation is complete."},"assistanceRisk":{"type":"string","nullable":true,"enum":["low","medium","high",null],"description":"Likelihood that the candidate used unauthorized assistance (for example, reading answers from an AI tool) during the interview. Read the scale carefully: it measures assistance risk, so it runs opposite to integrity. `low` = low likelihood of assistance, so interview integrity is high (no meaningful concerns); `medium` = some indicators of possible assistance, so integrity is uncertain; `high` = strong indicators of assistance, so integrity is low (review before trusting the result). Null until the evaluation is complete."},"hasFailingKnockout":{"type":"boolean","nullable":true,"description":"Whether the candidate failed a hard-fact/knockout criterion. Null until the evaluation is complete."},"overallConfidence":{"type":"string","nullable":true,"description":"How much the interview gave the model to judge on: `high`, `limited`, or `thin`. Null until the evaluation is complete."},"assessment":{"type":"object","nullable":true,"properties":{"qualificationFacts":{"type":"array","items":{"$ref":"#/components/schemas/QualificationFact"},"description":"Pass/fail on each hard-fact/knockout criterion."},"findings":{"type":"object","properties":{"strengths":{"type":"array","items":{"$ref":"#/components/schemas/TalentFlag"}},"concerns":{"type":"array","items":{"$ref":"#/components/schemas/TalentFlag"}},"observations":{"type":"array","items":{"$ref":"#/components/schemas/TalentFlag"}},"unknowns":{"type":"array","items":{"$ref":"#/components/schemas/TalentFlag"}}},"required":["strengths","concerns","observations","unknowns"],"description":"Talent findings, bucketed by category."},"competencies":{"type":"array","items":{"$ref":"#/components/schemas/CompetencyAssessment"},"description":"Per-competency score + evidence - what the interview scored against."},"candidateQuestions":{"type":"array","items":{"$ref":"#/components/schemas/CandidateQuestion"},"description":"Questions the candidate asked, and how the interviewer answered."},"audioMarkers":{"type":"array","items":{"$ref":"#/components/schemas/AudioMarker"},"description":"Timestamps worth listening to directly."},"summaryMarkdown":{"type":"string","description":"Human-readable overall summary."}},"required":["qualificationFacts","findings","competencies","candidateQuestions","audioMarkers","summaryMarkdown"],"description":"Scored assessment (Call 1). Shape owned by the evaluation service; may gain optional fields within v1. Null until the evaluation completes."},"language":{"type":"object","nullable":true,"properties":{"level":{"type":"string","enum":["A1","A2","B1","B2","C1","C2"],"description":"Assessed CEFR level."},"required":{"type":"string","nullable":true,"enum":["A1","A2","B1","B2","C1","C2",null],"description":"The job's required level, if one was set."},"confidence":{"type":"string","enum":["high","limited","thin"],"description":"How confident the assessment is."},"confidenceNote":{"type":"string","description":"Why confidence is limited, if applicable."},"summary":{"type":"string","description":"Overall language assessment."},"methodology":{"type":"string","description":"How the assessment was derived."},"findings":{"type":"array","items":{"type":"string"},"description":"Specific observations."},"samples":{"type":"array","items":{"$ref":"#/components/schemas/EvidenceRef"},"description":"Supporting quotes: `{label, timestamp}`."}},"required":["level","required","confidence","summary","methodology","findings","samples"],"description":"Language-proficiency assessment (Call 2). Null until the evaluation completes."},"integrity":{"type":"object","nullable":true,"properties":{"status":{"type":"string","enum":["low","medium","high"],"description":"The same value as the top-level `assistanceRisk`: `low` = few concerns (good), `high` = red flag."},"label":{"type":"string","description":"Short human-readable label."},"confidence":{"type":"string","enum":["high","limited","thin"],"description":"How confident the assessment is."},"confidenceNote":{"type":"string"},"summary":{"type":"string","description":"Overall integrity assessment."},"analyzed":{"type":"array","items":{"type":"string"},"description":"What was checked."},"findings":{"type":"array","items":{"type":"string"},"description":"What was found, if anything."},"flaggedMoments":{"type":"array","items":{"$ref":"#/components/schemas/EvidenceRef"},"description":"Specific moments of concern: `{label, timestamp}`."}},"required":["status","label","confidence","summary","analyzed","findings","flaggedMoments"],"description":"Assistance-detection assessment (Call 3). Null until the evaluation completes."},"createdAt":{"type":"string","description":"When this evaluation record was created."},"completedAt":{"type":"string","nullable":true,"description":"When the evaluation finished processing. Null until then."}},"required":["id","sessionId","candidateId","jobId","status","outputLanguage","summaryMarkdown","languageLevel","assistanceRisk","hasFailingKnockout","overallConfidence","assessment","language","integrity","createdAt","completedAt"]},"InviteResult":{"type":"object","properties":{"candidateId":{"type":"string","description":"The candidate the invite link is for."},"interviewId":{"type":"string","description":"The interview the link points at. Use it to poll `GET /v1/interviews/{interviewId}`."},"interviewUrl":{"type":"string","description":"The interview link. Deliver it to the candidate yourself (email/SMS); this endpoint does not send it."},"token":{"type":"string","description":"The one-time interview token embedded in `interviewUrl`."},"reused":{"type":"boolean","description":"Whether an existing usable link was reused (`true`) rather than a fresh one minted (`false`)."}},"required":["candidateId","interviewId","interviewUrl","token","reused"]},"SendInviteResult":{"type":"object","properties":{"candidateId":{"type":"string","description":"The candidate the invite was sent to."},"interviewId":{"type":"string","description":"The interview the link points at. Use it to poll `GET /v1/interviews/{interviewId}`."},"interviewUrl":{"type":"string","description":"The interview link that was delivered."},"token":{"type":"string","description":"The one-time interview token embedded in `interviewUrl`."},"reused":{"type":"boolean","description":"Whether an existing usable link was reused (`true`) rather than a fresh one minted (`false`)."},"channels":{"type":"array","items":{"type":"string"},"description":"The channels the invite was queued on (e.g. `email`, `whatsapp`)."},"heldUntil":{"type":"string","nullable":true,"description":"ISO timestamp the send is held until (quiet-hours window), or null to send immediately."}},"required":["candidateId","interviewId","interviewUrl","token","reused","channels","heldUntil"]},"DecisionResult":{"type":"object","properties":{"id":{"type":"string","description":"Madita's ID for this recorded decision."},"candidateId":{"type":"string","description":"The candidate the decision is for."},"decision":{"type":"string","enum":["forwarded","rejected","on-hold"],"description":"The recruiter's hiring decision: `forwarded`, `rejected`, or `on-hold`."},"score":{"type":"number","nullable":true,"description":"The 1-4 suitability rating recorded with the decision (1 = strong no, 4 = strong yes). Null if not provided."},"createdAt":{"type":"string","description":"When the decision was recorded (ISO 8601)."}},"required":["id","candidateId","decision","score","createdAt"]},"JobResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Job"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data","meta"]},"CandidateResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Candidate"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data","meta"]},"InterviewResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Interview"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data","meta"]},"TranscriptResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Transcript"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data","meta"]},"EvaluationResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Evaluation"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data","meta"]},"InviteResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/InviteResult"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data","meta"]},"SendInviteResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SendInviteResult"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data","meta"]},"DecisionResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DecisionResult"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data","meta"]},"JobListResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Job"}},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data","meta"]},"CandidateListResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Candidate"}},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data","meta"]},"InterviewListResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Interview"}},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data","meta"]},"EvaluationListResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Evaluation"}},"meta":{"$ref":"#/components/schemas/ResponseMeta"}},"required":["data","meta"]}},"parameters":{}},"paths":{"/v1/jobs":{"get":{"summary":"List jobs","tags":["Jobs"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"description":"Page size (max 100, default 25)."},"required":false,"description":"Page size (max 100, default 25).","name":"limit","in":"query"},{"schema":{"type":"string","description":"Opaque keyset cursor from a prior response's meta.nextCursor."},"required":false,"description":"Opaque keyset cursor from a prior response's meta.nextCursor.","name":"cursor","in":"query"}],"responses":{"200":{"description":"A page of jobs","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobListResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Create a job","tags":["Jobs"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":300},"description":{"type":"string"},"location":{"type":"string","maxLength":300},"status":{"type":"string","enum":["draft","active","paused","closed"]},"interviewLanguage":{"type":"string","enum":["de","en"]},"analysisLanguage":{"type":"string","enum":["de","en"]},"formality":{"type":"string","enum":["du","sie"]},"tone":{"type":"string","enum":["formal","neutral","casual"]},"interviewStyle":{"type":"string","enum":["concise","balanced","deep"]},"externalReferenceId":{"type":"string","maxLength":255},"competencies":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1},"description":{"type":"string","default":""},"tier":{"type":"string","enum":["essential","important","optional"]},"covered":{"type":"boolean"}},"required":["name"]}},"hardFacts":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"description":{"type":"string"},"covered":{"type":"boolean","default":true}},"required":["label"]}},"knowledgeItems":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string","minLength":1},"body":{"type":"string","minLength":1}},"required":["title","body"]}},"forbiddenTopics":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string","minLength":1},"body":{"type":"string","minLength":1}},"required":["title","body"]}},"generateFromDescription":{"type":"boolean","description":"When true, Madita runs the same LLM extraction the dashboard uses to fill the job config from `description`. It only fills the generatable fields you did NOT provide (competencies, hardFacts, knowledgeItems, forbiddenTopics, interviewLanguage, formality, tone, interviewStyle) - any field you send explicitly is kept as-is. Requires a `description` of at least 100 characters. The job is created immediately with `generationStatus: \"generating\"`; poll `GET /v1/jobs/{jobId}` until `generationStatus` is `done` (or `error`)."}},"required":["title"]}}}},"responses":{"201":{"description":"Created job","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/jobs/{jobId}":{"get":{"summary":"Get a job","tags":["Jobs"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"job_9f2a1c"},"required":true,"description":"The job's id.","name":"jobId","in":"path"}],"responses":{"200":{"description":"A job","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"summary":"Update a job","tags":["Jobs"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"job_9f2a1c"},"required":true,"description":"The job's id.","name":"jobId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":300},"description":{"type":"string"},"location":{"type":"string","maxLength":300},"status":{"type":"string","enum":["draft","active","paused","closed"]},"interviewLanguage":{"type":"string","enum":["de","en"]},"analysisLanguage":{"type":"string","enum":["de","en"]},"formality":{"type":"string","enum":["du","sie"]},"tone":{"type":"string","enum":["formal","neutral","casual"]},"interviewStyle":{"type":"string","enum":["concise","balanced","deep"]},"externalReferenceId":{"type":"string","maxLength":255},"competencies":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1},"description":{"type":"string","default":""},"tier":{"type":"string","enum":["essential","important","optional"]},"covered":{"type":"boolean"}},"required":["name"]}},"hardFacts":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"description":{"type":"string"},"covered":{"type":"boolean","default":true}},"required":["label"]}},"knowledgeItems":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string","minLength":1},"body":{"type":"string","minLength":1}},"required":["title","body"]}},"forbiddenTopics":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string","minLength":1},"body":{"type":"string","minLength":1}},"required":["title","body"]}}}}}}},"responses":{"200":{"description":"Updated job","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/candidates":{"get":{"summary":"List candidates","tags":["Candidates"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"description":"Page size (max 100, default 25)."},"required":false,"description":"Page size (max 100, default 25).","name":"limit","in":"query"},{"schema":{"type":"string","description":"Opaque keyset cursor from a prior response's meta.nextCursor."},"required":false,"description":"Opaque keyset cursor from a prior response's meta.nextCursor.","name":"cursor","in":"query"},{"schema":{"type":"string"},"required":false,"name":"jobId","in":"query"},{"schema":{"type":"string"},"required":false,"name":"status","in":"query"}],"responses":{"200":{"description":"A page of candidates","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidateListResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Create a candidate","tags":["Candidates"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"jobId":{"type":"string","minLength":1},"firstName":{"type":"string","minLength":1,"maxLength":200},"lastName":{"type":"string","maxLength":200},"email":{"type":"string","format":"email"},"phone":{"type":"string","maxLength":40},"preferredLocale":{"type":"string","enum":["de","en"]},"currentJobTitle":{"type":"string","maxLength":300},"currentLocation":{"type":"string","maxLength":300},"documentUrl":{"type":"string","format":"uri"},"cvFullMarkdown":{"type":"string"},"externalReferenceId":{"type":"string","maxLength":255}},"required":["jobId","firstName"]}}}},"responses":{"201":{"description":"Created candidate","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidateResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/candidates/{candidateId}":{"get":{"summary":"Get a candidate","tags":["Candidates"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"cand_7b3e21"},"required":true,"description":"The candidate's id.","name":"candidateId","in":"path"}],"responses":{"200":{"description":"A candidate","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidateResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"summary":"Update a candidate","tags":["Candidates"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"cand_7b3e21"},"required":true,"description":"The candidate's id.","name":"candidateId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"firstName":{"type":"string","minLength":1,"maxLength":200},"lastName":{"type":"string","maxLength":200},"email":{"type":"string","format":"email"},"phone":{"type":"string","maxLength":40},"preferredLocale":{"type":"string","enum":["de","en"]},"currentJobTitle":{"type":"string","maxLength":300},"currentLocation":{"type":"string","maxLength":300}}}}}},"responses":{"200":{"description":"Updated candidate","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidateResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/candidates/{candidateId}/invite":{"post":{"summary":"Create an interview invite link","tags":["Interviews"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"cand_7b3e21"},"required":true,"description":"The candidate's id.","name":"candidateId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"ttlDays":{"type":"integer","minimum":1,"maximum":60},"regenerate":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Existing link reused","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteResponse"}}}},"201":{"description":"New interview link","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"An interview is in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/candidates/{candidateId}/invite/send":{"post":{"summary":"Send an interview invite","tags":["Interviews"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"cand_7b3e21"},"required":true,"description":"The candidate's id.","name":"candidateId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"ttlDays":{"type":"integer","minimum":1,"maximum":60},"resend":{"type":"boolean"},"regenerate":{"type":"boolean"}}}}}},"responses":{"202":{"description":"Invite queued for delivery","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendInviteResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"invite_already_sent, delivery_not_owned, job_not_active, candidate_not_eligible, or interview_in_progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"candidate_unreachable or not_deliverable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/candidates/{candidateId}/decision":{"post":{"summary":"Record a recruiter decision","tags":["Candidates"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"cand_7b3e21"},"required":true,"description":"The candidate's id.","name":"candidateId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"decision":{"type":"string","enum":["forwarded","rejected","on-hold"]},"score":{"type":"integer","minimum":1,"maximum":4},"sessionId":{"type":"string"},"forwardReason":{"type":"string"},"rejectCategory":{"type":"string","enum":["no-fit","conditions-not-met","other"]},"rejectReasonText":{"type":"string"},"rejectSubReasons":{"type":"array","items":{"type":"string"}}},"required":["decision"]}}}},"responses":{"201":{"description":"Recorded decision","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DecisionResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/candidates/{candidateId}/decline":{"post":{"summary":"Record a candidate decline","tags":["Candidates"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"cand_7b3e21"},"required":true,"description":"The candidate's id.","name":"candidateId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string","enum":["prefer_human","withdraw_application"]}},"required":["reason"]}}}},"responses":{"200":{"description":"Declined candidate","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidateResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"candidate_not_eligible (not in 'new' or 'link_generated' state)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/interviews":{"get":{"summary":"List interviews","tags":["Interviews"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"description":"Page size (max 100, default 25)."},"required":false,"description":"Page size (max 100, default 25).","name":"limit","in":"query"},{"schema":{"type":"string","description":"Opaque keyset cursor from a prior response's meta.nextCursor."},"required":false,"description":"Opaque keyset cursor from a prior response's meta.nextCursor.","name":"cursor","in":"query"},{"schema":{"type":"string"},"required":false,"name":"candidateId","in":"query"},{"schema":{"type":"string"},"required":false,"name":"jobId","in":"query"}],"responses":{"200":{"description":"A page of interviews","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewListResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/interviews/{interviewId}":{"get":{"summary":"Get an interview","tags":["Interviews"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"int_9a3f2c"},"required":true,"description":"The interview's id - the `interviewId` returned by the invite and send endpoints (equivalently the `sessionId` used by evaluations and decisions).","name":"interviewId","in":"path"}],"responses":{"200":{"description":"An interview","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/interviews/{interviewId}/transcript":{"get":{"summary":"Get an interview transcript","tags":["Interviews"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"int_9a3f2c"},"required":true,"description":"The interview's id - the `interviewId` returned by the invite and send endpoints (equivalently the `sessionId` used by evaluations and decisions).","name":"interviewId","in":"path"}],"responses":{"200":{"description":"Transcript","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/evaluations":{"get":{"summary":"List evaluations","tags":["Evaluations"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"description":"Page size (max 100, default 25)."},"required":false,"description":"Page size (max 100, default 25).","name":"limit","in":"query"},{"schema":{"type":"string","description":"Opaque keyset cursor from a prior response's meta.nextCursor."},"required":false,"description":"Opaque keyset cursor from a prior response's meta.nextCursor.","name":"cursor","in":"query"},{"schema":{"type":"string"},"required":false,"name":"candidateId","in":"query"},{"schema":{"type":"string"},"required":false,"name":"sessionId","in":"query"},{"schema":{"type":"string"},"required":false,"name":"jobId","in":"query"}],"responses":{"200":{"description":"A page of evaluations","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationListResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/evaluations/{evaluationId}":{"get":{"summary":"Get an evaluation","tags":["Evaluations"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"eval_4c8d1a"},"required":true,"description":"The evaluation's id.","name":"evaluationId","in":"path"}],"responses":{"200":{"description":"An evaluation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/evaluations/{evaluationId}/pdf":{"get":{"summary":"Download the evaluation PDF","tags":["Evaluations"],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"description":"Returns the rendered evaluation report as a PDF document - the same report a recruiter sees in the Madita dashboard. The response body is the PDF itself (`application/pdf`), not a link, so you can stream it straight to disk or forward it to your ATS. Returns `409 evaluation_not_ready` while the evaluation is still processing; poll `GET /v1/evaluations/{evaluationId}` until `status` is `complete` or `partial`.","parameters":[{"schema":{"type":"string","example":"eval_4c8d1a"},"required":true,"description":"The evaluation's id.","name":"evaluationId","in":"path"}],"responses":{"200":{"description":"The evaluation report as a PDF document","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The evaluation is not finished yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}