API Reference
The JSON Resume API provides programmatic access to resume data, themes, and job matching.
Base URL
https://jsonresume.org/apiAuthentication
Most endpoints are public and don’t require authentication. For private resume access, you’ll need to authenticate with GitHub OAuth.
# Public resume access (no auth required)
GET https://jsonresume.org/[username]
 
# Private resume access (requires auth)
GET https://jsonresume.org/api/resume?token=YOUR_TOKENEndpoints
Get Resume
Fetch a resume by GitHub username.
GET /[username]Parameters:
- username(required) - GitHub username
Response:
{
  "basics": {
    "name": "John Doe",
    "label": "Software Engineer",
    ...
  },
  ...
}Get Resume with Theme
Render a resume using a specific theme.
GET /[username]?theme=[theme-name]Parameters:
- username(required) - GitHub username
- theme(optional) - Theme name (default:- standard)
Supported formats:
- .html- HTML rendering
- .pdf- PDF export
- .json- Raw JSON data
Examples:
# Get resume as HTML with professional theme
curl https://jsonresume.org/johndoe?theme=professional
 
# Get resume as PDF
curl https://jsonresume.org/johndoe.pdf
 
# Get raw JSON
curl https://jsonresume.org/johndoe.jsonValidate Resume
Validate a resume against the JSON Resume schema.
POST /api/validate
Content-Type: application/json
 
{
  "basics": { ... },
  ...
}Response:
{
  "valid": true,
  "errors": []
}Or if invalid:
{
  "valid": false,
  "errors": [
    {
      "path": "basics.email",
      "message": "Invalid email format"
    }
  ]
}Search Jobs
Search for jobs matched to your resume.
POST /api/jobs/search
Content-Type: application/json
 
{
  "resume": { ... },
  "filters": {
    "location": "San Francisco",
    "remote": true,
    "types": ["full-time"]
  }
}Response:
{
  "jobs": [
    {
      "uuid": "abc-123",
      "company": "Acme Corp",
      "title": "Senior Software Engineer",
      "score": 0.95,
      ...
    }
  ],
  "total": 42
}Rate Limiting
API requests are rate-limited to prevent abuse:
- Anonymous: 60 requests per hour
- Authenticated: 5000 requests per hour
Rate limit headers:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59
X-RateLimit-Reset: 1640995200Error Responses
The API uses standard HTTP status codes:
| Status | Description | 
|---|---|
| 200 | Success | 
| 400 | Bad Request - Invalid parameters | 
| 401 | Unauthorized - Authentication required | 
| 404 | Not Found - Resume not found | 
| 429 | Too Many Requests - Rate limit exceeded | 
| 500 | Internal Server Error | 
Error format:
{
  "error": {
    "code": "RESUME_NOT_FOUND",
    "message": "Resume not found for user: johndoe"
  }
}SDK / Client Libraries
JavaScript / TypeScript
npm install @jsonresume/clientimport { JSONResumeClient } from '@jsonresume/client';
 
const client = new JSONResumeClient();
 
// Get resume
const resume = await client.getResume('johndoe');
 
// Validate resume
const validation = await client.validate(resume);
 
// Search jobs
const jobs = await client.searchJobs(resume, {
  remote: true,
  location: 'San Francisco',
});Python
pip install jsonresumefrom jsonresume import Client
 
client = Client()
 
# Get resume
resume = client.get_resume('johndoe')
 
# Validate
validation = client.validate(resume)
 
# Search jobs
jobs = client.search_jobs(resume, remote=True)Webhooks
Subscribe to resume updates and job matches.
POST /api/webhooks
Content-Type: application/json
Authorization: Bearer YOUR_TOKEN
 
{
  "url": "https://yourapp.com/webhook",
  "events": ["resume.updated", "job.matched"]
}Webhook payload:
{
  "event": "job.matched",
  "timestamp": "2024-01-15T10:30:00Z",
  "data": {
    "job": { ... },
    "score": 0.92
  }
}GraphQL API
For advanced queries, use the GraphQL API:
{
  resume(username: "johndoe") {
    basics {
      name
      email
      profiles {
        network
        url
      }
    }
    work {
      name
      position
      highlights
    }
  }
 
  jobs(first: 10, filters: { remote: true }) {
    edges {
      node {
        company
        title
        location {
          city
          remote
        }
      }
    }
  }
}Examples
Full Resume Workflow
// 1. Fetch resume from GitHub Gist
const gistUrl =
  'https://gist.githubusercontent.com/johndoe/abc123/raw/resume.json';
const resume = await fetch(gistUrl).then((r) => r.json());
 
// 2. Validate
const validation = await fetch('https://jsonresume.org/api/validate', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify(resume),
}).then((r) => r.json());
 
if (!validation.valid) {
  console.error('Resume is invalid:', validation.errors);
  return;
}
 
// 3. Search for matching jobs
const jobs = await fetch('https://jsonresume.org/api/jobs/search', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ resume }),
}).then((r) => r.json());
 
console.log(`Found ${jobs.total} matching jobs`);Next Steps
- Getting Started - Create your first resume
- Job Board - Learn about job matching
- Architecture - Technical details
- Contributing - Help improve the API
Support
For API issues or questions:
- GitHub Issues: jsonresume/jsonresume.org/issues
- Documentation: https://docs.jsonresume.org