Skip to content
Docs
Sign in

Screening API

Create and screen jobs from PDFs, Files or imposition sheets, read their plates and report, and manage profiles, devices and curves.

For integrators

The screening API does what the Screening pages do: it creates a job from a PDF, from a PDF in Files or from the sheets of an imposition layout, changes its screens and output, screens it into 1-bit TIFFs and reads back the plates and the report. It also manages the team's profiles, platesetters, presses and plate curves. Every endpoint is under your team, at /a/<team_slug>/screening/api/v1/.

Every call takes the same authentication as the rest of the API: an API key of a team member, or a signed-in session that also sends its CSRF token when it changes data (see authentication).

Job ids are UUIDs; profile, device and curve ids are numbers. An object of another team is a 404. Deleting a profile, a device or a curve needs a team administrator (403 for other members).

Screen a PDF from start to finish#

JOBS=https://app.example.com/a/acme/screening/api/v1/jobs/
AUTH="Authorization: Api-Key $API_KEY"
JOB=00000000-0000-0000-0000-000000000000   # the id the first call returns

# 1. Upload pages 1-2 of a PDF with profile 42 (multipart; 201 with the new job, preflighted and configuring)
curl -s -X POST "$JOBS" -H "$AUTH" -F source=upload -F file=@postcard-a.pdf -F pages=1-2 -F profile=42

# 2. Change the resolution and the Black screen (the answer has the checks again, in "guardrails")
curl -s -X PATCH "$JOBS$JOB/" -H "$AUTH" -H "Content-Type: application/json" \
  -d '{"settings": {"dpi": 2540, "separations": [{"name": "Black", "screen": {"lpi": 175, "angle": 45}}]}}'

# 3. Screen it (202), then poll until the status is done, failed or cancelled
curl -s -X POST "$JOBS$JOB/start/" -H "$AUTH"
curl -s "$JOBS$JOB/" -H "$AUTH"

# 4. Read the report of the done job
curl -s "$JOBS$JOB/report/" -H "$AUTH"

Jobs#

POST /a/{team_slug}/screening/api/v1/jobs/

Create a job from an uploaded PDF, a PDF in Files or imposition sheets, and preflight it.

screening_jobs_create · View in API reference

GET /a/{team_slug}/screening/api/v1/jobs/

List the team's screening jobs, newest first.

screening_jobs_list · View in API reference

GET /a/{team_slug}/screening/api/v1/jobs/{id}/

Read a job with its settings, checks and plates.

screening_jobs_retrieve · View in API reference

DELETE /a/{team_slug}/screening/api/v1/jobs/{id}/

Delete a job with its plates and files.

screening_jobs_destroy · View in API reference

A new job is made in one call: the app copies the pages, runs the preflight and gives each separation the screen its profile says, so the answer (201) is a job in configuring, ready to check and start. The call takes as long as the preflight, up to a few minutes for a large file.

Create a job
FieldNeeded to createMeaning
sourceYesupload for an uploaded PDF, file for a PDF already in Files, imposition for the sheets of an imposition layout.
nameNoThe job's name. Without one: the file's name, or the imposition job's and layout's names.
profileNoA screening profile of the team. Without one: the team's Offset sheetfed default.
fileNoThe PDF, up to 500 MB (upload; send the request as multipart form data). It is also stored in the Screening folder in Files.
file_versionNoThe id of a PDF version in Files, from the Files API (file). The job keeps that exact version.
pagesNoThe pages to screen, such as 1-3, 5, at most 50 (upload and file; empty for every page).
imposition_jobNoThe imposition job (imposition).
layout_refNoThe layout's ref from the layouts list, such as l-42 (imposition).
sheetsNoThe sheets to screen, numbered from 0, such as [0, 2] (imposition; empty for every sheet).
  • An uploaded PDF: send multipart/form-data with source=upload and file, and optionally pages, profile and name. See Sources: PDFs, Files and imposition sheets. Once the preflight passes, the PDF is also saved in the team's Screening folder in Files, and the job keeps that version. A full Files storage answers 507 and creates nothing.
  • A PDF in Files: send JSON with source: "file" and file_version, the id of a version from the Files API, and optionally pages, profile and name. The job keeps that exact version; a newer version never changes it. A version of another team, or one still being processed, is a 404; a file that isn't a PDF is a 422. See Sources: PDFs, Files and imposition sheets.
  • Imposition sheets: send JSON with source: "imposition", imposition_job and layout_ref, and optionally sheets. The app builds the imposed PDF of those sheets, as the imposition export does, and screens that. See Sources: PDFs, Files and imposition sheets.
{"source": "file", "file_version": 42, "pages": "1-2"}
{"source": "imposition", "imposition_job": 42, "layout_ref": "l-42", "sheets": [0, 1]}

The imposition jobs to choose from, and the layouts of one, are listed by:

GET /a/{team_slug}/screening/api/v1/jobs/imposition-jobs/

List the imposition jobs a screening job can start from.

screening_imposition_jobs · View in API reference

GET /a/{team_slug}/screening/api/v1/jobs/imposition-jobs/{imposition_id}/layouts/

List the sheet layouts of an imposition job.

screening_imposition_layouts · View in API reference

The first lists the team's 100 most recently changed imposition jobs (id, name, run_type, updated_at). The second lists a job's saved layouts and the layouts of its last run, each with its ref, name, sheets, run_type, size_in, method, press_sheets and yield_pct, plus roll and fresh. A roll layout can't be screened, and a layout that isn't fresh is refused with 409 until the imposition job runs again.

The list takes ?status= (one status), ?imposition_job= (an id) and ?limit= (1 to 200, 50 by default), and answers {"count": …, "results": […]}, newest first. Each job in a list has the first group of fields below; a job read alone, and the answer of every call that changes a job, has them all.

Job fields
FieldInMeaning
idAlwaysThe job's id, a UUID.
nameAlwaysThe job's name: the {job} of the plate file names.
statusAlwaysconfiguring, queued, rendering, finishing, done, failed, cancelled or expired.
source_kindAlwaysupload, file (a PDF from Files) or imposition.
source_filenameAlwaysThe uploaded file's name, the file's name in Files, or the name of the imposed PDF built.
source_fileAlwaysWhere the PDF is in Files, or null for imposition sheets: path and version (as they were when the job was made), and version_id, file_id and url (the file in Files) while the job keeps that version; they are null once the job has expired.
imposition_jobAlwaysThe imposition job's id, or null.
imposition_job_nameAlwaysThe imposition job's name, or empty.
layout_refAlwaysThe imposition layout's ref, or empty.
layout_nameAlwaysThe layout's name (its ref when the layout is gone), or empty.
rescreen_ofAlwaysThe id of the job this one re-screens, or null.
pagesAlwaysHow many pages (or sheets) the job has.
platesAlwaysHow many plate files it has: 0 until it is done.
dpiAlwaysThe job's resolution.
progressAlwaysWhile it runs: stage, percent (0 to 100) and, per page, page, pages and detail.
errorAlwaysWhy the job failed, or empty.
worker_staleAlwaystrue when the screening worker stopped answering: retry the job.
queue_positionAlwaysHow many jobs are ahead of a queued job; 0 otherwise.
errorsAlwaysHow many errors the checks found. A job with errors can't start.
warningsAlwaysHow many warnings the checks found.
profileAlwaysThe profile's id, or null.
profile_nameAlwaysThe profile's name, or empty.
created_atAlwaysWhen the job was created (ISO 8601).
finished_atAlwaysWhen it finished, or null.
expires_atAlwaysWhen its files are deleted.
urlsAlwaysIts page, viewer, api, download (the ZIP), report and thumb (page 1) addresses.
file_namesOne jobThe file name of every plate the job writes, in order.
page_listOne jobEvery page: number, label, size_pt, boxes (media, bleed, trim) and, for sheets, sheet_index.
settingsOne jobThe resolved settings. Each separation also has actual (the screen the engine really makes) and chain (its curve's label and checksum).
guardrailsOne jobThe checks: level (error, warning or info), code, message and the separation or page it is about.
preflightOne jobWhat the preflight found on each page: size, transparency, spots, rotation and plates.
engineOne jobAfter screening: the renderer's version, the time taken, the trap layer state and the skipped plates.
plate_listOne jobThe plates of a done job; empty before.

What each status means is in Running a screening job. The addresses in urls are the job's pages and files in the app. source_file tells where the PDF is in Files:

{"version_id": 42, "file_id": 42, "path": "Customers / Postcard A.pdf", "version": 2, "url": "/a/acme/files/f/42/"}

The path and version are recorded when the job is made. Once the job expires it lets go of the version, and version_id, file_id and url become null.

Deleting a job deletes its plates and files (204). A job that is rendering or finishing must be cancelled first (409).

Change a job's settings#

PATCH /a/{team_slug}/screening/api/v1/jobs/{id}/

Rename a job or change its settings while it is configuring.

screening_jobs_partial_update · View in API reference

While a job is configuring, PATCH takes a new name and settings changes; send only what changes. Every other status answers 409.

Key What it changes
dpi The resolution, 600 to 5,080 dpi.
extent media, bleed or trim (see Output settings).
output Any of compression (auto, g4, lzw, packbits, none), polarity (positive, negative), mirror, name_template, ink_zones (1 to 128) and blank_plates (skip, write). Keys the job's platesetter sets, listed in the job's settings.locked, are ignored.
marks registration and plate_labels, true or false.
trap policy (use_artwork_traps, off or as_file) and require (see Output settings).
separations A list of changes, each with the separation's name and any of include, screen, curve and, for a spot ink, role.

A screen takes any of kind (am, fm or solid), lpi (50 to 300, and at most dpi ÷ 4), angle (degrees, counter-clockwise on the right-reading sheet), dot (round, euclidean, ellipse, square, line or diamond) and fm_dot_um (5 to 100). curve is a curve id, or null for the profile's chain. role is spot, solid or technical; a technical ink is never output, so it can't be included (see Screens per separation).

The answer is the job with its checks run again. A setting the app refuses is a 400 that names each one:

{"detail": "Some settings are not valid.", "settings": {"separations.Black.lpi": "Enter a value from 50 to 300."}}

Screen, cancel and re-screen#

POST /a/{team_slug}/screening/api/v1/jobs/{id}/start/

Queue a configuring job for screening.

screening_jobs_start · View in API reference

POST /a/{team_slug}/screening/api/v1/jobs/{id}/cancel/

Cancel a queued or running job.

screening_jobs_cancel · View in API reference

POST /a/{team_slug}/screening/api/v1/jobs/{id}/edit/

Take a failed or cancelled job back to configuring.

screening_jobs_edit · View in API reference

POST /a/{team_slug}/screening/api/v1/jobs/{id}/retry/

Queue a job again after its worker stopped answering.

screening_jobs_retry · View in API reference

POST /a/{team_slug}/screening/api/v1/jobs/{id}/rescreen/

Make a new configuring job from a finished job's pages and settings.

screening_jobs_rescreen · View in API reference

  • start/ checks the job once more, freezes its settings and curve versions and queues it (202). A job with errors answers 409 with "detail": "Fix the errors before screening." and the errors in guardrails.
  • cancel/ stops a queued, rendering or finishing job (202); its partial plates are deleted.
  • edit/ takes a failed or cancelled job back to configuring (202), so you can change it and start it again.
  • retry/ queues a job again from the start when worker_stale is true (202).
  • rescreen/ makes a new job in configuring from a done, failed or cancelled job's pages and settings (201, the new job, whose rescreen_of is the first one's id). See Running a screening job.

Each answers with the job (the new one for rescreen/), or 409 with the reason when the job's status doesn't allow it, such as "Only a queued or running job can be cancelled." Poll the job while it runs: progress has the stage and the percentage, and queue_position the jobs ahead.

Plates, report and analyser#

Once a job is done, reading it alone lists its plates: one per page and separation output. Each plate has:

Plate fields
FieldMeaning
idThe plate's id.
pageIts page number, from 1.
separationThe separation's name, such as Cyan or PMS 185 C.
slugThe separation's short name for the analyser, such as cyan.
kindprocess or spot.
fileThe file's name.
bytesThe file's size.
sha256The file's SHA-256 checksum.
width_pxThe width in device pixels.
height_pxThe height in device pixels.
dpiThe resolution.
compressionThe TIFF compression used: g4, lzw, packbits or none.
negativetrue for a negative plate.
mirrortrue for a mirrored (wrong-reading) plate.
coverageThe ink coverage in %, counted from the device pixels.
ink_zonesThe coverage of each ink zone in %, left to right on the right-reading sheet.
screenThe screen asked for, the actual one, and the curve's label and checksum.
downloadThe file's address. It needs a signed-in session: an API key alone can't download it.

Warning: Files need a signed-in session

The plate download address, the job's download ZIP and the viewer tiles are app routes for signed-in team members: a request with only an API key is redirected to sign in. Through the API you can read everything about the plates (names, sizes, checksums, coverage), but downloading the files needs a browser session today.

GET /a/{team_slug}/screening/api/v1/jobs/{id}/report/

The report of a done job (report.json).

screening_jobs_report · View in API reference

The report of a done job, the same record as the report.json in its ZIP, with the format automateprint.screening-report/1: the job, source, pages, engine, settings, every plate file with its checksum, and the warnings. See Downloads and the screening report. Before the job is done it is a 404.

GET /a/{team_slug}/screening/api/v1/jobs/{id}/manifest/

The plate viewer's manifest of a job: pages, plates and tile address.

screening_jobs_manifest · View in API reference

What the plate viewer loads: the pages with their size in device pixels, zoom levels and plates (screen, coverage, ink zones), and a tile_url template. Before the job is done it describes the 50 dpi preview, with "state": "preview".

GET /a/{team_slug}/screening/api/v1/jobs/{id}/analyse/

Measure the coverage, ruling and angle of an area of a plate.

screening_jobs_analyse · View in API reference

The screen analyser for one plate of a done job: page, plate (the plate's slug) and an area x, y, w, h in device pixels of the right-reading plate, at least 64 × 64. The answer has screen (am, fm, or flat for paper or a solid), coverage in %, and for an AM screen the measured lpi and angle. A job that isn't done yet is a 409.

Profiles and devices#

GET /a/{team_slug}/screening/api/v1/profiles/

List the team's screening profiles.

screening_profiles_list · View in API reference

POST /a/{team_slug}/screening/api/v1/profiles/

Create a screening profile.

screening_profiles_create · View in API reference

GET /a/{team_slug}/screening/api/v1/profiles/{id}/

Read a screening profile.

screening_profiles_retrieve · View in API reference

PATCH /a/{team_slug}/screening/api/v1/profiles/{id}/

Change some fields of a screening profile.

screening_profiles_partial_update · View in API reference

DELETE /a/{team_slug}/screening/api/v1/profiles/{id}/

Delete a screening profile (team administrators).

screening_profiles_destroy · View in API reference

POST /a/{team_slug}/screening/api/v1/profiles/{id}/set-default/

Make a profile the default of its press type.

screening_profiles_set_default · View in API reference

GET /a/{team_slug}/screening/api/v1/profiles/presets/

List the built-in profiles.

screening_profiles_presets · View in API reference

POST /a/{team_slug}/screening/api/v1/profiles/from-preset/

Create a profile from a built-in one.

screening_profiles_from_preset · View in API reference

A profile is the setup a job starts from. The list answers {"results": […]}; each profile has its id, is_default, url (its page in the app) and the fields below.

Profile fields
FieldNeeded to createMeaning
nameYesThe profile's name.
press_typeYesoffset_sheetfed, offset_web, newspaper, flexo or custom.
resolution_dpiYesThe jobs' starting resolution, 600 to 5,080 dpi.
settingsYesThe screens, inks, output, marks and trap layer settings.
platesetterNoA platesetter of the team, or null.
pressNoA press of the team, or null.
tone_curveNoA curve of kind tone, or null.
press_curveNoA curve of kind press, or null.
linearization_curveNoA curve of kind linearization, or null.

The easiest start is a built-in profile: profiles/presets/ lists them with their full settings, and profiles/from-preset/ with {"preset": "offset_150_euclidean", "name": "Press 150"} makes a team profile from one (201). It becomes the default of its press type when the type has none; set-default/ makes another profile the default. Listing the profiles creates the "Offset 150 · Euclidean" default when the team has no Offset sheetfed default.

settings is the document the presets show: process (a screen for each of Cyan, Magenta, Yellow and Black), spot (the screen of other spot inks, with angle_from, the process colours whose angles spots take in turn), named ({ink name: screen}), technical_inks and solid_inks (lists of names, up to 60), extent, output, marks and trap. Screens and the other keys take the values of a job's settings. Errors name the key, such as {"settings": {"process.Cyan.lpi": "Enter a value from 50 to 300."}}. A curve or device slot takes an id of the team of the right kind: "This is not the right kind for this slot." otherwise.

Devices#

GET /a/{team_slug}/screening/api/v1/devices/

List the team's platesetters and presses.

screening_devices_list · View in API reference

POST /a/{team_slug}/screening/api/v1/devices/

Add a platesetter or a press.

screening_devices_create · View in API reference

GET /a/{team_slug}/screening/api/v1/devices/{id}/

Read a device.

screening_devices_retrieve · View in API reference

PATCH /a/{team_slug}/screening/api/v1/devices/{id}/

Change some fields of a device.

screening_devices_partial_update · View in API reference

DELETE /a/{team_slug}/screening/api/v1/devices/{id}/

Delete a device (team administrators).

screening_devices_destroy · View in API reference

Device fields
FieldNeeded to createMeaning
nameYesThe device's name, unique in the team.
kindYesplatesetter or press. It can't change.
settingsNoThe device's settings; keys left out take the defaults.
notesNoFree text.

A platesetter's settings are resolutions (a list of dpi), default_resolution, technology (thermal, violet, uv, flexo_lams or film), compression, name_template, negative, mirror and blank_plates (skip by default). A press's are process (a press type), registration_tolerance_mm (0 to 1), ink_zones (1 to 128), trap_policy and require_traps. What each one does is in Screening profiles and devices.

Plate curves#

GET /a/{team_slug}/screening/api/v1/curves/

List the team's plate curves.

screening_curves_list · View in API reference

POST /a/{team_slug}/screening/api/v1/curves/

Create a plate curve with its first version.

screening_curves_create · View in API reference

GET /a/{team_slug}/screening/api/v1/curves/{id}/

Read a plate curve and all its versions.

screening_curves_retrieve · View in API reference

PATCH /a/{team_slug}/screening/api/v1/curves/{id}/

Change a plate curve; new data adds a version.

screening_curves_partial_update · View in API reference

DELETE /a/{team_slug}/screening/api/v1/curves/{id}/

Delete a plate curve (team administrators).

screening_curves_destroy · View in API reference

POST /a/{team_slug}/screening/api/v1/curves/{id}/restore/

Make an older version current again, as a new version.

screening_curves_restore · View in API reference

POST /a/{team_slug}/screening/api/v1/curves/preview/

Compute a curve entry without saving it.

screening_curves_preview · View in API reference

POST /a/{team_slug}/screening/api/v1/curves/import/

Read measurements (CSV, TSV or CGATS) into compensation entries.

screening_curves_import · View in API reference

GET /a/{team_slug}/screening/api/v1/curves/presets/

List the built-in curves and the compensation aims.

screening_curves_presets · View in API reference

A plate curve keeps every version it ever had. A curve read alone lists them in versions; the list shows only current_version. Each version has its id, number, data, measured_with, hashes (the checksum of each entry), note, created_at and created_by.

Curve fields
FieldNeeded to createMeaning
nameYesThe curve's name, unique in the team.
kindYespress, linearization or tone: the curve's place in the chain. It can't change.
deviceNoThe device it was made for, for reference, or null.
printing_conditionNoFree text, such as the paper and the press.
bindingNoMade for: the jobs the curve suits.
mismatch_policyNoWhat a job outside the binding gets: warn (a warning) or abort (an error).
notesNoFree text.
dataNoThe entries of a new version.
measured_withNoThe version the measured test form was printed through.
measurementNoWhere a measured version came from, such as the imported text (up to 64 KB).
noteNoA note on the new version.
presetNoA built-in curve to start from, instead of data.

A POST or PATCH with data (or preset) adds a version; changing only the name or notes doesn't. data holds separations, one entry per separation name (Default covers the others), and spot_mapping ({spot name: entry name}). An entry has a mode:

  • linear: no change;
  • points: points, 2 to 33 [in %, out %] pairs, or the same as in,out lines of text;
  • compensation: measured (input and output lists, units percent, fraction or density) and a target from curves/presets/ (see Press compensation from measurements).

Any entry can have limits: keep_zero_below, min_dot, min_dot_mode (hold or cutoff), bump_range, max_dot, cutback_range and keep_solid (see Plate curves). binding takes resolution_dpi (a list), screen_family (am, fm, solid), lpi ([lowest, highest]), dot_shapes and polarity (see Plate curves).

restore/ takes {"version": <a version's id>} and makes it current again, as a new version. preview/ computes an entry without saving: send {"spec": {…}} for samples ([file %, plate %] pairs from 0 to 100), the sha256 of the curve and, for a compensation, the aim. import/ reads measurements (text up to 256 KB of CSV, TSV or CGATS, units auto by default, and an optional target) into compensation entries, with warnings and errors, without saving them: put them in data to save.

Errors#

Status When
400 A field or setting the app refuses (named in the answer); no file, no layout or no imposition job for the source.
403 Not a member of the team, or deleting a profile, device or curve without being a team administrator.
404 No such job, profile, device, curve, imposition job, layout or plate in the team; a report before the job is done.
409 The job's status doesn't allow the call; a job with errors started; a layout out of date; an analyser call before the plates exist.
413 An uploaded PDF over 500 MB.
422 A PDF that can't be read, is password protected or has no such page; a roll layout or a sheet it doesn't have; a preflight that took too long.

Job errors answer {"detail": "…"}, with the field when one is at fault, such as {"detail": "Choose at most 50 pages.", "pages": ["Choose at most 50 pages."]}. Other limits are on Screening limits.

Last updated Sept. 28, 2026