JSON Schema · draft-07 · v1.0.0

The open schema standard
for AI-native hiring.

One canonical shape for candidates, jobs, matches, and sync — so every résumé parser, ATS, job board, and LLM agent can finally speak the same language.

npm install @agent-resume/schemas

Hiring data is a tower of Babel

A résumé leaves a parser as one shape, lands in an ATS as another, gets re-shaped for a job board, and is flattened again before it ever reaches a model. Every integration is a bespoke mapping, every matching engine reinvents "what is a skill," and every LLM agent is handed a slightly different blob of JSON.

There's a good standard for the human résumé — JSON Resume — but nothing canonical for the parts machines now care about: normalized skills, requirement levels, knock-out logic, match scores, model evaluations, and the events that keep two systems in sync. agent-resume is that missing layer.

Four canonical schemas

Strict draft-07 JSON Schema, additionalProperties: false, semver-versioned $ids — with mirror TypeScript types and Ajv validators.

CCDM

Candidate Canonical Data Model

A structured candidate profile: experience, normalized skills with proficiency, education, work authorization, preferences, and AI enrichment — embeddings, seniority, generated summaries.

schema.json →
JD-CDM

Job Description Canonical Data Model

A structured posting: company, comp, responsibilities, and requirements tagged by level — Knock-Out / Required / Preferred / Optional.

schema.json →
MatchObject

Candidate ↔ Job match

A deterministic algorithmic score (always present) plus an optional LLM evaluation — recommendation, rationale, and requirement-by-requirement analysis.

schema.json →
SyncEvent

Signed sync envelope

An HMAC-authenticated webhook envelope for cross-system sync, covering 18 event types across candidates, jobs, applications, matches, evaluations, and scrapes.

schema.json →

Requirement levels: matching that reasons

JD-CDM tags every requirement with one of four levels. This is what lets a matcher reason instead of keyword-count.

LevelMeaningEffect on matching
Knock-OutHard gate (work authorization, an active clearance).Failing one sets knock_out_passed: false — the candidate does not advance, regardless of score.
RequiredMust-have to be competitive.Heavily weighted; gaps surface as critical.
PreferredStrong plus.Moderately weighted; raises the ceiling.
OptionalNice to have.Lightly weighted; tie-breaker only.

Quick start

Validate, convert, and sign — in a few lines.

import {
  validateCCDM,
  ccdmToJsonResume,
  signPayload,
  verifyPayload,
  type CCDM,
} from "@agent-resume/schemas";

// 1. Validate a parsed candidate against the canonical model.
const candidate = validateCCDM(parsedResume) as CCDM;

// 2. Export it to JSON Resume for any downstream renderer.
const resume = ccdmToJsonResume(candidate);

// 3. Ship a sync event with a tamper-proof signature.
const { header } = signPayload(body, process.env.WEBHOOK_SECRET);
// ...and verify on the receiving end:
const ok = verifyPayload(rawBody, signatureHeader, secret);

Complementary to JSON Resume — not a competitor

JSON Resume is the standard for the human-facing résumé. CCDM is a superset built for machines and the rest of the pipeline. Adopting it is additive, and ccdmToJsonResume() exports back anytime.

JSON Resumeagent-resume (CCDM)
Primary audienceHumans rendering a résuméParsers, ATS, matchers, LLM agents
ScopeThe résumé documentCandidate + job + match + sync
SkillsFree-text name + keywordsNormalized skill, proficiency, years
Requirement levelsKnock-Out / Required / Preferred / Optional
Matching & evaluationFirst-class MatchObject
AI enrichmentEmbeddings, seniority, semantic keywords
InteropccdmToJsonResume()

Build on the standard.

It's a community standard — proposals, adapters, and new language bindings are all welcome.