When you upload a resume to Yeti Jobs, it doesn’t just get stored — it gets read. The platform extracts the full text from your PDF usingDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/tech-dipesh/yeti-Jobs/llms.txt
Use this file to discover all available pages before exploring further.
pdf-parse, sends it to a Groq-hosted AI model with a structured prompt, and returns a numeric ATS (Applicant Tracking System) compatibility score alongside a set of concrete improvement suggestions. The score and feedback are persisted in the ats_scores table and linked back to your user account so you can retrieve them at any time without re-uploading.
How the Scoring Pipeline Works
Upload your resume PDF
Send a
multipart/form-data POST request to the resume endpoint with your PDF attached under the resume field. The server validates the file is present before proceeding.Text extraction via pdf-parse
The backend instantiates a
PDFParse parser with the raw file buffer and calls getText(). This extracts all readable text from your PDF without requiring a file to be written to disk, keeping the operation fully in-memory.AI analysis via Groq API
The extracted text is passed to the
gemini utility (backend/src/utils/grok.js), which calls the Groq API using an OpenAI-compatible client. The call uses client.responses.create with model "openai/gpt-oss-20b" against base URL https://api.groq.com/openai/v1. The prompt instructs the model to return only a raw JSON object — no markdown, no code fences, no explanatory prose — with exactly two keys: ats_scores and feedback.The environment variable GROK_API must be set to a valid Groq API key for this step to succeed.Parallel storage operations
Using
Promise.all, the backend simultaneously:- Uploads the PDF to Supabase Storage (
resumebucket) and gets the public URL. - Inserts a new row into
ats_scoreswith thescore(integer fromats_scoreskey) andfeedback(JSONB array). - Updates the user’s
resume_urlcolumn in theuserstable.
ats_scores row is removed before the new data is written. All writes are wrapped in a database transaction (BEGIN / COMMIT / ROLLBACK).Upload Endpoint
multipart/form-data. The file field name must be resume.
201 Created:
Retrieving Your Score
Fetch your most recent resume URL and ATS analysis result. The query joinsats_scores with users and returns only the latest record ordered by created_at DESC.
Response Format
The API returns the data stored in theats_scores table, joined with the resume_url from users:
| Field | Type | Description |
|---|---|---|
score | integer (0–100) | ATS compatibility score. Higher is better. |
feedback | string array | Ordered list of actionable improvement points. |
resume_url | string | Public URL to your uploaded PDF in Supabase Storage. |
created_at | timestamp | When this analysis was performed. |
Database Schema
Scores are stored in theats_scores table:
feedback column is stored as JSONB, which allows efficient querying and indexing of individual feedback points if needed in the future.
AI Prompt Structure
The Groq API is called viaclient.responses.create with model "openai/gpt-oss-20b". The prompt enforces strict JSON-only output with no markdown or prose:
JSON.parse() via result.output_text. The ats_scores value from the model response is stored as score in the ats_scores database table. If the model deviates from the expected format, the parse will throw and the upload transaction is rolled back.