Entwickler

Verbinden Sie Screenwell mit den Tools, die Sie bereits nutzen

Webhooks für jede Scorecard und jeden Phasenwechsel, eine REST-API für Ihre Stellen und Kandidat:innen, und ein MCP-Server, damit Claude, ChatGPT und andere KI-Assistenten für Sie mit Screenwell arbeiten können.

In jedem Plan und in der Testphase

API-Schlüssel

Webhooks, die API und der MCP-Server für Skripte verwenden den API-Schlüssel Ihres Kontos. Sie finden ihn in der App unter Einstellungen → API & Webhooks. Claude- und ChatGPT-Connectors brauchen keinen Schlüssel: Sie melden sich stattdessen mit Screenwell an.

  • Sie haben einen primären und einen sekundären Schlüssel, damit Sie ohne Ausfallzeit zu einem neuen Schlüssel wechseln können.
  • Ein Schlüssel handelt als Sie: Er sieht Ihre Stellen und die Ihres Teams, sonst nichts.
  • Bewahren Sie ihn auf Ihrem Server auf. Verwenden Sie ihn nie in einer Webseite oder einer mobilen App.

Zapier

Verbinde Screenwell ohne Code mit deinem ATS, Slack, Google Sheets und über 7.000 weiteren Apps. Jeder Auslöser feuert in dem Moment, in dem es in Screenwell passiert.

Einrichten

  1. 1Kopiere deinen API-Schlüssel in der App: Einstellungen → API & Webhooks.
  2. 2Öffne Screenwell auf Zapier über den Button unten und nimm die Einladung an.
  3. 3Erstelle einen Zap, wähle Screenwell und füge deinen API-Schlüssel ein, wenn Zapier danach fragt.
  4. 4Wähle einen Auslöser oder eine Aktion, teste sie und schalte den Zap ein.
Screenwell auf Zapier öffnen

Auslöser

Interview Scored
Luna hat ein Interview beendet und die Scorecard ist fertig: Score, Empfehlung, Zusammenfassung und Link zur Scorecard.
Candidate Moved to Stage
Eine Kandidatin oder ein Kandidat hat die Phase gewechselt. Optional nur für eine Phase, etwa Shortlist.
New Candidate
Neue Kandidat:in, in der App, über die API oder über den Interview-Link.
New Job
Ein Job wurde erstellt.
Interview Completed
Ein Interview ist zu Ende, bevor die Scorecard fertig ist.

Aktionen und Suchen

Add Candidate to Job
Name, E-Mail, Telefon und optional ein Lebenslauf.
Send Interview Invite
Schickt den Interview-Link per E-Mail. Findet die Person per E-Mail oder legt sie an.
Schedule Meet/Teams Interview
Plant Luna in ein Google-Meet- oder Microsoft-Teams-Interview ein.
Update Candidate Stage
Verschiebt nach Neu, Eingeladen, Interviewt, Shortlist, Eingestellt oder Passt nicht.
Create Job
Titel, Beschreibung, Firma und Interviewsprache.
Find Candidate
Per E-Mail, optional in einem Job.
Find Job
Per Titel.

Ideen

  • Neue Bewerbung in Workable, Recruitee, Teamtailor oder Greenhouse → Send Interview Invite
  • Interview Scored → Notiz und neue Phase im ATS
  • Interview Scored → Nachricht im Hiring-Channel in Slack
  • Interview Scored → neue Zeile in Google Sheets

Webhooks

Screenwell sendet einen signierten POST mit einem JSON-Body an Ihre URL, sobald etwas passiert. Richten Sie ihn auf Ihr ATS, einen Zapier-Catch-Hook oder Ihren eigenen Endpunkt.

Einrichten

  1. 1Öffnen Sie in der App Einstellungen → API & Webhooks und fügen Sie Ihre Webhook-URL hinzu. Sie muss eine öffentliche https-Adresse sein.
  2. 2Kopieren Sie das Signatur-Secret, das nach dem ersten Speichern erscheint. Sie brauchen es, um Signaturen zu prüfen.
  3. 3Klicken Sie auf „Test-Event senden“, um ein Beispiel für interview.scored mit test: true zu erhalten.

Sie können die URL auch über die API festlegen: PUT /api/v1/settings/webhook {"webhookUrl": "https://…"}.

Events

interview.scored
Luna hat ein Interview beendet, und die Scorecard ist fertig: der Score von 100, ihre Entscheidung und wie sicher sie sich ist, ihre Begründung und ein Link zur Scorecard.
candidate.stage_changed
Ein Kandidat oder eine Kandidatin hat die Board-Phase gewechselt, mit Angabe von woher, wohin und wer sie verschoben hat: luna nach dem Interview, oder recruiter, wenn es jemand aus Ihrem Team war.

Konten, die CV Parsing genutzt haben, erhalten weiterhin dessen ältere Events (cv_parsed, candidate_created und weitere).

Wie eine Zustellung aussieht

Jede Zustellung hat denselben Umschlag: id, eventType, timestamp, userId und data. Test-Events tragen zusätzlich test: true.

interview.scored
{
  "id": "evt_01J9ZK4T7Q2M8C6V",
  "eventType": "interview.scored",
  "timestamp": "2026-09-26T09:44:12.000Z",
  "userId": "usr_4f1c",
  "data": {
    "candidate": { "id": "cand_8f2c", "name": "Maya Kowalski", "email": "maya@example.com" },
    "job": { "id": "job_31a0", "title": "Senior Frontend Engineer" },
    "interview": { "id": "int_77b1", "finishedAt": "2026-09-26T09:43:50.000Z", "durationSeconds": 1920 },
    "score": 84,
    "decision": "hire",
    "confidence": 82,
    "summary": "Strong frontend engineer who led a design system migration.",
    "reasoning": "Explains her trade-offs clearly and meets 4 of 5 requirements.",
    "scorecardUrl": "https://<app-host>/interviews/int_77b1",
    "integrity": { "level": "none" }
  }
}
candidate.stage_changed
{
  "id": "evt_01J9ZK4VB1XK0D3R",
  "eventType": "candidate.stage_changed",
  "timestamp": "2026-09-26T09:44:13.000Z",
  "userId": "usr_4f1c",
  "data": {
    "candidate": { "id": "cand_8f2c", "name": "Maya Kowalski", "email": "maya@example.com" },
    "job": { "id": "job_31a0", "title": "Senior Frontend Engineer" },
    "from": "invited",
    "to": "shortlisted",
    "movedBy": "luna",
    "changedBy": "rule",
    "reason": "Moved by rule: score 84 ≥ 75",
    "at": "2026-09-26T09:44:13.000Z"
  }
}

Headers

X-Screenwell-Event
Der Event-Typ, z. B. interview.scored.
X-Screenwell-Event-Id
Die Event-ID. Sie bleibt bei jedem Wiederholungsversuch gleich, sodass Sie damit bereits verarbeitete Events überspringen können.
X-Screenwell-Signature
t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<raw body>">, mit Ihrem Signatur-Secret erzeugt.

Signatur prüfen

  1. 1Lesen Sie den rohen Request-Body, bevor er als JSON geparst wird.
  2. 2Berechnen Sie den HMAC-SHA256 von "<t>.<raw body>" mit Ihrem Signatur-Secret, als Hex-Wert.
  3. 3Vergleichen Sie ihn in konstanter Zeit mit v1, und lehnen Sie Anfragen ab, deren t älter als 5 Minuten ist.
Node.js (Express)
import crypto from 'node:crypto'
import express from 'express'

const app = express()
const SECRET = process.env.SCREENWELL_WEBHOOK_SECRET // whsec_...

// Keep the raw body: the signature is over the exact bytes we sent.
app.post('/webhooks/screenwell', express.raw({ type: 'application/json' }), (req, res) => {
  const header = req.get('X-Screenwell-Signature') ?? ''
  const { t, v1 } = Object.fromEntries(header.split(',').map((part) => part.split('=')))
  const expected = crypto.createHmac('sha256', SECRET).update(`${t}.${req.body}`).digest('hex')

  const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 5 * 60
  const valid = v1?.length === expected.length && crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(expected))
  if (!fresh || !valid) return res.status(400).send('bad signature')

  const event = JSON.parse(req.body)
  // Skip events you have already handled: event.id stays the same on retries.
  console.log(event.eventType, event.data)
  res.sendStatus(200)
})

app.listen(3000)
Python (Flask)
import hashlib, hmac, json, os, time
from flask import Flask, request, abort

app = Flask(__name__)
SECRET = os.environ["SCREENWELL_WEBHOOK_SECRET"].encode()  # whsec_...

@app.post("/webhooks/screenwell")
def screenwell():
    header = request.headers.get("X-Screenwell-Signature", "")
    parts = dict(p.split("=", 1) for p in header.split(",") if "=" in p)
    t, v1 = parts.get("t", "0"), parts.get("v1", "")

    body = request.get_data()  # the raw bytes, before any JSON parsing
    expected = hmac.new(SECRET, f"{t}.".encode() + body, hashlib.sha256).hexdigest()

    if abs(time.time() - int(t)) > 300 or not hmac.compare_digest(v1, expected):
        abort(400)

    event = json.loads(body)
    # Skip events you have already handled: event["id"] stays the same on retries.
    print(event["eventType"], event["data"])
    return "", 200

Wiederholungen

Antworten Sie innerhalb von 10 Sekunden mit einem beliebigen 2xx-Status. Wenn Ihr Endpunkt fehlschlägt oder nicht antwortet, versucht Screenwell es erneut nach 1 Min., 5 Min., 30 Min. und 2 Std. Unter Einstellungen → API & Webhooks sehen Sie die letzten Zustellungen mit ihrem Status und der Antwort Ihres Endpunkts.

  1. 0
  2. +1m
  3. +5m
  4. +30m
  5. +2h

REST-API

Eine JSON-API für die Stellen, Kandidat:innen und Interviews in Ihrem Konto. Senden Sie Ihren Schlüssel im Header X-API-KEY. Antworten sehen aus wie {"status": "success", "data": …}.

Basis-URL
https://api.screenwell.ai/api/v1
Authentifizierung
X-API-KEY: <API key>

Stellen

  • GET/jobsIhre Stellen und die Ihres Teams.
  • GET/jobs/:idEine Stelle mit Beschreibung und Fähigkeiten.
  • POST/jobsErstellen Sie eine Stelle: Titel, Unternehmen, Ort, Beschreibung und mehr.
  • PUT/jobs/:idÄndern Sie die Details einer Stelle.

Kandidat:innen

  • POST/jobs/:id/candidatesFügen Sie einer Stelle eine:n Kandidat:in anhand des Lebenslaufs hinzu: als Datei-Upload (file), Link (fileUrl) oder base64.
  • POST/jobs/:id/candidates/batchFügen Sie einer Stelle mehrere Lebensläufe auf einmal hinzu (fileUrls oder base64Files).
  • GET/candidates/:idEin:e Kandidat:in mit Lebenslaufdetails, Status und Lunas Analyse.
  • PUT/candidates/:id/statusVerschieben Sie eine:n Kandidat:in, z. B. zu selected (In der engeren Auswahl), hired oder rejected.
  • GET/candidates/:id/cvEin Link zur Lebenslaufdatei der Kandidatin oder des Kandidaten.

Interviews und Scorecards

  • GET/meetingsInterviews und Calls, neueste zuerst. Filtern Sie mit isInterview=true, limit und offset.
  • GET/meetings/:id/interview-insightsDie Scorecard eines Interviews: Score, Empfehlung, Stärken, Bedenken und Belege.
  • GET/meetings/:id/transcriptDas Interview-Transkript.

Konto

  • GET/quotaWie viele Interviews Sie diesen Monat noch übrig haben.
  • GET · PUT/settings/webhookLesen oder setzen Sie Ihre Webhook-URL.

Kandidatenstatus

Die Board-Phasen entsprechen diesen Status-Werten: Neu = applied, Eingeladen = interview_scheduled, Interviewt = interviewed, In der engeren Auswahl = selected, Eingestellt = hired, Kein Fit = rejected. Eine Statusänderung verschickt nie eine E-Mail an die Person.

Beispiel: Eine:n Kandidat:in aus einem Lebenslauf hinzufügen

curl
curl -X POST https://api.screenwell.ai/api/v1/jobs/job_31a0/candidates \
  -H "X-API-KEY: $SCREENWELL_API_KEY" \
  -F "file=@maya-kowalski-cv.pdf"

# or from a link
curl -X POST https://api.screenwell.ai/api/v1/jobs/job_31a0/candidates \
  -H "X-API-KEY: $SCREENWELL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"fileUrl": "https://example.com/cv/maya.pdf"}'
curl
curl -X PUT https://api.screenwell.ai/api/v1/candidates/cand_8f2c/status \
  -H "X-API-KEY: $SCREENWELL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status": "selected"}'

MCP-Server

Arbeiten Sie mit Screenwell aus Claude, ChatGPT, Cursor oder jedem anderen MCP-Client heraus: „Wen hat Luna diese Woche in die engere Auswahl genommen?“, „Fügen Sie diese 5 Lebensläufe zur Backend-Rolle hinzu“, „Schicken Sie Tomas den Interviewlink“. Der Assistent handelt als Sie, mit demselben Zugriff, den Sie in der App haben.

Endpunkt
POST https://api.screenwell.ai/mcp
Authorization
Bearer <Anmeldetoken oder API-Schlüssel>

Von claude.ai oder ChatGPT aus: mit Screenwell anmelden

Kein Schlüssel zum Kopieren. Fügen Sie Screenwell als Connector mit der Server-URL hinzu, melden Sie sich dann mit Ihrem Screenwell-Konto an und bestätigen Sie den Zugriff.

claude.ai (Web, Desktop und Mobil)

  1. 1Öffnen Sie Settings → Connectors → Add custom connector. Bei Team- und Enterprise-Plänen fügt zuerst ein:e Owner es unter Organization settings hinzu.
  2. 2Nennen Sie es Screenwell und geben Sie die Server-URL ein. Lassen Sie OAuth Client ID und Secret leer.
  3. 3Klicken Sie auf Connect. Screenwell öffnet sich: melden Sie sich an, prüfen Sie den Zugriff und klicken Sie auf Allow. Schalten Sie Screenwell dann im Tools-Menü eines Chats ein.

ChatGPT

  1. 1Öffnen Sie Settings → Apps & Connectors → Advanced settings und aktivieren Sie Developer mode. Bei Business-, Enterprise- und Edu-Workspaces muss ein:e Admin das zuerst erlauben.
  2. 2Wählen Sie Create, nennen Sie es Screenwell, geben Sie die Server-URL ein und wählen Sie OAuth als Authentifizierung.
  3. 3Screenwell öffnet sich: melden Sie sich an, prüfen Sie den Zugriff und klicken Sie auf Allow. Wählen Sie den Connector dann in einem Chat aus.
Endpunkthttps://api.screenwell.ai/mcp

Die Screenwell-Seite zeigt, welche App anfragt, die Adresse, zu der Sie danach zurückgeschickt werden, und den angeforderten Zugriff: nur lesen oder lesen und handeln (Kandidat:innen hinzufügen, verschieben und anschreiben, immer erst nach Ihrem Ja).

Jede verbundene App wird unter Einstellungen → API & Webhooks → Verbundene Apps aufgeführt. Trennen kappt die Verbindung bei der nächsten Anfrage.

Mit einem API-Schlüssel: Claude Code, Cursor und Skripte

Tools, bei denen Sie einen Header setzen können, nutzen stattdessen Ihren API-Schlüssel. Claude Code kann sich auch anmelden: Fügen Sie den Server ohne Header hinzu, führen Sie dann /mcp aus und wählen Sie Authenticate.

Claude Code
# sign in with Screenwell: add the server, then run /mcp and choose Authenticate
claude mcp add --transport http screenwell https://api.screenwell.ai/mcp

# or with an API key
claude mcp add --transport http screenwell https://api.screenwell.ai/mcp \
  --header "Authorization: Bearer <API key>"

# read-only
claude mcp add --transport http screenwell-read https://api.screenwell.ai/mcp \
  --header "Authorization: Bearer <API key>" \
  --header "X-Screenwell-Scope: read"
Claude Desktop · claude_desktop_config.json
{
  "mcpServers": {
    "screenwell": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://api.screenwell.ai/mcp", "--header", "Authorization: Bearer ${SCREENWELL_KEY}"],
      "env": { "SCREENWELL_KEY": "<API key>" }
    }
  }
}

Claude Desktop verbindet sich über mcp-remote, das den Key-Header automatisch für Sie hinzufügt.

Cursor, VS Code, der MCP Inspector und Skripte nutzen dieselbe URL, per API-Schlüssel-Header oder durch Anmelden.

Fügen Sie mit einem API-Schlüssel den Header X-Screenwell-Scope: read hinzu für eine schreibgeschützte Verbindung. Der Assistent kann dann nachschlagen, aber niemanden hinzufügen, verschieben oder anschreiben.

Tools

Nachschlagen

  • list_jobsIhre Stellen mit den Kandidat:innen je Phase und ob der Interviewlink aktiv ist.
  • get_jobEine Stelle mit Lunas Interviewplan, dem Interviewlink und der Pipeline.
  • list_candidatesKandidat:innen nach Stelle, Phase oder Name, mit ihrem letzten Score und wer sie zuletzt verschoben hat.
  • get_candidateEine:n Kandidat:in: Kontaktdaten, Lunas Briefing, Lebenslauf-Zusammenfassung, Scorecard und Feedback vom Hiring Manager.
  • get_scorecardDie vollständige Scorecard: Score von 100, Entscheidung, Stärken, Lücken und wichtige Momente.
  • ask_lunaStellen Sie Luna, Ihrer Recruiting-Beraterin, eine Frage zu Ihren Kandidat:innen.

Handeln

  • add_candidateFügen Sie eine:n Kandidat:in anhand ihrer Angaben oder eines Lebenslaufs hinzu (PDF oder Word). Luna liest den Lebenslauf zuerst.
  • move_candidateBraucht Ihre ZustimmungVerschieben Sie eine:n Kandidat:in in eine andere Phase.
  • add_noteFügen Sie einer/einem Kandidat:in eine Notiz für Ihr Team hinzu.
  • send_interview_linkBraucht Ihre ZustimmungVerschicken Sie den Interviewlink der Stelle per E-Mail an bis zu 50 Kandidat:innen.

Nichts erreicht eine Kandidatin oder einen Kandidaten ohne Ihre Zustimmung

  • Das Versenden des Interviewlinks und das Verschieben einer Person nach „Eingestellt“ oder „Kein Fit“ zeigt zuerst eine Vorschau („Das schickt eine E-Mail an 3 Kandidat:innen: …“). Nichts passiert, bevor der Assistent Sie fragt und Sie zustimmen.
  • Der Assistent sieht nur, was Sie in der App sehen: Ihre Stellen und die Ihres Teams. Das funktioniert in jedem Plan und in der Testphase, genau wie die API.
  • Bis zu 60 Tool-Aufrufe pro Minute je Schlüssel. Das Lesen von Lebensläufen und Luna fragen haben eigene Stundenlimits.

Bauen Sie etwas Größeres?

Erzählen Sie uns, was Sie verbinden möchten. Wir helfen Ihnen bei der Einrichtung.

Sprechen Sie mit uns