Keep the original or the rewrite of one line, or edit it
const url = 'http://127.0.0.1:8765/api/tailored-resumes/lines';const options = { method: 'PUT', headers: {'Content-Type': 'application/json'}, body: '{"job_identity":"https://boards.greenhouse.io/acme/jobs/101","line_id":"L3","profile_id":"prof_1","text":"Rebuilt the scheduling service on Python and Postgres for 4 teams.","updated_at":"2026-09-29T10:05:00Z","use":"custom"}'};
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/lines \ --header 'Content-Type: application/json' \ --data '{ "job_identity": "https://boards.greenhouse.io/acme/jobs/101", "line_id": "L3", "profile_id": "prof_1", "text": "Rebuilt the scheduling service on Python and Postgres for 4 teams.", "updated_at": "2026-09-29T10:05:00Z", "use": "custom" }'Show the original, the rewrite, or your own text on one line of a stored tailored resume. Idempotent: choosing what is already shown changes nothing. The PDF and the markdown follow the choice; updated_at is unchanged. use custom edits a body line (a summary, skills or other line, or an entry’s bullet; never an entry heading): the line becomes kind custom, origin user, with no refs (no source is claimed for it and the no-loss check does not cover it) and edited_from holding the line it replaced, so use original or use rewritten brings that back. Local only: no model reads the text. A text that looks like your name or a contact detail (email, phone, link, address) is refused with 422 personal_info_refused: GigAI stores no name or contact details; they are typed in Scout’s Generate PDF form for one PDF. Example, change two bullets then render: PUT this route twice (line_id L3, then L4, each with use custom and text), then POST /api/tailored-resumes/pdf with the same profile_id and job_identity.
Request Bodyrequired
Section titled “Request Bodyrequired”object
The job identity.
A line id (L<n>) from the tailored resume.
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.
With use custom only: the line’s new text, one line of at most 400 characters, without a bullet marker.
The updated_at of the tailored resume you read; a newer tailoring answers 409.
Which version to show; custom shows text.
Example
{ "job_identity": "https://boards.greenhouse.io/acme/jobs/101", "line_id": "L3", "profile_id": "prof_1", "text": "Rebuilt the scheduling service on Python and Postgres for 4 teams.", "updated_at": "2026-09-29T10:05:00Z", "use": "custom"}Responses
Section titled “Responses”Success.
object
Example
{ "job": { "job_identity": "https://boards.greenhouse.io/acme/jobs/101" }, "markdown": "# ...", "schema_version": "scout-tailor-response:1"}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, target_unavailable
object
object
Example
{ "error": { "code": "tailored_resume_not_found", "message": "..." }}Tailored_resume_changed
object
object
Example
{ "error": { "code": "tailored_resume_changed", "message": "..." }}Unsupported_media_type: writes need Content-Type: application/json.
object
object
Examplegenerated
{ "error": { "allowed_keys": [ "example" ], "code": "example", "message": "example" }}Invalid_value, personal_info_refused
object
object
Example
{ "error": { "code": "invalid_value", "message": "..." }}