Create a Reactive Resume API key, send authenticated REST requests to read and edit your resumes, and revoke keys you no longer need.
The Reactive Resume REST API lets your own scripts, extensions and automations read and change your documents and job applications. You authenticate with an API key that you create in Settings. This guide walks you through creating a key, making your first request and revoking the key when you’re done.
Select your name at the bottom of the sidebar, choose Settings, then open AI & developer. You can also press ⌘K (CtrlK on Windows and Linux) and type “API keys”.
2
Start a new key
In the API keys section, select New key.
3
Name the key and choose when it expires
Under What’s it for?, enter a name that reminds you where the key is used, such as “Resume sync script”. Under Expires, choose 30 days, 90 days or Never, then select Create key. If you signed in more than a day ago, you’re asked to sign in again first.
The New API key dialog
4
Copy the key
Select Copy, store the key somewhere safe (a password manager or your deployment’s secret store), then select Done.
The key is shown once, right after you create it
Reactive Resume shows the key only once. If you lose it, revoke it and create a new one.
Your keys are listed in the API keys table with the date each was created, the date it was last used and when it expires. Expired keys disappear from the list and stop working.
Sharing controls belong to resume metadata, outside the resume’s data object:
Field
Meaning
isPublic
Publishes or unpublishes the web page.
showDownloadButtons
Allows visitors to download the public PDF. The owner keeps download access.
showInSearchEngines
Opts a published, non-password-protected resume into search indexing. Defaults to false.
hideContactDetails
Redacts dedicated contact fields from public representations. Defaults to false.
isPrimary
Selects the account’s resume for /<username> and its verified domain. Only a published resume can become primary.
New or changed slug values must be 1–64 characters: lowercase letters and numbers separated by single dashes.
An invalid value returns INVALID_SLUG (HTTP 400). Reads and updates that retain an unchanged legacy slug remain
supported. Renames preserve an old address for 30 days.Authenticated custom-domain operations live under /api/openapi: GET /custom-domain, PUT /custom-domain with
{ "hostname": "resume.example.com" }, POST /custom-domain/verify, and DELETE /custom-domain.
The status includes the DNS target, ownership TXT name/value, verification status and last check time. These routes
return PRECONDITION_FAILED (HTTP 412) when the operator hasn’t enabled custom domains. Use the
API Reference tab for full request and response schemas, and
Sharing domains for server prerequisites.Public resume reads, pages and PDFs enforce visibility and password access and omit hidden content and
private notes. The signed-in owner is exempt from their own public password challenge. Visitor PDFs also enforce
the download setting. Downloading the file and recording an explicit visitor download are separate operations;
fetching a PDF alone doesn’t record a download event.Owner-generated preview links are a separate, temporary way to review the public rendering before publication.
Anyone holding that preview link can open it during its 15-minute lifetime, so keep it private.
Every endpoint, with its parameters, request body and responses, is listed in the API Reference tab of these docs. Your own instance also serves the machine-readable OpenAPI document at /api/openapi/spec.json (for example https://rxresu.me/api/openapi/spec.json). Use the spec from the version you run when you generate a client.
Area
Paths
What you can do
Resumes
/resumes, /resumes/{id}
List, read, create, import, update, patch, lock, duplicate, move to Trash, set a sharing password, download a PDF, read version history and statistics
Cover letters
/cover-letters
List, read, create, update, duplicate, export and import letters, restore versions, refresh their design from a resume
Documents
/documents
Work across resumes and letters: rename, tag, lock, link to an application, move to Trash, restore, delete now
PDF, Word, OpenDocument, Markdown and JSON exports
GET /resumes/{id}/exports/{format}, GET /cover-letters/{id}/exports/{format}
Editor content checks and job-term matching
GET /resumes/{id}/checks, POST /resumes/{id}/job-matches
Public PDF readability checker
POST /pdf-checks
File uploads and deletion
POST /files, DELETE /files
Web search integration settings and connection tests
/integrations/web-access
Sign-in, sessions, profile, passwords, two-factor authentication, passkeys and API keys
/api/auth/* (outside /api/openapi)
Authentication workflows use Better Auth’s native HTTP API and its own error contract. Your instance publishes their specification at /api/auth/open-api/generate-schema; use that specification for the enabled authentication methods. Browser interactions such as zoom, print dialogs and local undo do not require separate server endpoints: use document changes, versions and exports for the corresponding data workflows.GET /api/health (outside /api/openapi) reports whether the instance and its database and storage are healthy. It needs no key.
File imports accept a multipart form. The format is one of PDF, REACTIVE_RESUME, REACTIVE_RESUME_V4, JSON_RESUME or LINKEDIN; the maximum file size is 10 MiB. PDF imports read the text layer without AI. AI-assisted PDF and Word parsing remain available under /ai/pdf-parses and /ai/docx-parses; save the resulting data through /resumes/imports.
Exports accept pdf, docx, md or json and return a downloadable file. They enforce document ownership. The public checker accepts a multipart file (PDF, maximum 25 MB) and optional jobDescription text. It stores nothing, examines at most 30 pages and reports truncation or skipped checks. Parsing has a 45-second deadline. Hosting-provider request limits still apply.
Collection endpoints support limit (1–100) and offset (zero-based). For existing array responses, omitting both preserves the complete array for compatibility. Supplying only offset selects a page size of 20. The X-Total-Count header reports the total before slicing; paginated responses also include X-Limit and X-Offset. The cover-letter list retains its existing { items, total } response and default pagination.Applications also expose GET /applications/summary for list views. It accepts the same status, tags, limit and offset parameters as GET /applications, but returns only lightweight list fields and stage/interview activity; job descriptions, notes, requirements, AI metadata and uploaded document fields are omitted. Use GET /applications/{id} when you need one application’s full details. The original /applications response remains unchanged for integrations that need the complete application object.Set includeInitialDetails (0–6) to attach full initialDetail objects for the first few applications in the web and mobile default list orders. A value of N includes the union of each client’s first N rows, so at most 2N rows receive full details; closed applications are excluded unless explicitly selected with status. Omit the parameter to keep the response entirely lightweight.
Use PATCH for partial application, interview, timeline-entry and cover-letter updates. Resume content uses JSON Patch at /resumes/{id}; metadata uses PATCH /resumes/{id}/metadata. Resource-oriented paths such as /resumes/{id}/copies and /documents/{type}/{id}/trash are preferred for new integrations. Existing verb-based routes, partial PUT routes, response shapes and enum values remain supported.
State-changing operations do not implement Idempotency-Key. Treat mutations as unsafe to retry automatically, including requests that timed out: the change might already have happened. Read the current resource before deciding whether to repeat a write. Repeating create, copy, import or AI operations can create duplicates or incur provider charges.
x-api-key: <key>: an API key from Settings. Use this for scripts and servers.
Authorization: Bearer <token>: an OAuth access token, which MCP clients get when you connect them with OAuth. See Using the MCP server.
The session cookie of a signed-in browser.
Send one credential. When several are present, the server tries API key, bearer token, then session cookie, using the first valid credential. Cookie-authenticated requests with a foreign Origin or cross-site fetch metadata are rejected; explicit API keys and bearer tokens do not rely on browser cookies.Account deletion (DELETE /auth/account) requires a browser session; API keys and OAuth tokens receive 403 FORBIDDEN. Delete your account in Settings → Account.A private request without valid credentials gets 401 with the code UNAUTHORIZED. Public operations are marked with security: [] in the OpenAPI specification. Public resumes still enforce visibility, trash status and sharing passwords, and redact private data.Replacing or removing an existing application PDF attachment requires api:delete as well as api:write. Write-only integrations can attach the first file but cannot delete an earlier one by replacing it.REST data responses use Cache-Control: no-store. Uploaded profile images are public; other uploaded files require the owner’s credentials, including conditional download requests. Assistant attachments are not exposed through the uploads URL. Unknown and unauthorized file URLs return 404.
Procedure limits apply in production. When you hit a limit, the API responds with 429. On a self-hosted installation, FLAG_DISABLE_API_RATE_LIMIT turns off the per-key limit together with the sign-in limits; the procedure limits also turn off (see Environment variables).
Errors come back as JSON with a machine-readable code, the HTTP status and a message. Validation errors also include the failing fields in data.issues.
Branch on code rather than on the message text. Invalid input uses 400, missing authentication 401, forbidden actions 403, missing or inaccessible resources 404, conflicts 409, oversized requests 413, rate limits 429, and unexpected failures 500. Unexpected failures do not expose internal exception details.
The web app talks to the server through oRPC at /api/rpc, using the same procedures, authorization and validation as the REST API. It uses oRPC’s own wire format, and its procedure names follow the app’s source code rather than a published contract. For integrations, use the REST API under /api/openapi, which has a documented, generated specification.
If you built against the v5 API, check these changes:
Structured dates. Dated entries have a dates object (start, end, present). The text fields period and date are still returned, but the server rewrites them from dates on every save, so writing only the text has no effect. See Using the patch API.
Cover letters are their own documents. Resumes no longer hold cover letters. Use the /cover-letters endpoints. If you send a resume that still contains a cover-letter section (for example an old export), the server saves each letter as a separate cover letter and removes the section from the resume.
Application link.GET /resumes/{id} includes applicationId for a tailored resume. Trash and automatic naming remain managed through the documents API.
No cover-letter PDF from resumes.GET /resumes/{id}/pdf only accepts target=resume (or no target). Old signed download links that ask for a cover letter return 404.
Delete moves to Trash.DELETE /resumes/{id} and DELETE /cover-letters/{id} move the document to Trash for 30 days. Use the /documents/restore and /documents/purge endpoints to bring it back or delete it at once.
Application stages. The rejected stage and the archived flag are gone. Close an application with the closed stage and a closedReason (not-selected, withdrew, accepted-other or no-response).
Resume versions. Versions have a kind and an optional name instead of a free-text label.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Reactive Resume","description":"A privacy-minded resume builder that is customizable, portable, open-source, and free to use.","colors":{"primary":"#166534","light":"#07C983","dark":"#15803D"},"logo":{"light":"https://mintcdn.com/reactiveresume/lsEa0V8tmq-7Vofb/logo/light.svg?fit=max\u0026auto=format\u0026n=lsEa0V8tmq-7Vofb\u0026q=85\u0026s=21a2f3c9b27509effa871b216e67c0ce","dark":"https://mintcdn.com/reactiveresume/lsEa0V8tmq-7Vofb/logo/dark.svg?fit=max\u0026auto=format\u0026n=lsEa0V8tmq-7Vofb\u0026q=85\u0026s=fe4e07f4f06411b0ad16fd4644a475de","href":"https://rxresu.me"},"favicon":"https://mintcdn.com/reactiveresume/lsEa0V8tmq-7Vofb/favicon.svg?fit=max\u0026auto=format\u0026n=lsEa0V8tmq-7Vofb\u0026q=85\u0026s=6d7f6f71f71340846e94142b357a89b7","background":{"decoration":"grid"},"navbar":{"links":[{"href":"https://rxresu.me/resume-templates","label":"Resume templates"},{"href":"https://github.com/reactive-resume/reactive-resume/issues","label":"Support"}],"primary":{"type":"button","label":"Build your resume","href":"https://rxresu.me/auth/register"}},"footer":{"socials":{"website":"https://rxresu.me","github":"https://github.com/reactive-resume/reactive-resume"}},"seo":{"metatags":{"canonical":"https://docs.rxresu.me","og:image":"https://rxresu.me/opengraph/banner.jpg"},"indexing":"navigable"},"fonts":{"heading":{"family":"IBM Plex Sans"},"body":{"family":"IBM Plex Sans"}},"icons":{"library":"lucide"},"contextual":{"options":["copy","view"],"display":"header"},"styling":{"latex":true},"navigation":{"global":{"anchors":[{"anchor":"Reactive Resume","icon":"link","href":"https://rxresu.me"},{"anchor":"Source Code","icon":"github","href":"https://github.com/reactive-resume/reactive-resume"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"reactiveresume","hasAudioNarration":false,"actualSubdomain":"reactiveresume","customDomains":["docs.rxresu.me"],"gitSource":{"type":"github","owner":"reactive-resume","repo":"reactive-resume","deployBranch":"main","contentDirectory":"docs","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae31c2d51fbfc0519aa5bd2","collectionId":"0997ea10-7a86-4922-9789-96535d994d6c","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae31c2d51fbfc0519aa5bd2"},"feedback":{"edits":true,"thumbs":false,"issues":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae31c2d51fbfc0519aa5bd2","clientVersion":"0.0.4006","searchFilterCounts":[{"language":"default","tag":"API Reference","count":208},{"language":"default","tag":"Documentation","count":123},{"language":"default","tag":"Applications","count":42},{"language":"default","tag":"Career","count":30},{"language":"default","tag":"Resumes","count":26},{"language":"default","tag":"Documents","count":24},{"language":"default","tag":"Cover Letters","count":24},{"language":"default","tag":"Comparisons","count":17},{"language":"default","tag":"Agent","count":15},{"language":"default","tag":"Integrations","count":13}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":true,"enableContextualStarterQuestions":true,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"hello@amruthpillai.com","showHelpButton":true}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[],"page":{"pagePath":"guides/using-the-api","slug":"/guides/using-the-api","pageMetadata":{"title":"Using the API","description":"Create a Reactive Resume API key, send authenticated REST requests to read and edit your resumes, and revoke keys you no longer need.","href":"/guides/using-the-api"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Create a Reactive Resume API key, send authenticated REST requests to read and edit your resumes, and revoke keys you no longer need.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Card,CardGroup,CodeBlock,Frame,Heading,OptimizedImage,Step,Steps,Table,Tip,Warning}=_components;if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`The Reactive Resume REST API lets your own scripts, extensions and automations read and change your documents and job applications. You authenticate with an API key that you create in Settings. This guide walks you through creating a key, making your first request and revoking the key when you’re done.`}),`\n`,_jsx(Heading,{level:`2`,id:`before-you-start`,children:`Before you start`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`You need a Reactive Resume account. The examples use the hosted instance at `,_jsx(_components.code,{children:`https://rxresu.me`}),`. If you self-host, replace it with your own address.`]}),`\n`,_jsx(_components.li,{children:`An API key acts as you. Anyone who has it can read and edit your documents, so treat it like a password.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`create-an-api-key`,children:`Create an API key`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Open AI \u0026 developer settings`,children:_jsxs(_components.p,{children:[`Select your name at the bottom of the sidebar, choose `,_jsx(_components.strong,{children:`Settings`}),`, then open `,_jsx(_components.strong,{children:`AI \u0026 developer`}),`. You can also press `,_jsx(`kbd`,{children:`⌘`}),` `,_jsx(`kbd`,{children:`K`}),` (`,_jsx(`kbd`,{children:`Ctrl`}),` `,_jsx(`kbd`,{children:`K`}),` on Windows and Linux) and type “API keys”.`]})}),_jsx(Step,{title:`Start a new key`,children:_jsxs(_components.p,{children:[`In the `,_jsx(_components.strong,{children:`API keys`}),` section, select `,_jsx(_components.strong,{children:`New key`}),`.`]})}),_jsxs(Step,{title:`Name the key and choose when it expires`,children:[_jsxs(_components.p,{children:[`Under `,_jsx(_components.strong,{children:`What’s it for?`}),`, enter a name that reminds you where the key is used, such as “Resume sync script”. Under `,_jsx(_components.strong,{children:`Expires`}),`, choose `,_jsx(_components.strong,{children:`30 days`}),`, `,_jsx(_components.strong,{children:`90 days`}),` or `,_jsx(_components.strong,{children:`Never`}),`, then select `,_jsx(_components.strong,{children:`Create key`}),`. If you signed in more than a day ago, you’re asked to sign in again first.`]}),_jsx(Frame,{caption:`The New API key dialog`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/new-api-key-dialog.webp?fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=ed4b47759855e590a1ccfc777cedd895`,alt:`New API key dialog with the name Resume sync script entered and 90 days selected under Expires`,\"data-og-width\":`1080`,width:`1080`,\"data-og-height\":`708`,height:`708`,\"data-path\":`images/guides/using-the-api/new-api-key-dialog.webp`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/new-api-key-dialog.webp?w=280\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=7e22412890cb86f11f13fe26e5a8153d 280w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/new-api-key-dialog.webp?w=560\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=88eae6e730464a5bc421999c9d97edb4 560w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/new-api-key-dialog.webp?w=840\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=c4a83523474578c6e2f762b77d094d5f 840w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/new-api-key-dialog.webp?w=1100\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=7722048976a50d6bccbfb8339a19819f 1100w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/new-api-key-dialog.webp?w=1650\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=e1c2895ba4089de81c9aa95dee8a2fc7 1650w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/new-api-key-dialog.webp?w=2500\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=8c4834190fbeae6f5c05175ad2091f01 2500w`})})]}),_jsxs(Step,{title:`Copy the key`,children:[_jsxs(_components.p,{children:[`Select `,_jsx(_components.strong,{children:`Copy`}),`, store the key somewhere safe (a password manager or your deployment’s secret store), then select `,_jsx(_components.strong,{children:`Done`}),`.`]}),_jsx(Frame,{caption:`The key is shown once, right after you create it`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/api-key-shown-once.webp?fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=756be861e4103716612e62d74055add4`,alt:`New API key dialog showing the generated key with a Copy button and the warning Copy it now. For your security, it won't be shown again.`,\"data-og-width\":`1080`,width:`1080`,\"data-og-height\":`564`,height:`564`,\"data-path\":`images/guides/using-the-api/api-key-shown-once.webp`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/api-key-shown-once.webp?w=280\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=12d72f9e2a3f1a377784bbadb2d04d2e 280w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/api-key-shown-once.webp?w=560\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=9e60d8bded1bd58718f9b6d50e9efbf7 560w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/api-key-shown-once.webp?w=840\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=7666b0cb8f7798522359251e251ff255 840w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/api-key-shown-once.webp?w=1100\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=0974424f23091633369bb2d10a62f2e8 1100w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/api-key-shown-once.webp?w=1650\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=c8dd3edf3f77ab490a8bede5dbac1a36 1650w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/api-key-shown-once.webp?w=2500\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=750513fc1b2730a2bc910b38d71d9719 2500w`})}),_jsx(Warning,{children:_jsx(_components.p,{children:`Reactive Resume shows the key only once. If you lose it, revoke it and create a new one.`})})]})]}),`\n`,_jsxs(_components.p,{children:[`Your keys are listed in the `,_jsx(_components.strong,{children:`API keys`}),` table with the date each was created, the date it was last used and when it expires. Expired keys disappear from the list and stop working.`]}),`\n`,_jsx(Frame,{caption:`The API keys section in AI \u0026 developer settings`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/api-keys-section.webp?fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=eafaff7e86794bf8bf970fbf41479f62`,alt:`API keys table listing two keys, Claude Desktop that never expires and Resume sync script that expires on 29 Dec 2026, each with a Revoke button`,\"data-og-width\":`1440`,width:`1440`,\"data-og-height\":`488`,height:`488`,\"data-path\":`images/guides/using-the-api/api-keys-section.webp`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/api-keys-section.webp?w=280\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=c871dd1c6cc7049853f09cea86baf95f 280w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/api-keys-section.webp?w=560\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=56399c1c0f45acac356af692b06a5f58 560w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/api-keys-section.webp?w=840\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=a4e9d46685e38c3f667eae7a5c3cd448 840w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/api-keys-section.webp?w=1100\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=d1f176146b45ddfcb84bbce401385b05 1100w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/api-keys-section.webp?w=1650\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=fa384ef79c47ca0fe50964a68c51414f 1650w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/api-keys-section.webp?w=2500\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=579f2e15d6058169837335b3f4800dd5 2500w`})}),`\n`,_jsx(Heading,{level:`2`,id:`public-sharing-settings`,children:`Public sharing settings`}),`\n`,_jsxs(_components.p,{children:[`Sharing controls belong to resume metadata, outside the resume’s `,_jsx(_components.code,{children:`data`}),` object:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Meaning`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`isPublic`})}),_jsx(_components.td,{children:`Publishes or unpublishes the web page.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`showDownloadButtons`})}),_jsx(_components.td,{children:`Allows visitors to download the public PDF. The owner keeps download access.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`showInSearchEngines`})}),_jsxs(_components.td,{children:[`Opts a published, non-password-protected resume into search indexing. Defaults to `,_jsx(_components.code,{children:`false`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`hideContactDetails`})}),_jsxs(_components.td,{children:[`Redacts dedicated contact fields from public representations. Defaults to `,_jsx(_components.code,{children:`false`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`isPrimary`})}),_jsxs(_components.td,{children:[`Selects the account’s resume for `,_jsx(_components.code,{children:`/\u003cusername>`}),` and its verified domain. Only a published resume can become primary.`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[`New or changed `,_jsx(_components.code,{children:`slug`}),` values must be 1–64 characters: lowercase letters and numbers separated by single dashes.\nAn invalid value returns `,_jsx(_components.code,{children:`INVALID_SLUG`}),` (HTTP 400). Reads and updates that retain an unchanged legacy slug remain\nsupported. Renames preserve an old address for 30 days.`]}),`\n`,_jsxs(_components.p,{children:[`Authenticated custom-domain operations live under `,_jsx(_components.code,{children:`/api/openapi`}),`: `,_jsx(_components.code,{children:`GET /custom-domain`}),`, `,_jsx(_components.code,{children:`PUT /custom-domain`}),` with\n`,_jsx(_components.code,{children:`{ \"hostname\": \"resume.example.com\" }`}),`, `,_jsx(_components.code,{children:`POST /custom-domain/verify`}),`, and `,_jsx(_components.code,{children:`DELETE /custom-domain`}),`.\nThe status includes the DNS target, ownership TXT name/value, verification status and last check time. These routes\nreturn `,_jsx(_components.code,{children:`PRECONDITION_FAILED`}),` (HTTP 412) when the operator hasn’t enabled custom domains. Use the\nAPI Reference tab for full request and response schemas, and\n`,_jsx(_components.a,{href:`/self-hosting/sharing-domains`,children:`Sharing domains`}),` for server prerequisites.`]}),`\n`,_jsx(_components.p,{children:`Public resume reads, pages and PDFs enforce visibility and password access and omit hidden content and\nprivate notes. The signed-in owner is exempt from their own public password challenge. Visitor PDFs also enforce\nthe download setting. Downloading the file and recording an explicit visitor download are separate operations;\nfetching a PDF alone doesn’t record a download event.`}),`\n`,_jsx(_components.p,{children:`Owner-generated preview links are a separate, temporary way to review the public rendering before publication.\nAnyone holding that preview link can open it during its 15-minute lifetime, so keep it private.`}),`\n`,_jsx(Heading,{level:`2`,id:`make-your-first-request`,children:`Make your first request`}),`\n`,_jsxs(_components.p,{children:[`The REST API lives under `,_jsx(_components.code,{children:`/api/openapi`}),` on your instance. Send your key in the `,_jsx(_components.code,{children:`x-api-key`}),` header.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://rxresu.me/api/openapi/resumes\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"x-api-key: YOUR_API_KEY\"`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`The response is a JSON array of your resumes, without their full content:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`13`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`13`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"01a0efa5-6529-745e-950a-521ef5b8afc7\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"name\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Game Developer Resume\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"slug\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"game-developer-resume\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"tags\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"games\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"isPublic\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"showDownloadButtons\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"isLocked\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"createdAt\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"2026-09-30T00:09:49.101Z\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"updatedAt\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"2026-09-30T00:09:49.101Z\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Fetch one resume with its full data, using an ID from the list:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://rxresu.me/api/openapi/resumes/01a0efa5-6529-745e-950a-521ef5b8afc7\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"x-api-key: YOUR_API_KEY\"`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`For request bodies, send JSON with `,_jsx(_components.code,{children:`Content-Type: application/json`}),`. For example, create a resume filled with sample content:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://rxresu.me/api/openapi/resumes\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"x-api-key: YOUR_API_KEY\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{ \"name\": \"Product Designer Resume\", \"tags\": [\"design\"], \"withSampleData\": true }'`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`The response is the new resume’s ID as a JSON string.`}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`To change a few fields in a resume without sending the whole document, use `,_jsx(_components.a,{href:`/guides/using-the-patch-api`,children:`JSON Patch`}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`find-the-endpoint-you-need`,children:`Find the endpoint you need`}),`\n`,_jsxs(_components.p,{children:[`Every endpoint, with its parameters, request body and responses, is listed in the `,_jsx(_components.strong,{children:`API Reference`}),` tab of these docs. Your own instance also serves the machine-readable OpenAPI document at `,_jsx(_components.code,{children:`/api/openapi/spec.json`}),` (for example `,_jsx(_components.code,{children:`https://rxresu.me/api/openapi/spec.json`}),`). Use the spec from the version you run when you generate a client.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Area`}),_jsx(_components.th,{children:`Paths`}),_jsx(_components.th,{children:`What you can do`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Resumes`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`/resumes`}),`, `,_jsx(_components.code,{children:`/resumes/{id}`})]}),_jsx(_components.td,{children:`List, read, create, import, update, patch, lock, duplicate, move to Trash, set a sharing password, download a PDF, read version history and statistics`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Cover letters`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/cover-letters`})}),_jsx(_components.td,{children:`List, read, create, update, duplicate, export and import letters, restore versions, refresh their design from a resume`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Documents`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/documents`})}),_jsx(_components.td,{children:`Work across resumes and letters: rename, tag, lock, link to an application, move to Trash, restore, delete now`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Applications`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/applications`})}),_jsx(_components.td,{children:`Track job applications: stages, notes, interviews, attached PDFs, bulk changes, import, statistics`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`AI`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`/ai-providers`}),`, `,_jsx(_components.code,{children:`/ai`}),`, `,_jsx(_components.code,{children:`/agent`})]}),_jsx(_components.td,{children:`Manage your AI providers, run AI tools such as resume import from PDF, work with assistant conversations`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Account`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`/auth/account/export`}),`, `,_jsx(_components.code,{children:`/auth/account`})]}),_jsx(_components.td,{children:`Export your account data, delete your account`})]})]})]}),`\n`,_jsx(_components.p,{children:`Additional app workflows have REST endpoints:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Workflow`}),_jsx(_components.th,{children:`Endpoint`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`PDF, JSON Resume, Reactive Resume v4/current, LinkedIn imports`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`POST /resumes/file-imports`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`PDF, Word, OpenDocument, Markdown and JSON exports`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`GET /resumes/{id}/exports/{format}`}),`, `,_jsx(_components.code,{children:`GET /cover-letters/{id}/exports/{format}`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Editor content checks and job-term matching`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`GET /resumes/{id}/checks`}),`, `,_jsx(_components.code,{children:`POST /resumes/{id}/job-matches`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Public PDF readability checker`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`POST /pdf-checks`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`File uploads and deletion`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`POST /files`}),`, `,_jsx(_components.code,{children:`DELETE /files`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Web search integration settings and connection tests`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/integrations/web-access`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Sign-in, sessions, profile, passwords, two-factor authentication, passkeys and API keys`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`/api/auth/*`}),` (outside `,_jsx(_components.code,{children:`/api/openapi`}),`)`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[`Authentication workflows use Better Auth’s native HTTP API and its own error contract. Your instance publishes their specification at `,_jsx(_components.code,{children:`/api/auth/open-api/generate-schema`}),`; use that specification for the enabled authentication methods. Browser interactions such as zoom, print dialogs and local undo do not require separate server endpoints: use document changes, versions and exports for the corresponding data workflows.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`GET /api/health`}),` (outside `,_jsx(_components.code,{children:`/api/openapi`}),`) reports whether the instance and its database and storage are healthy. It needs no key.`]}),`\n`,_jsx(Heading,{level:`2`,id:`imports-and-exports`,children:`Imports and exports`}),`\n`,_jsxs(_components.p,{children:[`File imports accept a multipart form. The format is one of `,_jsx(_components.code,{children:`PDF`}),`, `,_jsx(_components.code,{children:`REACTIVE_RESUME`}),`, `,_jsx(_components.code,{children:`REACTIVE_RESUME_V4`}),`, `,_jsx(_components.code,{children:`JSON_RESUME`}),` or `,_jsx(_components.code,{children:`LINKEDIN`}),`; the maximum file size is 10 MiB. PDF imports read the text layer without AI. AI-assisted PDF and Word parsing remain available under `,_jsx(_components.code,{children:`/ai/pdf-parses`}),` and `,_jsx(_components.code,{children:`/ai/docx-parses`}),`; save the resulting data through `,_jsx(_components.code,{children:`/resumes/imports`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`6`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://rxresu.me/api/openapi/resumes/file-imports\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"x-api-key: YOUR_API_KEY\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -F`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"format=JSON_RESUME\"`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -F`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"file=@resume.json\"`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://rxresu.me/api/openapi/resumes/RESUME_ID/exports/docx\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"x-api-key: YOUR_API_KEY\"`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -o`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` resume.docx`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Exports accept `,_jsx(_components.code,{children:`pdf`}),`, `,_jsx(_components.code,{children:`docx`}),`, `,_jsx(_components.code,{children:`md`}),` or `,_jsx(_components.code,{children:`json`}),` and return a downloadable file. They enforce document ownership. The public checker accepts a multipart `,_jsx(_components.code,{children:`file`}),` (PDF, maximum 25 MB) and optional `,_jsx(_components.code,{children:`jobDescription`}),` text. It stores nothing, examines at most 30 pages and reports truncation or skipped checks. Parsing has a 45-second deadline. Hosting-provider request limits still apply.`]}),`\n`,_jsx(Heading,{level:`2`,id:`pagination-and-partial-updates`,children:`Pagination and partial updates`}),`\n`,_jsxs(_components.p,{children:[`Collection endpoints support `,_jsx(_components.code,{children:`limit`}),` (1–100) and `,_jsx(_components.code,{children:`offset`}),` (zero-based). For existing array responses, omitting both preserves the complete array for compatibility. Supplying only `,_jsx(_components.code,{children:`offset`}),` selects a page size of 20. The `,_jsx(_components.code,{children:`X-Total-Count`}),` header reports the total before slicing; paginated responses also include `,_jsx(_components.code,{children:`X-Limit`}),` and `,_jsx(_components.code,{children:`X-Offset`}),`. The cover-letter list retains its existing `,_jsx(_components.code,{children:`{ items, total }`}),` response and default pagination.`]}),`\n`,_jsxs(_components.p,{children:[`Applications also expose `,_jsx(_components.code,{children:`GET /applications/summary`}),` for list views. It accepts the same `,_jsx(_components.code,{children:`status`}),`, `,_jsx(_components.code,{children:`tags`}),`, `,_jsx(_components.code,{children:`limit`}),` and `,_jsx(_components.code,{children:`offset`}),` parameters as `,_jsx(_components.code,{children:`GET /applications`}),`, but returns only lightweight list fields and stage/interview activity; job descriptions, notes, requirements, AI metadata and uploaded document fields are omitted. Use `,_jsx(_components.code,{children:`GET /applications/{id}`}),` when you need one application’s full details. The original `,_jsx(_components.code,{children:`/applications`}),` response remains unchanged for integrations that need the complete application object.`]}),`\n`,_jsxs(_components.p,{children:[`Set `,_jsx(_components.code,{children:`includeInitialDetails`}),` (0–6) to attach full `,_jsx(_components.code,{children:`initialDetail`}),` objects for the first few applications in the web and mobile default list orders. A value of N includes the union of each client’s first N rows, so at most 2N rows receive full details; closed applications are excluded unless explicitly selected with `,_jsx(_components.code,{children:`status`}),`. Omit the parameter to keep the response entirely lightweight.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://rxresu.me/api/openapi/resumes?limit=20\u0026offset=20\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"x-api-key: YOUR_API_KEY\"`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -i`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Use `,_jsx(_components.code,{children:`PATCH`}),` for partial application, interview, timeline-entry and cover-letter updates. Resume content uses JSON Patch at `,_jsx(_components.code,{children:`/resumes/{id}`}),`; metadata uses `,_jsx(_components.code,{children:`PATCH /resumes/{id}/metadata`}),`. Resource-oriented paths such as `,_jsx(_components.code,{children:`/resumes/{id}/copies`}),` and `,_jsx(_components.code,{children:`/documents/{type}/{id}/trash`}),` are preferred for new integrations. Existing verb-based routes, partial `,_jsx(_components.code,{children:`PUT`}),` routes, response shapes and enum values remain supported.`]}),`\n`,_jsx(Heading,{level:`2`,id:`retries`,children:`Retries`}),`\n`,_jsxs(_components.p,{children:[`State-changing operations do not implement `,_jsx(_components.code,{children:`Idempotency-Key`}),`. Treat mutations as unsafe to retry automatically, including requests that timed out: the change might already have happened. Read the current resource before deciding whether to repeat a write. Repeating create, copy, import or AI operations can create duplicates or incur provider charges.`]}),`\n`,_jsx(Heading,{level:`2`,id:`authentication-methods`,children:`Authentication methods`}),`\n`,_jsx(_components.p,{children:`The API accepts three kinds of credentials:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`x-api-key: \u003ckey>`}),`: an API key from Settings. Use this for scripts and servers.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`Authorization: Bearer \u003ctoken>`}),`: an OAuth access token, which MCP clients get when you connect them with OAuth. See `,_jsx(_components.a,{href:`/guides/using-the-mcp-server`,children:`Using the MCP server`}),`.`]}),`\n`,_jsx(_components.li,{children:`The session cookie of a signed-in browser.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Send one credential. When several are present, the server tries API key, bearer token, then session cookie, using the first valid credential. Cookie-authenticated requests with a foreign `,_jsx(_components.code,{children:`Origin`}),` or cross-site fetch metadata are rejected; explicit API keys and bearer tokens do not rely on browser cookies.`]}),`\n`,_jsxs(_components.p,{children:[`Account deletion (`,_jsx(_components.code,{children:`DELETE /auth/account`}),`) requires a browser session; API keys and OAuth tokens receive `,_jsx(_components.code,{children:`403 FORBIDDEN`}),`. Delete your account in `,_jsx(_components.strong,{children:`Settings → Account`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`A private request without valid credentials gets `,_jsx(_components.code,{children:`401`}),` with the code `,_jsx(_components.code,{children:`UNAUTHORIZED`}),`. Public operations are marked with `,_jsx(_components.code,{children:`security: []`}),` in the OpenAPI specification. Public resumes still enforce visibility, trash status and sharing passwords, and redact private data.`]}),`\n`,_jsxs(_components.p,{children:[`Replacing or removing an existing application PDF attachment requires `,_jsx(_components.code,{children:`api:delete`}),` as well as `,_jsx(_components.code,{children:`api:write`}),`. Write-only integrations can attach the first file but cannot delete an earlier one by replacing it.`]}),`\n`,_jsxs(_components.p,{children:[`REST data responses use `,_jsx(_components.code,{children:`Cache-Control: no-store`}),`. Uploaded profile images are public; other uploaded files require the owner’s credentials, including conditional download requests. Assistant attachments are not exposed through the uploads URL. Unknown and unauthorized file URLs return `,_jsx(_components.code,{children:`404`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`limits`,children:`Limits`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Limit`}),_jsx(_components.th,{children:`Value`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Requests per API key`}),_jsx(_components.td,{children:`1,000 per hour`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Changes to one resume, document or application (create, update, patch, lock, duplicate, delete)`}),_jsx(_components.td,{children:`300 per minute`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`PDF downloads of one resume (`,_jsx(_components.code,{children:`GET /resumes/{id}/pdf`}),`)`]}),_jsx(_components.td,{children:`5 per minute`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`PDF downloads across all your resumes`}),_jsx(_components.td,{children:`30 per minute`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Public PDF checks per client address`}),_jsx(_components.td,{children:`5 per minute`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`REST request body size (before endpoint-specific limits)`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`40 MiB`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`AI requests per account (voice transcription and speech count separately)`}),_jsx(_components.td,{children:`20 per minute`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Request body size on Vercel installations`}),_jsxs(_components.td,{children:[`4.5 MB (see `,_jsx(_components.a,{href:`/guides/large-rpc-requests`,children:`Large RPC requests`}),`)`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[`Procedure limits apply in production. When you hit a limit, the API responds with `,_jsx(_components.code,{children:`429`}),`. On a self-hosted installation, `,_jsx(_components.code,{children:`FLAG_DISABLE_API_RATE_LIMIT`}),` turns off the per-key limit together with the sign-in limits; the procedure limits also turn off (see `,_jsx(_components.a,{href:`/self-hosting/environment-variables`,children:`Environment variables`}),`).`]}),`\n`,_jsx(Heading,{level:`2`,id:`errors`,children:`Errors`}),`\n`,_jsxs(_components.p,{children:[`Errors come back as JSON with a machine-readable `,_jsx(_components.code,{children:`code`}),`, the HTTP `,_jsx(_components.code,{children:`status`}),` and a `,_jsx(_components.code,{children:`message`}),`. Validation errors also include the failing fields in `,_jsx(_components.code,{children:`data.issues`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{ `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"defined\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"code\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"NOT_FOUND\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"status\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`404`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"message\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Not Found\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Branch on `,_jsx(_components.code,{children:`code`}),` rather than on the message text. Invalid input uses `,_jsx(_components.code,{children:`400`}),`, missing authentication `,_jsx(_components.code,{children:`401`}),`, forbidden actions `,_jsx(_components.code,{children:`403`}),`, missing or inaccessible resources `,_jsx(_components.code,{children:`404`}),`, conflicts `,_jsx(_components.code,{children:`409`}),`, oversized requests `,_jsx(_components.code,{children:`413`}),`, rate limits `,_jsx(_components.code,{children:`429`}),`, and unexpected failures `,_jsx(_components.code,{children:`500`}),`. Unexpected failures do not expose internal exception details.`]}),`\n`,_jsx(Heading,{level:`2`,id:`revoke-a-key`,children:`Revoke a key`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Find the key`,children:_jsxs(_components.p,{children:[`Open `,_jsx(_components.strong,{children:`Settings`}),`, then `,_jsx(_components.strong,{children:`AI \u0026 developer`}),`. In the `,_jsx(_components.strong,{children:`API keys`}),` table, find the key you want to stop.`]})}),_jsxs(Step,{title:`Revoke it`,children:[_jsxs(_components.p,{children:[`Select `,_jsx(_components.strong,{children:`Revoke`}),`. The key stops working at once, and a message confirms which key you revoked.`]}),_jsx(Frame,{caption:`Revoking a key shows an Undo action`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/revoke-key-undo-toast.webp?fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=918f5b7d3128f4496bb5f60130c38e4f`,alt:`Message reading Revoked Claude Desktop. Apps using it stop working now, with an Undo link`,\"data-og-width\":`984`,width:`984`,\"data-og-height\":`148`,height:`148`,\"data-path\":`images/guides/using-the-api/revoke-key-undo-toast.webp`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/revoke-key-undo-toast.webp?w=280\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=873499160baac90a8b4ce4826390baae 280w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/revoke-key-undo-toast.webp?w=560\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=309b6a12e21960fbc9e342a80e8652de 560w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/revoke-key-undo-toast.webp?w=840\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=181c10ec16dfa1590ad666db3d5c55dc 840w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/revoke-key-undo-toast.webp?w=1100\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=760778f618a4f32d37354069417a3f60 1100w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/revoke-key-undo-toast.webp?w=1650\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=d84f7a09630c14da958958c29e30f35c 1650w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-the-api/revoke-key-undo-toast.webp?w=2500\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=ce479d1f857e74d44408f16c56c1f270 2500w`})})]}),_jsx(Step,{title:`Undo if you revoked the wrong key`,children:_jsxs(_components.p,{children:[`Select `,_jsx(_components.strong,{children:`Undo`}),` in the message to turn the key back on. When the message closes, the key is deleted for good.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`the-rpc-endpoint`,children:`The RPC endpoint`}),`\n`,_jsxs(_components.p,{children:[`The web app talks to the server through oRPC at `,_jsx(_components.code,{children:`/api/rpc`}),`, using the same procedures, authorization and validation as the REST API. It uses oRPC’s own wire format, and its procedure names follow the app’s source code rather than a published contract. For integrations, use the REST API under `,_jsx(_components.code,{children:`/api/openapi`}),`, which has a documented, generated specification.`]}),`\n`,_jsx(Heading,{level:`2`,id:`changes-from-v5`,children:`Changes from v5`}),`\n`,_jsx(_components.p,{children:`If you built against the v5 API, check these changes:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Structured dates.`}),` Dated entries have a `,_jsx(_components.code,{children:`dates`}),` object (`,_jsx(_components.code,{children:`start`}),`, `,_jsx(_components.code,{children:`end`}),`, `,_jsx(_components.code,{children:`present`}),`). The text fields `,_jsx(_components.code,{children:`period`}),` and `,_jsx(_components.code,{children:`date`}),` are still returned, but the server rewrites them from `,_jsx(_components.code,{children:`dates`}),` on every save, so writing only the text has no effect. See `,_jsx(_components.a,{href:`/guides/using-the-patch-api#dates`,children:`Using the patch API`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Cover letters are their own documents.`}),` Resumes no longer hold cover letters. Use the `,_jsx(_components.code,{children:`/cover-letters`}),` endpoints. If you send a resume that still contains a cover-letter section (for example an old export), the server saves each letter as a separate cover letter and removes the section from the resume.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Application link.`}),` `,_jsx(_components.code,{children:`GET /resumes/{id}`}),` includes `,_jsx(_components.code,{children:`applicationId`}),` for a tailored resume. Trash and automatic naming remain managed through the documents API.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`No cover-letter PDF from resumes.`}),` `,_jsx(_components.code,{children:`GET /resumes/{id}/pdf`}),` only accepts `,_jsx(_components.code,{children:`target=resume`}),` (or no target). Old signed download links that ask for a cover letter return `,_jsx(_components.code,{children:`404`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Delete moves to Trash.`}),` `,_jsx(_components.code,{children:`DELETE /resumes/{id}`}),` and `,_jsx(_components.code,{children:`DELETE /cover-letters/{id}`}),` move the document to Trash for 30 days. Use the `,_jsx(_components.code,{children:`/documents/restore`}),` and `,_jsx(_components.code,{children:`/documents/purge`}),` endpoints to bring it back or delete it at once.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Application stages.`}),` The `,_jsx(_components.code,{children:`rejected`}),` stage and the `,_jsx(_components.code,{children:`archived`}),` flag are gone. Close an application with the `,_jsx(_components.code,{children:`closed`}),` stage and a `,_jsx(_components.code,{children:`closedReason`}),` (`,_jsx(_components.code,{children:`not-selected`}),`, `,_jsx(_components.code,{children:`withdrew`}),`, `,_jsx(_components.code,{children:`accepted-other`}),` or `,_jsx(_components.code,{children:`no-response`}),`).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Resume versions.`}),` Versions have a `,_jsx(_components.code,{children:`kind`}),` and an optional `,_jsx(_components.code,{children:`name`}),` instead of a free-text label.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Self-hosters upgrading an installation can read `,_jsx(_components.a,{href:`/self-hosting/upgrading-to-v6`,children:`Migrating from v5`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`related-guides`,children:`Related guides`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Using the patch API`,href:`/guides/using-the-patch-api`,children:_jsx(_components.p,{children:`Change individual fields of a resume with JSON Patch.`})}),_jsx(Card,{title:`Using the MCP server`,href:`/guides/using-the-mcp-server`,children:_jsx(_components.p,{children:`Let AI clients such as Claude or Cursor work with your documents.`})}),_jsx(Card,{title:`JSON resume schema`,href:`/guides/json-resume-schema`,children:_jsx(_components.p,{children:`The structure of resume data, for validation and code generation.`})}),_jsx(Card,{title:`Large RPC requests`,href:`/guides/large-rpc-requests`,children:_jsx(_components.p,{children:`How large request bodies reach Vercel installations.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Using the API","description":"Create a Reactive Resume API key, send authenticated REST requests to read and edit your resumes, and revoke keys you no longer need.","href":"/guides/using-the-api"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Before you start","slug":"before-you-start","depth":2,"children":[]},{"title":"Create an API key","slug":"create-an-api-key","depth":2,"children":[]},{"title":"Public sharing settings","slug":"public-sharing-settings","depth":2,"children":[]},{"title":"Make your first request","slug":"make-your-first-request","depth":2,"children":[]},{"title":"Find the endpoint you need","slug":"find-the-endpoint-you-need","depth":2,"children":[]},{"title":"Imports and exports","slug":"imports-and-exports","depth":2,"children":[]},{"title":"Pagination and partial updates","slug":"pagination-and-partial-updates","depth":2,"children":[]},{"title":"Retries","slug":"retries","depth":2,"children":[]},{"title":"Authentication methods","slug":"authentication-methods","depth":2,"children":[]},{"title":"Limits","slug":"limits","depth":2,"children":[]},{"title":"Errors","slug":"errors","depth":2,"children":[]},{"title":"Revoke a key","slug":"revoke-a-key","depth":2,"children":[]},{"title":"The RPC endpoint","slug":"the-rpc-endpoint","depth":2,"children":[]},{"title":"Changes from v5","slug":"changes-from-v5","depth":2,"children":[]},{"title":"Related guides","slug":"related-guides","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"reactiveresume","siteName":"Reactive Resume","title":"Using the API - Reactive Resume","contextualStarterQuestions":[{"_id":"6ae18e53c480072be98e3b88","deploymentId":"696550c78205dc150ed83107","questionText":"How do I create an API key?","status":"active","generatedBy":"contextual","path":"guides/using-the-api","createdAt":"2026-10-28T05:55:31.874Z","updatedAt":"2026-10-28T05:55:31.874Z","__v":0},{"_id":"6ae18e53c480072be98e3b8a","deploymentId":"696550c78205dc150ed83107","questionText":"How do I revoke an API key?","status":"active","generatedBy":"contextual","path":"guides/using-the-api","createdAt":"2026-10-28T05:55:31.874Z","updatedAt":"2026-10-28T05:55:31.874Z","__v":0},{"_id":"6ae18e53c480072be98e3b89","deploymentId":"696550c78205dc150ed83107","questionText":"Where do I find API key settings?","status":"active","generatedBy":"contextual","path":"guides/using-the-api","createdAt":"2026-10-28T05:55:31.874Z","updatedAt":"2026-10-28T05:55:31.874Z","__v":0}],"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-28T05:55:27.997Z","originalFileLocation":"guides/using-the-api.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Create a Reactive Resume API key, send authenticated REST requests to read and edit your resumes, and revoke keys you no longer need.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Reactive Resume\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/reactiveresume/m9TtW-C9R_eefHpI/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/reactiveresume/m9TtW-C9R_eefHpI/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/reactiveresume/m9TtW-C9R_eefHpI/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/reactiveresume/m9TtW-C9R_eefHpI/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/reactiveresume/m9TtW-C9R_eefHpI/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/reactiveresume/m9TtW-C9R_eefHpI/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/reactiveresume/m9TtW-C9R_eefHpI/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/reactiveresume/m9TtW-C9R_eefHpI/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/reactiveresume/m9TtW-C9R_eefHpI/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Using the API - Reactive Resume\">\u003cmeta data-mint-head property=\"og:description\" content=\"Create a Reactive Resume API key, send authenticated REST requests to read and edit your resumes, and revoke keys you no longer need.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Reactive Resume\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.rxresu.me/guides/using-the-api\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://rxresu.me/opengraph/banner.jpg\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Using the API - Reactive Resume\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Create a Reactive Resume API key, send authenticated REST requests to read and edit your resumes, and revoke keys you no longer need.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://rxresu.me/opengraph/banner.jpg\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/reactiveresume/m9TtW-C9R_eefHpI/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Reactive Resume\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#166534\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.rxresu.me/guides/using-the-api\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/guides/using-the-api.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.rxresu.me/#organization\",\"name\":\"Reactive Resume\",\"url\":\"https://docs.rxresu.me\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/reactiveresume/lsEa0V8tmq-7Vofb/logo/light.svg?fit=max\u0026auto=format\u0026n=lsEa0V8tmq-7Vofb\u0026q=85\u0026s=21a2f3c9b27509effa871b216e67c0ce\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.rxresu.me#website\",\"name\":\"Reactive Resume\",\"url\":\"https://docs.rxresu.me\",\"publisher\":{\"@id\":\"https://docs.rxresu.me/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.rxresu.me/guides/using-the-api#webpage\",\"url\":\"https://docs.rxresu.me/guides/using-the-api\",\"name\":\"Using the API\",\"description\":\"Create a Reactive Resume API key, send authenticated REST requests to read and edit your resumes, and revoke keys you no longer need.\",\"dateModified\":\"2026-10-28T05:55:27.997Z\",\"isPartOf\":{\"@id\":\"https://docs.rxresu.me#website\"},\"breadcrumb\":{\"@id\":\"https://docs.rxresu.me/guides/using-the-api#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.rxresu.me/guides/using-the-api#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Reactive Resume\",\"item\":\"https://docs.rxresu.me\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Using the API\",\"item\":\"https://docs.rxresu.me/guides/using-the-api\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.rxresu.me/guides/using-the-api#article\",\"headline\":\"Using the API\",\"name\":\"Using the API\",\"description\":\"Create a Reactive Resume API key, send authenticated REST requests to read and edit your resumes, and revoke keys you no longer need.\",\"url\":\"https://docs.rxresu.me/guides/using-the-api\",\"mainEntityOfPage\":{\"@id\":\"https://docs.rxresu.me/guides/using-the-api#webpage\"},\"image\":\"https://rxresu.me/opengraph/banner.jpg\",\"dateModified\":\"2026-10-28T05:55:27.997Z\",\"publisher\":{\"@id\":\"https://docs.rxresu.me/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.rxresu.me#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Reactive Resume\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Reactive Resume","nav":{"global":{"anchors":[{"anchor":"Reactive Resume","icon":"link","href":"https://rxresu.me"},{"anchor":"Source Code","icon":"github","href":"https://github.com/reactive-resume/reactive-resume"}]},"tabs":[{"tab":"Documentation","icon":"book","groups":[{"group":"Getting Started","pages":[{"title":"Introduction","href":"/getting-started"},{"title":"Quickstart","href":"/getting-started/quickstart"},{"title":"Video Guides","icon":"circle-play","href":"/guides/video-guides"},{"title":"What's new in v6","href":"/guides/whats-new-in-v6"},{"title":"Using the command bar","href":"/guides/using-the-command-bar"},{"title":"Keyboard shortcuts","href":"/guides/keyboard-shortcuts"},{"title":"Checking service status","href":"/guides/checking-service-status"},{"title":"Accessing the previous version","href":"/guides/accessing-the-previous-version"}]},{"group":"Account","pages":[{"title":"Creating an account","href":"/guides/creating-an-account"},{"title":"Signing in","href":"/guides/signing-in"},{"title":"Updating your profile","href":"/guides/updating-your-profile"},{"title":"Changing appearance and language","href":"/guides/changing-appearance-and-language"},{"title":"Linking social accounts","href":"/guides/linking-social-accounts"},{"title":"Setting up two-step verification","href":"/guides/setting-up-two-factor-authentication"},{"title":"Setting up passkeys","href":"/guides/setting-up-passkeys"},{"title":"Exporting your data","href":"/guides/exporting-your-data"},{"title":"Deleting your account","href":"/guides/deleting-your-account"}]},{"group":"Documents","pages":[{"title":"Creating your first resume","href":"/guides/creating-your-first-resume"},{"title":"Managing your documents","href":"/guides/managing-documents"},{"title":"Organizing documents with tags","href":"/guides/organizing-with-tags"},{"title":"Using the Trash","href":"/guides/using-the-trash"},{"title":"Importing a resume","href":"/guides/importing-resumes"}]},{"group":"Resume Editor","pages":[{"title":"Getting to know the resume editor","href":"/guides/editor-overview"},{"title":"Filling in your details","href":"/guides/filling-in-your-details"},{"title":"Formatting text","href":"/guides/formatting-text"},{"title":"Managing sections","href":"/guides/managing-sections"},{"title":"Editing entries","href":"/guides/editing-entries"},{"title":"Entering dates","href":"/guides/entering-dates"},{"title":"Undoing changes and version history","href":"/guides/undoing-changes-and-version-history"},{"title":"Using private notes","href":"/guides/using-private-notes"},{"title":"Editing on a phone or tablet","href":"/guides/editing-on-mobile"}]},{"group":"Design","pages":[{"title":"Choosing a template","href":"/guides/choosing-a-template"},{"title":"Changing how entries look","href":"/guides/changing-how-entries-look"},{"title":"Customizing typography","href":"/guides/customizing-typography"},{"title":"Choosing colors","href":"/guides/choosing-colors"},{"title":"Choosing paper size, margins and language","href":"/guides/selecting-page-format"},{"title":"Arranging the layout","href":"/guides/arranging-the-layout"},{"title":"Fitting content on a page","href":"/guides/fitting-content-on-a-page"},{"title":"Applying custom styles","href":"/applying-custom-styles"}]},{"group":"Checking Your Resume","pages":[{"title":"Checking your resume before you apply","href":"/guides/checking-your-resume"},{"title":"Checking any resume PDF with the ATS checker","href":"/guides/using-the-ats-checker"}]},{"group":"Cover Letters","pages":[{"title":"Writing a cover letter","href":"/guides/writing-a-cover-letter"}]},{"group":"Sharing and Exporting","pages":[{"title":"Sharing your resume as a web page","href":"/guides/sharing-your-resume-publicly"},{"title":"Downloading your resume","href":"/guides/exporting-your-resume"},{"title":"Exporting a resume to Markdown","href":"/guides/exporting-resume-to-markdown"}]},{"group":"AI Assistant","pages":[{"title":"Connecting an AI provider","href":"/guides/using-ai"},{"title":"Using the assistant","href":"/guides/using-the-assistant"},{"title":"Assistant tools","href":"/guides/ai-agent-tools"}]},{"group":"Career and Application Workspaces","pages":[{"title":"Your career, in one place","href":"/guides/career-overview"},{"title":"Prepare your first application","href":"/guides/first-career-application"},{"title":"Tell your story once","href":"/guides/building-career-knowledge"},{"title":"Apply when your experience is different","href":"/guides/checking-job-fit"},{"title":"Answer another application form","href":"/guides/writing-application-answers"},{"title":"Get ready for interview day","href":"/guides/preparing-for-interview-day"},{"title":"Find roles while you are busy","href":"/guides/finding-roles-automatically"},{"title":"Reply to a recruiter","href":"/guides/replying-to-recruiters"},{"title":"Choose between two offers","href":"/guides/comparing-job-offers"},{"title":"Career and workspace controls","href":"/guides/career-workspace-reference"}]},{"group":"Application Tracker","pages":[{"title":"Tracking job applications","href":"/guides/tracking-job-applications"},{"title":"Adding an application","href":"/guides/adding-an-application"},{"title":"Managing an application","href":"/guides/managing-an-application"},{"title":"Customizing application stages","href":"/guides/customizing-application-stages"},{"title":"Scheduling interviews","href":"/guides/scheduling-interviews"},{"title":"Tailoring a resume for a job","href":"/guides/tailoring-a-resume-for-a-job"},{"title":"Viewing application insights","href":"/guides/viewing-application-insights"},{"title":"Importing applications from CSV","description":"Move job applications from a spreadsheet into Reactive Resume with CSV import, check how columns are matched, and export your applications back to CSV.","href":"/guides/importing-applications-from-csv"}]},{"group":"Integrations","pages":[{"title":"Using the API","href":"/guides/using-the-api"},{"title":"Using the patch API","description":"Change individual fields of a Reactive Resume with JSON Patch (RFC 6902): add, remove, replace and move items, set dates and avoid overwriting edits.","href":"/guides/using-the-patch-api"},{"title":"JSON resume schema","href":"/guides/json-resume-schema"},{"title":"Using the MCP server","href":"/guides/using-the-mcp-server"},{"title":"Using WebMCP","href":"/guides/using-webmcp"},{"title":"Managing applications with MCP","href":"/guides/managing-applications-with-mcp"},{"title":"Using agent skills","href":"/guides/using-agent-skills"},{"title":"Large RPC requests","href":"/guides/large-rpc-requests"}]},{"group":"Use Cases","pages":[{"title":"Free resume builder","href":"/use-cases/free-resume-builder"},{"title":"Open-source resume builder","href":"/use-cases/open-source-resume-builder"},{"title":"Privacy-focused resume builder","href":"/use-cases/privacy-focused-resume-builder"},{"title":"Self-hosted resume builder","href":"/use-cases/self-hosted-resume-builder"},{"title":"API and MCP resume automation","href":"/use-cases/api-mcp-resume-automation"},{"title":"Export and share resumes","href":"/use-cases/export-and-share-resumes"},{"title":"AI resume builder","href":"/use-cases/ai-resume-builder"}]},{"group":"Comparisons","pages":[{"title":"Reactive Resume vs Canva","href":"/comparisons/reactive-resume-vs-canva"},{"title":"Reactive Resume vs Adobe Express","href":"/comparisons/reactive-resume-vs-adobe-express"},{"title":"Reactive Resume vs Overleaf","href":"/comparisons/reactive-resume-vs-overleaf"},{"title":"Reactive Resume vs Resume.com","href":"/comparisons/reactive-resume-vs-resume-com"},{"title":"Reactive Resume vs MyPerfectResume","href":"/comparisons/reactive-resume-vs-myperfectresume"},{"title":"Reactive Resume vs Resume-Now","href":"/comparisons/reactive-resume-vs-resume-now"},{"title":"Reactive Resume vs Resume.io","href":"/comparisons/reactive-resume-vs-resume-io"},{"title":"Reactive Resume vs Zety","href":"/comparisons/reactive-resume-vs-zety"},{"title":"Reactive Resume vs Kickresume","href":"/comparisons/reactive-resume-vs-kickresume"},{"title":"Reactive Resume vs ResumeGemini","href":"/comparisons/reactive-resume-vs-resumegemini"},{"title":"Reactive Resume vs Jobscan","href":"/comparisons/reactive-resume-vs-jobscan"},{"title":"Reactive Resume vs Resumod","href":"/comparisons/reactive-resume-vs-resumod"},{"title":"Reactive Resume vs Rezi","href":"/comparisons/reactive-resume-vs-rezi"},{"title":"Reactive Resume vs CareerCircle","href":"/comparisons/reactive-resume-vs-careercircle"},{"title":"Reactive Resume vs Novorésumé","href":"/comparisons/reactive-resume-vs-novoresume"},{"title":"Reactive Resume vs LiveCareer","href":"/comparisons/reactive-resume-vs-livecareer"},{"title":"Reactive Resume vs Freesumes","href":"/comparisons/reactive-resume-vs-freesumes"}]},{"group":"Self-Hosting","pages":[{"title":"Self-hosting with Docker","href":"/self-hosting/docker"},{"title":"Self-hosting with Kubernetes","href":"/self-hosting/kubernetes"},{"title":"Self-hosting on Vercel","href":"/self-hosting/vercel"},{"title":"Self-hosting on Hostinger","href":"/self-hosting/hostinger"},{"title":"Self-hosting on Cloudflare","href":"/self-hosting/cloudflare"},{"title":"Self-hosting on your NAS","href":"/self-hosting/nas"}]},{"group":"Server Configuration","pages":[{"title":"Environment variables","href":"/self-hosting/environment-variables"},{"title":"Sharing domains","href":"/self-hosting/sharing-domains"},{"title":"Mirror Computer Modern fonts","href":"/self-hosting/fonts"},{"title":"Deployment examples","href":"/self-hosting/examples"},{"title":"Job search and AI","href":"/self-hosting/job-search-and-ai"},{"title":"Single sign-on (SSO)","href":"/self-hosting/sso"}]},{"group":"Upgrade Guides","pages":[{"title":"Migrating from v5","href":"/self-hosting/upgrading-to-v6"},{"title":"Migrating from v4","href":"/self-hosting/migration"}]},{"group":"Contributing","pages":[{"title":"Development setup","href":"/contributing/development"},{"title":"Project architecture","href":"/contributing/architecture"},{"title":"Web access adapters","href":"/contributing/web-access"},{"title":"Career platform rollout","href":"/contributing/career-platform"},{"title":"Contributing translations","href":"/contributing/translations"},{"title":"Deployment checks","href":"/contributing/deployment-checks"}]},{"group":"Community","pages":[{"title":"Sponsors","href":"/community/sponsors"},{"title":"Spotlight","href":"/community/spotlight"}]},{"group":"Legal","pages":[{"title":"License","href":"/legal/license"},{"title":"Privacy Policy","href":"/legal/privacy-policy"},{"title":"Terms of Service","href":"/legal/terms-of-service"}]}]},{"tab":"Changelog","icon":"clock","pages":[{"title":"Changelog","href":"/changelog"}]},{"tab":"API Reference","icon":"code","pages":[{"title":"API Reference","href":"/api-reference/system/get-application-health-and-version"}]}]},"title":"Using the API - Reactive Resume","buildId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","deploymentId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","dynamics":["07c022d89b","a74be98ba7","a9bb46feb3"],"chunks":["Frame-DYplxqhs.js","DynamicMarkdown-Cc6AuSHS.js","zoom-image-lightbox-BNnMwe0F.js","lightbox-handle-r17bVUz3.js","Markdown-Cc16CX65.js","clsx-Cs6nMGht.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-zbf22OZA.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-C_fs-y5n.js"]}