Tanova API Documentation

RESTful API for intelligent candidate evaluation and screening

Quick Start

1. Get Your API Key

Navigate to Settings → API Keys in your dashboard and create a new key.

2. Base URL

https://tanova.ai/api/v1

3. Authentication

Include your API key in the Authorization header:

Authorization: Bearer YOUR_API_KEY

4. Make Your First Request

curl -X POST https://tanova.ai/api/v1/jobs \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Senior Software Engineer",
    "company": "Acme Inc",
    "description": "We are looking for a senior engineer with 5+ years experience in JavaScript, React, and Node.js...",
    "is_public": true
  }'

Jobs

POST/api/v1/jobs

Create a new job posting

Request Body

{
  "title": "Senior Full-Stack Engineer",
  "company": "Acme Inc",
  "description": "Full job description including requirements, responsibilities, etc...",
  "requirements_json": {  // Optional - AI will extract from description if not provided
    "must_have_skills": ["React", "Node.js", "PostgreSQL"],
    "nice_to_have_skills": ["TypeScript", "Docker"],
    "years_experience": 5,
    "education_level": "Bachelor's degree"
  },
  "is_public": true,  // optional - default false
  "public_slug": "senior-fullstack-engineer"  // optional - auto-generated if not provided
}

Response

{
  "id": 123,
  "title": "Senior Full-Stack Engineer",
  "company": "Acme Inc",
  "is_public": true,
  "public_slug": "senior-fullstack-engineer",
  "public_url": "https://tanova.ai/jobs/senior-fullstack-engineer",
  "created_at": "2025-01-15T10:30:00Z"
}
GET/api/v1/jobs/{id}

Retrieve job details

Response

{
  "id": 123,
  "title": "Senior Full-Stack Engineer",
  "company": "Acme Inc",
  "description": "Full job description...",
  "requirements_json": {...},
  "is_public": true,
  "public_slug": "senior-fullstack-engineer",
  "applicant_count": 15,
  "created_at": "2025-01-15T10:30:00Z"
}

Candidates

POST/api/v1/candidates

Create a new candidate with CV text or URL

Request Body

{
  "name": "Jane Doe",
  "email": "jane@example.com", // optional
  "cv_text": "Full CV text...", // either cv_text or cv_url required
  "cv_url": "https://example.com/cv.pdf", // alternative to cv_text
  "source": "api" // optional
}

Response

{
  "id": 456,
  "name": "Jane Doe",
  "email": "jane@example.com",
  "cv_url": "https://tanova.ai/storage/cvs/456.pdf",
  "skills": ["JavaScript", "React", "Node.js"],
  "experience_years": 5,
  "created_at": "2025-01-15T10:35:00Z"
}

Quick Evaluations

POST/api/v1/quick-screens

Fast preliminary evaluation (15-30 seconds, 0.05 credits)

Request Body (Option 1: Existing Candidate)

{
  "job_id": 123,
  "candidate_id": 456  // Use existing candidate by ID
}

Request Body (Option 2: Inline Candidate Data)

{
  "job_id": 123,
  "candidate": {
    "name": "John Smith",
    "email": "john@example.com",
    "cv_text": "Full CV text..."
  }
}

Response

{
  "id": 789,
  "candidate_id": 457,
  "job_id": 123,
  "aggregate_score": 75,
  "passed_screen": true,
  "screening_reason": "Strong technical skills match",
  "hidden_gem_score": 15,
  "top_skills": ["JavaScript", "React", "PostgreSQL"],
  "experience_years": 6,
  "created_at": "2025-01-15T10:40:00Z"
}

Evaluations

POST/api/v1/evaluations

Asynchronous: Creates a new evaluation and queues it for processing. The evaluation takes 60 seconds to complete. Poll the GET endpoint to retrieve results. (1.0 credits)

⚡ Note: This endpoint returns immediately with status "processing". The evaluation runs asynchronously in a background queue. Use the GET endpoint to check when it's complete.

Request Body (Option 1: Existing Candidate)

{
  "job_id": 123,
  "candidate_id": 456  // Use existing candidate by ID
}

Request Body (Option 2: Inline Candidate Data)

{
  "job_id": 123,
  "candidate": {
    "name": "Sarah Johnson",
    "email": "sarah@example.com",
    "cv_text": "Full CV text..."
  }
}

Immediate Response (Status: Processing)

{
  "id": 890,
  "candidate_id": 458,
  "job_id": 123,
  "status": "processing",
  "aggregate_score": null,
  "recommendation": null,
  "summary": null,
  "created_at": "2025-01-15T10:45:00Z",
  "estimated_completion": "60 seconds"
}

Completed Response (After Polling GET /api/v1/evaluations/{id})

{
  "id": 890,
  "candidate": {
    "id": 458,
    "name": "Sarah Johnson",
    "email": "sarah@example.com",
    "cv_url": "https://tanova.ai/storage/cvs/458.pdf"
  },
  "job": {
    "id": 123,
    "title": "Senior Full-Stack Engineer",
    "company": "Acme Inc"
  },
  "aggregate_score": 82,
  "recommendation": "yes",
  "confidence_level": "high",
  "summary": "Strong candidate with excellent technical skills...",
  "strengths": ["5+ years React experience", "Strong problem-solving"],
  "concerns": ["Limited backend experience"],
  "scores": {
    "qualification": 9,
    "capability": 9,
    "situational": 7,
    "reward": 8,
    "culture": 8,
    "career": 7,
    "compensation": 8
  },
  "high_level_assessment": {
    "skills": 9.0,
    "judgment": 8.0,
    "agency": 7.0
  },
  "hidden_gem_potential": "Self-taught developer with strong portfolio despite non-traditional background. Shows exceptional problem-solving ability.",
  "interview_questions": [
    "Tell me about your experience with React performance optimization",
    "How do you approach database design?"
  ],
  "status": "completed",
  "created_at": "2025-01-15T10:45:00Z",
  "updated_at": "2025-01-15T10:46:23Z"
}
GET/api/v1/evaluations/{id}

Retrieve evaluation details

Public Job Applicants

GET/api/v1/jobs/{slug}/applicants

Retrieve all applicants for a public job posting

Query Parameters

  • min_score - Filter by minimum score (default: 0)
  • passed_only - Show only passed screenings (default: false)
  • limit - Number of results (default: 50, max: 200)

Response

{
  "job": {
    "id": 123,
    "title": "Senior Full-Stack Engineer",
    "applicant_count": 15
  },
  "applicants": [
    {
      "id": 890,
      "candidate": {
        "id": 458,
        "name": "Sarah Johnson",
        "email": "sarah@example.com",
        "cv_url": "https://tanova.ai/storage/cvs/458.pdf"
      },
      "aggregate_score": 82,
      "recommendation": "yes",
      "summary": "Strong candidate...",
      "applied_at": "2025-01-15T10:45:00Z"
    }
  ],
  "total": 15,
  "page": 1
}

Understanding the Scoring System

High-Level Assessment

High-level scores (0-10) that consolidate the 7D framework into three research-backed predictors:

Skills (30%)
Can they do the job today?
Qualification (20%) + Capability (10%)
Judgment (45%)
Will they make good decisions?
Reward (22%) + Culture (15%) + Compensation (8%)
Initiative & Adaptability (25%)
Will they adapt and grow?
Career (13%) + Situational (12%)

Returns null if high-level scores haven't been calculated yet (older evaluations).

7-Dimensional (7D) Scores

Detailed breakdown across seven critical dimensions (scores 1-10):

Qualification: Skills & experience alignment with requirements
Capability: Confidence they can deliver based on track record
Situational: Likelihood to join & stay (career stability)
Reward: Upside potential if hire succeeds
Culture: Values & work style alignment
Career: Growth trajectory over time
Compensation: Salary expectations alignment

Aggregate Score

The aggregate score (0-100) is a weighted combination of the 7D scores, designed to predict overall job success. Scores above 70 typically indicate strong candidates worth interviewing.

Hidden Gem Potential

A text description identifying candidates who may be undervalued by traditional screening (self-taught developers, career changers, entrepreneurs). Returns null if no hidden gem signals detected.

Rate Limits

Professional Plan: 10 requests/minute

API Plan: 60 requests/minute

Enterprise: Custom limits

Rate limit headers included in all responses:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 58
X-RateLimit-Reset: 1642252800

Error Codes

400 Bad Request - Invalid parameters

401 Unauthorized - Invalid API key

402 Payment Required - Insufficient credits

403 Forbidden - Insufficient permissions

404 Not Found - Resource not found

429 Too Many Requests - Rate limit exceeded

500 Server Error - Contact support

Error Response Format

{
  "error": {
    "code": "invalid_parameter",
    "message": "Missing required field: job_id"
  }
}

Need Help?

Our team is here to help you integrate Tanova into your workflow