Convilyn Resume Match API (1.0.0)

Download OpenAPI specification:

Resume Match data schemas — a supplementary specification for goal_mode_openapi.yaml.

Overview

Resume Match is a Goal Mode workflow that takes a resume document and produces a scored, verified list of matching job openings. It reuses the same Goal Mode endpoints (POST /jobs/goal, PATCH /slots, POST /confirm, GET /status, GET /download, SSE events) defined in the base Goal Mode contract.

This spec documents only the Resume Match-specific data shapes:

  • Workflow catalog entry
  • Slot definitions (all optional)
  • Preflight rules
  • 7-step DAG pipeline
  • Result artifact schemas (MatchingJob, FitScore, etc.)

SKU Tiers (Deprecated — use resume_to_job_ready instead)

  • SKU 1 (resume_to_job_list): Parse → Extract Profile → Search → Normalize → Dedupe → flat job list
  • SKU 2 (resume_to_job_suggestions): SKU 1 + Batch URL Verify + LLM Fit Scoring → ranked, verified job list
  • SKU 4 (multi_source_aggregation): Jooble + ATS providers (Greenhouse, Lever, Workable) with source-priority dedup

Unified Workflow: resume_to_job_ready (Recommended)

The goal_lane.resume_to_job_ready workflow combines all 4 SKUs into a single 3-phase interactive experience with mid-execution checkpoints:

  • Phase 1: Resume analysis → profile_review checkpoint (user confirms titles/skills)
  • Phase 2: Job discovery & scoring → job_selection checkpoint (user selects target jobs)
  • Phase 3: Tailored resume generation → download ZIP with ready-to-apply resumes

User Flow (Unified Workflow)

  1. User uploads a resume (PDF or DOCX)
  2. System presents optional preference slots (country, location, remote, seniority)
  3. User fills slots (or skips — all are optional) and confirms
  4. Phase 1 executes: parse resume and extract profile
  5. Checkpoint: User reviews and confirms target titles and key skills
  6. Phase 2 executes: search, normalize, dedupe, verify, and score jobs
  7. Checkpoint: User selects which jobs to generate tailored resumes for (1-10)
  8. Phase 3 executes: generate tailored resumes and package as ZIP
  9. User downloads the ZIP with tailored resumes

User Flow (Legacy SKUs)

  1. User uploads a resume (PDF or DOCX)
  2. System presents optional slots (country, location, remote, seniority)
  3. User fills slots (or skips — all are optional)
  4. System executes a 7-step pipeline via 2 MCP servers (resume-profile-mcp, job-search-mcp)
  5. User receives a ranked list of matching jobs with fit scores and verification status

API Flow (uses base Goal Mode endpoints)

  1. POST /jobs/goal with workflowId: "goal_lane.resume_to_job_suggestions" + fileIds
  2. PATCH /jobs/goal/{jobSpecId}/slots — fill optional preferences
  3. POST /jobs/goal/{jobSpecId}/confirm — triggers 7-step DAG
  4. GET /jobs/goal/{jobSpecId}/status or SSE — poll progress
  5. GET /jobs/goal/{jobSpecId}/download — download result JSON

Resume Match

Resume Match workflow schemas and examples. All endpoints are defined in the base Goal Mode contract (goal_mode_openapi.yaml).

Create Resume Match Job

Create a Resume Match job using the base Goal Mode endpoint.

Provide workflowId: "goal_lane.resume_to_job_suggestions" to bypass NLP and route directly to the Resume Match pipeline.

Input requirements:

  • Exactly 1 resume file (PDF or DOCX)
  • Max file size: 10 MB
Request Body schema: application/json
required
goalText
string [ 3 .. 2000 ] characters

Natural language goal description. Required when workflowId is not provided.

workflowId
string or null

Explicit workflow ID from the catalog. When provided, bypasses NLP resolution and routes directly to the workflow. Mutually exclusive with goalText and userWorkflowId.

userWorkflowId
string or null^uw_[a-zA-Z0-9_-]+$

User-authored workflow ID (from the User Workflows Builder). When provided, the server loads the UserWorkflow, compiles it to a DestinationSpec, and runs it through the same Goal Lane agent.

Contract guarantees (enforced by the compiler, not this endpoint):

  • requiredSlots is empty — the agent never pauses to ask the user
  • toolPalette excludes request_user_input
  • specId of the resulting job is user_<ownerPrefix>.<workflowId>

Mutually exclusive with goalText and workflowId.

fileIds
Array of strings
Default: []

List of uploaded file IDs to process. Required (minItems: 1) when workflowId is not provided. May be empty for workflow-based jobs that collect files via checkpoints.

Responses

Request samples

Content type
application/json
Example
{
  • "workflowId": "goal_lane.resume_to_job_suggestions",
  • "fileIds": [
    ]
}

Response samples

Content type
application/json
{
  • "jobSpecId": "goal_rm_abc123",
  • "itemVersion": 1,
  • "goalText": "Find matching jobs for my resume",
  • "fileIds": [
    ],
  • "status": "slots_pending",
  • "progress": 0,
  • "resolvedDestinations": [
    ],
  • "pendingSlots": [
    ],
  • "filledSlots": { },
  • "preflightResult": {
    },
  • "tasks": [ ],
  • "createdAt": "2026-02-09T10:00:00Z",
  • "updatedAt": "2026-02-09T10:00:00Z"
}

Fill Resume Match Preferences

Fill optional preference slots for the Resume Match job.

All 4 slots are optional. Skipping them uses defaults (country=All, remote=Any, seniority=Any, no location filter). Users can fill any subset.

path Parameters
jobSpecId
required
string
Example: goal_abc123

Goal job specification ID

Request Body schema: application/json
required
required
Array of objects (SlotAnswer) non-empty

List of slot answers

expectedVersion
integer or null

Expected item version for optimistic locking

Responses

Request samples

Content type
application/json
Example
{
  • "answers": [
    ],
  • "expectedVersion": 1
}

Response samples

Content type
application/json
{
  • "jobSpecId": "goal_rm_abc123",
  • "itemVersion": 2,
  • "goalText": "Find matching jobs for my resume",
  • "fileIds": [
    ],
  • "status": "ready",
  • "progress": 0,
  • "pendingSlots": [ ],
  • "filledSlots": {
    },
  • "createdAt": "2026-02-09T10:00:00Z",
  • "updatedAt": "2026-02-09T10:00:05Z"
}

Confirm and Execute Resume Match Pipeline

Confirm the Resume Match job and start the 7-step DAG pipeline.

Returns 202 Accepted. The pipeline runs asynchronously through:

  1. Parse Resume Document (resume-profile-mcp)
  2. Extract Resume Profile (resume-profile-mcp)
  3. Search Matching Jobs (job-search-mcp)
  4. Normalize Job Postings (job-search-mcp)
  5. Deduplicate Job Postings (job-search-mcp)
  6. Batch Verify Job URLs (job-search-mcp)
  7. Score Job-Candidate Fit (resume-profile-mcp)

Use polling or SSE to track progress across the 7 steps.

path Parameters
jobSpecId
required
string
Example: goal_abc123

Goal job specification ID

Request Body schema: application/json
optional
expectedVersion
integer or null

Expected item version for optimistic locking

Responses

Request samples

Content type
application/json
{
  • "expectedVersion": 5
}

Response samples

Content type
application/json
{
  • "jobSpecId": "goal_rm_abc123",
  • "status": "queued",
  • "messageId": "msg_rm_5f6e7d8c",
  • "submittedAt": "2026-02-09T10:00:10Z",
  • "pollingUrl": "/api/v1/jobs/goal/goal_rm_abc123/status",
  • "tasks": [
    ]
}

Download Resume Match Results

Download the completed Resume Match results.

The result artifact is a JSON file containing a JobListResult object with scored, verified, and deduplicated job matches.

The artifact mimeType is application/json.

path Parameters
jobSpecId
required
string
Example: goal_abc123

Goal job specification ID

Responses

Response samples

Content type
application/json
{}