Parse a Resume in PHP &amp; Laravel: 2 Packages, 15 Minutes   [ResumeParser.pro](https://resumeparser.pro)

 - [Parsing API](https://resumeparser.pro/resume-parsing-api)
- [Match Score API](https://resumeparser.pro/resume-job-match-score-api)
- [Sample JSON](https://resumeparser.pro/resume-to-json)
- [Guides](https://resumeparser.pro/guides)
- [Glossary](https://resumeparser.pro/glossary)
- [Get API key](https://sharpapi.com/en/resume-parsing-api?utm_source=resumeparser.pro&utm_medium=referral&utm_campaign=parse-resume-php-laravel&utm_content=nav)

   1. [Home](https://resumeparser.pro)
2. [Guides](https://resumeparser.pro/guides)
3. Parse Resumes in PHP and Laravel

 Parse Resumes in PHP and Laravel
================================

Two official Composer packages, one for parsing and one for match scoring, plus a raw Guzzle fallback for framework-free PHP. Working code for all three, nothing hypothetical.

Updated 9 August 2026 · by the SharpAPI team

  To parse a resume in Laravel, install sharpapi/laravel-resume-parser, set SHARP\_API\_KEY in your .env, and call ResumeParserService::parseResume(). The service returns a status URL; fetchResults() polls it and hands you the structured candidate data.

Laravel — the parser package
----------------------------

  composer require sharpapi/laravel-resume-parser ```
use SharpAPI\ResumeParser\ResumeParserService;

class ImportResumeController extends Controller
{
    public function __construct(private ResumeParserService $resumeParser) {}

    public function store(Request $request)
    {
        $path = $request->file('resume')->getRealPath();

        $statusUrl = $this->resumeParser->parseResume($path, 'English');

        $result = $this->resumeParser->fetchResults($statusUrl);

        return response()->json($result->getResultJson());
    }
}
```

 fetchResults() handles the polling loop internally — each job typically finishes in a few seconds. For upload-heavy apps, move the two calls into a queued job so the HTTP request returns instantly.

Laravel — match scoring, same pattern
-------------------------------------

 The sibling package sharpapi/laravel-resume-job-match-score scores the parsed candidate against a job description — including the context directives that tune the weighting:

  composer require sharpapi/laravel-resume-job-match-score ```
use SharpAPI\ResumeMatchScore\ResumeMatchScoreService;

$service = new ResumeMatchScoreService();

$context = "EMPHASIZE: backend scalability\n"
    ."DEEMPHASIZE: frontend frameworks\n"
    ."CREDIT: AWS";

$statusUrl = $service->matchResumeToJob(
    storage_path('resumes/candidate.pdf'),
    'We are hiring a Senior Backend Developer (PHP/Laravel)…',
    'English',
    $context,
);

$scores = $service->fetchResults($statusUrl)->toArray();
// $scores['match_scores']['overall_match'] → 0–100
```

Plain PHP — no framework, no package
------------------------------------

The endpoint is ordinary multipart REST, so Guzzle alone covers it:

  Guzzle — framework-free ```
$client = new \GuzzleHttp\Client();

$submit = $client->post('https://sharpapi.com/api/v1/hr/parse_resume', [
    'headers' => ['Authorization' => 'Bearer '.$apiKey],
    'multipart' => [
        ['name' => 'file', 'contents' => fopen('candidate.pdf', 'r')],
        ['name' => 'language', 'contents' => 'English'],
    ],
]);

$statusUrl = json_decode((string) $submit->getBody(), true)['status_url'];

do {
    sleep(2);
    $job = json_decode((string) $client->get($statusUrl, [
        'headers' => ['Authorization' => 'Bearer '.$apiKey],
    ])->getBody(), true);
} while ($job['data']['attributes']['status'] === 'pending');

$candidate = $job['data']['attributes']['result'];
```

Where to take it
----------------

 The full response schema is explorable at [resume to JSON](https://resumeparser.pro/resume-to-json); the [field reference](https://resumeparser.pro/what-fields-does-a-resume-parser-extract) lists all 50+ fields for your migrations. Parsing a legacy database of CVs? The [bulk parsing guide](https://resumeparser.pro/guides/bulk-resume-parsing) covers queues, webhooks and cost estimation for Laravel specifically.

 Parse your first resume today
-----------------------------

Send a PDF, DOCX or photo CV to the SharpAPI Resume Parsing API and get 50+ structured JSON fields back — no models to train, no OCR vendor to add.

 [Start parsing free](https://sharpapi.com/en/resume-parsing-api?utm_source=resumeparser.pro&utm_medium=referral&utm_campaign=parse-resume-php-laravel&utm_content=article-end) [Endpoint docs](https://sharpapi.com/documentation?utm_source=resumeparser.pro&utm_medium=referral&utm_campaign=parse-resume-php-laravel&utm_content=article-end-docs) 

14-day trial · 100,000 words included · No credit card · 30-day money-back guarantee

 Questions, answered
-------------------

  Is there an official Laravel package?Yes — composer require sharpapi/laravel-resume-parser. Set SHARP\_API\_KEY in .env, inject ResumeParserService, and call parseResume($path, $language). A sibling package covers job match scoring.

   Can I use plain PHP without Laravel?Yes — the endpoint is standard multipart REST, so Guzzle or curl works directly. The Laravel package just removes the boilerplate: auth header, multipart encoding and the polling loop.

   How should I parse thousands of resumes in Laravel?Dispatch one queued job per file and let each submit to the API and register a webhook. The API side is async by design, so your queue concurrency is the only throttle. Details in the bulk parsing guide.

   Further reading
---------------

- [Parse a Resume in Python: PDF to JSON in Under 30 Lines](https://resumeparser.pro/guides/parse-resume-python) A working Python tutorial: send a PDF resume to a parsing API, poll the async job and read 50+ structured fields — requests-only, no ML setup.
- [Parse a Resume in Node.js: Async PDF to JSON Tutorial](https://resumeparser.pro/guides/parse-resume-nodejs) Node.js tutorial for resume parsing: multipart upload with fetch, async job polling, typed access to 50+ candidate fields. Copy-paste ready.
- [Resume Parsing API — PDF, DOCX &amp; Photo CVs to JSON (80+ Langs)](https://resumeparser.pro/resume-parsing-api) AI resume parsing API: send a PDF, DOCX, RTF, TXT or photo CV, get back 50+ structured JSON fields. 80+ languages, OCR included, async REST, from $50/mo.
- [Bulk Resume Parsing: 10,000 Legacy CVs Without a Meltdown](https://resumeparser.pro/guides/bulk-resume-parsing) Turn a folder of 10,000 legacy CVs into a searchable candidate database: async job queues, webhooks, rate strategy, dedupe and cost estimation.

    ResumeParser.pro — a free resource on resume parsing and candidate matching, written and maintained by the team behind [SharpAPI](https://sharpapi.com/?utm_source=resumeparser.pro&utm_medium=referral&utm_campaign=parse-resume-php-laravel&utm_content=footer). The APIs documented here: [Resume Parsing API](https://sharpapi.com/en/resume-parsing-api?utm_source=resumeparser.pro&utm_medium=referral&utm_campaign=parse-resume-php-laravel&utm_content=footer) and [Resume Job Match Score API](https://sharpapi.com/en/resume-job-match-score-api?utm_source=resumeparser.pro&utm_medium=referral&utm_campaign=parse-resume-php-laravel&utm_content=footer). SDKs on [GitHub](https://github.com/sharpapi).

 On this site: [What is resume parsing](https://resumeparser.pro/what-is-resume-parsing)·[How parsing works](https://resumeparser.pro/how-does-resume-parsing-work)·[Extracted fields](https://resumeparser.pro/what-fields-does-a-resume-parser-extract)·[Resume to JSON](https://resumeparser.pro/resume-to-json)·[Best parser APIs](https://resumeparser.pro/guides/best-resume-parser-apis)·[All guides](https://resumeparser.pro/guides)·[Glossary](https://resumeparser.pro/glossary)·[About](https://resumeparser.pro/about)

 No cookies, no tracking pixels, no popups. © 2026 [A2Z Web](https://a2zweb.co).

 A Markdown version of this page is available at https://resumeparser.pro/guides/parse-resume-php-laravel.md, optimized for AI and LLM tools.
