Pexagon Order API (1.0.0-rc.8)

Download OpenAPI specification:

Standardized B2B order intake with Pexagon-controlled artwork upload.

Release candidate contract for owner-controlled intake. The owner uploads exact final JPEG bytes, poll until ready, then submit immutable orders that assign opaque upload IDs to mapping-authorized imprint locations.

Plugin code implements Schema Six direct-upload/order intake and gated Schema Seven HPOS order behavior with guarded Live registration. S10-49/S10-50 accepted the core fictional-order flow on the then-installed Standard staging runtime, and S10-52 accepted that runtime's unattended processing boundary. S10-88 later accepted Standard-staging artwork access on exact S10-90 alpha.18/Schema Seven, documented in the S10-91 record in docs/decisions.md. The staging portal remains enabled by owner decision; external API and processing gates remain absent. Production remains undeployed and unaccepted; source publication alone proves neither deployment nor production readiness.

Artwork uploads

Upload and inspect private client-owned artwork.

Upload exact final JPEG bytes

Requires artwork:write. The body is the client's declared final JPEG. The authenticated client, idempotency key, exact server-observed bytes, and profile define retry identity. Same identity returns the existing upload; changed bytes or profile returns 409. A 202 response means the complete immutable original is already durably stored with matching server-observed size and SHA-256. JPEG structure and decodability are not decided synchronously; inspection and preview remain async, and malformed/non-JPEG bytes later produce failed upload status.

Authorizations:
bearerAuth
header Parameters
Idempotency-Key
required
string [ 16 .. 128 ] characters ^[A-Za-z0-9._~-]+$
Example: upkey_01K0SYNTHETICRETRY

Client-scoped upload retry key. The server stores only the SHA-256 digest of the exact accepted Idempotency-Key bytes; never use an order ID or filename as storage authority.

X-Pexagon-Artwork-Profile
required
string
Value: "PRINT_WRAP_JPEG_3000X2700_V1"
X-Pexagon-Filename
string [ 1 .. 180 ] characters ^(?!.*[\\/])(?!.*\.\.)(?!.*[\u0000-\u001F\u00...
Example: synthetic-wrap.jpg

Bounded advisory display/audit value; not upload identity or storage authority.

X-Request-Id
string <= 100 characters
Request Body schema: image/jpeg
required
string <binary>

Client-declared final JPEG bytes; nonempty and maximum 5 MiB. Structural JPEG validation is asynchronous after durable receipt.

Responses

Response Headers
X-Request-Id
string

Correlation identifier safe to provide to support.

Response Schema: application/json
success
required
any
Value: true
request_id
required
string
duplicate
required
boolean
required
object (ArtworkUpload)
upload_id
required
string (UploadId) ^upl_[A-Za-z0-9]{12,64}$
profile
required
string (ArtworkProfile)
Value: "PRINT_WRAP_JPEG_3000X2700_V1"
status
required
string (UploadStatus)
Enum: "processing" "ready" "failed" "expired"
availability
required
string (UploadAvailability)
Enum: "unsealed" "sealed" "attached" "unavailable"
created_at
required
string <date-time>
updated_at
required
string <date-time>
ready_at
required
string or null <date-time>
expires_at
required
string or null <date-time>

Seven days after readiness; null until ready.

byte_size
required
integer [ 1 .. 5242880 ]

Server-authoritative exact received bytes.

sha256
required
string^[a-f0-9]{64}$

Server-authoritative lowercase SHA-256 of received bytes.

status_reference
required
string^/artwork-uploads/upl_[A-Za-z0-9]{12,64}$
required
UploadIssue (object) or null
One of
code
required
string^[a-z][a-z0-9_]*$
message
required
string [ 1 .. 300 ] characters
retryable
required
boolean

False for terminal content failures that require a new corrected upload.

recovery_classification
required
string (RecoveryClassification)
Enum: "platform_retrying" "client_action_required" "pexagon_action_required" "not_recoverable"
Response Headers
X-Request-Id
string

Correlation identifier safe to provide to support.

Location
string
Example: "/artwork-uploads/upl_01K0SYNTHETIC001"

Authenticated status reference for this upload.

Response Schema: application/json
success
required
any
Value: true
request_id
required
string
duplicate
required
boolean
required
object (ArtworkUpload)
upload_id
required
string (UploadId) ^upl_[A-Za-z0-9]{12,64}$
profile
required
string (ArtworkProfile)
Value: "PRINT_WRAP_JPEG_3000X2700_V1"
status
required
string (UploadStatus)
Enum: "processing" "ready" "failed" "expired"
availability
required
string (UploadAvailability)
Enum: "unsealed" "sealed" "attached" "unavailable"
created_at
required
string <date-time>
updated_at
required
string <date-time>
ready_at
required
string or null <date-time>
expires_at
required
string or null <date-time>

Seven days after readiness; null until ready.

byte_size
required
integer [ 1 .. 5242880 ]

Server-authoritative exact received bytes.

sha256
required
string^[a-f0-9]{64}$

Server-authoritative lowercase SHA-256 of received bytes.

status_reference
required
string^/artwork-uploads/upl_[A-Za-z0-9]{12,64}$
required
UploadIssue (object) or null
One of
code
required
string^[a-z][a-z0-9_]*$
message
required
string [ 1 .. 300 ] characters
retryable
required
boolean

False for terminal content failures that require a new corrected upload.

recovery_classification
required
string (RecoveryClassification)
Enum: "platform_retrying" "client_action_required" "pexagon_action_required" "not_recoverable"
Response Headers
X-Request-Id
string

Correlation identifier safe to provide to support.

Response Schema: application/json
success
required
any
request_id
required
string
required
object (Error)
code
required
string^[a-z][a-z0-9_]*$
message
required
string <= 300 characters
field
string or null
retryable
required
boolean
object
object
Response Headers
X-Request-Id
string

Correlation identifier safe to provide to support.

Response Schema: application/json
success
required
any
request_id
required
string
required
object (Error)
code
required
string^[a-z][a-z0-9_]*$
message
required
string <= 300 characters
field
string or null
retryable
required
boolean
object
object
Response Headers
X-Request-Id
string

Correlation identifier safe to provide to support.

Response Schema: application/json
success
required
any
request_id
required
string
required
object (Error)
code
required
string^[a-z][a-z0-9_]*$
message
required
string <= 300 characters
field
string or null
retryable
required
boolean
object
object

Response samples

Content type
application/json
{
  • "success": true,
  • "request_id": "string",
  • "duplicate": true,
  • "upload": {
    }
}

Get private upload status

Requires artwork:read. Returns only uploads owned by the authenticated client. Nonexistent and wrong-client IDs use the same privacy-safe 404.

Authorizations:
bearerAuth
path Parameters
upload_id
required
string (UploadId) ^upl_[A-Za-z0-9]{12,64}$
Example: upl_01K0SYNTHETIC001
header Parameters
X-Request-Id
string <= 100 characters

Responses

Response Headers
X-Request-Id
string

Correlation identifier safe to provide to support.

Response Schema: application/json
success
required
any
Value: true
request_id
required
string
required
object (ArtworkUpload)
upload_id
required
string (UploadId) ^upl_[A-Za-z0-9]{12,64}$
profile
required
string (ArtworkProfile)
Value: "PRINT_WRAP_JPEG_3000X2700_V1"
status
required
string (UploadStatus)
Enum: "processing" "ready" "failed" "expired"
availability
required
string (UploadAvailability)
Enum: "unsealed" "sealed" "attached" "unavailable"
created_at
required
string <date-time>
updated_at
required
string <date-time>
ready_at
required
string or null <date-time>
expires_at
required
string or null <date-time>

Seven days after readiness; null until ready.

byte_size
required
integer [ 1 .. 5242880 ]

Server-authoritative exact received bytes.

sha256
required
string^[a-f0-9]{64}$

Server-authoritative lowercase SHA-256 of received bytes.

status_reference
required
string^/artwork-uploads/upl_[A-Za-z0-9]{12,64}$
required
UploadIssue (object) or null
One of
code
required
string^[a-z][a-z0-9_]*$
message
required
string [ 1 .. 300 ] characters
retryable
required
boolean

False for terminal content failures that require a new corrected upload.

recovery_classification
required
string (RecoveryClassification)
Enum: "platform_retrying" "client_action_required" "pexagon_action_required" "not_recoverable"

Response samples

Content type
application/json
Example
{
  • "success": true,
  • "request_id": "req_01K0READY",
  • "upload": {
    }
}

Orders

Submit and reconcile immutable orders.

Submit an immutable order

Requires orders:write. After static validation, the server normalizes and hashes the request and looks up (client_id, external_order_id) before consulting mutable upload, mapping, product, readiness, expiry, profile, or sealing state. Identical canonical data returns the existing submission and attachments without mutation or current-authority revalidation. Changed data returns 409 before mutable validation.

Only a new submission validates current ownership, readiness, failure, expiry, sealing availability, mapped locations/products, and profile compatibility, then atomically creates the submission, assignments, attachments, and seals. Line order is meaningful. Assignment order is not: after duplicate-location rejection, canonicalization sorts it by imprint_location_code. Limits are 8 assignments per line and 100 per order; product configuration may impose lower limits.

Authorizations:
bearerAuth
header Parameters
X-Request-Id
string <= 100 characters
Request Body schema: application/json
required
external_order_id
required
string (ExternalOrderId) [ 1 .. 100 ] characters ^[A-Za-z0-9][A-Za-z0-9._:/-]*$
purchase_order
string or null <= 100 characters
in_hands_date
string or null <date>
required
object (ShippingAddress)
company
string or null <= 100 characters
first_name
required
string [ 1 .. 60 ] characters
last_name
required
string [ 1 .. 60 ] characters
address_1
required
string [ 1 .. 100 ] characters
address_2
string or null <= 100 characters
city
required
string [ 1 .. 80 ] characters
state
required
string [ 1 .. 80 ] characters
postcode
required
string [ 1 .. 20 ] characters
country
required
string
Value: "US"
email
string or null <email> <= 254 characters
phone
string or null [ 7 .. 30 ] characters ^(?=(?:[^0-9]*[0-9]){7,15}[^0-9]*$)[0-9 +().-...
required
Array of objects (OrderItemRequest) [ 1 .. 40 ] items
Array ([ 1 .. 40 ] items)
external_line_item_id
required
string [ 1 .. 100 ] characters
product_code
required
string [ 1 .. 64 ] characters ^[A-Z0-9][A-Z0-9_-]*$
quantity
required
integer [ 1 .. 100 ]
required
Array of objects (ArtworkAssignmentRequest) [ 1 .. 8 ] items

Input order is insignificant; normalized location codes must be unique. Maximum 8 per line and 100 across the order; product configuration may impose lower limits.

Responses

Response Headers
X-Request-Id
string

Correlation identifier safe to provide to support.

Response Schema: application/json
success
required
any
Value: true
request_id
required
string
duplicate
required
boolean
required
object (PublicOrder)
external_order_id
required
string (ExternalOrderId) [ 1 .. 100 ] characters ^[A-Za-z0-9][A-Za-z0-9._:/-]*$
submission_id
required
string (SubmissionId) ^sub_[A-Za-z0-9]{12,64}$
status
required
string (OrderStatus)
Enum: "received" "artwork_processing" "accepted" "in_production" "action_required" "rejected" "shipped" "cancelled"
submitted_at
required
string <date-time>
updated_at
required
string <date-time>

Latest submission, shipment evidence, unresolved shipping warning or native order modification time. Duplicate shipment capture alone does not advance this value.

pexagon_order_number
required
string or null
required
object (ArtworkSummary)

Counts derived line statuses, never uploads, assignments, objects, or revisions. ready + processing + failed = total. held is an overlapping subset of lines and is not added to that equality.

total
required
integer >= 0

Total order lines.

ready
required
integer >= 0

Lines whose required assignments are all ready.

processing
required
integer >= 0

Nonfailed lines with at least one pending or processing assignment.

failed
required
integer >= 0

Lines with at least one failed required assignment.

held
required
integer >= 0

Overlapping count of lines with any active applicable assignment hold.

required
Array of objects (OrderLine) [ 1 .. 40 ] items
Array ([ 1 .. 40 ] items)
external_line_item_id
required
string
product_code
required
string
quantity
required
integer
artwork_status
required
string (ArtworkStatus)
Enum: "pending" "processing" "ready" "failed"

Failed if any required assignment failed; otherwise processing if any is pending/processing; otherwise ready.

production_hold
required
boolean

True when any assignment has an active applicable hold; orthogonal to artwork status.

required
Array of objects (PublicArtworkAssignment) non-empty
required
SafeIssue (object) or null
required
SafeIssue (object) or null
One of
code
required
string^[a-z][a-z0-9_]*$
message
required
string [ 1 .. 300 ] characters
recovery_classification
required
string (RecoveryClassification)
Enum: "platform_retrying" "client_action_required" "pexagon_action_required" "not_recoverable"
shipping_progress
string
Enum: "not_recorded" "partially_shipped" "awaiting_completion_confirmation" "shipped"

Optional for compatibility; RC7 always returns it. No recorded evidence does not prove nothing shipped. Partial means one explicit positive proper-subset report. Distinct split reports, legacy/missing quantities, corrections or unresolved exceptions require staff confirmation. Shipped requires active tracking, confirmed reported fulfillment and fresh WooCommerce Completed; it proves neither carrier acceptance nor delivery. Overall lifecycle status remains separate.

required
Array of objects (Shipment)

Active valid tracking, visible before whole-order completion. Withdrawn and replaced records are excluded.

Array
shipment_id
required
string
carrier
required
string
service
string or null
tracking_number
required
string
tracking_url
string or null <uri>
Response Headers
X-Request-Id
string

Correlation identifier safe to provide to support.

Location
string
Example: "/orders/SYN-UPLOAD-ONE"

Order lookup reference.

Response Schema: application/json
success
required
any
Value: true
request_id
required
string
duplicate
required
boolean
required
object (PublicOrder)
external_order_id
required
string (ExternalOrderId) [ 1 .. 100 ] characters ^[A-Za-z0-9][A-Za-z0-9._:/-]*$
submission_id
required
string (SubmissionId) ^sub_[A-Za-z0-9]{12,64}$
status
required
string (OrderStatus)
Enum: "received" "artwork_processing" "accepted" "in_production" "action_required" "rejected" "shipped" "cancelled"
submitted_at
required
string <date-time>
updated_at
required
string <date-time>

Latest submission, shipment evidence, unresolved shipping warning or native order modification time. Duplicate shipment capture alone does not advance this value.

pexagon_order_number
required
string or null
required
object (ArtworkSummary)

Counts derived line statuses, never uploads, assignments, objects, or revisions. ready + processing + failed = total. held is an overlapping subset of lines and is not added to that equality.

total
required
integer >= 0

Total order lines.

ready
required
integer >= 0

Lines whose required assignments are all ready.

processing
required
integer >= 0

Nonfailed lines with at least one pending or processing assignment.

failed
required
integer >= 0

Lines with at least one failed required assignment.

held
required
integer >= 0

Overlapping count of lines with any active applicable assignment hold.

required
Array of objects (OrderLine) [ 1 .. 40 ] items
Array ([ 1 .. 40 ] items)
external_line_item_id
required
string
product_code
required
string
quantity
required
integer
artwork_status
required
string (ArtworkStatus)
Enum: "pending" "processing" "ready" "failed"

Failed if any required assignment failed; otherwise processing if any is pending/processing; otherwise ready.

production_hold
required
boolean

True when any assignment has an active applicable hold; orthogonal to artwork status.

required
Array of objects (PublicArtworkAssignment) non-empty
required
SafeIssue (object) or null
required
SafeIssue (object) or null
One of
code
required
string^[a-z][a-z0-9_]*$
message
required
string [ 1 .. 300 ] characters
recovery_classification
required
string (RecoveryClassification)
Enum: "platform_retrying" "client_action_required" "pexagon_action_required" "not_recoverable"
shipping_progress
string
Enum: "not_recorded" "partially_shipped" "awaiting_completion_confirmation" "shipped"

Optional for compatibility; RC7 always returns it. No recorded evidence does not prove nothing shipped. Partial means one explicit positive proper-subset report. Distinct split reports, legacy/missing quantities, corrections or unresolved exceptions require staff confirmation. Shipped requires active tracking, confirmed reported fulfillment and fresh WooCommerce Completed; it proves neither carrier acceptance nor delivery. Overall lifecycle status remains separate.

required
Array of objects (Shipment)

Active valid tracking, visible before whole-order completion. Withdrawn and replaced records are excluded.

Array
shipment_id
required
string
carrier
required
string
service
string or null
tracking_number
required
string
tracking_url
string or null <uri>
Response Headers
X-Request-Id
string

Correlation identifier safe to provide to support.

Response Schema: application/json
success
required
any
request_id
required
string
required
object (Error)
code
required
string^[a-z][a-z0-9_]*$
message
required
string <= 300 characters
field
string or null
retryable
required
boolean
object
object
Response Headers
X-Request-Id
string

Correlation identifier safe to provide to support.

Response Schema: application/json
success
required
any
request_id
required
string
required
object (Error)
code
required
string^[a-z][a-z0-9_]*$
message
required
string <= 300 characters
field
string or null
retryable
required
boolean
object
object
Response Headers
X-Request-Id
string

Correlation identifier safe to provide to support.

Response Schema: application/json
success
required
any
request_id
required
string
required
object (Error)
code
required
string^[a-z][a-z0-9_]*$
message
required
string <= 300 characters
field
string or null
retryable
required
boolean
object
object

Request samples

Content type
application/json
Example
{
  • "external_order_id": "SYN-UPLOAD-ONE",
  • "shipping": {
    },
  • "items": [
    ]
}

Response samples

Content type
application/json
{
  • "success": true,
  • "request_id": "string",
  • "duplicate": true,
  • "order": {
    }
}

Look up an order by client external ID

Requires orders:read and returns only the authenticated client's order.

Authorizations:
bearerAuth
path Parameters
external_order_id
required
string (ExternalOrderId) [ 1 .. 100 ] characters ^[A-Za-z0-9][A-Za-z0-9._:/-]*$
Example: SYN-UPLOAD-ONE
header Parameters
X-Request-Id
string <= 100 characters

Responses

Response Headers
X-Request-Id
string

Correlation identifier safe to provide to support.

Response Schema: application/json
success
required
any
Value: true
request_id
required
string
required
object (PublicOrder)
external_order_id
required
string (ExternalOrderId) [ 1 .. 100 ] characters ^[A-Za-z0-9][A-Za-z0-9._:/-]*$
submission_id
required
string (SubmissionId) ^sub_[A-Za-z0-9]{12,64}$
status
required
string (OrderStatus)
Enum: "received" "artwork_processing" "accepted" "in_production" "action_required" "rejected" "shipped" "cancelled"
submitted_at
required
string <date-time>
updated_at
required
string <date-time>

Latest submission, shipment evidence, unresolved shipping warning or native order modification time. Duplicate shipment capture alone does not advance this value.

pexagon_order_number
required
string or null
required
object (ArtworkSummary)

Counts derived line statuses, never uploads, assignments, objects, or revisions. ready + processing + failed = total. held is an overlapping subset of lines and is not added to that equality.

total
required
integer >= 0

Total order lines.

ready
required
integer >= 0

Lines whose required assignments are all ready.

processing
required
integer >= 0

Nonfailed lines with at least one pending or processing assignment.

failed
required
integer >= 0

Lines with at least one failed required assignment.

held
required
integer >= 0

Overlapping count of lines with any active applicable assignment hold.

required
Array of objects (OrderLine) [ 1 .. 40 ] items
Array ([ 1 .. 40 ] items)
external_line_item_id
required
string
product_code
required
string
quantity
required
integer
artwork_status
required
string (ArtworkStatus)
Enum: "pending" "processing" "ready" "failed"

Failed if any required assignment failed; otherwise processing if any is pending/processing; otherwise ready.

production_hold
required
boolean

True when any assignment has an active applicable hold; orthogonal to artwork status.

required
Array of objects (PublicArtworkAssignment) non-empty
required
SafeIssue (object) or null
required
SafeIssue (object) or null
One of
code
required
string^[a-z][a-z0-9_]*$
message
required
string [ 1 .. 300 ] characters
recovery_classification
required
string (RecoveryClassification)
Enum: "platform_retrying" "client_action_required" "pexagon_action_required" "not_recoverable"
shipping_progress
string
Enum: "not_recorded" "partially_shipped" "awaiting_completion_confirmation" "shipped"

Optional for compatibility; RC7 always returns it. No recorded evidence does not prove nothing shipped. Partial means one explicit positive proper-subset report. Distinct split reports, legacy/missing quantities, corrections or unresolved exceptions require staff confirmation. Shipped requires active tracking, confirmed reported fulfillment and fresh WooCommerce Completed; it proves neither carrier acceptance nor delivery. Overall lifecycle status remains separate.

required
Array of objects (Shipment)

Active valid tracking, visible before whole-order completion. Withdrawn and replaced records are excluded.

Array
shipment_id
required
string
carrier
required
string
service
string or null
tracking_number
required
string
tracking_url
string or null <uri>

Response samples

Content type
application/json
{
  • "success": true,
  • "request_id": "req_01K0ROLLUP",
  • "order": {
    }
}

Order accepted Webhook

Future at-least-once event after real WooCommerce order creation.

Authorizations:
bearerAuth
Request Body schema: application/json
required
event_id
required
string
event_type
required
string
Enum: "order.accepted" "order.rejected" "artwork.failed" "order.shipped"
Value: "order.accepted"
api_version
required
any
Value: "v1"
created_at
required
string <date-time>
required
object
external_order_id
required
string (ExternalOrderId) [ 1 .. 100 ] characters ^[A-Za-z0-9][A-Za-z0-9._:/-]*$
pexagon_order_number
required
string
status
required
any
Value: "accepted"

Responses

Request samples

Content type
application/json
{
  • "event_id": "string",
  • "event_type": "order.accepted",
  • "api_version": "v1",
  • "created_at": "2019-08-24T14:15:22Z",
  • "data": {
    }
}

Order shipped Webhook

Future at-least-once normalized shipment event.

Authorizations:
bearerAuth
Request Body schema: application/json
required
event_id
required
string
event_type
required
string
Enum: "order.accepted" "order.rejected" "artwork.failed" "order.shipped"
Value: "order.shipped"
api_version
required
any
Value: "v1"
created_at
required
string <date-time>
required
object
external_order_id
required
string (ExternalOrderId) [ 1 .. 100 ] characters ^[A-Za-z0-9][A-Za-z0-9._:/-]*$
pexagon_order_number
required
string
required
object (Shipment)
shipment_id
required
string
carrier
required
string
service
string or null
tracking_number
required
string
tracking_url
string or null <uri>

Responses

Request samples

Content type
application/json
{
  • "event_id": "string",
  • "event_type": "order.shipped",
  • "api_version": "v1",
  • "created_at": "2019-08-24T14:15:22Z",
  • "data": {
    }
}