Skip to main content
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 caseMethod
Update a single field (e.g., name, headline)PATCH
Add or remove an item in a sectionPATCH
Change template, colors, or fontsPATCH
Replace the entire resume data at oncePUT
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:
PropertyRequiredDescription
opYesThe operation to perform: add, remove, replace, move, copy, or test
pathYesA JSON Pointer (RFC 6901) to the target location in the resume data
valueFor add, replace, testThe value to use for the operation
fromFor move, copyA 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" }
    ]
  }'

Update Metadata (Template, Colors, Fonts)

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

StatusError CodeDescription
400INVALID_PATCH_OPERATIONSThe operations are structurally invalid, target a non-existent path, or produce resume data that fails schema validation.
401UNAUTHORIZEDMissing or invalid API key.
404NOT_FOUNDThe resume does not exist or does not belong to the authenticated user.
403RESUME_LOCKEDThe 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.