TalentSprout
REST APIv1

TalentSprout API

Create interviews programmatically and get a candidate-ready share link in a single request. Manual, template-based, or fully AI-generated from a job description.

Base URL
https://www.talentsprout.ai/api/v1
Auth
Authorization: Bearer tsk_...

Quick start#

1

Create an API key

Open Settings → Developers and click Create API key. Copy the token immediately -- we only show it once.

2

Export it as an environment variable

We recommend the env var TALENTSPROUT_API_KEY. Every example on this page assumes it’s set.

3

Generate an interview from a job description

Send the job description and we generate the title, questions, and a candidate-ready share link in a single call.

curl https://www.talentsprout.ai/api/v1/interviews/from-job-description \
  -H "Authorization: Bearer $TALENTSPROUT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "job_description": "We are hiring a Senior Product Designer to lead the redesign of our enterprise dashboard..."
  }'

Example response (truncated):

{
  "id": "f8a4b2c1-9e3d-4f5a-b6c7-d8e9f0a1b2c3",
  "object": "interview",
  "title": "Senior Product Designer",
  "share_link": "https://www.talentsprout.ai/interview/f8a4b2c1-9e3d-4f5a-b6c7-d8e9f0a1b2c3",
  "questions": [
    { "question": "Walk us through a recent design system you shipped end-to-end." },
    { "question": "How do you balance user research with shipping velocity?" }
  ],
  "status": "active",
  "voice": "alloy",
  "languages": ["en"],
  "duration": 15,
  "passing_score": 70,
  "ai_generation": {
    "model": "gpt-4o-mini",
    "generated_at": "2026-05-08T10:24:11.421Z"
  },
  "created_at": "2026-05-08T10:24:11.421Z"
}

Next: get notified when candidates finish

Subscribe to interview.completed events with our webhooks to receive scores, transcripts, and recordings as soon as a candidate completes the interview.

Authentication#

Every v1 request must include an API key in the Authorization header using the Bearer scheme. Keys are scoped to a single organization.

curl https://www.talentsprout.ai/api/v1/ping \
  -H "Authorization: Bearer tsk_aB3xKp9q..."

Key format#

  • Tokens start with tsk_ followed by 32 random base62 characters (~190 bits of entropy).
  • The full token is shown once, at creation time. Store it as a server-side secret -- we keep only a SHA-256 hash and the first 12 characters (the “display prefix”).
  • Lost a key? Revoke it from the dashboard and create a new one.

Security: Never embed an API key in a browser, mobile app, or public repository. Use it only from trusted server-to-server contexts. We surface leaked-key alerts via the GitHub Secret Scanning Partner Program.

Operations#

Operational details we want every integration to know up front. None of these are required reading for your first request, but they’ll save you debugging time once you’re in production.

Environments#

TalentSprout has no separate test mode. API calls operate against your live data, but creating an interview is free and only billable when a candidate completes a session. If you need an isolated environment, create a dedicated organization (e.g. “Acme — Staging”) and issue keys there.

Idempotency & retries#

v1 does not yet support an Idempotency-Key header. To safely retry a POST after a network failure, deduplicate on your side using your own request ID, or check for duplicates before retrying. Retrying a successful request will create a duplicate interview. Retries on 5xx responses are safe with exponential backoff (e.g. 1s, 2s, 4s, capped at 30s).

Request IDs#

Every response includes an X-Request-Id header (also echoed in error envelopes as request_id). Log it on every call — including this ID in support requests is the fastest way for us to trace what happened.

Client libraries#

We don’t ship official SDKs yet. The API is plain JSON over HTTPS and works with any HTTP client — every example on this page uses fetch (Node 18+) or requests (Python). If you’d like a first-party SDK in a specific language, let us know.

Using this API from an AI assistant#

Want Claude, ChatGPT, Cursor, or Cline to call this API for you? Use the TalentSprout MCP server — same tsk_* API key, same rate limits, same data. The MCP surface exposes a tool per endpoint on this page so an LLM can create interviews from natural language.

Rate limits#

Limits are applied per organization, per minute, on a sliding window. Every response includes the standard headroom headers.

TierLimitApplies to
Default120 requests / minuteGET /v1/ping, POST /v1/interviews
AI20 requests / minutePOST /v1/interviews/from-job-description

Response headers#

X-RateLimit-LimitTotal requests allowed in the current window.
X-RateLimit-RemainingRequests remaining in the current window.
X-RateLimit-ResetUnix epoch seconds when the window resets.
Retry-After(429 only) Seconds the client should wait before retrying.
X-Request-IdEcho this in support requests to help us trace your call.

When you receive a 429 rate_limit_exceeded, wait the number of seconds in Retry-After before retrying. Need higher limits? Contact us.

Errors#

Errors return a JSON envelope with stable type and code fields, a human-readable message, and a request_id to include in any support request. Every error response also includes a docs_url that deep-links to the matching code in the table below.

{
  "error": {
    "type": "validation_error",
    "code": "invalid_request",
    "message": "Required",
    "param": "questions",
    "request_id": "req_2f9a3b1c4d5e6f7a8b9c0d1e",
    "docs_url": "https://www.talentsprout.ai/docs/api-reference#error-invalid_request"
  }
}
StatusCodeDescription
400invalid_jsonRequest body was not valid JSON.
400invalid_requestOne or more fields failed validation. The 'param' field identifies which field.
400invalid_typeA field had the wrong type.
400too_smallA field was below the minimum length, count, or value.
400too_bigA field exceeded the maximum length, count, or value.
400invalid_enum_valueA field's value was not one of the accepted options.
401invalid_api_keyAPI key is missing, malformed, expired, or revoked.
403insufficient_scopeAPI key does not have the scope required for this endpoint.
404template_not_foundThe referenced 'template_id' does not exist or is not visible to your organization.
422invalid_job_descriptionThe job description could not be processed. Provide more detail and retry.
429rate_limit_exceededYou have exceeded the per-minute request budget for this tier. Honor the 'Retry-After' header.
500internal_errorUnexpected server error. Safe to retry with exponential backoff.
502upstream_errorUpstream AI provider returned an error. Safe to retry with backoff.
504timeoutAI generation exceeded the request timeout. Retry with a more concise job description.

Endpoints#

GET/v1/ping#

Verify your API key and view the scopes attached to it. Useful as a connectivity test from CI or installer scripts.

curl https://www.talentsprout.ai/api/v1/ping \
  -H "Authorization: Bearer $TALENTSPROUT_API_KEY"
POST/v1/interviews#

Create an interview manually, or by referencing one of your saved templates. Either questions OR template_id is required. When both are provided, explicit fields in the request body win.

Body parameters

FieldDescription
titleRequired. Interview title shown to candidates.
questionsRequired (unless template_id is provided). 1–50 items.
questions[].questionThe question text.
questions[].evaluation_criteriaOptional rubric used by the AI evaluator.
template_idUUID of a saved interview template. Template settings are merged as defaults; any explicit fields in this body win.
job_descriptionJob description shown to candidates.
company_nameOverride the org-wide company name for this interview.
client_nameInternal client/team label, never shown to candidates.
voiceInterviewer voice. One of 'alloy', 'ash', 'ballad', 'cedar', 'coral', 'echo', 'marin', 'sage', 'verse'.
languagesISO-639-1 codes; first entry is primary.
durationTarget length in minutes. Default 15.
require_videoRequire candidate camera. Default false.
max_attemptsMax attempts per candidate. Default 999.
passing_score0–100. Default 70.
access_type'public' or 'invite-only'. Default 'public'.
redirect_urlURL candidates land on after finishing.
ai_personalityAI tone (e.g. 'professional', 'friendly', 'casual'). Default 'professional'.

Manual create

curl https://www.talentsprout.ai/api/v1/interviews \
  -H "Authorization: Bearer $TALENTSPROUT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Senior Product Designer",
    "job_description": "We are hiring a Senior Product Designer...",
    "questions": [
      { "question": "Walk us through a recent design system you shipped end-to-end." },
      { "question": "How do you balance research with shipping velocity?" }
    ],
    "voice": "alloy",
    "languages": ["en"],
    "passing_score": 75
  }'

Create from template

curl https://www.talentsprout.ai/api/v1/interviews \
  -H "Authorization: Bearer $TALENTSPROUT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Senior Product Designer (Acme)",
    "template_id": "f8a4b2c1-9e3d-4f5a-b6c7-d8e9f0a1b2c3",
    "company_name": "Acme",
    "passing_score": 80
  }'
POST/v1/interviews/from-job-description#

Generate an interview end-to-end from a job description. We extract the title, write 5–7 questions, and persist the interview in a single call. Override any field by passing it explicitly in the request body (e.g. force a specific passing_score).

Body parameters

job_descriptionRequired. 50–20,000 characters.
...all fields from POST /v1/interviewsAny of the optional fields above to override the AI’s defaults.
curl https://www.talentsprout.ai/api/v1/interviews/from-job-description \
  -H "Authorization: Bearer $TALENTSPROUT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "job_description": "We are hiring a Senior Product Designer to...",
    "languages": ["en"],
    "passing_score": 75
  }'

Responses include an ai_generation object with the model and timestamp so you can audit which generation produced the interview.

The interview object#

All endpoints that return an interview return the same shape.

{
  "id": "f8a4b2c1-9e3d-4f5a-b6c7-d8e9f0a1b2c3",
  "object": "interview",
  "title": "Senior Product Designer",
  "job_description": "We are hiring a Senior Product Designer...",
  "questions": [
    { "question": "Walk us through a recent design system you shipped." },
    { "question": "How do you balance research with shipping velocity?" }
  ],
  "company_name": "Acme",
  "client_name": "",
  "template_id": null,
  "share_link": "https://www.talentsprout.ai/interview/f8a4b2c1-...",
  "status": "active",
  "voice": "alloy",
  "languages": ["en"],
  "duration": 15,
  "require_video": false,
  "max_attempts": 999,
  "passing_score": 70,
  "access_type": "public",
  "redirect_url": null,
  "ai_personality": "professional",
  "created_at": "2026-05-08T10:24:11.421Z",
  "updated_at": "2026-05-08T10:24:11.421Z"
}
FieldDescription
idStable identifier (UUID v4). Use this in share links and future GET endpoints.
objectAlways 'interview' for this resource.
titleThe interview title shown to candidates.
job_descriptionJob description shown to candidates. May be empty.
questions[].questionEach interview question.
questions[].evaluation_criteriaOptional rubric used by the AI evaluator for that question.
company_nameCompany name displayed to candidates. Inherits the org default if not set.
client_nameInternal client/team label, never shown to candidates.
template_idTemplate UUID if the interview was created from a template, else null.
share_linkPublic URL the candidate visits to take the interview.
statusOne of 'active', 'inactive', 'draft', 'archived'. New interviews default to 'active'.
voiceInterviewer voice. One of 'alloy', 'ash', 'ballad', 'cedar', 'coral', 'echo', 'marin', 'sage', 'verse'.
languagesISO-639-1 codes the candidate may use. First entry is primary.
durationTarget interview length in minutes. Default 15.
require_videoWhether candidates must enable their camera. Default false.
max_attemptsMaximum attempts per candidate. Default 999.
passing_scoreScore (0-100) above which the candidate passes. Default 70.
access_type'public' or 'invite-only'. Default 'public'.
redirect_urlOptional URL candidates are redirected to after finishing.
ai_personalityAI interviewer tone (e.g. 'professional', 'friendly', 'casual'). Default 'professional'.
created_atISO 8601 creation timestamp.
updated_atISO 8601 last-update timestamp.

Versioning#

The API is versioned in the URL path (/api/v1). We will introduce /api/v2 alongside v1 if we ever need a breaking change.

What is non-breaking#

  • Adding new endpoints.
  • Adding new optional request fields.
  • Adding new response fields. Always treat unknown fields as additive.
  • Adding new error codes within an existing error type.

What would be breaking (and trigger a v2)#

  • Removing or renaming an existing field.
  • Changing the type of an existing field, or making an optional field required.
  • Changing the meaning of an existing error code.

Changelog#

v1.0.0

May 2026

Initial release: ping, manual / template create, and AI generation from job description.
    API Reference