The Patch API lets you make small, targeted changes to your resume without sending the entire data object. Instead of replacing the whole resume with a PUT, you send a list of JSON Patch operations that describe exactly what to change.
This is based on the JSON Patch (RFC 6902) standard.
When to Use PATCH vs PUT
| Use case | Method |
|---|
| Update a single field (e.g., name, headline) | PATCH |
| Add or remove an item in a section | PATCH |
| Change template, colors, or fonts | PATCH |
| Replace the entire resume data at once | PUT |
The PATCH endpoint only modifies the resume data (the JSONB column). To update top-level resume properties like name, slug, tags, or isPublic, use the existing PUT /resume/{id} endpoint.
Authentication
All requests require your API key in the x-api-key header. See Using the API for how to create one.
If you’re self-hosting, replace https://rxresu.me with your instance URL. The API is served under /api/openapi.
Endpoint
PATCH /api/openapi/resume/{id}
Request Body
The resume ID is taken from the URL path, so the request body only requires the operations array:
{
"operations": [
{ "op": "replace", "path": "/basics/name", "value": "Jane Doe" }
]
}
Each operation is an object with the following properties:
| Property | Required | Description |
|---|
op | Yes | The operation to perform: add, remove, replace, move, copy, or test |
path | Yes | A JSON Pointer (RFC 6901) to the target location in the resume data |
value | For add, replace, test | The value to use for the operation |
from | For move, copy | A JSON Pointer to the source location |
Examples
Replace a Basic Field
Update the resume holder’s name and headline:
curl -X PATCH "https://rxresu.me/api/openapi/resume/YOUR_RESUME_ID" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operations": [
{ "op": "replace", "path": "/basics/name", "value": "Jane Doe" },
{ "op": "replace", "path": "/basics/headline", "value": "Senior Software Engineer" }
]
}'
Add an Experience Entry
Append a new item to the experience section:
curl -X PATCH "https://rxresu.me/api/openapi/resume/YOUR_RESUME_ID" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operations": [
{
"op": "add",
"path": "/sections/experience/items/-",
"value": {
"id": "a1b2c3d4-0000-0000-0000-000000000000",
"hidden": false,
"company": "Acme Corp",
"position": "Staff Engineer",
"location": "San Francisco, CA",
"period": "Jan 2024 - Present",
"website": { "url": "https://acme.example.com", "label": "Acme Corp" },
"description": "<p>Leading the platform team.</p>"
}
}
]
}'
The path /sections/experience/items/- uses the special - index, which means “append to the end of the array”.
To insert at a specific position, use a numeric index like /sections/experience/items/0 for the beginning.
Remove an Item from a Section
Remove the second skill (index 1) from the skills section:
curl -X PATCH "https://rxresu.me/api/openapi/resume/YOUR_RESUME_ID" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operations": [
{ "op": "remove", "path": "/sections/skills/items/1" }
]
}'
Switch the template and update the primary color:
curl -X PATCH "https://rxresu.me/api/openapi/resume/YOUR_RESUME_ID" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operations": [
{ "op": "replace", "path": "/metadata/template", "value": "bronzor" },
{ "op": "replace", "path": "/metadata/design/colors/primary", "value": "rgba(37, 99, 235, 1)" }
]
}'
Test-Then-Replace (Optimistic Concurrency)
The test operation checks that a value matches before proceeding. If the test fails, the entire patch is rejected. This is useful to avoid overwriting changes made by another client:
curl -X PATCH "https://rxresu.me/api/openapi/resume/YOUR_RESUME_ID" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operations": [
{ "op": "test", "path": "/basics/name", "value": "Albert Einstein" },
{ "op": "replace", "path": "/basics/name", "value": "Jane Doe" }
]
}'
If /basics/name is not "Albert Einstein" at the time of the request, the entire patch will fail with a 400 error and no changes will be applied.
Move an Item Within a Section
Move the first experience item to the third position:
curl -X PATCH "https://rxresu.me/api/openapi/resume/YOUR_RESUME_ID" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operations": [
{ "op": "move", "from": "/sections/experience/items/0", "path": "/sections/experience/items/2" }
]
}'
Error Handling
| Status | Error Code | Description |
|---|
400 | INVALID_PATCH_OPERATIONS | The operations are structurally invalid, target a non-existent path, or produce resume data that fails schema validation. |
401 | UNAUTHORIZED | Missing or invalid API key. |
404 | NOT_FOUND | The resume does not exist or does not belong to the authenticated user. |
403 | RESUME_LOCKED | The resume is locked and cannot be modified. Unlock it first. |
All operations in a single request are applied atomically. If any operation fails (including a test), none of the operations are applied.
Tips
- Fetch first, then patch. Use
GET /resume/{id} to inspect the current structure before crafting your operations. This helps you target the correct paths and array indices.
- Use
test for safety. When updating a value you expect to be a specific value, combine test + replace to avoid accidentally overwriting concurrent changes.
- Batch related changes. You can send multiple operations in a single request. They are applied in order, so later operations can depend on earlier ones.
- The
- index appends. When adding items to arrays, use - as the index (e.g., /sections/skills/items/-) to append to the end.