{
  "openapi": "3.1.0",
  "info": {
    "title": "Resume Parser",
    "version": "1.0.0",
    "summary": "Turn a resume — plain text, a PDF, or an image — into structured candidate data.",
    "description": "Turn a resume (plain text, a PDF, or an image) into structured candidate data for applicant tracking systems, recruiting CRMs, and staffing tools.\n\nGenerated from the service's own TypeScript contract types, so this document describes what the API actually returns. Operated by EAC Ventures, LLC.\n\nSubscribe, including the free tier: https://rapidapi.com/aervik-labs-aervik-labs-default/api/ai-resume-parser-candidate-data-extraction-api\n\nSources, freshness and live health: https://aerviklabs.com/sources.json (https://aerviklabs.com/data-sources/#resume-parser). What we do when something cannot be established: https://aerviklabs.com/trust/\n\nThis OpenAPI document is available under the MIT License (Copyright (c) 2026 EAC Ventures, LLC). Use of the API itself is governed by its Terms of Service, not by that license.",
    "contact": {
      "name": "Aervik Labs",
      "url": "https://aerviklabs.com/about/"
    },
    "x-aervik-provenance": {
      "sources_json": "https://aerviklabs.com/sources.json",
      "data_sources_page": "https://aerviklabs.com/data-sources/#resume-parser",
      "trust_page": "https://aerviklabs.com/trust/",
      "read_method": "input-only"
    },
    "termsOfService": "https://resume.aerviklabs.com/terms"
  },
  "externalDocs": {
    "description": "Product page",
    "url": "https://aerviklabs.com/apis/resume-parser/"
  },
  "servers": [
    {
      "url": "https://ai-resume-parser-candidate-data-extraction-api.p.rapidapi.com",
      "description": "RapidAPI gateway"
    }
  ],
  "security": [
    {
      "RapidApiKey": []
    }
  ],
  "paths": {
    "/parse": {
      "post": {
        "operationId": "parseResume",
        "summary": "Parse a resume (plain text, a PDF, or an image) into structured candidate data",
        "parameters": [
          {
            "$ref": "#/components/parameters/RapidApiHost"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ParseResponse"
                }
              }
            }
          },
          "400": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "405": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ParseRequest"
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "RapidApiKey": {
        "type": "apiKey",
        "in": "header",
        "name": "X-RapidAPI-Key",
        "description": "Your RapidAPI application key."
      }
    },
    "parameters": {
      "RapidApiHost": {
        "name": "X-RapidAPI-Host",
        "in": "header",
        "required": true,
        "schema": {
          "type": "string",
          "const": "ai-resume-parser-candidate-data-extraction-api.p.rapidapi.com"
        }
      }
    },
    "schemas": {
      "Contact": {
        "type": "object",
        "properties": {
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "As the model read it; not checked against the document. null when the model reported none."
          },
          "email": {
            "type": [
              "string",
              "null"
            ],
            "description": "Served only when the characters the model quoted from the document state this address. null either because no email was reported or because it was withheld; only a withheld value is named in withheld (contact.email), so a null that is not listed there means the model did not report an email."
          },
          "phone": {
            "type": [
              "string",
              "null"
            ],
            "description": "In the model's formatting, served only when the characters the model quoted from the document print these digits as one number; a country code the quote does not print is never added. null either because no phone number was reported or because it was withheld; only a withheld value is named in withheld (contact.phone)."
          },
          "location": {
            "type": [
              "string",
              "null"
            ],
            "description": "As the model read it; not checked against the document. null when the model reported none."
          }
        },
        "required": [
          "name",
          "email",
          "phone",
          "location"
        ]
      },
      "EducationEntry": {
        "type": "object",
        "properties": {
          "institution": {
            "type": [
              "string",
              "null"
            ],
            "description": "As the model read it; not checked against the document. null when the model reported none."
          },
          "degree": {
            "type": [
              "string",
              "null"
            ],
            "description": "As the model read it; not checked against the document. null when the model reported none."
          },
          "field": {
            "type": [
              "string",
              "null"
            ],
            "description": "As the model read it; not checked against the document. null when the model reported none."
          },
          "graduation_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "YYYY, YYYY-MM or YYYY-MM-DD, served only when the last date printed in the characters the model quoted for it states that value; a month or day the quote does not state unambiguously is not served. null either because none was reported or because it was withheld, and only a withheld value is named in withheld."
          }
        },
        "required": [
          "institution",
          "degree",
          "field",
          "graduation_date"
        ]
      },
      "ErrorResponse": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string",
            "description": "Stable machine-readable code. On parsing_failed, 422 means the document could not be parsed as sent (the model provider refused it, nothing at all was read from it, the reply could not be read into one complete result, or it has more content than fits in one response); 502 means the parse did not complete for another reason, such as the model provider failing, timing out, rate limiting or returning a reply that could not be used, and a retry may succeed."
          },
          "message": {
            "type": "string",
            "description": "A plain-language explanation for humans, whose wording may change. It never contains any part of the submitted resume."
          }
        },
        "required": [
          "error",
          "message"
        ],
        "description": "Every non-2xx JSON response from the API itself. `error` is a stable machine-readable code; `message` is for humans and may change. Codes this API can return: `blocked_file_url`, `input_too_large`, `invalid_base64`, `invalid_file_url`, `invalid_json`, `method_not_allowed`, `missing_input`, `missing_mime_type`, `multiple_inputs`, `not_found`, `parsing_failed`, `pdf_url_unsupported`, `provider_misconfigured`, `unauthorized`, `unsupported_input`, `unsupported_url_scheme`. RapidAPI answers authentication, subscription and rate-limit failures itself, in its own format."
      },
      "ParseRequest": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "description": "The resume as plain text: a non-empty string of up to 50,000 characters, measured as its JavaScript string length. Longer text is refused with input_too_large, never truncated. Send exactly one of text, file_url or base64_file."
          },
          "file_url": {
            "type": "string",
            "description": "A public https URL of an image of the resume, up to 2,048 characters. A URL whose host is a loopback, private-network or link-local address, or a known alias for one, is refused (blocked_file_url), and a URL whose path ends in .pdf is refused (pdf_url_unsupported), so send a PDF as base64_file. Send exactly one of text, file_url or base64_file."
          },
          "base64_file": {
            "type": "string",
            "description": "The resume file, base64-encoded (standard or URL-safe alphabet, padded or not; whitespace and a data:...;base64, prefix are accepted), up to 15,000,000 characters as sent. Requires mime_type; a media type in a data: prefix is not used in its place. Send exactly one of text, file_url or base64_file."
          },
          "mime_type": {
            "type": "string",
            "description": "Required with base64_file and not used with any other input. application/pdf is read as a PDF, any image/ type as an image, and text/plain or text/markdown as UTF-8 text; any other type, including DOCX and other office formats, is refused with unsupported_input."
          }
        }
      },
      "ParseResponse": {
        "type": "object",
        "properties": {
          "contact": {
            "$ref": "#/components/schemas/Contact",
            "description": "Always present with all four keys."
          },
          "work_history": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkHistoryEntry"
            },
            "description": "One entry per role the model reported, in the order it reported them; an entry's position is the index used in withheld. An empty list with no work_history_not_a_list warning means no role was reported."
          },
          "education": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EducationEntry"
            },
            "description": "One entry per education record the model reported, in the order it reported them; an entry's position is the index used in withheld. An empty list with no education_not_a_list warning means none was reported."
          },
          "skills": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Skills as the model reported them, not checked against the document and not mapped to a taxonomy. An empty list with no skills_not_a_list warning means no skills were reported."
          },
          "confidence": {
            "type": "number",
            "description": "The model's own rating of the parse, from 0 to 1; it is not a calibrated accuracy figure and nothing this API checks changes it. 0 when the model gave none, and 0 with an unreadable_confidence warning when its value could not be read as a number or was outside 0 to 1."
          },
          "warnings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ResumeWarning"
            },
            "description": "Present only when a check found something to report; a clean parse has no warnings key. Its absence means none of these checks found a problem, not that every value is correct."
          },
          "withheld": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Always present; [] when nothing was withheld. The path of each email, phone number or date the model reported that is served as null because it was not a string, because the characters the model quoted from the document do not state it (for text input, or a text/plain or text/markdown file, the quote must also occur in the submitted text), or because a role's start date is later than its end date (both dates are then withheld). Paths are contact.email, contact.phone, work_history[<i>].start_date, work_history[<i>].end_date and education[<i>].graduation_date, where <i> is the entry's position in the served list, each at most once. The check compares a value with the characters the model says it read; it does not re-read a PDF or image."
          }
        },
        "required": [
          "contact",
          "work_history",
          "education",
          "skills",
          "confidence",
          "withheld"
        ]
      },
      "ResumeWarning": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "work_history_not_a_list",
              "education_not_a_list",
              "skills_not_a_list",
              "unreadable_confidence"
            ],
            "description": "work_history_not_a_list, education_not_a_list, skills_not_a_list: the model returned that section as something other than a list, so none of it could be read and it is served as an empty list (a resume with no such section returns an empty list and no warning); unreadable_confidence: the model's confidence could not be read as a number or was outside 0 to 1, and confidence is served as 0."
          },
          "message": {
            "type": "string",
            "description": "A plain-language explanation, safe to show an end user. It never repeats the resume's content."
          }
        },
        "required": [
          "code",
          "message"
        ]
      },
      "WorkHistoryEntry": {
        "type": "object",
        "properties": {
          "company": {
            "type": [
              "string",
              "null"
            ],
            "description": "As the model read it; not checked against the document. null when the model reported none."
          },
          "title": {
            "type": [
              "string",
              "null"
            ],
            "description": "As the model read it; not checked against the document. null when the model reported none."
          },
          "start_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "YYYY, YYYY-MM or YYYY-MM-DD, served only when the first date printed in the characters the model quoted for it states that value; a month or day the quote does not state unambiguously is not served (03/04/2015 reads as 3 April or 4 March). null either because none was reported or because it was withheld, and only a withheld value is named in withheld."
          },
          "end_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "YYYY, YYYY-MM or YYYY-MM-DD, served only when the last date printed in the characters the model quoted for it states that value, with the same rule on an ambiguous month or day as start_date; or present, in the letter case the model used, when the quote prints at most one date and a word such as Present, Current, Now or To date comes after any date it prints. null either because none was reported or because it was withheld, and only a withheld value is named in withheld."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "description": "As the model read it; not checked against the document. null when the model reported none."
          }
        },
        "required": [
          "company",
          "title",
          "start_date",
          "end_date",
          "description"
        ]
      }
    }
  }
}
