CV JSON Schema
Reference for the Resume Builder JSON format
Overview
The resume is defined as a single JSON object with a "sections" array. Each element in the array is a section block that maps to a visual block in the PDF. Order matters — sections render top-to-bottom in the order they appear.
{
"sections": [
{ "type": "header", "..." : "..." },
{ "type": "summary", "..." : "..." },
{ "type": "section", "..." : "..." },
{ "type": "experience", "..." : "..." },
{ "type": "education", "..." : "..." },
{ "type": "keywords", "..." : "..." }
]
}
"section" blocks for Skills, Certifications, Awards, etc. Use multiple "experience" blocks for Work, Projects, Volunteer, etc. Rename titles freely.
Section Types
1. header
The candidate's name and contact line. Typically the first section.
| Field | Type | Description |
|---|---|---|
type | string | Must be "header" |
content.name | string | Full name |
content.contact | string | Contact info, pipe-separated: email | linkedin | phone | location |
{
"type": "header",
"content": {
"name": "Jane Smith",
"contact": "[email protected] | linkedin.com/in/janesmith | (555) 987-6543 | Lisbon, PT"
}
}
2. summary
A free-text block for professional summaries, objectives, or bios.
| Field | Type | Description |
|---|---|---|
type | string | Must be "summary" |
title | string | Section heading (e.g. "Professional Summary", "Objective") |
content.text | string | The summary paragraph |
{
"type": "summary",
"title": "Professional Summary",
"content": {
"text": "Backend engineer with 6+ years building distributed systems and data pipelines."
}
}
3. section
A generic bullet-point section. Use for skills, certifications, awards, languages, projects, or anything list-based.
| Field | Type | Description |
|---|---|---|
type | string | Must be "section" |
title | string | Section heading (e.g. "Core Competencies", "Certifications") |
content.bullets | string[] | Array of bullet-point strings |
{
"type": "section",
"title": "Core Competencies",
"content": {
"bullets": [
"Go, Python, TypeScript, SQL",
"PostgreSQL, Redis, Kafka, Docker, Kubernetes",
"CI/CD, Terraform, AWS (EC2, Lambda, S3)"
]
}
}
4. experience
Work experience with companies and roles. Each company can hold multiple roles (promotions). Each role has its own date range and achievement bullets.
| Field | Type | Description |
|---|---|---|
type | string | Must be "experience" |
title | string | Section heading (e.g. "Professional Experience", "Projects") |
content.jobs | object[] | Array of company objects |
jobs[].company | string | Company or organisation name |
jobs[].roles | object[] | Array of role objects within that company |
roles[].title | string | Job title or position |
roles[].period | string | Date range (e.g. "Jan 2022 - Present") |
roles[].bullets | string[] | Achievements or responsibilities |
{
"type": "experience",
"title": "Professional Experience",
"content": {
"jobs": [
{
"company": "Acme Corp",
"roles": [
{
"title": "Senior Backend Engineer",
"period": "Mar 2023 - Present",
"bullets": [
"Designed event-driven pipeline processing 2M+ events/day",
"Reduced P95 API latency from 800ms to 120ms"
]
},
{
"title": "Backend Engineer",
"period": "Jun 2021 - Feb 2023",
"bullets": [
"Built internal tooling used by 40+ engineers daily"
]
}
]
}
]
}
}
roles array. They render grouped under the company name.
5. education
Academic qualifications. Each entry is an institution with a degree, date range, and optional detail bullets.
| Field | Type | Description |
|---|---|---|
type | string | Must be "education" |
title | string | Section heading (e.g. "Education") |
content.entries | object[] | Array of education objects |
entries[].institution | string | University or school name |
entries[].degree | string | Degree or qualification |
entries[].period | string | Date range |
entries[].bullets | string[] | Honours, GPA, relevant coursework, etc. |
{
"type": "education",
"title": "Education",
"content": {
"entries": [
{
"institution": "University of Lisbon",
"degree": "BSc Computer Science",
"period": "Sep 2016 - Jun 2020",
"bullets": [
"GPA: 16/20, Dean's List",
"Thesis: Distributed Job Scheduling with Go"
]
}
]
}
}
6. keywords (optional)
Hidden keywords embedded in the PDF for ATS parsing. Invisible to humans but machine-readable.
| Field | Type | Description |
|---|---|---|
type | string | Must be "keywords" |
content.keywords | string | Comma or space-separated keyword string |
{
"type": "keywords",
"content": {
"keywords": "Python, AWS, Agile, Scrum, Project Management, Leadership"
}
}
Full Example
{
"sections": [
{
"type": "header",
"content": {
"name": "Jane Smith",
"contact": "[email protected] | linkedin.com/in/janesmith | (555) 987-6543 | Lisbon, PT"
}
},
{
"type": "summary",
"title": "Professional Summary",
"content": {
"text": "Backend engineer with 6+ years building distributed systems, data pipelines, and developer tooling."
}
},
{
"type": "section",
"title": "Core Competencies",
"content": {
"bullets": [
"Go, Python, TypeScript, SQL",
"PostgreSQL, Redis, Kafka, Docker, Kubernetes"
]
}
},
{
"type": "experience",
"title": "Professional Experience",
"content": {
"jobs": [
{
"company": "Acme Corp",
"roles": [
{
"title": "Senior Backend Engineer",
"period": "Mar 2023 - Present",
"bullets": [
"Designed event-driven pipeline processing 2M+ events/day",
"Reduced P95 API latency from 800ms to 120ms"
]
}
]
}
]
}
},
{
"type": "education",
"title": "Education",
"content": {
"entries": [
{
"institution": "University of Lisbon",
"degree": "BSc Computer Science",
"period": "Sep 2016 - Jun 2020",
"bullets": ["GPA: 16/20"]
}
]
}
},
{
"type": "keywords",
"content": {
"keywords": "Go, Golang, Python, distributed systems, microservices"
}
}
]
}
Rules
- The root object must contain a
"sections"array. - Each section must have a
"type"field. - All sections except
"header"and"keywords"require a"title"string. - Section order in the array = render order in the PDF.
- Titles are freeform — rename them to anything you need.
- Empty
bulletsarrays are allowed and simply render nothing. - Output must be valid JSON (no trailing commas, no comments).