Check a PDF for ATS readability
curl --request POST \
--url https://rxresu.me/api/openapi/pdf-checks \
--header 'Content-Type: multipart/form-data' \
--form 'file=<string>' \
--form 'jobDescription=<string>'import requests
url = "https://rxresu.me/api/openapi/pdf-checks"
payload = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"jobDescription\"\r\n\r\n<string>\r\n-----011000010111000001101001--"
headers = {"Content-Type": "multipart/form-data"}
response = requests.post(url, data=payload, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '<string>');
form.append('jobDescription', '<string>');
const options = {method: 'POST'};
options.body = form;
fetch('https://rxresu.me/api/openapi/pdf-checks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://rxresu.me/api/openapi/pdf-checks",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"jobDescription\"\r\n\r\n<string>\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://rxresu.me/api/openapi/pdf-checks"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"jobDescription\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://rxresu.me/api/openapi/pdf-checks")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"jobDescription\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://rxresu.me/api/openapi/pdf-checks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"jobDescription\"\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"version": 1,
"score": 123,
"cappedBy": [
"NO_TEXT_LAYER"
],
"categories": [
{
"category": "parseability",
"score": 123,
"weight": 123,
"applicableChecks": 123,
"passedChecks": 123,
"skippedChecks": 123
}
],
"checks": [
{
"code": "NO_TEXT_LAYER",
"category": "parseability",
"severity": "blocker",
"status": "pass",
"findings": [
{
"code": "NO_TEXT_LAYER",
"severity": "blocker",
"category": "parseability",
"params": {},
"evidence": {
"snippet": "<string>",
"page": 123,
"box": {
"x": 123,
"y": 123,
"width": 123,
"height": 123
}
}
}
],
"skipReason": "no-text"
}
],
"findings": [
{
"code": "NO_TEXT_LAYER",
"severity": "blocker",
"category": "parseability",
"params": {},
"evidence": {
"snippet": "<string>",
"page": 123,
"box": {
"x": 123,
"y": 123,
"width": 123,
"height": 123
}
}
}
],
"tips": [
{
"code": "NO_TEXT_LAYER",
"severity": "blocker",
"category": "parseability",
"params": {},
"evidence": {
"snippet": "<string>",
"page": 123,
"box": {
"x": 123,
"y": 123,
"width": 123,
"height": 123
}
}
}
],
"counts": {
"blocker": 123,
"warning": 123,
"tip": 123
},
"applicableChecks": 123,
"passedChecks": 123,
"skippedChecks": 123,
"jd": {
"terms": [
{
"term": "<string>",
"jdCount": 123,
"resumeCount": 123,
"weight": 123
}
],
"matchedTerms": [
"<string>"
],
"missingTerms": [
"<string>"
],
"totalTerms": 123,
"matchedCount": 123,
"weightedCoverage": 123,
"stuffedTerms": [
"<string>"
],
"documentHasHiddenText": true
},
"file": {
"name": "<string>",
"sizeBytes": 123,
"magicBytesOk": true
},
"document": {
"pageCount": 123,
"truncated": true,
"wordCount": 123,
"operatorsAvailable": true
},
"fullText": "<string>"
}{
"defined": true,
"code": "<string>",
"status": 123,
"message": "<string>",
"data": "<unknown>"
}Checks
Check a PDF for ATS readability
Multipart PDF upload, up to 25 MB. Processes at most 30 pages, reports truncation and skipped checks, and stores nothing. Rate limited per client address. No authentication required.
POST
/
pdf-checks
Check a PDF for ATS readability
curl --request POST \
--url https://rxresu.me/api/openapi/pdf-checks \
--header 'Content-Type: multipart/form-data' \
--form 'file=<string>' \
--form 'jobDescription=<string>'import requests
url = "https://rxresu.me/api/openapi/pdf-checks"
payload = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"jobDescription\"\r\n\r\n<string>\r\n-----011000010111000001101001--"
headers = {"Content-Type": "multipart/form-data"}
response = requests.post(url, data=payload, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '<string>');
form.append('jobDescription', '<string>');
const options = {method: 'POST'};
options.body = form;
fetch('https://rxresu.me/api/openapi/pdf-checks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://rxresu.me/api/openapi/pdf-checks",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"jobDescription\"\r\n\r\n<string>\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://rxresu.me/api/openapi/pdf-checks"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"jobDescription\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://rxresu.me/api/openapi/pdf-checks")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"jobDescription\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://rxresu.me/api/openapi/pdf-checks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"jobDescription\"\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"version": 1,
"score": 123,
"cappedBy": [
"NO_TEXT_LAYER"
],
"categories": [
{
"category": "parseability",
"score": 123,
"weight": 123,
"applicableChecks": 123,
"passedChecks": 123,
"skippedChecks": 123
}
],
"checks": [
{
"code": "NO_TEXT_LAYER",
"category": "parseability",
"severity": "blocker",
"status": "pass",
"findings": [
{
"code": "NO_TEXT_LAYER",
"severity": "blocker",
"category": "parseability",
"params": {},
"evidence": {
"snippet": "<string>",
"page": 123,
"box": {
"x": 123,
"y": 123,
"width": 123,
"height": 123
}
}
}
],
"skipReason": "no-text"
}
],
"findings": [
{
"code": "NO_TEXT_LAYER",
"severity": "blocker",
"category": "parseability",
"params": {},
"evidence": {
"snippet": "<string>",
"page": 123,
"box": {
"x": 123,
"y": 123,
"width": 123,
"height": 123
}
}
}
],
"tips": [
{
"code": "NO_TEXT_LAYER",
"severity": "blocker",
"category": "parseability",
"params": {},
"evidence": {
"snippet": "<string>",
"page": 123,
"box": {
"x": 123,
"y": 123,
"width": 123,
"height": 123
}
}
}
],
"counts": {
"blocker": 123,
"warning": 123,
"tip": 123
},
"applicableChecks": 123,
"passedChecks": 123,
"skippedChecks": 123,
"jd": {
"terms": [
{
"term": "<string>",
"jdCount": 123,
"resumeCount": 123,
"weight": 123
}
],
"matchedTerms": [
"<string>"
],
"missingTerms": [
"<string>"
],
"totalTerms": 123,
"matchedCount": 123,
"weightedCoverage": 123,
"stuffedTerms": [
"<string>"
],
"documentHasHiddenText": true
},
"file": {
"name": "<string>",
"sizeBytes": 123,
"magicBytesOk": true
},
"document": {
"pageCount": 123,
"truncated": true,
"wordCount": 123,
"operatorsAvailable": true
},
"fullText": "<string>"
}{
"defined": true,
"code": "<string>",
"status": 123,
"message": "<string>",
"data": "<unknown>"
}Response
OK
Available options:
NO_TEXT_LAYER, IMAGE_ONLY_DOCUMENT, GARBLED_TEXT, TYPE3_FONT, INVALID_EMBEDDED_FONT, FILE_TOO_LARGE, ENCRYPTED_PDF, XFA_FORM, PDF_PORTFOLIO, REPLACEMENT_CHARACTERS, PRIVATE_USE_CHARACTERS, LIGATURE_CHARACTERS, NON_EMBEDDED_FONTS, INVISIBLE_TEXT, WHITE_TEXT, LOW_TEXT_DENSITY, HIGH_IMAGE_COVERAGE, LOST_WORD_SPACING, SPLIT_CHARACTER_SPACING, VERTICAL_TEXT, ROTATED_PAGES, ACROFORM_FIELDS, NON_STANDARD_PAGE_SIZE, UNTAGGED_PDF, MISSING_DOCUMENT_LANGUAGE, LARGE_FILE_SIZE, TRUNCATED_ANALYSIS, MULTI_COLUMN_LAYOUT, READING_ORDER_INVERSION, READING_ORDER_RISK, COLUMN_GUTTER, TABLE_LIKE_LAYOUT, TEXT_IN_MARGIN_ZONE, TIGHT_LINE_SPACING, SMALL_BODY_TEXT, MANY_DISTINCT_FONTS, NARROW_PAGE_MARGINS, TEXT_OUTSIDE_PAGE, NON_STANDARD_BULLET_GLYPHS, REPEATED_HEADER_FOOTER, DENSE_PAGE, NO_EXPERIENCE_SECTION, NO_RECOGNIZED_HEADINGS, FEW_SECTION_HEADINGS, NO_EDUCATION_SECTION, NO_SKILLS_SECTION, HEADINGS_NOT_DISTINGUISHED, VERY_SHORT_DOCUMENT, NO_BULLET_POINTS, NO_ROLE_LINES, NO_SUMMARY_SECTION, NO_EMAIL, NO_PHONE, NO_NAME_LINE, CONTACT_NOT_ON_FIRST_PAGE, EMAIL_SPLIT_ACROSS_ITEMS, LINK_TEXT_URL_MISMATCH, MULTIPLE_EMAILS, NO_PROFESSIONAL_LINK, BARE_URL_WITHOUT_PROTOCOL, PHONE_FORMAT_UNUSUAL, NO_DATES_FOUND, FEW_DATES, UNPARSEABLE_DATE_RANGE, REVERSED_DATE_RANGE, FUTURE_DATED_ENTRY, MIXED_DATE_FORMATS, NO_CURRENT_ROLE_MARKER, AMBIGUOUS_NUMERIC_DATE, NO_QUANTIFIED_IMPACT, WEAK_ACTION_VERBS, FIRST_PERSON_PRONOUNS, LONG_BULLETS, HIGH_PAGE_COUNT, EMPLOYMENT_GAP, ALL_CAPS_RUNS, REPEATED_PHRASES Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Extracted text in reading order, for the optional AI review.