{"openapi":"3.1.0","info":{"title":"tview-Partner-API","version":"1.3.1","description":"Server-zu-Server-API zur Integration von tview-Recruitingabläufen in Partnerplattformen und Stellenbörsen.\n\n## Datenmodell\n\n- **Projekt** — der übergeordnete Recruitingcontainer. Erstellen Sie ein Projekt pro Rolle oder Einstellungsrunde, nicht pro Kandidat oder Screening.\n- **Pipeline-Schritte** — geordnete Phasen innerhalb eines Projekts. Persistierte API-Schrittwerte für `type` sind jetzt `screening`, `coding_task`, `video_interview`, `case_study`, `documents_upload` oder `custom`.\n- **Bewerbung** — der Weg eines Kandidaten durch ein Projekt.\n- **Schrittergebnis** — Status pro Bewerbung und Schritt: Antworten, Codeabgaben, Bewertungen und Aufzeichnungen.\n- **Interview-Trainingssitzung** — ein aus Projekt, Stellenangebot oder roher Anzeige erstelltes Übungsinterview für Kandidaten. Es gehört nur dann zur bewerteten Recruitingpipeline, wenn ein Partner es in seinen eigenen Ablauf einbindet.\n\n## Empfohlener Integrationsablauf\n\n1. Erstellen Sie für jede einzelne Rolle oder Einstellungsrunde ein Projekt.\n2. Konfigurieren Sie die Pipeline mit einem oder mehreren Schritten.\n3. Laden Sie Kandidaten in das Projekt ein. Jeder Kandidat erhält eine Bewerbung pro Projekt.\n4. Lassen Sie Kandidaten die Pipelineschritte absolvieren; Ergebnisse und Bewertungen erscheinen in den Schrittergebnissen.\n\nVermeiden Sie ein neues Projekt für jedes einzelne Screening — Screenings sind Pipelineschritte und keine eigenständigen Einheiten.\n\n## Pipeline-Schritttypen\n\n- `screening` — Fragebogen-/Screeningschritt. Fragen stehen in `config.questions` oder können pro Bewerbung über `/api/v1/applications/{id}/screening-compose` zusammengestellt werden.\n- `coding_task` — Programmier- oder technische Aufgabe. Der Haupttext steht meist in `config.challenge`; optionale Felder sind `config.language`, `config.difficulty` und `config.instructions`.\n- `video_interview` — Videointerview-Schritt. Fragen stehen in `config.questions`; `config.recordingEnabled=false` deaktiviert die Sitzungsaufzeichnung.\n- `case_study` — Fallstudien-Schritt. Verwenden Sie `config.brief` und optional `config.format` (`written`, `presentation` oder `both`).\n- `documents_upload` — Dokumenten-Upload-Schritt. Verwenden Sie `config.requiredDocuments`, `config.maxFileSizeMb`, `config.allowMultiple` und `config.acceptedFormats`.\n- `custom` — Erweiterungspunkt für nicht standardmäßige Schritte. Verwenden Sie `config.customType` für maschinenlesbares benutzerdefiniertes Verhalten.\n\nAbwärtskompatibilität: Nutzdaten mit der alten Darstellung `type: custom` und `config.subType: case_study` oder `config.subType: documents_upload` werden weiterhin akzeptiert und in die neuen eigenständigen Typen normalisiert.\n\n## Authentifizierung\n\nBearer-API-Schlüssel (`tv_live_*` / `tv_test_*`). Authentifizierte Antworten enthalten `X-Request-Id`, `X-Correlation-Id`, `X-RateLimit-Limit`, `X-RateLimit-Remaining` und `X-RateLimit-Reset`.\n\n## Idempotenz\n\nPOST `/api/v1/projects`, `/api/v1/projects/{id}/generate-pipeline`, `/api/v1/projects/{id}/candidates`, `/api/v1/projects/{id}/candidates/bulk`, `/api/v1/applications/{id}/evaluate`, `/api/v1/interview-training/sessions`, `/api/v1/interview-training/sessions/{id}/answers`, `/api/v1/interview-training/sessions/{id}/summary` und `/api/v1/webhooks/test` unterstützen den Header `Idempotency-Key`.\n\n## Partner-gehosteter Bewerbungsablauf\n\n- tokenisierte Bewerbungssitzungen ohne Registrierung oder Anmeldung des Kandidaten erstellen\n- Kandidatenprofile als vom Partner bereitgestellt markieren und die gehostete Profilerfassung überspringen\n- vom Partner bereitgestellte Einwilligung speichern\n- den Text der gehosteten Bewerbungsseite pro Bewerbung mit `applicationPage` anpassen\n- den gehosteten Ablauf optional in den einfachen shadcn-Whitelabel-Modus mit `hostedBranding` pro Bewerbung umschalten\n- `externalCandidateId` und öffentliche `metadata` in Bewerbungs-APIs und Webhooks zurückgeben\n\n## Screening-Zusammenstellung\n\n`POST /api/v1/applications/{id}/screening-compose` stellt manuelle und generierte Fragen pro Bewerbung zusammen. Verwenden Sie `stepId`, wenn eine Bewerbung mehr als einen Screening-Schritt enthält. Screening-Einreichungen speichern einen Fragen-Snapshot, damit spätere Änderungen die Historie nicht überschreiben.\n\n## Interviewtraining\n\n- Übungssitzungen aus einem Projekt, Stellenangebot oder rohen Anzeigentext erstellen\n- die nächste unbeantwortete Frage für eingebettete Kandidatenabläufe bereitstellen\n- Übungsantworten von Kandidaten absenden und Coaching-Feedback zurückgeben\n- einen abschließenden Bereitschaftsbericht für die konkrete Stellenanzeige erstellen\n\n## Nutzungsabhängige Endpunkte\n\n- `POST /api/v1/projects/{id}/generate-pipeline` → Generierungs-Credit\n- `POST /api/v1/applications/{id}/evaluate` → Screening-/Code-Bewertungs-Credit\n- `POST /api/v1/interview-training/sessions` → Generierungs-Credit, wenn die KI-Generierung erfolgreich ist\n- `POST /api/v1/interview-training/sessions/{id}/answers` → Screening-Bewertungs-Credit, wenn das KI-Feedback erfolgreich ist\n- `POST /api/v1/interview-training/sessions/{id}/summary` → Zusammenfassungs-Credit, wenn die KI-Zusammenfassung erfolgreich ist\n\n## Webhooks\n\nNutzdatenvertrag: `{ event, timestamp, data }` mit HMAC-SHA-256-Signatur in `X-Tview-Signature`.\n\nAvailable application and usage events: `application.created`, `application.started`, `application.completed`, `application.decided`, `application.stage_changed`, `screening.submitted`, `screening.evaluated`, `code.submitted`, `code.evaluated`, `interview.started`, `interview.completed`, `balance.low`, `balance.depleted`.\n\n`application.decided` is sent when a recruiter moves a candidate forward, rejects them, records a withdrawal or reopens the application. `data.decision` carries `type` (`advanced`, `rejected`, `withdrawn`, `reopened`), the resulting `status`, `reason` and `decidedAt`. Internal recruiter notes are never included.\n\n`application.stage_changed` is sent when a candidate moves between hiring stages (for example from AI screening to Interview). `data.stage` carries `from` and `to`, each with `id`, `kind` (`new`, `screening`, `interview`, `offer`, `hired`) and `name`.\n\n## Metadaten\n\n`metadata.__tview` ist für interne Verwendung reserviert und darf nicht von Partnern gesendet werden."},"servers":[{"url":"https://tview.work","description":"Produktions-API (primär)"},{"url":"https://jobs.tview.work","description":"Produktions-API (Kandidatenhost)"},{"url":"http://localhost:3000","description":"Lokale Entwicklung"}],"externalDocs":{"description":"Begleitdokumentation und Onboarding-Hinweise","url":"https://tview.work/docs"},"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Partner-API-Schlüssel im Format `tv_live_*` oder `tv_test_*`"}},"parameters":{"PageParam":{"name":"page","in":"query","schema":{"type":"integer","default":1,"minimum":1}},"LimitParam":{"name":"limit","in":"query","schema":{"type":"integer","default":20,"minimum":1,"maximum":100}},"ProjectId":{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},"ApplicationId":{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},"CandidateId":{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},"WebhookId":{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},"InterviewTrainingSessionId":{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","minLength":1,"maxLength":255}}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"VALIDATION_ERROR"},"message":{"type":"string","example":"Invalid request payload"},"details":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string","example":"title"},"message":{"type":"string","example":"Required"},"code":{"type":"string","example":"invalid_type"}}}}}}}},"PaginationMeta":{"type":"object","properties":{"total":{"type":"integer","example":42},"page":{"type":"integer","example":1},"limit":{"type":"integer","example":20}}},"Project":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"roleType":{"type":"string","nullable":true},"status":{"type":"string","enum":["draft","active","archived","closed"]},"isPublished":{"type":"boolean"},"defaultHostedBranding":{"$ref":"#/components/schemas/HostedBrandingResolved"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"ProjectReadiness":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["draft","active","archived","closed"]},"isPublished":{"type":"boolean"},"hasScreeningStep":{"type":"boolean"},"hasDefaultHostedBranding":{"type":"boolean"},"defaultHostedBranding":{"$ref":"#/components/schemas/HostedBrandingResolved"},"isWhitelabelActive":{"type":"boolean"},"effectiveHostedBranding":{"$ref":"#/components/schemas/HostedBrandingResolved"},"hasActiveJobOffer":{"type":"boolean"},"issues":{"type":"array","items":{"type":"string"}}}},"PipelineStep":{"type":"object","description":"Persistierter Recruiting-Pipeline-Schritt. `case_study` und `documents_upload` sind eigenständige Schritttypen. Die Legacy-Kombination `type: custom` mit `config.subType` wird weiterhin akzeptiert und normalisiert.","properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["screening","coding_task","video_interview","case_study","documents_upload","custom"]},"title":{"type":"string"},"order":{"type":"integer"},"config":{"type":"object","additionalProperties":true,"description":"Schrittspezifische Konfiguration. Bei video_interview ist recordingEnabled standardmäßig true; setzen Sie recordingEnabled=false, um die Sitzungsaufzeichnung zu deaktivieren.","properties":{"recordingEnabled":{"type":"boolean","default":true},"subType":{"type":"string","enum":["case_study","documents_upload"],"deprecated":true,"description":"Nur für Legacy-Kompatibilität. Bevorzugen Sie eigenständige Schritttypwerte."},"customType":{"type":"string","example":"manual_review"},"brief":{"type":"string","description":"Fallstudienaufgabe für type=case_study"},"format":{"type":"string","enum":["written","presentation","both"]},"requiredDocuments":{"type":"array","items":{"type":"string"},"description":"Erforderliche Dokumentnamen für type=documents_upload"},"maxFileSizeMb":{"type":"integer"},"allowMultiple":{"type":"boolean"},"acceptedFormats":{"type":"string","example":".pdf,.doc,.docx,.txt,.zip"},"questions":{"type":"array","items":{},"description":"Screening- oder Interviewfragen"},"challenge":{"type":"string","description":"Text der Programmieraufgabe"},"instructions":{"type":"string"},"durationMinutes":{"type":"integer"}}},"isRequired":{"type":"boolean"}}},"GeneratedPipelineStep":{"type":"object","description":"KI-generierter Pipeline-Knoten. `type` ist der persistierte API-/Datenbanktyp. `nodeType` spiegelt den generierten semantischen Knoten wider.","properties":{"type":{"type":"string","enum":["screening","coding_task","video_interview","case_study","documents_upload","custom"]},"nodeType":{"type":"string","enum":["screening","coding_task","video_interview","case_study","documents_upload","custom"]},"title":{"type":"string"},"description":{"type":"string"},"isRequired":{"type":"boolean"},"config":{"type":"object","additionalProperties":true}}},"CandidateInvite":{"type":"object","required":["email","firstName","lastName"],"properties":{"email":{"type":"string","format":"email"},"firstName":{"type":"string"},"lastName":{"type":"string"},"phone":{"type":"string"},"cvText":{"type":"string"},"cvUrl":{"type":"string","format":"uri"},"externalCandidateId":{"type":"string"},"metadata":{"type":"object","additionalProperties":true},"profileCollectionMode":{"type":"string","enum":["hosted","partner_provided"]},"partnerProvidedConsent":{"type":"object","additionalProperties":true,"properties":{"dataProcessing":{"type":"boolean"},"aiProcessing":{"type":"boolean"},"recording":{"type":"boolean"},"profileSharing":{"type":"boolean"},"source":{"type":"string"},"collectedAt":{"type":"string","format":"date-time"},"metadata":{"type":"object","additionalProperties":true}}},"profile":{"$ref":"#/components/schemas/CandidateProfileUpsert"},"applicationPage":{"$ref":"#/components/schemas/ApplicationPageInput"},"hostedBranding":{"$ref":"#/components/schemas/HostedBrandingInput"}}},"ApplicationPageInput":{"type":"object","description":"Überschreibungen des Seitentexts der gehosteten Bewerbung pro Bewerbung. Unterstützt Rohtext oder Vorlagen mit Variablen.","properties":{"locale":{"type":"string","enum":["en","pl"]},"title":{"type":"string"},"subtitle":{"type":"string"},"description":{"type":"string"},"profileNotice":{"type":"string"},"consentNotice":{"type":"string"},"ctaLabel":{"type":"string"},"titleTemplate":{"type":"string"},"subtitleTemplate":{"type":"string"},"descriptionTemplate":{"type":"string"},"profileNoticeTemplate":{"type":"string"},"consentNoticeTemplate":{"type":"string"},"variables":{"type":"object","additionalProperties":true},"labels":{"type":"object","properties":{"applicationHeader":{"type":"string"},"processHeader":{"type":"string"},"profileSectionTitle":{"type":"string"},"consentSectionTitle":{"type":"string"}}}}},"ApplicationPageResolved":{"type":"object","description":"Von Bewerbungs-APIs zurückgegebener aufgelöster Seitentext nach Anwendung von Vorlagen und Standardwerten.","properties":{"locale":{"type":"string","enum":["en","pl"]},"title":{"type":"string"},"subtitle":{"type":"string"},"description":{"type":"string"},"profileNotice":{"type":"string"},"consentNotice":{"type":"string"},"ctaLabel":{"type":"string"},"labels":{"type":"object","properties":{"applicationHeader":{"type":"string"},"processHeader":{"type":"string"},"profileSectionTitle":{"type":"string"},"consentSectionTitle":{"type":"string"}}}}},"HostedBrandingInput":{"type":"object","description":"Überschreibungen des gehosteten Brandings pro Bewerbung. Verwenden Sie `mode=whitelabel`, um den gehosteten Ablauf mit einer neutralen shadcn-ähnlichen Oberfläche und optionalem Partnerlogo bzw. optionalen Farben zu rendern.","properties":{"mode":{"type":"string","enum":["default","whitelabel"]},"logoUrl":{"type":"string","format":"uri"},"companyName":{"type":"string"},"primaryColor":{"type":"string","pattern":"^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"accentColor":{"type":"string","pattern":"^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"}}},"HostedBrandingResolved":{"type":"object","description":"Von Bewerbungs-APIs zurückgegebenes aufgelöstes Branding nach Anwendung von Standardwerten und Fallbacks.","properties":{"mode":{"type":"string","enum":["default","whitelabel"]},"logoUrl":{"type":"string","format":"uri","nullable":true},"companyName":{"type":"string","nullable":true},"primaryColor":{"type":"string","nullable":true},"accentColor":{"type":"string","nullable":true},"isWhitelabel":{"type":"boolean"}}},"ScreeningQuestionEntry":{"type":"object","description":"Ergebniszeile auf Fragenebene für Screenings in Bewerbungs-APIs und Screening-Webhooks.","properties":{"questionId":{"type":"string"},"source":{"type":"string","enum":["manual","generated"]},"externalQuestionId":{"type":"string","nullable":true},"text":{"type":"string"},"answer":{"nullable":true},"score":{"type":"number","nullable":true},"metadata":{"type":"object","additionalProperties":true,"nullable":true}}},"ScreeningComposeRequest":{"type":"object","properties":{"stepId":{"type":"string","format":"uuid"},"locale":{"type":"string","enum":["en","pl"]},"manualQuestions":{"type":"array","items":{"type":"object","properties":{"externalQuestionId":{"type":"string"},"text":{"type":"string"},"type":{"type":"string","enum":["scale","single_choice","multiple_choice","ordering","open"]},"options":{"type":"array","items":{"type":"string"}},"scaleMin":{"type":"integer"},"scaleMax":{"type":"integer"},"scaleMinLabel":{"type":"string"},"scaleMaxLabel":{"type":"string"},"isRequired":{"type":"boolean"},"metadata":{"type":"object","additionalProperties":true}}}},"generatedQuestions":{"type":"object","properties":{"enabled":{"type":"boolean"},"count":{"type":"integer"},"basedOn":{"type":"array","items":{"type":"string"}},"instructions":{"type":"string"}}},"mergeStrategy":{"type":"string","enum":["manual_first","generated_first","interleave"]},"deduplicate":{"type":"boolean"},"replaceExisting":{"type":"boolean"}}},"CandidateProfileUpsert":{"type":"object","properties":{"headline":{"type":"string","nullable":true},"bio":{"type":"string","nullable":true},"skills":{"type":"array","items":{"type":"string"}},"experienceYears":{"type":"integer","nullable":true},"cvUrl":{"type":"string","format":"uri","nullable":true},"linkedinUrl":{"type":"string","format":"uri","nullable":true},"githubUrl":{"type":"string","format":"uri","nullable":true}}},"InterviewTrainingSessionCreate":{"type":"object","description":"Geben Sie genau eines von projectId, jobOfferId oder postingText an.","properties":{"projectId":{"type":"string","format":"uuid"},"jobOfferId":{"type":"string","format":"uuid"},"postingText":{"type":"string","minLength":100,"maxLength":50000},"title":{"type":"string","maxLength":500},"roleType":{"type":"string","maxLength":100},"locale":{"type":"string","enum":["en","pl"],"default":"en"},"questionCount":{"type":"integer","minimum":3,"maximum":12,"default":6}}},"InterviewTrainingQuestion":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string","enum":["hr","technical","experience","situational"]},"text":{"type":"string"},"expectedSignals":{"type":"array","items":{"type":"string"}}}},"InterviewTrainingFeedback":{"type":"object","properties":{"score":{"type":"integer","minimum":0,"maximum":100},"summary":{"type":"string"},"strengths":{"type":"array","items":{"type":"string"}},"improvements":{"type":"array","items":{"type":"string"}},"suggestedAnswer":{"type":"string"}}},"InterviewTrainingAnswerCreate":{"type":"object","required":["questionId","answerText"],"properties":{"questionId":{"type":"string"},"answerText":{"type":"string","maxLength":20000}}},"InterviewTrainingAnswer":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"sessionId":{"type":"string","format":"uuid"},"questionId":{"type":"string"},"questionIndex":{"type":"integer"},"questionText":{"type":"string"},"answerText":{"type":"string"},"feedback":{"$ref":"#/components/schemas/InterviewTrainingFeedback"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"InterviewTrainingSummary":{"type":"object","properties":{"score":{"type":"integer","minimum":0,"maximum":100},"readiness":{"type":"string","enum":["low","medium","high"]},"summary":{"type":"string"},"strengths":{"type":"array","items":{"type":"string"}},"gaps":{"type":"array","items":{"type":"string"}},"nextSteps":{"type":"array","items":{"type":"string"}}}},"InterviewTrainingProgress":{"type":"object","properties":{"answered":{"type":"integer"},"total":{"type":"integer"},"completed":{"type":"boolean"}}},"InterviewTrainingSession":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid","nullable":true},"jobOfferId":{"type":"string","format":"uuid","nullable":true},"sourceType":{"type":"string","enum":["project","job_offer","raw_text"]},"status":{"type":"string","enum":["active","completed"]},"title":{"type":"string"},"roleType":{"type":"string","nullable":true},"locale":{"type":"string","enum":["en","pl"]},"questions":{"type":"array","items":{"$ref":"#/components/schemas/InterviewTrainingQuestion"}},"summary":{"anyOf":[{"$ref":"#/components/schemas/InterviewTrainingSummary"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"completedAt":{"type":"string","format":"date-time","nullable":true}}},"ShortlistCandidate":{"type":"object","required":["applicationId","overall","overallLower","overallUpper","coverage","gateStatus","conflicts"],"properties":{"applicationId":{"type":"string","format":"uuid"},"overall":{"type":"number","example":71.25},"overallLower":{"type":"number","example":66.5},"overallUpper":{"type":"number","example":76},"coverage":{"type":"number","minimum":0,"maximum":1,"description":"Anteil der Rubrikkompetenzen mit Belegen"},"gateStatus":{"type":"string","enum":["pass","failed","insufficient_evidence"]},"conflicts":{"type":"array","items":{"type":"string"},"description":"Kompetenzschlüssel mit widersprüchlichen Belegen"},"rank":{"type":"integer","minimum":1,"description":"Position ab 1 unter den gerankten Kandidaten. Bei angehefteten Kandidaten fehlt sie; diese führen die Liste an."}}},"Webhook":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string","enum":["application.created","application.started","application.completed","application.decided","application.stage_changed","screening.submitted","screening.evaluated","interview.started","interview.completed","code.submitted","code.evaluated","balance.low","balance.depleted","test.ping"]}},"secret":{"type":"string"},"isActive":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}}},"HealthChecks":{"type":"object","properties":{"database":{"type":"boolean"},"blob":{"type":"boolean"},"ai":{"type":"boolean"},"tavus":{"type":"boolean"},"stripe":{"type":"boolean"},"workos":{"type":"boolean"}}}},"responses":{"Unauthorized":{"description":"API-Schlüssel fehlt oder ist ungültig","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"VALIDATION_ERROR"},"message":{"type":"string","example":"Invalid request payload"},"details":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string","example":"title"},"message":{"type":"string","example":"Required"},"code":{"type":"string","example":"invalid_type"}}}}}}}}}}},"ValidationError":{"description":"Anfragevalidierung fehlgeschlagen","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"VALIDATION_ERROR"},"message":{"type":"string","example":"Invalid request payload"},"details":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string","example":"title"},"message":{"type":"string","example":"Required"},"code":{"type":"string","example":"invalid_type"}}}}}}}}}}},"Forbidden":{"description":"Partnerkonto ist gesperrt","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"VALIDATION_ERROR"},"message":{"type":"string","example":"Invalid request payload"},"details":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string","example":"title"},"message":{"type":"string","example":"Required"},"code":{"type":"string","example":"invalid_type"}}}}}}}}}}},"NotFound":{"description":"Ressource nicht gefunden","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"VALIDATION_ERROR"},"message":{"type":"string","example":"Invalid request payload"},"details":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string","example":"title"},"message":{"type":"string","example":"Required"},"code":{"type":"string","example":"invalid_type"}}}}}}}}}}},"RateLimited":{"description":"Ratenlimit überschritten","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"VALIDATION_ERROR"},"message":{"type":"string","example":"Invalid request payload"},"details":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string","example":"title"},"message":{"type":"string","example":"Required"},"code":{"type":"string","example":"invalid_type"}}}}}}}}}}}}},"paths":{"/api/v1/health":{"get":{"summary":"Gesundheitsstatus","tags":["Health"],"security":[],"responses":{"200":{"description":"Ergebnis der Gesundheitsprüfung","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"version":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"checks":{"$ref":"#/components/schemas/HealthChecks"}}}}}},"503":{"description":"Dienst beeinträchtigt","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"version":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"checks":{"$ref":"#/components/schemas/HealthChecks"}}}}}}}}},"/api/v1/ready":{"get":{"summary":"Bereitschaftsstatus","tags":["Health"],"security":[],"responses":{"200":{"description":"Dienst ist bereit","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"ready"},"timestamp":{"type":"string","format":"date-time"},"checks":{"type":"object","properties":{"database":{"type":"boolean"},"env":{"type":"boolean"}}}}}}}},"503":{"description":"Dienst ist nicht bereit","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"not_ready"},"timestamp":{"type":"string","format":"date-time"},"checks":{"type":"object","properties":{"database":{"type":"boolean"},"env":{"type":"boolean"}}}}}}}}}}},"/api/v1/projects":{"get":{"summary":"Projekte auflisten","tags":["Projects"],"parameters":[{"$ref":"#/components/parameters/PageParam"},{"$ref":"#/components/parameters/LimitParam"},{"name":"status","in":"query","schema":{"type":"string","enum":["draft","active","archived","closed"]}}],"responses":{"200":{"description":"Projektliste","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Project"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"}}},"post":{"summary":"Projekt erstellen","tags":["Projects"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title"],"properties":{"title":{"type":"string"},"description":{"type":"string"},"roleType":{"type":"string"},"defaultHostedBranding":{"$ref":"#/components/schemas/HostedBrandingInput"},"pipeline":{"type":"array","items":{"$ref":"#/components/schemas/PipelineStep"}}}}}}},"responses":{"201":{"description":"Projekt erstellt","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Project"}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"409":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/projects/{id}":{"get":{"summary":"Projekt abrufen","tags":["Projects"],"parameters":[{"$ref":"#/components/parameters/ProjectId"}],"responses":{"200":{"description":"Projektdetails","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Project"},{"type":"object","properties":{"pipeline":{"type":"array","items":{"$ref":"#/components/schemas/PipelineStep"}},"candidateCount":{"type":"integer"}}}]}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}},"put":{"summary":"Projekt aktualisieren","tags":["Projects"],"parameters":[{"$ref":"#/components/parameters/ProjectId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string","nullable":true},"roleType":{"type":"string","nullable":true},"status":{"type":"string","enum":["draft","active","archived","closed"]},"isPublished":{"type":"boolean"},"defaultHostedBranding":{"anyOf":[{"$ref":"#/components/schemas/HostedBrandingInput"},{"type":"null"}]}}}}}},"responses":{"200":{"description":"Projekt aktualisiert","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Project"}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}},"delete":{"summary":"Projekt archivieren","tags":["Projects"],"parameters":[{"$ref":"#/components/parameters/ProjectId"}],"responses":{"200":{"description":"Projekt archiviert","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string","example":"archived"}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/projects/{id}/readiness":{"get":{"summary":"Projektbereitschaft abrufen","tags":["Projects"],"parameters":[{"$ref":"#/components/parameters/ProjectId"}],"responses":{"200":{"description":"Zusammenfassung der Projektbereitschaft","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ProjectReadiness"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/projects/{id}/pipeline":{"get":{"summary":"Pipeline-Schritte auflisten","tags":["Projects"],"parameters":[{"$ref":"#/components/parameters/ProjectId"}],"responses":{"200":{"description":"Pipeline-Schritte","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PipelineStep"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}},"put":{"summary":"Pipeline ersetzen","tags":["Projects"],"parameters":[{"$ref":"#/components/parameters/ProjectId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["steps"],"properties":{"steps":{"type":"array","items":{"$ref":"#/components/schemas/PipelineStep"}}}}}}},"responses":{"200":{"description":"Pipeline aktualisiert","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PipelineStep"}}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"description":"Ein entfernter Pipeline-Schritt wird noch von einer Bewerbung referenziert","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/projects/{id}/generate-pipeline":{"post":{"summary":"KI-Pipeline generieren","description":"Erstellt einen Pipeline-Vorschlag. Die zurückgegebenen Schritte enthalten type und nodeType; case_study und documents_upload sind eigenständige Schritttypen.","tags":["Projects"],"parameters":[{"$ref":"#/components/parameters/ProjectId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"description":{"type":"string"},"roleType":{"type":"string"}}}}}},"responses":{"200":{"description":"Generierter Pipeline-Vorschlag","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"steps":{"type":"array","items":{"$ref":"#/components/schemas/GeneratedPipelineStep"}}}}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/ValidationError"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/projects/{id}/context":{"get":{"summary":"Projektdokumente mit Kontext auflisten","tags":["Projects"],"parameters":[{"$ref":"#/components/parameters/ProjectId"}],"responses":{"200":{"description":"Kontextdatensätze","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}},"post":{"summary":"Projektkontext hochladen","tags":["Projects"],"parameters":[{"$ref":"#/components/parameters/ProjectId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["type","name"],"properties":{"type":{"type":"string","enum":["job_spec","rubric","requirements","other"]},"name":{"type":"string"},"content":{"type":"string"},"fileUrl":{"type":"string","format":"uri"}}}},"multipart/form-data":{"schema":{"type":"object","required":["type","name"],"properties":{"type":{"type":"string","enum":["job_spec","rubric","requirements","other"]},"name":{"type":"string"},"content":{"type":"string"},"fileUrl":{"type":"string","format":"uri"},"file":{"type":"string","format":"binary"}}}}}},"responses":{"201":{"description":"Kontext gespeichert","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","additionalProperties":true}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/projects/{id}/apply-url":{"get":{"summary":"Öffentlichen Bewerbungs-Permalink des Projekts abrufen","tags":["Projects"],"parameters":[{"$ref":"#/components/parameters/ProjectId"}],"responses":{"200":{"description":"Öffentlicher Permalink für Kandidaten auf dem Stellenbörsenhost","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"kind":{"type":"string","enum":["offer_permalink","marketplace_fallback"]}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/projects/{id}/candidates":{"get":{"summary":"Kandidaten des Projekts auflisten","description":"Listet Kandidaten-/Bewerbungspaare für ein Projekt auf. Jede Zeile enthält öffentliche metadata sowie aufgelöste Überschreibungen für applicationPage und hostedBranding.","tags":["Candidates"],"parameters":[{"$ref":"#/components/parameters/ProjectId"},{"$ref":"#/components/parameters/PageParam"},{"$ref":"#/components/parameters/LimitParam"},{"name":"status","in":"query","schema":{"type":"string","enum":["new","invited","in_progress","completed","rejected","accepted","withdrawn"]}}],"responses":{"200":{"description":"Kandidatenliste","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}},"post":{"summary":"Tokenisierte Kandidatenbewerbungssitzung erstellen","description":"Erstellt oder verwendet ein Kandidaten-/Bewerbungspaar erneut und gibt eine gehostete applyUrl zurück. Unterstützt vom Partner bereitgestellte Profildaten, Einwilligung, Metadaten, Überschreibungen des Seitentexts über applicationPage und Whitelabel-Theme über hostedBranding.","tags":["Candidates"],"parameters":[{"$ref":"#/components/parameters/ProjectId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidateInvite"}}}},"responses":{"200":{"description":"Kandidat eingeladen","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"candidateId":{"type":"string","format":"uuid"},"applicationId":{"type":"string","format":"uuid"},"token":{"type":"string"},"applyUrl":{"type":"string","format":"uri"},"externalCandidateId":{"type":"string"},"metadata":{"type":"object","additionalProperties":true},"profileCollectionMode":{"type":"string","enum":["hosted","partner_provided"]},"partnerProvidedConsent":{"type":"object","additionalProperties":true},"applicationPage":{"$ref":"#/components/schemas/ApplicationPageResolved"},"hostedBranding":{"$ref":"#/components/schemas/HostedBrandingResolved"}}}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/ValidationError"}}}},"/api/v1/projects/{id}/candidates/bulk":{"post":{"summary":"Kandidaten gesammelt einladen","description":"Erstellt oder verwendet Kandidaten-/Bewerbungspaare gesammelt erneut. Jedes erfolgreiche Ergebnis enthält die tokenisierte applyUrl, öffentliche metadata sowie aufgelöste applicationPage- und hostedBranding-Werte.","tags":["Candidates"],"parameters":[{"$ref":"#/components/parameters/ProjectId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["candidates"],"properties":{"candidates":{"type":"array","items":{"$ref":"#/components/schemas/CandidateInvite"}}}}}}},"responses":{"200":{"description":"Ergebnis des Massenimports","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","additionalProperties":true}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/ValidationError"}}}},"/api/v1/projects/{id}/shortlist":{"get":{"summary":"Auswahlliste des Projekts abrufen","description":"Gibt die deterministische Auswahlliste eines Projekts zurück: zuerst angeheftete Kandidaten, danach ab 1 nummerierte Kandidaten. Kandidaten, die an einem fehlgeschlagenen Gate oder an zu geringer Belegabdeckung scheitern, werden nicht zurückgegeben. Bewertungen liegen auf einer Skala von 0 bis 100; overallLower und overallUpper begrenzen das Intervall.","tags":["Projects"],"parameters":[{"$ref":"#/components/parameters/ProjectId"},{"name":"mode","in":"query","description":"Rangfolgensignal. lcb (Standard) sortiert nach der unteren Konfidenzgrenze, sodass eine sichere Bewertung eine spekulative übertrifft; mean sortiert nach der Punktschätzung.","schema":{"type":"string","enum":["lcb","mean"],"default":"lcb"}}],"responses":{"200":{"description":"Projektauswahlliste","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","required":["mode","generatedAt","candidates"],"properties":{"mode":{"type":"string","enum":["lcb","mean"]},"generatedAt":{"type":"string","format":"date-time"},"candidates":{"type":"array","items":{"$ref":"#/components/schemas/ShortlistCandidate"}}}}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/applications/{id}":{"get":{"summary":"Bewerbungsdetails abrufen","description":"Gibt Bewerbungsstatus, Text der gehosteten Bewerbungsseite, gehostetes Whitelabel-Branding, Ergebnisse auf Schritt- und Screeningebene sowie screeningbezogene questionEntries zurück, die die Herkunft der Frage (manual oder generated) bewahren. Abgeschlossene Bewerbungen enthalten außerdem recording und recordingUrl.","tags":["Applications"],"parameters":[{"$ref":"#/components/parameters/ApplicationId"}],"responses":{"200":{"description":"Bewerbungsdetails","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","additionalProperties":true}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/applications/{id}/screening-compose":{"post":{"summary":"Schrittspezifische Screeningfragen für eine Bewerbung zusammenstellen","description":"Erstellt einen Screeningfragensatz aus manuell bereitgestellten Partnerfragen und optional von tview generierten, profilbezogenen Fragen. Wenn eine Bewerbung mehrere Screening-Schritte hat, übergeben Sie stepId, um den richtigen Schritt anzusprechen. Eingereichte Screening-Snapshots sind unveränderlich.","tags":["Applications"],"parameters":[{"$ref":"#/components/parameters/ApplicationId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScreeningComposeRequest"}}}},"responses":{"200":{"description":"Zusammengestellter Fragensatz","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"stepId":{"type":"string","format":"uuid"},"questionSetId":{"type":"string"},"generationVersion":{"type":"integer"},"questions":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/ValidationError"}}}},"/api/v1/applications/{id}/recording":{"get":{"summary":"Signierte URL der Interviewaufzeichnung abrufen","description":"Gibt eine im Browser öffnungsfähige signierte URL für abgeschlossene Bewerbungsaufzeichnungen zurück. Die signierte URL läuft nach einer Stunde ab und benötigt beim Öffnen im Browser keine Partner-API-Header.","tags":["Applications"],"parameters":[{"$ref":"#/components/parameters/ApplicationId"}],"responses":{"200":{"description":"Aufzeichnungs-URL","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"source":{"type":"string","enum":["tavus","browser"]},"contentType":{"type":"string","enum":["video/mp4","video/webm"]},"expiresAt":{"type":"string","format":"date-time"}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/applications/{id}/recording/browser":{"get":{"summary":"Abgeschlossene Browseraufzeichnung streamen","description":"Streamt die letzte abgeschlossene Videointerview-Aufzeichnung aus dem privaten Speicher. Dieser Endpunkt erfordert einen Partner-API-Bearer-Schlüssel und die Berechtigung für die Bewerbung; trotz des Namens handelt es sich nicht um eine unauthentifizierte Browser-URL. Leiten Sie ihn über Ihren Server weiter oder holen Sie eine kurzlebige signierte URL ab.","tags":["Applications"],"parameters":[{"$ref":"#/components/parameters/ApplicationId"}],"responses":{"200":{"description":"Privater Aufzeichnungsstream","content":{"video/webm":{"schema":{"type":"string","format":"binary"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/applications/{id}/recording/signed":{"get":{"summary":"Signierte Interviewaufzeichnung öffnen","description":"Öffentliches, kurzlebiges Ziel einer signierten Aufzeichnungs-URL. Partner sollten diese URL über GET /api/v1/applications/{id} oder GET /api/v1/applications/{id}/recording abrufen und sie nicht manuell erstellen.","tags":["Applications"],"security":[],"parameters":[{"$ref":"#/components/parameters/ApplicationId"},{"name":"expires","in":"query","required":true,"schema":{"type":"integer"}},{"name":"signature","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Browseraufzeichnungsstream","content":{"video/webm":{"schema":{"type":"string","format":"binary"}}}},"302":{"description":"Zur gehosteten Aufzeichnung weiterleiten"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/applications/{id}/evaluate":{"post":{"summary":"Bewerbungsschritt bewerten","tags":["Applications"],"parameters":[{"$ref":"#/components/parameters/ApplicationId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["stepId"],"properties":{"stepId":{"type":"string","format":"uuid"}}}}}},"responses":{"200":{"description":"Bewertungsergebnis","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"score":{"type":"number"},"evaluation":{"type":"object","description":"Always carries summary, strengths, weaknesses and recommendation, plus correctness and codeQuality for coding steps. A project scored against a rubric additionally returns mode=\"two_stage\" with rubric, competencies and criterionScores; single-shot evaluations omit those keys.","additionalProperties":true,"properties":{"mode":{"type":"string","enum":["two_stage"]},"summary":{"type":"string"},"recommendation":{"type":"string"}}}}}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/ValidationError"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/candidates/{id}":{"get":{"summary":"Kandidatenprofil abrufen","description":"Gibt den Kandidatendatensatz, ein optional vom Partner bereitgestelltes Profil und alle für den Partner sichtbaren Bewerbungen zurück. Jede Bewerbung enthält öffentliche metadata sowie aufgelöste Werte für applicationPage und hostedBranding.","tags":["Candidates"],"parameters":[{"$ref":"#/components/parameters/CandidateId"}],"responses":{"200":{"description":"Kandidatenprofil und Bewerbungen","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","additionalProperties":true}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/candidates/{id}/profile":{"put":{"summary":"Vom Partner bereitgestelltes Kandidatenprofil aktualisieren oder erstellen","tags":["Candidates"],"parameters":[{"$ref":"#/components/parameters/CandidateId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidateProfileUpsert"}}}},"responses":{"200":{"description":"Kandidatenprofil aktualisiert","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","additionalProperties":true}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/usage":{"get":{"summary":"Aktuelle Nutzungsübersicht","tags":["Usage"],"responses":{"200":{"description":"Nutzung im aktuellen Monat","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","additionalProperties":true}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/api/v1/usage/history":{"get":{"summary":"Nutzungsverlauf","tags":["Usage"],"parameters":[{"name":"months","in":"query","schema":{"type":"integer","default":6,"minimum":1,"maximum":24}}],"responses":{"200":{"description":"Nutzungsverlauf","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/api/v1/balance":{"get":{"summary":"Aktuelles Guthaben","tags":["Usage"],"responses":{"200":{"description":"Guthaben- und Einstellungen für automatische Aufladung","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","additionalProperties":true}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/api/v1/interview-training/sessions":{"post":{"summary":"Interview-Trainingssitzung erstellen","description":"Erstellt aus einem Projekt, einem Stellenangebot oder rohem Anzeigentext eine Übungssitzung für ein Interview.","tags":["Interview Training"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewTrainingSessionCreate"}}}},"responses":{"201":{"description":"Interview-Trainingssitzung erstellt","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/InterviewTrainingSession"}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/ValidationError"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/interview-training/sessions/{id}":{"get":{"summary":"Interview-Trainingssitzung abrufen","tags":["Interview Training"],"parameters":[{"$ref":"#/components/parameters/InterviewTrainingSessionId"}],"responses":{"200":{"description":"Interview-Trainingseinheit","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/InterviewTrainingSession"},{"type":"object","properties":{"answers":{"type":"array","items":{"$ref":"#/components/schemas/InterviewTrainingAnswer"}},"progress":{"$ref":"#/components/schemas/InterviewTrainingProgress"}}}]}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/interview-training/sessions/{id}/next-question":{"get":{"summary":"Nächste Frage für das Interview-Training abrufen","tags":["Interview Training"],"parameters":[{"$ref":"#/components/parameters/InterviewTrainingSessionId"}],"responses":{"200":{"description":"Nächste unbeantwortete Frage","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"question":{"anyOf":[{"$ref":"#/components/schemas/InterviewTrainingQuestion"},{"type":"null"}]},"progress":{"$ref":"#/components/schemas/InterviewTrainingProgress"}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/interview-training/sessions/{id}/answers":{"post":{"summary":"Antwort für das Interview-Training absenden","description":"Speichert eine Übungsantwort des Kandidaten und gibt Coaching-Feedback zurück.","tags":["Interview Training"],"parameters":[{"$ref":"#/components/parameters/InterviewTrainingSessionId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewTrainingAnswerCreate"}}}},"responses":{"200":{"description":"Antwort-Feedback","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"answer":{"$ref":"#/components/schemas/InterviewTrainingAnswer"},"feedback":{"$ref":"#/components/schemas/InterviewTrainingFeedback"}}}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/ValidationError"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/interview-training/sessions/{id}/summary":{"post":{"summary":"Zusammenfassung des Interviewtrainings erstellen","description":"Erstellt einen abschließenden Bereitschaftsbericht für die Übungssitzung oder gibt einen zwischengespeicherten Bericht zurück.","tags":["Interview Training"],"parameters":[{"$ref":"#/components/parameters/InterviewTrainingSessionId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Trainingszusammenfassung","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"summary":{"$ref":"#/components/schemas/InterviewTrainingSummary"},"cached":{"type":"boolean"}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/ValidationError"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/webhooks":{"get":{"summary":"Webhooks auflisten","tags":["Webhooks"],"responses":{"200":{"description":"Webhook-Registrierungen","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}},"post":{"summary":"Webhook erstellen","tags":["Webhooks"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url","events"],"properties":{"url":{"type":"string","format":"uri","description":"Öffentliche HTTPS-Webhook-URL. Localhost sowie private, Link-Local- und reservierte IP-Ziele werden abgelehnt."},"events":{"type":"array","items":{"type":"string","enum":["application.created","application.started","application.completed","application.decided","application.stage_changed","screening.submitted","screening.evaluated","interview.started","interview.completed","code.submitted","code.evaluated","balance.low","balance.depleted","test.ping"]}},"secret":{"type":"string"}}}}}},"responses":{"200":{"description":"Webhook erstellt","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Webhook"}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/api/v1/webhooks/{id}":{"put":{"summary":"Webhook aktualisieren","tags":["Webhooks"],"parameters":[{"$ref":"#/components/parameters/WebhookId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"Öffentliche HTTPS-Webhook-URL. Localhost sowie private, Link-Local- und reservierte IP-Ziele werden abgelehnt."},"events":{"type":"array","items":{"type":"string","enum":["application.created","application.started","application.completed","application.decided","application.stage_changed","screening.submitted","screening.evaluated","interview.started","interview.completed","code.submitted","code.evaluated","balance.low","balance.depleted","test.ping"]}},"isActive":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Webhook aktualisiert","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string","enum":["application.created","application.started","application.completed","application.decided","application.stage_changed","screening.submitted","screening.evaluated","interview.started","interview.completed","code.submitted","code.evaluated","balance.low","balance.depleted","test.ping"]}},"isActive":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}}}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}},"delete":{"summary":"Webhook löschen","tags":["Webhooks"],"parameters":[{"$ref":"#/components/parameters/WebhookId"}],"responses":{"200":{"description":"Webhook gelöscht","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"deleted":{"type":"boolean"}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/webhooks/{id}/deliveries":{"get":{"summary":"Webhook-Zustellungen auflisten","tags":["Webhooks"],"parameters":[{"$ref":"#/components/parameters/WebhookId"},{"$ref":"#/components/parameters/PageParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"description":"Webhook-Zustellungsprotokoll","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true}},"meta":{"type":"object","properties":{"page":{"type":"integer"},"limit":{"type":"integer"}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/webhooks/test":{"post":{"summary":"Test-Webhook senden","tags":["Webhooks"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["webhookId"],"properties":{"webhookId":{"type":"string","format":"uuid"}}}}}},"responses":{"200":{"description":"Ergebnis der Testzustellung","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"statusCode":{"type":"integer"},"response":{"type":"string","nullable":true},"deliveredAt":{"type":"string","format":"date-time","nullable":true}}}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/ValidationError"}}}}},"tags":[{"name":"Health","description":"Betriebszustand und Bereitschaft von Abhängigkeiten","x-displayName":"API-Status"},{"name":"Projects","description":"Recruitingprojekte und KI-generierte Pipelines","x-displayName":"Projekte"},{"name":"Candidates","description":"Kandidateneinladungen und Profile","x-displayName":"Kandidaten"},{"name":"Applications","description":"Bewerbungsstatus, Aufzeichnungen und Bewertungen","x-displayName":"Bewerbungen"},{"name":"Usage","description":"Nutzungs-, Abrechnungs- und Guthabenübersicht","x-displayName":"Nutzung"},{"name":"Interview Training","description":"Übungsinterviews auf Basis von Stellenanzeigen für eingebettete Partnerabläufe","x-displayName":"Interviewtraining"},{"name":"Webhooks","description":"Webhook-Registrierung und Zustellungsverfolgung","x-displayName":"Webhooks"}]}