API Reference
Comprehensive REST reference for interviews, questions, sessions, candidates, and usage—parameters, curl examples, and response shapes
Feature coverage and additional workflows
The API supports interview context, candidate profiles, invitation emails, session completion, report media, and personal practice results. Textarea resizing and tab draft preservation are browser interactions and do not require API fields.
ccSenderOnInviteinviteCcEmailjobDescriptionresumeTextcompanyNameroleTitleccSenderOnInviteboolean= trueinviteCcEmailstring | nulljobDescriptionstring | nullresumeTextstring | nullcompanyNamestring | nullroleTitlestring | nullcurl -sS -X PATCH "$AURAL_BASE_URL/api/v1/interviews/INTERVIEW_ID" \
-H "Authorization: Bearer $AURAL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"ccSenderOnInvite":true,"inviteCcEmail":"recruiting[at]example.com","companyName":"Example","roleTitle":"Backend Engineer"}'Set AURAL_BASE_URL to your deployment (http://localhost:3000 for local testing) and AURAL_API_KEY to your key. CC defaults on and is visible to candidates; disabling CC prevents copies even when an override is saved.
Preview and send invitations
POST /interviews/{id}/invites — ids are candidate IDs returned by candidate creation. Creating candidates does not send email.
curl -sS -X POST "$AURAL_BASE_URL/api/v1/interviews/INTERVIEW_ID/invites" \
-H "Authorization: Bearer $AURAL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"ids":["CANDIDATE_ID"],"dryRun":true}'Review the preview, then set dryRun to false to send. Each email uses the candidate's personal /i/invite/{token} link and preserves invite-only access. Only unstarted candidates with an email and invite token are eligible.
Preview and end interview sessions
POST /interviews/{id}/sessions/end — Uses the same body, but ids are session IDs. Only IN_PROGRESS sessions are ended, using the app's activity-duration and billing logic. Completion does not generate an AI report.
{"ids":["SESSION_ID"],"dryRun":true}Both bulk endpoints require MEMBER or higher. Supply 1–100 IDs; duplicates are processed once. dryRun defaults to true. Execution rechecks eligibility, so a preview does not reserve records.
{"data":{"dryRun":true,"results":[{"id":"CANDIDATE_ID","status":"eligible"},{"id":"OTHER_ID","status":"skipped","reason":"Not eligible"}]}}HTTP 200 does not mean every item succeeded. Inspect each eligible, skipped, succeeded, or failed status and reason. Batches are not atomic. Email sending is not idempotent: resubmitting a whole batch may resend successful invites. Retry only known failures; investigate uncertain timeouts before resending.
Candidate and question fields
Candidate list/create responses include the profile fields below. PATCH /interviews/{id}/candidates/{candidateId} updates them alongside name, email, phone, and notes. Omitted fields remain unchanged; null clears nullable fields. name cannot be blank; email must be valid or null.
gendereducationschoolmajorworkExperiencebirthdaygraduationYeargenderstring | nulleducationstring | nullschoolstring | nullmajorstring | nullworkExperiencestring | nullbirthdaystring | nullgraduationYearinteger | nullPOST /interviews/{id}/questions and PATCH /questions/{id} also accept these fields; GET returns their stored values.
descriptionstarterCodevalidationRulesfollowUpPromptsshowIfskipIfprobeThresholdtimeLimitSecondsallowFileUploadallowedFileTypesdescriptionstring | nullstarterCodeobject | nullvalidationRulesJSON | nullfollowUpPromptsJSON | nullshowIfJSON | nullskipIfJSON | nullprobeThresholdnumber | nulltimeLimitSecondsinteger | nullallowFileUploadbooleanallowedFileTypesstring[]Session list/detail responses include startedAt, completedAt, and lastActivityAt. IN_PROGRESS alone does not mean a participant is currently active.
Reports, media, and practices
GET /sessions/{id}/report: Existing summary, insights, messages, antiCheatingLog, audioRecordings, screenshots, and mediaRetention. Signed media URLs expire; fetch fresh URLs when needed. Does not generate missing AI reports.GET /interviews/{id}/practices?limit=100: The key owner's practice summaries; limit is 1–500, with no cursor pagination.GET /practices/{id}: session, interview, questions, and attempts including feedback, scores, and retained answer audio. Only the key owner's own practices are accessible.
Interview time is accounted within the current subscription billing period, excluding idle gaps. Practices do not consume interview session hours, but AI practice operations use AI tokens. Read GET /usage instead of hard-coding plan allowances.
Use the web/mobile app for AI interview generation/refinement, PDF/URL extraction, live voice and microphone controls, practice answer submission/grading, answer-bank editing, recording uploads, and report generation. Those interactions do not have public REST write endpoints. Webhooks and official SDKs are not provided; internal tRPC and voice WebSockets are not stable Developer API contracts.
Base URL and conventions
Base path: /api/v1. Examples below use https://aural-ai.com; substitute your deployment host.
- Auth —
Authorization: Bearer dlv_…on every request. - JSON — Send
Content-Type: application/jsonfor bodies unless noted. - Success — Most responses wrap payloads in
data. Paginated lists also returncursor(opaque string ornullwhen there is no next page). - Errors — JSON shaped like
{ "error": { "code", "message", ... } }with 4xx/5xx status codes. - Rate limits — 60 requests per minute per API key. When exceeded, the API returns 429 Too Many Requests with an error body; back off and retry with exponential delay.
Interviews
List interviews
/api/v1/interviewsReturns interviews your key can access in its projects. Each item includes question and session counts.
limitcursorlimitinteger= 20cursorstringcurl -sS "https://aural-ai.com/api/v1/interviews?limit=20" \
-H "Authorization: Bearer dlv_KEY"{
"data": [
{
"id": "...",
"title": "Backend screening",
"isActive": true,
"_count": { "questions": 3, "sessions": 12 }
}
],
"cursor": "eyJ..."
}When cursor is null, there are no further pages. Pass the previous cursor value to continue.
Create interview
/api/v1/interviewsCreates an interview in your first accessible project. Requires a title; other fields use defaults below.
titlerequireddescriptionobjectiveassessmentCriteriachatEnabledvoiceEnabledvideoEnabledaiNameaiTonefollowUpDepthlanguagetimeLimitMinutesantiCheatingEnabledccSenderOnInviteinviteCcEmailjobDescriptionresumeTextcompanyNameroleTitletitlerequiredstringdescriptionstringobjectivestringassessmentCriteriaobject[]chatEnabledboolean= truevoiceEnabledboolean= falsevideoEnabledboolean= falseaiNamestring= AuralaiToneenum= PROFESSIONALfollowUpDepthenum= MODERATElanguagestring= entimeLimitMinutesinteger | nullantiCheatingEnabledboolean= falseccSenderOnInviteboolean= trueinviteCcEmailstring | nulljobDescriptionstring | nullresumeTextstring | nullcompanyNamestring | nullroleTitlestring | nullIf your organization has reached its interview template quota, the API returns 403 with PLAN_LIMIT_EXCEEDED (see Usage & Limits).
curl -sS -X POST "https://aural-ai.com/api/v1/interviews" \
-H "Authorization: Bearer dlv_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"Backend screening","voiceEnabled":true,"chatEnabled":true}'{
"data": {
"id": "...",
"title": "Backend screening",
"chatEnabled": true,
"voiceEnabled": true,
"videoEnabled": false,
"aiTone": "PROFESSIONAL",
"followUpDepth": "MODERATE",
"language": "en"
}
}Get interview detail
/api/v1/interviews/:idReturns one interview with its questions array and session count. Unknown or inaccessible ids yield 404.
No query parameters.
curl -sS "https://aural-ai.com/api/v1/interviews/INTERVIEW_ID" \
-H "Authorization: Bearer dlv_KEY"{
"data": {
"id": "...",
"title": "Backend screening",
"objective": "Assess API design",
"questions": [
{
"id": "...",
"text": "Describe a recent API.",
"type": "OPEN_ENDED",
"order": 0
}
],
"_count": { "sessions": 12 }
}
}Update interview
/api/v1/interviews/:idPartial update. Any create body field may be sent; omitted keys are left unchanged.
titledescriptionobjectiveassessmentCriteriachatEnabledvoiceEnabledvideoEnabledaiNameaiTonefollowUpDepthlanguagetimeLimitMinutesantiCheatingEnabledccSenderOnInviteinviteCcEmailjobDescriptionresumeTextcompanyNameroleTitletitlestringdescriptionstringobjectivestringassessmentCriteriaobject[]chatEnabledbooleanvoiceEnabledbooleanvideoEnabledbooleanaiNamestringaiToneenumfollowUpDepthenumlanguagestringtimeLimitMinutesinteger | nullantiCheatingEnabledbooleanccSenderOnInviteboolean= trueinviteCcEmailstring | nulljobDescriptionstring | nullresumeTextstring | nullcompanyNamestring | nullroleTitlestring | nullcurl -sS -X PATCH "https://aural-ai.com/api/v1/interviews/INTERVIEW_ID" \
-H "Authorization: Bearer dlv_KEY" \
-H "Content-Type: application/json" \
-d '{"voiceEnabled":true}'{
"data": {
"id": "...",
"title": "Backend screening",
"voiceEnabled": true
}
}Archive interview
/api/v1/interviews/:idSoft-archives the interview by setting isActive to false. Historical sessions remain available.
No request body.
curl -sS -X DELETE "https://aural-ai.com/api/v1/interviews/INTERVIEW_ID" \
-H "Authorization: Bearer dlv_KEY"{
"data": {
"id": "...",
"archived": true
}
}Publish interview
/api/v1/interviews/:id/publishActivates the interview, turns off invite-only mode, ensures a publicSlug exists, and returns the shareable candidate URL.
No request body.
curl -sS -X POST "https://aural-ai.com/api/v1/interviews/INTERVIEW_ID/publish" \
-H "Authorization: Bearer dlv_KEY"{
"data": {
"id": "...",
"publicSlug": "acme-backend-2025",
"url": "https://aural-ai.com/i/acme-backend-2025"
}
}Questions
List questions
/api/v1/interviews/:id/questionsReturns all questions for the interview, sorted by order ascending.
No query parameters.
curl -sS "https://aural-ai.com/api/v1/interviews/INTERVIEW_ID/questions" \
-H "Authorization: Bearer dlv_KEY"{
"data": [
{
"id": "...",
"text": "Pick a design pattern.",
"type": "SINGLE_CHOICE",
"order": 0,
"options": ["Singleton", "Factory", "Observer"]
}
]
}Create questions
/api/v1/interviews/:id/questionsCreates one or many questions. Send a single object or an array; omit order to auto-increment.
textrequiredtypeorderrequiredoptionsfollowUpEnabledtextrequiredstringtypeenum= OPEN_ENDEDorderintegerrequiredboolean= trueoptionsstring[]followUpEnabledboolean= trueWrap a single question in an object, or send an array to bulk-create.
curl -sS -X POST "https://aural-ai.com/api/v1/interviews/INTERVIEW_ID/questions" \
-H "Authorization: Bearer dlv_KEY" \
-H "Content-Type: application/json" \
-d '[{"text":"Pick one","type":"SINGLE_CHOICE","options":["A","B"]}]'{
"data": [
{
"id": "...",
"text": "Pick one",
"type": "SINGLE_CHOICE",
"order": 0,
"options": ["A", "B"]
}
]
}Update question
/api/v1/questions/:idPartial update for a single question anywhere in your accessible projects.
texttypeorderrequiredoptionsfollowUpEnabledtextstringtypeenumorderintegerrequiredbooleanoptionsstring[]followUpEnabledbooleancurl -sS -X PATCH "https://aural-ai.com/api/v1/questions/QUESTION_ID" \
-H "Authorization: Bearer dlv_KEY" \
-H "Content-Type: application/json" \
-d '{"order":1}'{
"data": {
"id": "...",
"text": "Pick one",
"order": 1,
"type": "SINGLE_CHOICE"
}
}Delete question
/api/v1/questions/:idPermanently removes the question from its interview.
No request body.
curl -sS -X DELETE "https://aural-ai.com/api/v1/questions/QUESTION_ID" \
-H "Authorization: Bearer dlv_KEY"{
"data": {
"id": "...",
"deleted": true
}
}Sessions
List sessions for an interview
/api/v1/interviews/:id/sessionsPaginated sessions with summaries and per-session message counts.
limitcursorlimitinteger= 20cursorstringEach row includes id, status, participant fields, AI outputs (summary, insights, themes, sentiment), totalDurationSeconds, timestamps, and _count.messages.
curl -sS "https://aural-ai.com/api/v1/interviews/INTERVIEW_ID/sessions?limit=20" \
-H "Authorization: Bearer dlv_KEY"{
"data": [
{
"id": "...",
"status": "COMPLETED",
"participantName": "Alex",
"participantEmail": "alex[at]example.com",
"summary": "Strong system design answers.",
"insights": ["Clear tradeoff discussion"],
"themes": ["APIs", "scalability"],
"sentiment": "positive",
"totalDurationSeconds": 1842,
"createdAt": "2026-04-01T12:00:00.000Z",
"updatedAt": "2026-04-01T12:31:00.000Z",
"_count": { "messages": 42 }
}
],
"cursor": null
}Get session detail
/api/v1/sessions/:idFull session record including ordered messages and nested interview metadata.
No query parameters.
curl -sS "https://aural-ai.com/api/v1/sessions/SESSION_ID" \
-H "Authorization: Bearer dlv_KEY"{
"data": {
"id": "...",
"status": "COMPLETED",
"participantName": "Alex",
"participantEmail": "alex[at]example.com",
"summary": "Strong system design answers.",
"insights": ["Clear tradeoff discussion"],
"themes": ["APIs"],
"sentiment": "positive",
"totalDurationSeconds": 1842,
"createdAt": "2026-04-01T12:00:00.000Z",
"messages": [
{
"id": "...",
"role": "assistant",
"content": "Welcome to your interview.",
"timestamp": "2026-04-01T12:00:05.000Z"
}
],
"interview": {
"id": "...",
"title": "Backend screening",
"objective": "Assess API design"
}
}
}Candidates
List candidates
/api/v1/interviews/:id/candidatesAll invite rows for the interview, including tokens and linked session ids when present.
No query parameters.
curl -sS "https://aural-ai.com/api/v1/interviews/INTERVIEW_ID/candidates" \
-H "Authorization: Bearer dlv_KEY"{
"data": [
{
"id": "...",
"name": "Alex",
"email": "alex[at]example.com",
"phone": "+1-555-0100",
"notes": "Referral from Jane",
"inviteToken": "...",
"sessionId": null,
"createdAt": "2026-04-01T10:00:00.000Z"
}
]
}Create candidates
/api/v1/interviews/:id/candidatesCreates invite rows and returns inviteUrl for each. Accepts one object or up to 500 in an array.
nameemailphonenotesnamestringemailstringphonestringnotesstringIf session hours are exhausted for the organization, the API responds with 403, PLAN_LIMIT_EXCEEDED, and limit: "session_hours".
curl -sS -X POST "https://aural-ai.com/api/v1/interviews/INTERVIEW_ID/candidates" \
-H "Authorization: Bearer dlv_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Alex","email":"alex[at]example.com"}'{
"data": [
{
"id": "...",
"name": "Alex",
"email": "alex[at]example.com",
"inviteToken": "...",
"inviteUrl": "https://aural-ai.com/i/acme-backend-2025?token=..."
}
]
}Usage
Organization usage and limits
/api/v1/usageSnapshot of plan label and current consumption for templates, session hours, AI tokens, and seats.
No query parameters.
curl -sS "https://aural-ai.com/api/v1/usage" \
-H "Authorization: Bearer dlv_KEY"{
"data": {
"plan": "pro",
"templates": { "used": 8, "limit": 25 },
"session_hours": { "used": 42.5, "limit": 100 },
"ai_tokens": { "used": 125000, "limit": 500000 },
"seats": { "used": 5, "limit": 10 }
}
}Interpretation of limits, null caps, and quota errors is covered in Usage & Limits.
OpenAPI
Use the OpenAPI spec with codegen or documentation tools to stay in sync as the API evolves.