Changelog
This page tracks every shipping change to the JobTactics Public API. Entries are dated and grouped by category. Breaking changes are called out explicitly.
v1.1.0 — 2026-06-30
Removed — Profile, folder and document CRUD (breaking)
The Public API is now a workflow integration surface, not a remote substitute for the JobTactics dashboard. Resources whose creation/editing only makes sense inside the dashboard’s purpose-built UI have been removed from the public surface. They remain fully available inside app.jobtactics.io.
Profiles (write surface removed; two reads remain):
POST /public/profiles— removedPATCH /public/profiles/{id}— removedDELETE /public/profiles/{id}— removedPATCH /public/profiles/{id}/default— removedGET /public/profiles— kept (returns id + label so workflows can map a profileId into generation endpoints).GET /public/profiles/{id}— kept (read-only; returns the full profile content so a workflow can pre-fill data or archive a snapshot outside the SaaS).
Folders (entire surface removed):
GET /public/documents/folders— removedPOST /public/documents/folders— removedPATCH /public/documents/folders/{id}— removedDELETE /public/documents/folders/{id}— removed
Documents (write surface removed; reads remain):
POST /public/documents— removed (documents are now created exclusively by the generation endpointsPOST /public/cv/generate,POST /public/cover-letter/generate, etc., which already return persisted documents with anid).PATCH /public/documents/{id}— removedDELETE /public/documents/{id}— removedGET /public/documents— kept (paginated listing, filterable by type/folder/search).GET /public/documents/{id}— kept (retrieve a single document with content).POST /public/documents/{id}/export-*— kept (4 endpoints: PDF, letter PDF, letter DOCX, report PDF).
Removed — Application score (breaking)
Application scoring is split between an integration signal and two SaaS-internal features. Only the former stays public:
GET /public/application-score/profile/{profileId}— kept. A 0-100 readiness signal for a single profile. An API provider can use it to decide whether a profile is ready before triggering a generation. Free of charge.GET /public/application-score/application/{applicationId}— removed. Fine-grained scoring of one tracked application is part of the application-tracking experience inside the dashboard, not a workflow building block.POST /public/application-score/applications/batch— removed. Batch-scoring a whole kanban is a dashboard refresh feature; it has no meaningful use through an external workflow.
The use case left behind: an external provider can still score a single profile, but auditing a specific application or batch-rating a board are SaaS-internal features.
Changed — Document exports : locale query parameter removed (breaking)
The locale query parameter has been removed from every export endpoint:
POST /public/documents/{id}/export-pdf— no more?locale=POST /public/documents/{id}/export-letter-pdf— no more?locale=POST /public/documents/{id}/export-report-pdf— no more?locale=
Why. Exports must reflect the document as it was generated, not be re-translated at
download time. The previous design let callers pass a locale that would override the
section labels (e.g. “Experience” → “Expérience”), producing PDFs where the body content
was in one language and the section labels in another. That was a footgun.
New behavior. The export endpoints now pick the language from the document itself, in this order:
content.languageif the document was generated with an explicit language.- The user’s preferred language (
users.language). - English as the ultimate fallback.
If you want a CV in French, generate it in French (POST /public/cv/generate with
language: "fr"). The export then matches.
Added — CV section labels follow the document language, for any locale
CV section labels (“Experience”, “Education”, “Skills”…) now follow the language the CV was generated in — including languages outside the six UI locales (fr, en, es, it, de, pt). Generate a CV in Japanese, Arabic or Chinese and the exported PDF’s section headers come out in that language instead of falling back to English.
How it works. When a CV is generated, the target language is stored on the document
(content.language), and the AI produces the translated section labels alongside the
content (content.sectionLabels). At export time, labels are resolved in this order, per
label: the document’s own sectionLabels, then the built-in registry for one of the six UI
locales, then English. Explicit per-document labels always win, so non-EU languages render
correctly without any new endpoint or parameter.
Changed — every export follows the document’s own language, end to end
The “language is intrinsic to the document” principle now covers all generation paths and all exports:
- Letters (cover letter, resignation letter) store their generation language on the document across every path — the Studio, the “cover letter for a job offer” background workflow, and the public API. The same is true for CVs generated by the background “CV for a job offer” workflow.
- Reports (
cv_audit,cv_optimization,job_analysis) always carry their language, set at generation time. - The Studio’s ad-hoc report PDF export now derives the PDF language from the report itself
(
data.language) instead of a separately supplied UI locale. Generate an audit in Spanish, export it, and the PDF headers and labels come out in Spanish — no matter what UI language you happen to be viewing the dashboard in.
Migration notes
If you previously created profiles, folders or documents via the API in scripts or integrations:
- Profiles — create them once in the dashboard (richer UI for the 10 sub-schemas:
experiences, education, skills, languages, certifications, social links, projects), then
reference them by
profileIdin your generation calls. You can still read a profile back withGET /public/profiles/{id}(full content) or list them withGET /public/profiles. - Application score — keep scoring profiles with
GET /public/application-score/profile/{profileId}. Per-application and batch scoring are no longer exposed; track and rate applications inside the dashboard. - Folders — organize the document library inside the dashboard. The
folderIdfilter onGET /public/documentsstill works server-side. - Documents — call
POST /public/cv/generate(or any other generation endpoint) which now systematically persists a document and returns itsid. Theidis immediately usable with the export endpoints. - Exports — drop any
&locale=from the export URL. The generated PDF/DOCX language follows the document’s own language, set at generation time. If you generate infr, the export comes out infr.
Total surface: 31 → 17 public endpoints. The Make and Zapier integrations have been updated in lockstep.
v1.0.1 — 2026-05-18
Removed — Matching (breaking)
POST /public/matching/quickandPOST /public/matching/quick/batchhave been removed from the public API. Quick match is an internal SaaS feature (provisional profile-vs-offer scoring that powers the dashboard and the jobs page) and is not relevant to third-party API consumers. Thekeywords/scanendpoint — never actually implemented and documented by mistake — is also gone (keyword coverage is provided byPOST /public/ats/audit).
Fixed
POST /public/cv/generate,POST /public/ats/audit,POST /public/cover-letter/generateandPOST /public/resignation-letter/generatereturned500because theoperation_costs.api_endpointmapping was never populated in production. The mapping is now backfilled and seeded — these endpoints work as documented.
v1.0.0 — 2026-05-04
The first public release of the API expands the surface from four endpoints to a complete integration toolkit (31 endpoints), all gated by personal API keys generated in Settings → API keys.
Added — AI generation
POST /public/bullet-points/generate— generate ATS-aware bullet points for a job experience.POST /public/experience-description/generate— produce a polished narrative description.POST /public/professional-summary/generate— craft a 3-5 sentence positioning summary.POST /public/reformulator/reformulate— rewrite text with the requested tone.POST /public/skills-generation/generate— generate 20 mixed (hard + soft) skills from a title.POST /public/linkedin-optimizer/generate— optimized LinkedIn profile content.
Added — Application scoring
GET /public/application-score/profile/{profileId}— readiness signal for a profile.GET /public/application-score/application/{applicationId}— fit score for one application.POST /public/application-score/applications/batch— batch-score a list of applications.
Added — Profile, document and folder CRUD
- Full CRUD on
/public/profiles(list, get, create, update, delete, set default). - Full CRUD on
/public/documentsfor every document type (cv, cover_letter, resignation_letter, linkedin_profile, cv_audit, cv_optimization, job_analysis), filterable by?type=. - Full CRUD on
/public/documents/folders.
Added — Document exports
POST /public/documents/{id}/export-pdf— CV to PDF.POST /public/documents/{id}/export-letter-pdf— letter (cover or resignation) to PDF.POST /public/documents/{id}/export-letter-docx— letter to DOCX.POST /public/documents/{id}/export-report-pdf— audit / optimization / analysis report PDF.
All export endpoints follow the same async pattern: the file is generated, uploaded to private storage and returned as a presigned URL valid for one hour, in this exact JSON shape:
{
"downloadUrl": "https://...",
"expiresAt": "2026-05-04T18:30:00.000Z",
"filename": "cv-jane-doe-software-engineer-acme-04-05-2026.pdf",
"contentType": "application/pdf",
"sizeBytes": 245678
}
Added — Read-only resources
GET /public/credits/balance— current credit balance.GET /public/credits/history— paginated transaction history.GET /public/templates— list templates the caller owns (free + purchased).GET /public/templates/{id}— retrieve a single owned template.
Added — Settings
PATCH /public/settings/language— change the preferred generation language.
Notes
- The earlier
/public/cv/generate,/public/ats/audit,/public/cover-letter/generateand/public/resignation-letter/generateendpoints are unchanged — existing integrations keep working. - The interactive reference is now a separately versioned site (this docs.jobtactics.io domain), served independently from the API.