Developer docs

API reference

Explore resume parsing, evidence-based match analysis, resume checking, candidate ranking, and recruiter communication endpoints.

Backend file parsing
Server-side AI calls
Schema-validated JSON

RapidAPI base URL

https://hiresignal-api.p.rapidapi.com

Public examples use the RapidAPI gateway. Include `X-RapidAPI-Key` and `X-RapidAPI-Host: hiresignal-api.p.rapidapi.com` on every RapidAPI request.

Which analysis endpoint should I use?

File analysis

Use this when you have resume files. Send PDF, DOC, DOCX, or TXT files with a job description, and the API handles parsing before analysis.

POST /api/v1/analyze-match/files

Batch analysis

Use this when resume text is already extracted. Send up to 15 resume texts with one job description and receive ranked match results.

POST /api/v1/analyze-batch

Health Check

GET /api/health

{ "status": "ok", "service": "HireSignal API" }

Resume Text Extraction

PDF, DOC, DOCX, and TXT files are sent as multipart form data to the backend route below. The API validates file type, file size, and file count before extracting text server-side.

POST /api/extract-resume-text

curl

curl -X POST https://hiresignal-api.p.rapidapi.com/api/extract-resume-text \
  -H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
  -H "X-RapidAPI-Host: hiresignal-api.p.rapidapi.com" \
  -F "files=@resume.pdf" \
  -F "files=@portfolio.docx" \
  -F "files=@resume.doc" \
  -F "files=@resume.txt"

JavaScript

const formData = new FormData();
formData.append("files", resumePdf);
formData.append("files", portfolioDocx);

const response = await fetch("https://hiresignal-api.p.rapidapi.com/api/extract-resume-text", {
  method: "POST",
  headers: {
    "X-RapidAPI-Key": "YOUR_RAPIDAPI_KEY",
    "X-RapidAPI-Host": "hiresignal-api.p.rapidapi.com"
  },
  body: formData
});

const parsed = await response.json();

Response

{
  "text": "Resume 1: alex-morgan.pdf\nAlex Morgan is an operations analyst...",
  "files": [
    {
      "fileName": "alex-morgan.pdf",
      "text": "Alex Morgan is an operations analyst...",
      "characterCount": 2840
    }
  ]
}

Resume Job Match Endpoint

POST /api/v1/analyze-match

Compares a resume against any job description and returns structured hiring insights for candidate screening, ranking, and interview preparation. Match responses include score confidence, requirement-level evidence, missing requirements, and ambiguity warnings to support recruiter review.

Request

{
  "resumeText": "Alex Morgan\nProfessional Summary\nOperations analyst with 5 years of experience improving reporting workflows...\nSkills\nExcel, CRM reporting, SQL basics",
  "jobDescription": "We are hiring an Operations Analyst to manage KPI reporting, analyze CRM data, and improve business processes."
}

Response

{
  "overallScore": 86,
  "confidenceScore": 78,
  "recommendation": "Strong Match",
  "scoreRationale": "The candidate has direct evidence for most core operations requirements, while advanced SQL depth is not clearly supported.",
  "summary": "The candidate aligns well with the operations analyst role, especially in reporting, CRM data quality, and process improvement.",
  "strengths": [
    "Relevant operations experience",
    "Strong reporting background"
  ],
  "weaknesses": [
    "Limited evidence of advanced SQL"
  ],
  "missingSkills": [
    "Advanced SQL"
  ],
  "riskFlags": [],
  "matchedRequirements": [
    {
      "requirement": "CRM reporting",
      "evidence": "Resume describes ownership of CRM reporting and KPI dashboards.",
      "strength": "strong"
    }
  ],
  "unmatchedRequirements": [
    "Advanced SQL"
  ],
  "ambiguityWarnings": [
    "Resume mentions SQL basics but does not show query complexity or production use."
  ],
  "interviewQuestions": [
    "Describe a KPI dashboard you built or maintained."
  ],
  "candidate": {
    "name": "Alex Morgan",
    "email": "alex@example.com",
    "phone": "+1 555 0100",
    "skills": [
      "Excel",
      "CRM reporting",
      "Process improvement"
    ],
    "yearsOfExperience": 5
  }
}

curl

curl -X POST https://hiresignal-api.p.rapidapi.com/api/v1/analyze-match \
  -H "Content-Type: application/json" \
  -H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
  -H "X-RapidAPI-Host: hiresignal-api.p.rapidapi.com" \
  -d '{
  "resumeText": "Alex Morgan\nProfessional Summary\nOperations analyst with 5 years of experience improving reporting workflows...\nSkills\nExcel, CRM reporting, SQL basics",
  "jobDescription": "We are hiring an Operations Analyst to manage KPI reporting, analyze CRM data, and improve business processes."
}'

JavaScript

const response = await fetch("https://hiresignal-api.p.rapidapi.com/api/v1/analyze-match", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-RapidAPI-Key": "YOUR_RAPIDAPI_KEY",
    "X-RapidAPI-Host": "hiresignal-api.p.rapidapi.com"
  },
  body: JSON.stringify({
    resumeText,
    jobDescription
  })
});

const analysis = await response.json();

File Match Analysis Endpoint

POST /api/v1/analyze-match/files

Upload resume files and a job description in one request. The API extracts text server-side, analyzes the combined resume content, and returns structured match results.

JavaScript

const formData = new FormData();
formData.append("jobDescription", jobDescription);
formData.append("files", resumePdf);

const response = await fetch("https://hiresignal-api.p.rapidapi.com/api/v1/analyze-match/files", {
  method: "POST",
  headers: {
    "X-RapidAPI-Key": "YOUR_RAPIDAPI_KEY",
    "X-RapidAPI-Host": "hiresignal-api.p.rapidapi.com"
  },
  body: formData
});

const analysis = await response.json();

Batch Analysis Endpoint

POST /api/v1/analyze-batch

Analyze up to 15 resume texts against one job description and return results ordered by match score.

Request

{
  "jobDescription": "We are hiring an Operations Analyst to manage KPI reporting and CRM data quality.",
  "resumes": [
    {
      "id": "candidate_001",
      "fileName": "alex-morgan.txt",
      "resumeText": "Alex Morgan\nProfessional Summary\nOperations analyst with 5 years of reporting experience..."
    }
  ]
}

Response

{
  "count": 1,
  "results": [
    {
      "id": "candidate_001",
      "fileName": "alex-morgan.txt",
      "analysis": {
        "overallScore": 90,
        "confidenceScore": 82,
        "recommendation": "Strong Match",
        "scoreRationale": "The candidate directly supports most required operations analytics responsibilities.",
        "summary": "Candidate is highly aligned with the target role.",
        "strengths": [
          "KPI reporting",
          "CRM data quality"
        ],
        "weaknesses": [
          "Limited SQL depth"
        ],
        "missingSkills": [
          "Advanced SQL"
        ],
        "riskFlags": [],
        "matchedRequirements": [
          {
            "requirement": "KPI reporting",
            "evidence": "Resume lists KPI dashboard ownership.",
            "strength": "strong"
          }
        ],
        "unmatchedRequirements": [
          "Advanced SQL"
        ],
        "ambiguityWarnings": [
          "SQL evidence is limited."
        ],
        "interviewQuestions": [
          "Describe your reporting workflow."
        ],
        "candidate": {
          "name": "Alex Morgan",
          "email": "alex@example.com",
          "phone": "+1 555 0100",
          "skills": [
            "Excel",
            "CRM reporting"
          ],
          "yearsOfExperience": 5
        }
      }
    }
  ]
}

Resume Checker Endpoint

POST /api/v1/resume-checker

Performs recruiter-grade resume analysis for ATS compatibility, readability, professionalism, keyword coverage, structure, and hiring competitiveness.

Request

{
  "resumeText": "Full resume text..."
}

Response

{
  "resumeScore": 82,
  "atsScore": 86,
  "readabilityScore": 80,
  "professionalismScore": 88,
  "summary": "The resume is competitive but should include stronger measurable achievements.",
  "strengths": [
    "Clear role progression",
    "Relevant operations skills"
  ],
  "weaknesses": [
    "Limited quantified impact"
  ],
  "criticalIssues": [
    "Professional summary is too generic"
  ],
  "improvementRecommendations": [
    "Add metrics to recent bullet points"
  ],
  "missingSections": [
    "Certifications"
  ],
  "keywordSuggestions": [
    "KPI reporting",
    "CRM analytics"
  ],
  "grammarIssues": [
    "Inconsistent verb tense in one experience bullet"
  ],
  "redundancies": [
    "Repeated use of responsible for"
  ],
  "recommendedSkills": [
    "Advanced Excel",
    "SQL"
  ],
  "recommendedCertifications": [
    "Google Data Analytics Certificate"
  ],
  "bulletPointImprovements": [
    "Replace task-based bullets with outcome-based bullets"
  ],
  "optimizedProfessionalSummary": "Operations analyst with 5+ years of experience improving KPI reporting, CRM data quality, and cross-functional business processes.",
  "optimizedBulletExamples": [
    "Improved reporting turnaround by 32% by standardizing weekly KPI dashboards."
  ]
}

curl

curl -X POST https://hiresignal-api.p.rapidapi.com/api/v1/resume-checker \
  -H "Content-Type: application/json" \
  -H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
  -H "X-RapidAPI-Host: hiresignal-api.p.rapidapi.com" \
  -d '{
  "resumeText": "Full resume text..."
}'

JavaScript

const response = await fetch("https://hiresignal-api.p.rapidapi.com/api/v1/resume-checker", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-RapidAPI-Key": "YOUR_RAPIDAPI_KEY",
    "X-RapidAPI-Host": "hiresignal-api.p.rapidapi.com"
  },
  body: JSON.stringify({ resumeText })
});

const analysis = await response.json();

Job Requirements Endpoint

POST /api/v1/extract-job-requirements

Converts a job description into structured hiring requirements for screening, matching, and workflow automation.

Request

{
  "jobDescription": "Full job description..."
}

Response

{
  "roleTitle": "Operations Analyst",
  "seniorityLevel": "Mid-level",
  "employmentType": "Not specified",
  "locationRequirements": [],
  "requiredSkills": [
    "Excel",
    "CRM reporting",
    "Process improvement"
  ],
  "preferredSkills": [
    "SQL",
    "Dashboard reporting"
  ],
  "responsibilities": [
    "Manage KPI reporting",
    "Analyze CRM data"
  ],
  "requiredExperience": [
    "Experience in operations or business analytics"
  ],
  "educationRequirements": [],
  "certifications": [],
  "toolsAndTechnologies": [
    "Excel",
    "CRM"
  ],
  "softSkills": [
    "Stakeholder communication"
  ],
  "keywords": [
    "KPI reporting",
    "CRM data",
    "process improvement"
  ],
  "summary": "The role focuses on reporting, CRM analysis, and operational process improvement."
}

Candidate Ranking Endpoint

POST /api/v1/rank-candidates

Ranks existing match analyses and returns recruiter-friendly rationale, interview focus areas, and a hiring recommendation.

Request

{
  "candidates": [
    {
      "id": "candidate_001",
      "fileName": "alex-morgan.txt",
      "analysis": {
        "overallScore": 86,
        "confidenceScore": 78,
        "recommendation": "Strong Match",
        "scoreRationale": "The candidate has direct evidence for most core operations requirements, while advanced SQL depth is not clearly supported.",
        "summary": "The candidate aligns well with the operations analyst role, especially in reporting, CRM data quality, and process improvement.",
        "strengths": [
          "Relevant operations experience",
          "Strong reporting background"
        ],
        "weaknesses": [
          "Limited evidence of advanced SQL"
        ],
        "missingSkills": [
          "Advanced SQL"
        ],
        "riskFlags": [],
        "matchedRequirements": [
          {
            "requirement": "CRM reporting",
            "evidence": "Resume describes ownership of CRM reporting and KPI dashboards.",
            "strength": "strong"
          }
        ],
        "unmatchedRequirements": [
          "Advanced SQL"
        ],
        "ambiguityWarnings": [
          "Resume mentions SQL basics but does not show query complexity or production use."
        ],
        "interviewQuestions": [
          "Describe a KPI dashboard you built or maintained."
        ],
        "candidate": {
          "name": "Alex Morgan",
          "email": "alex@example.com",
          "phone": "+1 555 0100",
          "skills": [
            "Excel",
            "CRM reporting",
            "Process improvement"
          ],
          "yearsOfExperience": 5
        }
      }
    }
  ]
}

Response

{
  "summary": "Alex Morgan is the strongest available candidate based on score, relevant operations experience, and reporting alignment.",
  "topCandidate": "candidate_001",
  "rankedCandidates": [
    {
      "id": "candidate_001",
      "fileName": "alex-morgan.txt",
      "rank": 1,
      "candidateName": "Alex Morgan",
      "overallScore": 90,
      "recommendation": "Strong Match",
      "rationale": "Strong fit for operations reporting and CRM data quality responsibilities.",
      "keyStrengths": [
        "KPI reporting",
        "CRM data quality"
      ],
      "keyGaps": [
        "Advanced SQL"
      ],
      "interviewFocus": [
        "Reporting workflow",
        "Data quality process"
      ]
    }
  ],
  "hiringRecommendation": "Prioritize Alex Morgan for an interview."
}

Candidate Email Generation Endpoint

POST /api/v1/generate-candidate-email

Generates professional recruiter emails for acceptance, rejection, interview invitation, next steps, application received, and hold decisions. The response is plain text and structured for review before sending.

Request

{
  "candidateName": "Alex Morgan",
  "candidateEmail": "alex@example.com",
  "companyName": "Acme Operations",
  "roleTitle": "Operations Analyst",
  "decision": "interview_invite",
  "tone": "professional",
  "context": {
    "strengths": [
      "KPI reporting",
      "CRM data quality"
    ],
    "nextStep": "Schedule a 30-minute interview with the hiring team.",
    "recruiterName": "Jordan Lee",
    "schedulingLink": "https://cal.example.com/jordan"
  }
}

Response

{
  "subject": "Next steps for your Operations Analyst application",
  "previewText": "We would like to invite you to the next stage.",
  "body": "Hi Alex,\n\nThank you for your interest in the Operations Analyst role at Acme Operations. We were impressed by your experience with KPI reporting and CRM data quality.\n\nWe would like to invite you to a 30-minute interview with the hiring team. Please use this link to choose a convenient time: https://cal.example.com/jordan\n\nBest,\nJordan Lee"
}

Candidate Email Delivery Endpoint

POST /api/v1/send-candidate-email

Sends a reviewed candidate email through the configured email provider. Delivery requires server-side email configuration and a verified sender.

Request

{
  "to": "alex@example.com",
  "subject": "Next steps for your Operations Analyst application",
  "body": "Hi Alex,\n\nThank you for your interest...",
  "replyTo": "recruiting@example.com"
}

Response

{
  "id": "resend_email_id",
  "status": "sent"
}

OpenAPI Specification

GET /api/openapi.json

Machine-readable endpoint metadata for developer tooling, SDK generation, and API publishing workflows.

Error Responses

Status
Code
Meaning
400
Invalid request
Returned when JSON is malformed, required fields are missing, text is too short, or uploaded files fail validation.
400
Invalid upload
Returned when no file is provided, the file type is unsupported, more than 15 files are uploaded, or a file is larger than 5MB.
429
Rate limit exceeded
Returned when the request volume exceeds the allowed usage limit for the current API plan or enforcement window.
401
Unauthorized
Returned when a protected backend route is called without the required RapidAPI proxy authorization.
500
Analysis failure
Returned when an AI analysis, job requirement extraction, resume check, or candidate ranking request cannot be completed.
500
Missing server configuration
Returned when required server-side configuration such as OPENAI_API_KEY, RESEND_API_KEY, or EMAIL_FROM is missing.
502
Email provider failure
Returned when the configured email provider cannot deliver or rejects a candidate email request.

Response shape

{
  "error": "Resume text must be at least 120 characters.",
  "code": "BAD_REQUEST",
  "status": 400
}

{
  "error": "Rate limit exceeded. Please wait or upgrade your RapidAPI plan.",
  "code": "RATE_LIMITED",
  "status": 429
}

{
  "error": "Analysis failed. Please try again.",
  "code": "UPSTREAM_AI_ERROR",
  "status": 500
}

{
  "error": "Email provider rejected the request.",
  "code": "UPSTREAM_EMAIL_ERROR",
  "status": 502
}