Add or remove a master line on a job's tailored resume
const url = 'http://127.0.0.1:8765/api/tailored-resumes/selection';const options = { method: 'PUT', headers: {'Content-Type': 'application/json'}, body: '{"item_id":"b-hex-03","job_identity":"https://boards.greenhouse.io/acme/jobs/101","profile_id":"prof_1","updated_at":"2026-09-29T10:05:00Z","use":"add"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request PUT \ --url http://127.0.0.1:8765/api/tailored-resumes/selection \ --header 'Content-Type: application/json' \ --data '{ "item_id": "b-hex-03", "job_identity": "https://boards.greenhouse.io/acme/jobs/101", "profile_id": "prof_1", "updated_at": "2026-09-29T10:05:00Z", "use": "add" }'Add or Remove one master line on a job’s tailored resume. For a resume tailored from the master resume (its selection lists what was picked and what was left out). remove takes the line off this one job’s resume and lists it under selection.left_out with code removed_by_you. add shows the line: one an older pick had cut for length comes back as it was; any other is a copy of the master line as the master words it now, under its role. The reply is the tailored resume with selection_change: {use, item_id, applied, changed, needs_choice, pages, max_pages, would_cut, cut}. An add ALWAYS applies and nothing else moves: no page is counted and nothing is rendered, so applied is true, needs_choice false, would_cut and cut empty and pages null (the fields stay for callers; until 0.1.11.5 an add that ran past 2 pages stored nothing and asked what to cut). How many pages the resume now prints on is what POST /api/tailored-resumes/preview says, and its spacing fits the page. An add may take a resume past the 20 bullets a pick holds. updated_at is unchanged. The resume is then yours: background tailoring never replaces it. Other jobs, the profile’s selection and the master are untouched. Local only: no model call.
Request Bodyrequired
Section titled “Request Bodyrequired”object
Accepted and ignored since 0.1.11.5: an add always applies and nothing is cut to make room (the preview’s spacing fits the page).
The master line’s id (from selection.picked / selection.left_out, or GET /api/master).
The job identity.
Optional (0.1.11.9: a job has one resume, and the job names it). Still taken from callers of before; “ephemeral” names a pasted resume’s.
The updated_at of the tailored resume you read; a newer tailoring answers 409.
Add shows a left-out master line; remove takes a picked one off this resume.
Example
{ "item_id": "b-hex-03", "job_identity": "https://boards.greenhouse.io/acme/jobs/101", "profile_id": "prof_1", "updated_at": "2026-09-29T10:05:00Z", "use": "add"}Responses
Section titled “Responses”Success.
object
Example
{ "job": { "job_identity": "https://boards.greenhouse.io/acme/jobs/101" }, "markdown": "# ...", "schema_version": "scout-tailor-response:1", "selection_change": { "applied": true, "changed": true, "cut": [], "item_id": "b-hex-03", "max_pages": 2, "needs_choice": false, "pages": null, "use": "add", "would_cut": [] }}Forbidden / forbidden_origin: loopback peer and Host 127.0.0.1:<port> or localhost:<port> only (Origin too on writes).
object
object
Examplegenerated
{ "error": { "allowed_keys": [ "example" ], "code": "example", "message": "example" }}Tailored_resume_not_found, master_line_not_found, master_not_found, target_unavailable
object
object
Example
{ "error": { "code": "tailored_resume_not_found", "message": "..." }}Selection_line_not_shown, tailored_resume_changed
object
object
Example
{ "error": { "code": "selection_line_not_shown", "message": "..." }}Unsupported_media_type: writes need Content-Type: application/json.
object
object
Examplegenerated
{ "error": { "allowed_keys": [ "example" ], "code": "example", "message": "example" }}Unknown_key, invalid_value, selection_unavailable, selection_line_unsupported
object
object
Example
{ "error": { "code": "unknown_key", "message": "..." }}