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#
/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
/a/{team_slug}/screening/api/v1/jobs/
List the team's screening jobs, newest first.
screening_jobs_list ·
View in API reference
/a/{team_slug}/screening/api/v1/jobs/{id}/
Read a job with its settings, checks and plates.
screening_jobs_retrieve ·
View in API reference
/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.
| Field | Needed to create | Meaning |
|---|---|---|
| source | Yes | upload for an uploaded PDF, file for a PDF already in Files, imposition for the sheets of an imposition layout. |
| name | No | The job's name. Without one: the file's name, or the imposition job's and layout's names. |
| profile | No | A screening profile of the team. Without one: the team's Offset sheetfed default. |
| file | No | The PDF, up to 500 MB (upload; send the request as multipart form data). It is also stored in the Screening folder in Files. |
| file_version | No | The id of a PDF version in Files, from the Files API (file). The job keeps that exact version. |
| pages | No | The pages to screen, such as 1-3, 5, at most 50 (upload and file; empty for every page). |
| imposition_job | No | The imposition job (imposition). |
| layout_ref | No | The layout's ref from the layouts list, such as l-42 (imposition). |
| sheets | No | The sheets to screen, numbered from 0, such as [0, 2] (imposition; empty for every sheet). |
- An uploaded PDF: send
multipart/form-datawithsource=uploadandfile, and optionallypages,profileandname. 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 answers507and creates nothing. - A PDF in Files: send JSON with
source: "file"andfile_version, the id of a version from the Files API, and optionallypages,profileandname. The job keeps that exact version; a newer version never changes it. A version of another team, or one still being processed, is a404; a file that isn't a PDF is a422. See Sources: PDFs, Files and imposition sheets. - Imposition sheets: send JSON with
source: "imposition",imposition_jobandlayout_ref, and optionallysheets. 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:
/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
/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.
| Field | In | Meaning |
|---|---|---|
| id | Always | The job's id, a UUID. |
| name | Always | The job's name: the {job} of the plate file names. |
| status | Always | configuring, queued, rendering, finishing, done, failed, cancelled or expired. |
| source_kind | Always | upload, file (a PDF from Files) or imposition. |
| source_filename | Always | The uploaded file's name, the file's name in Files, or the name of the imposed PDF built. |
| source_file | Always | Where 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_job | Always | The imposition job's id, or null. |
| imposition_job_name | Always | The imposition job's name, or empty. |
| layout_ref | Always | The imposition layout's ref, or empty. |
| layout_name | Always | The layout's name (its ref when the layout is gone), or empty. |
| rescreen_of | Always | The id of the job this one re-screens, or null. |
| pages | Always | How many pages (or sheets) the job has. |
| plates | Always | How many plate files it has: 0 until it is done. |
| dpi | Always | The job's resolution. |
| progress | Always | While it runs: stage, percent (0 to 100) and, per page, page, pages and detail. |
| error | Always | Why the job failed, or empty. |
| worker_stale | Always | true when the screening worker stopped answering: retry the job. |
| queue_position | Always | How many jobs are ahead of a queued job; 0 otherwise. |
| errors | Always | How many errors the checks found. A job with errors can't start. |
| warnings | Always | How many warnings the checks found. |
| profile | Always | The profile's id, or null. |
| profile_name | Always | The profile's name, or empty. |
| created_at | Always | When the job was created (ISO 8601). |
| finished_at | Always | When it finished, or null. |
| expires_at | Always | When its files are deleted. |
| urls | Always | Its page, viewer, api, download (the ZIP), report and thumb (page 1) addresses. |
| file_names | One job | The file name of every plate the job writes, in order. |
| page_list | One job | Every page: number, label, size_pt, boxes (media, bleed, trim) and, for sheets, sheet_index. |
| settings | One job | The resolved settings. Each separation also has actual (the screen the engine really makes) and chain (its curve's label and checksum). |
| guardrails | One job | The checks: level (error, warning or info), code, message and the separation or page it is about. |
| preflight | One job | What the preflight found on each page: size, transparency, spots, rotation and plates. |
| engine | One job | After screening: the renderer's version, the time taken, the trap layer state and the skipped plates. |
| plate_list | One job | The 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#
/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#
/a/{team_slug}/screening/api/v1/jobs/{id}/start/
Queue a configuring job for screening.
screening_jobs_start ·
View in API reference
/a/{team_slug}/screening/api/v1/jobs/{id}/cancel/
Cancel a queued or running job.
screening_jobs_cancel ·
View in API reference
/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
/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
/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 answers409with"detail": "Fix the errors before screening."and the errors inguardrails.cancel/stops a queued, rendering or finishing job (202); its partial plates are deleted.edit/takes a failed or cancelled job back toconfiguring(202), so you can change it and start it again.retry/queues a job again from the start whenworker_staleistrue(202).rescreen/makes a new job inconfiguringfrom a done, failed or cancelled job's pages and settings (201, the new job, whoserescreen_ofis 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:
| Field | Meaning |
|---|---|
| id | The plate's id. |
| page | Its page number, from 1. |
| separation | The separation's name, such as Cyan or PMS 185 C. |
| slug | The separation's short name for the analyser, such as cyan. |
| kind | process or spot. |
| file | The file's name. |
| bytes | The file's size. |
| sha256 | The file's SHA-256 checksum. |
| width_px | The width in device pixels. |
| height_px | The height in device pixels. |
| dpi | The resolution. |
| compression | The TIFF compression used: g4, lzw, packbits or none. |
| negative | true for a negative plate. |
| mirror | true for a mirrored (wrong-reading) plate. |
| coverage | The ink coverage in %, counted from the device pixels. |
| ink_zones | The coverage of each ink zone in %, left to right on the right-reading sheet. |
| screen | The screen asked for, the actual one, and the curve's label and checksum. |
| download | The 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.
/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.
/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".
/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#
/a/{team_slug}/screening/api/v1/profiles/
List the team's screening profiles.
screening_profiles_list ·
View in API reference
/a/{team_slug}/screening/api/v1/profiles/
Create a screening profile.
screening_profiles_create ·
View in API reference
/a/{team_slug}/screening/api/v1/profiles/{id}/
Read a screening profile.
screening_profiles_retrieve ·
View in API reference
/a/{team_slug}/screening/api/v1/profiles/{id}/
Change some fields of a screening profile.
screening_profiles_partial_update ·
View in API reference
/a/{team_slug}/screening/api/v1/profiles/{id}/
Delete a screening profile (team administrators).
screening_profiles_destroy ·
View in API reference
/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
/a/{team_slug}/screening/api/v1/profiles/presets/
List the built-in profiles.
screening_profiles_presets ·
View in API reference
/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.
| Field | Needed to create | Meaning |
|---|---|---|
| name | Yes | The profile's name. |
| press_type | Yes | offset_sheetfed, offset_web, newspaper, flexo or custom. |
| resolution_dpi | Yes | The jobs' starting resolution, 600 to 5,080 dpi. |
| settings | Yes | The screens, inks, output, marks and trap layer settings. |
| platesetter | No | A platesetter of the team, or null. |
| press | No | A press of the team, or null. |
| tone_curve | No | A curve of kind tone, or null. |
| press_curve | No | A curve of kind press, or null. |
| linearization_curve | No | A 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#
/a/{team_slug}/screening/api/v1/devices/
List the team's platesetters and presses.
screening_devices_list ·
View in API reference
/a/{team_slug}/screening/api/v1/devices/
Add a platesetter or a press.
screening_devices_create ·
View in API reference
/a/{team_slug}/screening/api/v1/devices/{id}/
Read a device.
screening_devices_retrieve ·
View in API reference
/a/{team_slug}/screening/api/v1/devices/{id}/
Change some fields of a device.
screening_devices_partial_update ·
View in API reference
/a/{team_slug}/screening/api/v1/devices/{id}/
Delete a device (team administrators).
screening_devices_destroy ·
View in API reference
| Field | Needed to create | Meaning |
|---|---|---|
| name | Yes | The device's name, unique in the team. |
| kind | Yes | platesetter or press. It can't change. |
| settings | No | The device's settings; keys left out take the defaults. |
| notes | No | Free 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#
/a/{team_slug}/screening/api/v1/curves/
List the team's plate curves.
screening_curves_list ·
View in API reference
/a/{team_slug}/screening/api/v1/curves/
Create a plate curve with its first version.
screening_curves_create ·
View in API reference
/a/{team_slug}/screening/api/v1/curves/{id}/
Read a plate curve and all its versions.
screening_curves_retrieve ·
View in API reference
/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
/a/{team_slug}/screening/api/v1/curves/{id}/
Delete a plate curve (team administrators).
screening_curves_destroy ·
View in API reference
/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
/a/{team_slug}/screening/api/v1/curves/preview/
Compute a curve entry without saving it.
screening_curves_preview ·
View in API reference
/a/{team_slug}/screening/api/v1/curves/import/
Read measurements (CSV, TSV or CGATS) into compensation entries.
screening_curves_import ·
View in API reference
/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.
| Field | Needed to create | Meaning |
|---|---|---|
| name | Yes | The curve's name, unique in the team. |
| kind | Yes | press, linearization or tone: the curve's place in the chain. It can't change. |
| device | No | The device it was made for, for reference, or null. |
| printing_condition | No | Free text, such as the paper and the press. |
| binding | No | Made for: the jobs the curve suits. |
| mismatch_policy | No | What a job outside the binding gets: warn (a warning) or abort (an error). |
| notes | No | Free text. |
| data | No | The entries of a new version. |
| measured_with | No | The version the measured test form was printed through. |
| measurement | No | Where a measured version came from, such as the imported text (up to 64 KB). |
| note | No | A note on the new version. |
| preset | No | A 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 asin,outlines of text;compensation:measured(inputandoutputlists,unitspercent,fractionordensity) and atargetfromcurves/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.