Digitise and import shades
Browse, review and bulk-add shades through the API alone, in the order an automation or an AI agent should call it.
Everything the Platform’s digitisation screens do is a public call. This page is the order to call it in, written so a script or an AI agent can follow it without guessing. An AI agent can also use these steps as tools, through the MorphiaOne MCP server or the digitisation skill: see Connect an AI agent.
The rules that keep a run safe
- List before you create. Every shade you add is unique by its
external_ref(your SKU). ReadGET /v1/catalogue/variants?external_ref=...first; a taken reference answers409 EXTERNAL_REF_TAKEN. - Every write carries an
Idempotency-Key. Derive it from the row, not from a clock, so a rerun replays the first answer instead of creating a duplicate. - A SKU’s reference and GTIN are fixed at creation. To change a shade you already
have, post a new revision of it. A revision never carries
external_reforgtin. - Review what you accept. Accepting and staging send the
candidate_sha256you read; a candidate that changed since is refused. - Colours are upper-case hex,
#RRGGBB.
The key you need
The read calls below need digitisation.read. Writes need digitisation.write,
digitisation.review and the catalogue.write scope. Create the key in the Platform,
under API keys. A key without the scope is refused 403 INSUFFICIENT_SCOPE.
If your account’s review policy is on (Settings → Review policy), no key can
accept or reject, and a key stages only what a member accepted: those calls answer
403 HUMAN_REVIEW_REQUIRED, and the candidate’s review_url is where a person decides.
Browse what exists
Three list calls return the same page shape, data, has_more and next_cursor,
newest first. Send next_cursor back as cursor with the same filters to continue; a
cursor from another filter or account is 400 INVALID_CURSOR. limit is 1 to 100.
The review queue is the pending candidates:
An unknown or repeated parameter is 400 INVALID_REQUEST naming it, never ignored.
In the SDKs
Each list call has a list_all_* form that follows the cursors for you. The
morphiaone digitisation candidates command prints the same page as JSON.
Python
TypeScript
From a photo to a staged shade
- Retain the photo:
POST /v1/digitisation/evidencewithasset_id(an upload) orurl(a publichttpsimage the API fetches). When someone else has the photo,POST /v1/uploadsanswers a single-useupload_urlthey send it to with no API key;GET /v1/uploads/{upload_id}answers itsasset_idonce it isstored. - Measure regions:
POST /v1/digitisation/assessmentsanswers202 queued; pollGET /v1/digitisation/assessments/{assessment_id}until it is settled. - Freeze one region for review:
POST /v1/digitisation/candidates. - Review it in the queue above, then accept or reject by its digest.
- Stage the accepted candidate into the catalogue as a draft revision.
Approving and publishing the draft is a separate step with its own scope, so nothing renders in a try-on until you do.
Add many shades from a table
There is no bulk route. Loop over your rows with the rule above: create the variant,
and on 409 EXTERNAL_REF_TAKEN find the live variant by external_ref and post a
revision. Keep one result per row and carry on after a failure, so one bad row never
stops the file. The SDKs do exactly this and return created, revised or failed for
each row.
Python
TypeScript
Machine-readable sources
An agent should read the contract rather than this page: the OpenAPI document, llms.txt
and the generated scope table list every route, parameter and scope.