Developer platform

Structured, adaptive AI interviews through one API.

Create role-aware interviews, validate candidate experience, run text or realtime voice sessions, and receive evidence-backed reports.

How the integration works

Your backend creates the interview. JobPilotNG prepares the competency framework and interview plan, returns a signed candidate URL, runs the session, and notifies your system when results are ready.

1Create

Send candidate, job and interview settings from your server.

2Interview

Share the expiring interview URL with the candidate.

3Receive results

Process signed webhooks and retrieve the final report.

All customer data is tenant-isolated by the organization attached to the API key. Never send an organization ID in the request body.

Authentication

All protected API requests use a server-side Bearer API key. Keep the key in your backend secret store; never expose it in browser code or a mobile application.

HTTP header
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
Production base URL: https://interview.jobpilotng.com/api/v1

Quick start

Create a complete interview in one request. External IDs should be stable identifiers from your own database and are used to avoid duplicate candidate and job records.

cURL
curl --request POST \
  --url https://interview.jobpilotng.com/api/v1/interviews \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "external_candidate_id": "candidate_1042",
    "external_job_id": "job_287",
    "candidate": {
      "name": "Ada Okafor",
      "email": "ada@example.com"
    },
    "job": {
      "title": "Senior Backend Engineer",
      "description": "Build secure Python APIs and distributed systems.",
      "seniority": "senior",
      "required_skills": ["Python", "PostgreSQL", "API design"],
      "preferred_skills": ["Redis", "Docker"]
    },
    "settings": {
      "duration_minutes": 25,
      "difficulty": "adaptive",
      "language": "en",
      "voice": {
        "accent": "nigerian",
        "gender": "female",
        "style": "professional",
        "speed": 1.0
      },
      "record_audio": true,
      "record_video": false
    }
  }'

Successful response · 201 Created

JSON
{
  "interview_id": "589ee26a-36ce-4f85-bc73-c83c49bc7797",
  "status": "READY",
  "interview_url": "https://interview.jobpilotng.com/i/…",
  "expires_at": "2026-08-17T18:00:00Z"
}

Create an interview

Required information

FieldPurpose
candidate.name, candidate.emailIdentifies and contacts the participant.
job.title, job.descriptionBuilds the role-specific competency framework.
settings.duration_minutes10–180 minutes; defaults to 25.
settings.voiceSelects accent, gender, style and speed independently from scoring.

Creating an interview performs AI role analysis and planning. It may take longer than a normal CRUD request. Treat a returned interview_id as the canonical identifier.

Interview lifecycle

GET/interviews/{interview_id}Read status and interview metadata.
POST/interviews/{interview_id}/startStart a prepared text interview and receive the first question.
POST/interviews/{interview_id}/messageSubmit one candidate answer and receive exactly one next question.
POST/livekit/tokenCreate a short-lived token for a realtime voice participant.
POST/interviews/{interview_id}/completeComplete the interview safely and idempotently.

The backend state machine—not the language model—controls every transition. Terminal states are COMPLETED and FAILED.

Transcripts, recordings and reports

GET/interviews/{interview_id}/transcriptTimestamped interviewer and candidate transcript segments.
GET/interviews/{interview_id}/recordingsPrivate recording metadata; objects are not exposed through public URLs.
GET/interviews/{interview_id}/reportEvidence-backed score, recommendation, strengths, concerns and uncertainty.
Generate or retrieve a report only after the interview reaches COMPLETED. Scoring excludes accent and protected characteristics.

Signed webhooks

Configure one HTTPS receiver to get lifecycle updates. Verify the HMAC signature against the exact raw request bytes before parsing JSON, then deduplicate using X-Webhook-Event-Id.

Node.js signature verification
import crypto from 'node:crypto';

const expected = 'sha256=' + crypto
  .createHmac('sha256', process.env.WEBHOOK_SIGNING_SECRET)
  .update(rawRequestBody)
  .digest('hex');

const valid = crypto.timingSafeEqual(
  Buffer.from(expected),
  Buffer.from(request.headers['x-webhook-signature'])
);

Events include interview.created, interview.started, interview.disconnected, interview.resumed, interview.completed, interview.failed, evaluation.completed, and report.generated. Failed deliveries retry with exponential backoff and retain the same event ID.

Errors and operational limits

StatusMeaningAction
400Invalid operationCheck the requested interview action.
401Missing or invalid API keyCorrect the Bearer token.
404Resource not found in your organizationCheck the ID and API-key tenant.
409State conflict or duplicate in progressFetch status before retrying.
422Request validation failedInspect the structured validation response.
429Rate limit exceededRetry with exponential backoff.
502/503Provider or dependency unavailableRetry transient failures safely.

AI-backed endpoints are rate limited. Use idempotency/event IDs where provided and do not retry validation errors unchanged.