Start Here

Getting Started

Five steps from zero to your first fulfilled order.

1 — Get an API key

Contact us through your Pictorem account to receive your ArtFlowKey. Every request must include it as an HTTP header. Keys can optionally be issued in test mode so you can integrate without placing real orders.

2 — Explore the catalog

Call getcatalog once to pull the full tree of materials, types, orientations, sizes and options, or use buildproductlist to expand a partial code interactively.

3 — Validate and price

Build a preordercode, confirm it with validatepreorder, then fetch the cost with getprice and the production time with getleadtime.

4 — Place the order

Submit with sendorder — upload the artwork file directly, point to a public URL, or reference a Pictorem collection ID. Always send a unique po: it makes retries safe (duplicates are rejected with HTTP 409 and the existing order ID) and lets you query by your own reference later.

5 — Track it

Register a webhook to be notified on every order status and production stage change (including tracking numbers on shipment), or poll getorderstatus / getorderlist. Pre-production orders can be cancelled with cancelorder.

POST
https://www.pictorem.com/artflow/0.1/validatepreorder/

Validate Pre-Order

Validate a pre-order code before placing an order. The code is run through the same sanitizer used by sendorder, then compared against what you submitted: status is true only when preordercode and preordersanitize come back identical. Any difference means your code was incomplete or invalid — use data.preordersanitize as the corrected code. The optional border color is validated at the same time. Looking for the thank-you card? It is an order-level sendorder field now (thanksnotemsg / thanksnoteurl), not a code option.

Not sure how to assemble a code? Build one visually with the interactive code builder.

Body

Key Type Value
form-data
preordercode text * numCopies|material|type|orientation|width|height|additional…
bordercolorhex text ffffff

PHP cURL

$postData = [
  'preordercode' => '2|canvas|stretched|horizontal|30|24|303-12|semigloss|mirrorimage|c15|moulding|opt',

  // Only send this when the code actually calls for it:
  // 'bordercolorhex' => 'ffffff',   // required by the bordercolor canvas wrap
];

Response (JSON)

Success
{
  "status": true,
  "data": {
    "preordercode":     "2|canvas|stretched|horizontal|30|24|303-12|semigloss|mirrorimage|c15|moulding|opt",
    "preordersanitize": "2|canvas|stretched|horizontal|30|24|303-12|semigloss|mirrorimage|c15|moulding|opt"
  }
}
Fail

Here da9 is not a real acrylic type, so the sanitizer replaced it with the first available one and filled in the missing orientation and size. The returned code differs from the one submitted, so status is false.

{
  "status": false,
  "data": {
    "preordercode":     "1|acrylic|da9",
    "preordersanitize": "1|acrylic|ac220",
    "error": "Preorder code was modified during sanitization — use data.preordersanitize",
    "errorlist": []
  }
}
POST
https://www.pictorem.com/artflow/0.1/getprice/

Get Price

Returns a full pricing worksheet for a product configuration, including list price, discount, artist commission, taxes (GST/PST), and total in USD. Optionally scoped to a specific collection and delivery region for accurate tax calculation. Note: the optional thank-you card is a flat per-order fee (USD 2.99, free for Premium accounts) added at sendorder time — it is never part of a preordercode price.

Body

Key Type Value
form-data
preordercode text * numCopies|material|type|orientation|width|height|additional…
collectionid text xxxxxx
deliveryprovince text QC
deliverycountry text Canada

PHP cURL

$postData = [
  'preordercode'     => '2|canvas|stretched|horizontal|30|24|303-12|semigloss|mirrorimage|c15|moulding|opt',
  'deliveryprovince' => 'QC',
  'deliverycountry'  => 'Canada',
];

Response (JSON)

All prices are in USD $ — amounts rounded to 2 decimals, tax rates to 5

Success
{
  "status": true,
  "msg": [],
  "worksheet": {
    "enabledDiscount": true,
    "price": {
      "list": {
        "main": 20.06,
        "cert": 5
      },
      "discount": {
        "main": 6.02,
        "cert": 1.5
      },
      "artistCommission": {
        "main": 25.06
      },
      "artistCommissionDiscount": {
        "main": 7.52
      },
      "listTotal": 25.06,
      "discountTotal": 7.52,
      "artistCommissionTotal": 25.06,
      "artistCommissionDiscountTotal": 7.52,
      "subTotal": 35.08,
      "taxes": {
        "taxPercentage": 0.14975,
        "taxGST": 1.75,
        "taxPST": 3.5
      },
      "total": 40.34
    }
  }
}

Reading the worksheet. list, discount, artistCommission and artistCommissionDiscount hold one key per component of the preordercode — main is only the product itself, and every option you priced (float, semigloss, cert, moulding codes…) gets its own key. The key names are dynamic, so never read main alone: you would drop everything the order is charged for. Use the listTotal, discountTotal, artistCommissionTotal and artistCommissionDiscountTotal aggregates instead — they already sum every component.

list is the price before discount, and discount is an amount to subtract — not a rate, and not something to add back onto list. The worksheet always balances as:

subTotal = listTotal - discountTotal + artistCommissionTotal - artistCommissionDiscountTotal
total    = subTotal + taxes.taxGST + taxes.taxPST

enabledDiscount reports whether the account discount applied at all. It is false when the account is on special pricing (pro price level or product-specific pricing); in that case discount comes back empty because the list figures are already the negotiated ones.

Fail
{
  "status": false,
  "msg": {
    "error": ["PreOrder Code is NOT valid."]
  }
}
POST
https://www.pictorem.com/artflow/0.1/getleadtime/

Get Lead Time

Returns the estimated production lead time (in business days) for a given product configuration. Use this before placing an order to set customer delivery expectations.

Body

Key Type Value
form-data
preordercode text * numCopies|material|type|orientation|width|height|additional…

PHP cURL

$postData = [
  'preordercode' => '2|canvas|stretched|horizontal|30|24|303-12|semigloss|mirrorimage|c15|moulding|opt',
];

Response (JSON)

Success
{
  "status": true,
  "msg": [],
  "data": {
    "productionLeadTime": 8
  }
}
Fail
{
  "status": false,
  "msg": {
    "error": ["PreOrder Code is NOT valid."]
  }
}
POST
https://www.pictorem.com/artflow/0.1/getshippingquote/

Get Shipping Quote

Returns every UPS service available for a shipment, priced, together with a quoteid you pass back to sendorder. Use this to show shipping and collect payment before placing the order: the quoted price is the price we bill, so you never end up charging your customer a different amount than we invoice you.

Send the whole order in one call. Lines are packed together the way they will actually ship — several small prints travel in one carton — so quoting item by item and adding up the results will overcharge.

Express and air-only destinations. There is no separate express price list and no fixed air surcharge to apply: the services UPS returns are the express options, at the real rate for that address. Hawaii, Alaska and Puerto Rico are air-only, so ground does not appear in services for them and groundavailable comes back false. Pick any service in the list and send its code.

Body

Key Type Value
Destination
deliveryInfo[city] text * Honolulu
deliveryInfo[province] text * HI — state / province code
deliveryInfo[country] text * USA — ISO code or full country name
deliveryInfo[cp] text * 96815 — postal / zip code
deliveryInfo[address1] text Optional here — rating needs only city, state, postal and country. Still required on sendorder.
Order Items — one entry per line, the same codes you will order
orderList[0][code] text * numCopies|material|type|orientation|width|height|additional…
orderList[1][code] text No image source needed — this endpoint prices the box, not the artwork.

PHP cURL

$postData = [
  'deliveryInfo[city]'     => 'Honolulu',
  'deliveryInfo[province]' => 'HI',
  'deliveryInfo[country]'  => 'USA',
  'deliveryInfo[cp]'       => '96815',
  'orderList[0][code]'     => '2|canvas|stretched|horizontal|30|24|semigloss|mirrorimage|c15',
  'orderList[1][code]'     => '1|acrylic|da8|horizontal|16|12',
];

Response (JSON)

Success — Hawaii, air only
{
  "status": true,
  "msg": [],
  "quoteid": "q_8f14e45fceea167a5a36dedd4bea2543",
  "expires": "2026-09-14 15:42:00",
  "cached": false,
  "services": [
    {
      "service": "02",
      "name": "UPS 2nd Day Air",
      "price": 148.72,
      "currency": "USD",
      "transitdays": 2,
      "ground": false
    },
    {
      "service": "01",
      "name": "UPS Next Day Air",
      "price": 263.19,
      "currency": "USD",
      "transitdays": 1,
      "ground": false
    }
  ],
  "groundavailable": false,
  "packages": 2
}

services is sorted cheapest first, so services[0] is a safe default. transitdays is UPS's guaranteed business days in transit where UPS guarantees the service and null where it does not — it counts from dispatch, so add the production lead time from getleadtime to get a delivery date. packages is how many cartons the order consolidates into. cached is true when the same lines to the same address were quoted in the last hour and you are getting that quote back rather than a fresh one.

No service available
{
  "status": true,
  "msg": {
    "error": ["UPS returned no rate for this destination. Verify the postal code and country, or contact us for a manual quote."]
  },
  "quoteid": null,
  "services": []
}

HTTP 200 with an empty services list: the request was valid, but UPS would not rate that address. Handle it as "shipping unavailable, contact us" rather than as an error.

Fail — HTTP 422
{
  "status": false,
  "msg": {
    "error": [
      "deliveryInfo[cp] is required.",
      "orderList[0][code]: PreOrder Code is NOT valid."
    ]
  }
}

Using the quote on sendorder

Pass quoteid plus the service code your customer paid for. We charge the price that was quoted for that service and it lands on the order as its shipping line.

$postData = [
  'quoteid'         => 'q_8f14e45fceea167a5a36dedd4bea2543',
  'shippingservice' => '02',
  // …the rest of your sendorder fields
];

A quote is valid for 60 minutes, is good for one order, and is tied to the postal code it was priced for — shipping to a different address needs a new quote. Sending quoteid is optional: omit it and the order is created with no shipping charge, exactly as before.

POST
https://www.pictorem.com/artflow/0.1/sendorder/

Send Order

Submit a production order to Pictorem. Supports three image sources per line item: direct file upload, a public image URL, or an artwork from a Pictorem collection. Returns the Pictorem order ID on success. An optional document (waybill, shipping label, PDF…) can be attached to the order via document (file upload) or documenturl (public URL). An optional 7x5″ printed thank-you card can be added to the package via thanksnotemsg (we typeset your message) or thanksnoteurl (your own print-ready design) — one card per order, USD 2.99 flat, free for Premium accounts.

Body

Key Type Value
General
ordercomment text Proin maximus magna ante, semper porttitor neque tincidunt et.
po text MY-PO-2026-001 — your own reference number, searchable via getorderstatus. Must be unique per order: a reused PO is rejected with HTTP 409 and the existing order ID, which makes retries safe.
testmode text 1 — dry run: validates everything but creates nothing. See Sandbox / test mode.
Delivery Information
deliveryInfo[firstname] text * Kathleen
deliveryInfo[lastname] text * Bernal
deliveryInfo[company] text Bennett Brothers
deliveryInfo[address1] text * 3371 Sycamore Lake Road
deliveryInfo[address2] text
deliveryInfo[city] text * Oshkosh
deliveryInfo[province] text * WI
deliveryInfo[country] text * USA
deliveryInfo[cp] text * 54901
deliveryInfo[phone] text 920-456-7364
Order Items — Upload via File
orderList[0][code] text * numCopies|material|type|orientation|width|height|additional…
orderList[0][file] file * my-file.jpg (jpg / png / tiff)
orderList[0][bordercolorhex] text * ffffff
orderList[0][comment] text Your own reference for this item, such as the end customer it is for — shown on the order line (255 char max)
Order Items — Upload via URL
orderList[1][code] text * numCopies|material|type|orientation|width|height|additional…
orderList[1][fileurl] text * https://images.unsplash.com/photo-xxxx?q=80&w=3987
orderList[1][filetype] text * jpg (jpg / png / tiff)
Order Items — From a Collection
orderList[2][code] text * numCopies|material|type|orientation|width|height|additional…
orderList[2][collectionID] text * 357936
Shipping — Optional (from getshippingquote)
quoteid text q_8f14e45fceea167a5a36dedd4bea2543 — a quote returned by getshippingquote. We bill the price that quote carried for the service you name below, so your customer's shipping charge and ours match. Valid 60 minutes, one order per quote, and only for the postal code it was priced for. Omit it and the order is created with no shipping charge, as before.
shippingservice text 02 — the service code your customer paid for, from that quote's services list. Required whenever quoteid is sent.
Document Attachment — Optional
document file Optional document to attach to the order (waybill, shipping label, packing slip…). Accepted: pdf / jpg / jpeg / png. Mutually exclusive with documenturl. The document appears alongside the order in your account and for our production team.
documenturl text Public http(s) URL to a document to attach (pdf / jpg / jpeg / png). Mutually exclusive with document. Example: https://example.com/waybill-472175.pdf
Thank-You Card — Optional (one 7x5″ card per order, USD 2.99 flat, free for Premium accounts)
thanksnotemsg text Thank you for your purchase! We hope you enjoy your new custom print. — Pictorem typesets your message on the card in a handwriting font (accounts with a private-label logo get it printed on top). Mutually exclusive with thanksnoteurl.
thanksnoteurl text Public http(s) URL to your own print-ready card design (jpg / jpeg / png, 7:5 landscape, 2100×1500 px recommended — printed as-is). Mutually exclusive with thanksnotemsg. Example: https://example.com/my-thankyou-card.jpg

PHP cURL

$postData = [
  'po'                         => 'MY-PO-2026-001',
  'deliveryInfo[firstname]'    => 'Kathleen',
  'deliveryInfo[lastname]'     => 'Bernal',
  'deliveryInfo[address1]'     => '3371 Sycamore Lake Road',
  'deliveryInfo[city]'         => 'Oshkosh',
  'deliveryInfo[province]'     => 'WI',
  'deliveryInfo[country]'      => 'USA',
  'deliveryInfo[cp]'           => '54901',
  'orderList[0][code]'         => '1|canvas|stretched|horizontal|16|12',
  'orderList[0][file]'         => new CURLFile('/path/to/file.jpg'),
  'orderList[0][bordercolorhex]' => 'ffffff',
  // Optional per-item note kept on the order line, e.g. who the print is for:
  'orderList[0][comment]'      => 'Caroline Courteau',
  // Optional 7x5" thank-you card - one per order, USD 2.99, free for Premium.
  // Use EITHER your text (we typeset it) OR your own print-ready image URL:
  'thanksnotemsg'              => 'Thank you for your purchase! We hope you enjoy your new custom print.',
  // 'thanksnoteurl'           => 'https://example.com/my-thankyou-card.jpg',
  // Optional document attachment (waybill, shipping label...) - pdf / jpg / jpeg / png
  // Use EITHER a direct upload OR a public URL, not both:
  'document'                   => new CURLFile('/path/to/waybill.pdf'),
  // 'documenturl'             => 'https://example.com/waybill-472175.pdf',
];

Response (JSON)

Success
{
  "status": true,
  "msg": [],
  "orderid": 472175
}
Fail — HTTP 422 (validation)

failedstep names the pipeline stage that rejected the order. For code validation failures, msg.detail[] carries one entry per failing item: its orderList index, the submitted code, the code the validator expected (preordersanitize — same value validatepreorder returns) and the sanitizer error codes explaining what was changed or dropped. Internal failures (pricing, order creation, file transfer) answer HTTP 500 instead.

{
  "status": false,
  "msg": {
    "error": [
      "orderList[0]: PreOrder Code: 2|canvas|stretched|horizontal|30|24|303-12|semigloss|mirrorimage|c15|mouldin3g|opt is NOT valid."
    ],
    "detail": [
      {
        "item": 0,
        "preordercode":     "2|canvas|stretched|horizontal|30|24|303-12|semigloss|mirrorimage|c15|mouldin3g|opt",
        "preordersanitize": "2|canvas|stretched|horizontal|30|24|303-12|semigloss|mirrorimage|c15|moulding|opt",
        "processerror":     ["Error::5900::mouldin3g"]
      }
    ]
  },
  "orderid": null,
  "failedstep": "sanitizePreOrderList"
}
Duplicate PO — HTTP 409
{
  "status": false,
  "msg": {
    "error": ["PO \"MY-PO-2026-001\" was already used on order 472174. Use a unique PO per order."]
  },
  "orderid": 472174,
  "duplicate": true
}
POST
https://www.pictorem.com/artflow/0.1/getorderstatus/

Get Order Status

Retrieve the full status of an existing order, including the production stage, tracking information, line items, and billing status. Query by Pictorem order ID or your own PO number. Results are always scoped to your API account.

Body

Key Type Value
form-data — provide either field
orderid text 472174 — Pictorem order ID
po text MY-PO-2026-001 — your own PO number

PHP cURL

// Search by Pictorem order ID
$postData = [
  'orderid' => '472174',
];

// — OR — search by your own PO number
$postData = [
  'po' => 'MY-PO-2026-001',
];

Response (JSON)

Success
{
  "status": true,
  "msg": [],
  "order": {
    "orderid": 472174,
    "po": "MY-PO-2026-001",
    "date": "2026-03-15 10:22:00",
    "order_status": "0",
    "order_status_label": "Processing",
    "production_status": "27",
    "production_status_label": "Ready for Print",
    "production_progress": 30,
    "billing_status": "1",
    "billing_status_label": "Paid",
    "tracking_number": null,
    "tracking_carrier": null,
    "total": 125.40,
    "currency": "USD",
    "delivery": {
      "firstname": "Kathleen",
      "lastname": "Bernal",
      "company": null,
      "address1": "3371 Sycamore Lake Road",
      "address2": null,
      "city": "Oshkosh",
      "province": "WI",
      "country": "USA",
      "postal": "54901"
    },
    "lines": [
      {
        "line_id": 889421,
        "status": "27",
        "status_label": "Ready for Print",
        "is_option": false,
        "product": "canvas",
        "type": "stretched",
        "orientation": "horizontal",
        "width": "30",
        "height": "24",
        "qty": 1,
        "total": 125.40,
        "tracking": null
      }
    ]
  }
}

Two Statuses Per Order

Pictorem tracks an order's progress on two separate axes and this endpoint returns both. Reading only one of them is the single most common integration mistake, so it is worth being explicit:

Field Meaning
order_status Where the order stands commercially: quoted, processing, on hold, shipped, cancelled. It does not move while the order travels through the workshop, so it never reports a production stage such as Ready for Print.
production_status Where the items stand on the production floor, derived from the line statuses. An order is only as far along as its least advanced item, so this reports Ready for Print once every item is ready — not when the first one is. null for an order with no items yet.
production_progress Completion percentage (0-100) of production_status, the same number the Pictorem order tracking page shows. Convenient for a progress bar, and safe to compare across codes — higher always means further along.
lines[].status Per-item production stage, if you need item-level granularity rather than the order-level roll-up. Lines with is_option set to true are attachments (frames, mounts, thank-you cards) that follow their parent item and are excluded from production_status.

Order Status Codes

Values order_status takes. Labels below are read live from our status table, so they match order_status_label exactly.

CodeLabel
9QUOTE - Waiting payment
0Processing
11Action required
20Verification required
4Incident to Inspect
89Hold by customer
78Waiting for Address - on hold for shipping
2Shipped
38Picked up by customer
3Canceled

Production Stage Codes

The stages you will see most often on production_status and lines[].status, in production order. The full pipeline has dozens more internal steps — treat any other code as "in production" and display production_status_label rather than mapping codes yourself.

CodeLabel
20Verification required
27Ready for Print
75In Production
74In Production
67In Production
28In Production - Quality Control / Finalizing
8In Production - Quality Control / Finalizing
Fail
{
  "status": false,
  "msg": {
    "error": ["Order not found."]
  }
}
POST
https://www.pictorem.com/artflow/0.1/getorderlist/

Get Order List

Paginated list of all your orders, newest first, each with the same order status and production stage pair as getorderstatus. Optionally filter by order status or date range. Results are always scoped to your API account.

Body

Key Type Value
form-data — all optional
page text Page number — default: 1
limit text Items per page, max 100 — default: 25
status text Filter by order status code — e.g. 2 for Shipped. Filters on order_status only; there is no production stage filter, so scan production_status in the results instead
datefrom text YYYY-MM-DD — orders placed on or after this date
dateto text YYYY-MM-DD — orders placed on or before this date

PHP cURL

$postData = [
  'page'   => '1',
  'limit'  => '25',
  'status' => '2', // Shipped only
];

Response (JSON)

Success
{
  "status": true,
  "msg": [],
  "data": {
    "total": 63,
    "page": 1,
    "limit": 25,
    "pages": 3,
    "orders": [
      {
        "orderid": 472174,
        "po": "MY-PO-2026-001",
        "date": "2026-03-15 10:22:00",
        "order_status": "2",
        "order_status_label": "Shipped",
        "production_status": "2",
        "production_status_label": "Shipped",
        "production_progress": 100,
        "billing_status": "1",
        "billing_status_label": "Paid",
        "tracking_number": "1Z999AA10123456784",
        "tracking_carrier": "UPS",
        "total": 125.40,
        "currency": "USD"
      }
    ]
  }
}
POST
https://www.pictorem.com/artflow/0.1/cancelorder/

Cancel Order

Cancel an order before it enters production. Only orders in QUOTE - Waiting payment (9), Processing (0) or Action required (11) can be cancelled through the API — once production has started, contact support instead.

Body

Key Type Value
form-data — provide either field
orderid text 472174 — Pictorem order ID
po text MY-PO-2026-001 — your own PO number

PHP cURL

$postData = [
  'orderid' => '472174',
];

Response (JSON)

Success
{
  "status": true,
  "msg": [],
  "order": {
    "orderid": 472174,
    "order_status": "3",
    "order_status_label": "Canceled"
  }
}
Fail — HTTP 409 (already in production)
{
  "status": false,
  "msg": {
    "error": ["Order 472174 is already in production and can no longer be cancelled via the API. Please contact support."]
  }
}
POST
https://www.pictorem.com/artflow/0.1/buildproductlist/

Build Product List

Expands a partial pre-order code into the full set of valid product configurations available for that base selection. Unlike validatepreorder, a partial code is expected here — send as little as 1|canvas and you get back every choice that is still open, already filtered by the compatibility rules. Call it again after each selection to drive a step-by-step product picker.

The interactive code builder is this endpoint wired to a UI — a working reference for your own picker.

Note that each group of type one gets its first choice applied automatically, so preordersanitize normally comes back longer than what you sent. Whenever it differs from preordercode the response also carries data.error — on this endpoint that is a "your code was normalized" flag, not a failure. status is always true here; use validatepreorder when you need a strict yes/no.

Body

Key Type Value
form-data
preordercode text * numCopies|material|type|orientation|width|height|additional…

PHP cURL

$postData = [
  'preordercode' => '1|acrylic',
];

Response (JSON)

Success

Only the groups that can still be resolved are returned. Here no orientation was given yet, so size and additional are absent — they appear once the code is complete enough.

{
  "status": true,
  "data": {
    "preordercode":     "1|acrylic",
    "preordersanitize": "1|acrylic|ac220",
    "products": {
      "material": {
        "title": "Material",
        "choices": [
          { "id": "canvas",  "title": "canvas" },
          { "id": "acrylic", "title": "acrylic" }
        ]
      },
      "type": {
        "title": "Type",
        "choices": [
          { "id": "ac220", "title": "acrylic print 1/4 ( 0.220 )" },
          { "id": "da8",   "title": "acrylic print 1/8" }
        ]
      },
      "shape": {
        "title": "Shape",
        "choices": [
          { "id": "vertical",   "title": "vertical" },
          { "id": "horizontal", "title": "horizontal" },
          { "id": "square",     "title": "square" }
        ]
      }
    },
    "error": "Errors Everywhere"
  }
}

Response — complete code

Once numCopies, material, type, orientation, width and height are all present, the size and additional groups are included too. Each additional group carries a choicetype: one (pick exactly one), multi (pick any number) or text (a free-text value sent as its own form field, such as bordercolorhex). Frames too large for the requested size come back flagged with isDisabled.

{
  "status": true,
  "data": {
    "preordercode":     "1|canvas|stretched|horizontal|30|24",
    "preordersanitize": "1|canvas|stretched|horizontal|30|24|boxclassic|c15|imagewrap|none|regular",
    "products": {
      "material": { "title": "Material", "choices": [ ... ] },
      "type":     { "title": "Type",     "choices": [ ... ] },
      "shape":    { "title": "Shape",    "choices": [ ... ] },
      "size": {
        "title": "Size",
        "choices": [
          { "width": "30", "height": "24" },
          { "width": "36", "height": "24" }
        ]
      },
      "additional": {
        "title": "Additional",
        "choices": [
          {
            "id": "packaging",
            "title": "Packaging",
            "choicetype": "one",
            "choices": [
              { "id": "boxclassic", "title": "Classic Boxes 2 Ply" },
              { "id": "cra",        "title": "Wooden Crate Packaging On A Pallet" }
            ]
          },
          {
            "id": "frames",
            "title": "decorative moulding",
            "choicetype": "one",
            "choices": [
              { "id": "303-12", "title": "303-12 natural wood floating frame" },
              { "id": "360-29", "title": "360-29 black floating frame", "isDisabled": true }
            ]
          }
        ]
      }
    },
    "error": "Errors Everywhere"
  }
}
Unknown value

An unrecognised segment is not rejected — it is replaced with the first valid value for that position. Here da9 is not a real acrylic type, so it became ac220. Always read preordersanitize back rather than assuming your input survived.

{
  "status": true,
  "data": {
    "preordercode":     "1|acrylic|da9",
    "preordersanitize": "1|acrylic|ac220",
    "products": { ... },
    "error": "Errors Everywhere"
  }
}
POST
https://www.pictorem.com/artflow/0.1/getcatalog/

Get Catalog

Returns the complete product configuration tree as structured JSON — every material, type, orientation, size, additional option and frame, including compatibility requirements. This is the same source data the validator uses, so you can build product pickers programmatically instead of hardcoding values from the field reference. Cache it: the catalog changes rarely.

Body

No parameters — just the ArtFlowKey header.

PHP cURL

$ch = curl_init('https://www.pictorem.com/artflow/0.1/getcatalog/');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, ['fetch' => '1']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['ArtFlowKey: YOUR_API_KEY']);
$catalog = json_decode(curl_exec($ch), true);
curl_close($ch);

Response (JSON)

Success
{
  "status": true,
  "msg": [],
  "data": {
    "preordercodeFormat": "numCopies|material|type|orientation|width|height|additional|additional…",
    "products":     { "material": { "canvas": { ... }, "acrylic": { ... }, ... } },
    "orientations": { "shapes": { "choices": { "vertical": { ... }, "horizontal": { ... }, "square": { "requirements": [...] } } } },
    "sizes":        { ... },
    "additionals":  { "packaging": { "title": "Packaging", "choices": { ... } }, ... },
    "frames":       { "moulding": { "title": "Decorative Moulding", "choices": { "303-12": { "title": "303-12 Natural Wood Floating Frame" }, ... } } }
  }
}
POST
https://www.pictorem.com/artflow/0.1/getartworklist/

Get Artist Artwork Listing

Returns a paginated list of your own artworks — name, keywords, categories, description, orientation, stats and a ready-to-use image set. Generated print renders (acrylic, metal, wood, murals, canvas, framed, puzzle…) are available on request through previews.

Every URL returned is verified to resolve before it is sent. An image that has not been generated is omitted rather than returned as a dead link, so you can hand any URL from this response straight to a downstream importer. Absence of a key means "not generated", never "broken".

Body

Key Type Description
form-data — all optional
userid text Your own Artist UserID. Results are always scoped to the account behind the ArtFlowKey, so this is optional — send it and it must match, or you get HTTP 403.
page text Page number — default: 1
limit text Items per page — default 48, max 100. When previews is used the default and maximum both drop to 24.
sort text featured (default) · newest · oldest · name · views
previews text Comma-separated list of print renders to include, e.g. wallpreview,acr1,book. Omitted entirely by default. See the table below for valid values; an unknown value returns HTTP 422 listing the accepted ones.
pricing text 1 adds a commission object per artwork — what you earn when someone else orders it. For the price of a specific configuration use getprice.
includeprivate text 1 also lists artwork in your hidden / password-protected albums. Off by default so an export cannot accidentally republish private work. Artwork taken down by staff is never listed.

Image Set — always returned

Key Description
image.thumbSmall rendition of the original
image.previewRoom-context wall preview — the best image to show a shopper. null when none has been generated.
image.fullLarge rendition of the original
image.sourceThe uploaded source file

Print Renders — previews values

Pass any combination as a comma-separated list. Each key that resolves comes back as a single URL; keys whose render does not exist are left out of the previews object.

Value Product
wallpreviewRoom-context wall preview (hi-res, same image as image.preview)
wallrandomsmallRoom-context wall preview, small
wall, wallsmallStatic wall mockup
bookStretched canvas
acr1–acr4 (+ acr1small…)Acrylic
metalbrush1, metalbrush2 (+ smalls)Brushed metal
sublim1–sublim3 (+ smalls)HD Metal / Sublimation
wood1, wood2Wood
mural1–mural3 (+ smalls)Wall murals
puzzle1, puzzle2 (+ smalls)Puzzle
pfFramed print
gallerysmallCropped gallery thumbnail
Retired renders. canvasPrint.view2 / view3 (book2_, book3_), splitPanels, decoFrame, imageLink and wallMockup.generated are no longer produced and have been removed from this endpoint. Split-panel layouts are now rendered live in the browser rather than as per-artwork files. Remove them from any exporter selection logic — for canvas, use book.

Code Example

$ch = curl_init('https://www.pictorem.com/artflow/0.1/getartworklist/');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['ArtFlowKey: YOUR_API_KEY']);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
  'page'     => '1',
  'limit'    => '24',
  'sort'     => 'newest',
  // Optional: ask for specific print renders (omit for metadata + image only)
  'previews' => 'wallpreview,book,acr1',
  // Optional: include what you earn per artwork
  'pricing'  => '1',
]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
const body = new FormData();
body.append('page',     '1');
body.append('limit',    '24');
body.append('sort',     'newest');
body.append('previews', 'wallpreview,book,acr1');
body.append('pricing',  '1');

fetch('https://www.pictorem.com/artflow/0.1/getartworklist/', {
  method:  'POST',
  headers: { 'ArtFlowKey': 'YOUR_API_KEY' },
  body:    body,
})
  .then(r => r.json())
  .then(data => console.log(data));

Response (JSON)

Success
{
  "status": true,
  "msg": [],
  "data": {
    "total": 147,
    "page": 1,
    "limit": 24,
    "pages": 7,
    "artworks": [
      {
        "id": 2452666,
        "name": "Mona Lisa",
        "author": "Stock Photography",
        "keywords": ["classical", "portrait", "renaissance"],
        "description": "...",
        "categories": [
          { "id": 12, "name": "Classical Portraits" }
        ],
        "url": "https://www.pictorem.com/2452666/Mona-Lisa.html",
        "orientation": "vertical",
        "ratio": 0.6693,
        "image": {
          "thumb":   "https://www.pictorem.com/uploads/collection/A/ABC123/small_2452666.jpg",
          "preview": "https://s3.pictorem.com/images/collection/A/ABC123/rand_2452666.webp",
          "full":    "https://www.pictorem.com/uploads/collection/A/ABC123/big_2452666.jpg",
          "source":  "https://www.pictorem.com/uploads/collection/A/ABC123/2452666.jpg"
        },
        "stats": { "rating": 4.5, "nbRating": 12, "views": 340 },
        "createdAt": "2024-01-15 10:22:00",
        "previews": {
          "wallpreview": "https://s3.pictorem.com/images/collection/A/ABC123/rand_2452666.webp",
          "book":        "https://s3.pictorem.com/images/collection/A/ABC123/book_2452666.jpg"
        },
        "commission": { "strategy": "percentage", "value": 30, "source": "collection" }
      }
    ]
  }
}

previews is present only when the previews parameter was sent, and commission only when pricing=1 was sent. In the example above acr1 was requested but no acrylic render exists for this artwork, so the key is absent rather than pointing at a 404.

commission.strategy is one of percentage, sqft, dynamic or fixed — whichever is set takes effect, checked in that order. source tells you whether the value comes from the artwork itself (collection) or from your account default (account). A strategy of null means no commission is configured.

Fail — HTTP 403 (wrong userid)
{
  "status": false,
  "msg": {
    "error": ["userid must be your own account (ABC123). This endpoint only lists artwork belonging to the API key used."]
  }
}
Fail — HTTP 422 (unknown previews value)
{
  "status": false,
  "msg": {
    "error": [
      "Unknown previews value(s): book2, splitPanels.",
      "Valid values: acr1, acr1small, acr2, ... , wallpreview, wallsmall."
    ]
  }
}
Access Denied
{
  "status": false,
  "error": "Access Denied"
}
POST
https://www.pictorem.com/artflow/0.1/shc/

System Health Check

Lightweight ping to verify that the ArtFlow API is reachable and that your ArtFlowKey is recognized. Intended for uptime monitors and pre-flight checks before heavier calls like sendorder. Does not count toward the rate limit and is not logged in API request reports.

Body

Empty multipart/form-data — no fields. Authentication is via the ArtFlowKey header only.

Response fields

FieldTypeMeaning
status boolean true when the API is accepting traffic; false during maintenance mode
artFlowKey boolean Only evaluated when status is true — true when the ArtFlowKey header matches a registered key; false when missing, invalid, or when status is false

PHP cURL

$ch = curl_init('https://www.pictorem.com/artflow/0.1/shc/');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, []);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['ArtFlowKey: YOUR_API_KEY']);
$health = json_decode(curl_exec($ch), true);
curl_close($ch);

Response (JSON)

API up, valid key — HTTP 200
{
  "status": true,
  "artFlowKey": true
}
API up, invalid key — HTTP 200
{
  "status": true,
  "artFlowKey": false
}
Maintenance mode — HTTP 503
{
  "status": false,
  "artFlowKey": false
}

When status is false (maintenance mode), artFlowKey is not checked and is always false. Unlike other endpoints, an invalid key does not return HTTP 401 — check artFlowKey in the JSON body instead (only meaningful when status is true). Non-POST requests return HTTP 405 with {"status": false, "artFlowKey": false}.

Webhooks

Webhooks — Overview

Instead of polling getorderstatus, register a callback URL and Pictorem will POST a JSON payload to your server whenever one of your ArtFlow orders changes status — including every production stage such as Ready for Print, and the tracking number the moment an order ships. Only orders placed after the webhook was registered generate notifications.

What triggers a delivery

A delivery is queued whenever order_status or production_status moves — the same two fields getorderstatus returns. The changed array tells you which of the two it was, so you can ignore production noise and react only to commercial changes if that is all you need.

Changes are detected on a schedule rather than the instant a status is written, so expect a delay of a few minutes. If an order moves through two stages inside the same window, you receive a delivery for each one, in order.

Delivery, retries & signature

Each delivery is an HTTPS POST with Content-Type: application/json and four headers: X-ArtFlow-Event (the event name), X-ArtFlow-Delivery (a unique ID for this change, stable across retries), X-ArtFlow-Attempt (1 on the first try) and X-ArtFlow-Signature — an HMAC-SHA256 hex digest of the raw request body, signed with your API key. Always verify the signature before trusting a payload.

Respond with any 2xx status within 10 seconds. Anything else — a 5xx, a timeout, an unreachable host — is retried with a growing delay of roughly 10, 30, 60, 180 and 480 minutes, so your endpoint can be down for about half a day without you losing a status change. Deliveries for the same order are always attempted in order: a failing one holds the rest of that order's queue until it succeeds or runs out of attempts.

A retry re-sends the change that was detected, not the order's current state, and reuses the same X-ArtFlow-Delivery ID. Because a slow acknowledgement can be retried after we already recorded a failure, treat that ID as an idempotency key.

Payload

{
  "event": "order.status_changed",
  "orderid": 472174,
  "po": "MY-PO-2026-001",
  "changed": ["production_status"],
  "order_status": "0",
  "order_status_label": "Processing",
  "previous_order_status": "0",
  "production_status": "27",
  "production_status_label": "Ready for Print",
  "production_progress": 30,
  "previous_production_status": "20",
  "tracking_number": null,
  "tracking_carrier": null,
  "queued_at": "2026-07-15T10:28:00-04:00",
  "delivery_id": 91233,
  "attempt": 1,
  "sent_at": "2026-07-15T10:30:00-04:00"
}

previous_status is still present as an alias of previous_order_status for integrations written against the original payload. It will be removed in a future version — read previous_order_status instead.

Verifying the signature (PHP)

$rawBody   = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_ARTFLOW_SIGNATURE'] ?? '';
$expected  = hash_hmac('sha256', $rawBody, 'YOUR_API_KEY');

if (!hash_equals($expected, $signature)) {
  http_response_code(401);
  exit;
}

$payload = json_decode($rawBody, true);
// handle $payload['event'] ...
POST
https://www.pictorem.com/artflow/0.1/registerwebhook/

Register Webhook

Subscribe a callback URL to an event. Re-registering the same URL + event re-activates it.

Body

Key Type Value
form-data
url text * https://your-app.com/webhooks/pictorem — must be https://
event text order.status_changed (default — currently the only event; it covers both order status and production stage changes)

Response (JSON)

Success
{
  "status": true,
  "msg": [],
  "webhook": {
    "webhookid": 12,
    "url": "https://your-app.com/webhooks/pictorem",
    "event": "order.status_changed",
    "active": true
  }
}
POST
https://www.pictorem.com/artflow/0.1/listwebhooks/

List Webhooks

Returns every webhook registered on your account, active and inactive.

Body

No parameters — just the ArtFlowKey header.

Response (JSON)

Success
{
  "status": true,
  "msg": [],
  "webhooks": [
    {
      "webhookid": 12,
      "url": "https://your-app.com/webhooks/pictorem",
      "event": "order.status_changed",
      "active": true,
      "createdAt": "2026-07-15 10:22:00"
    }
  ]
}
POST
https://www.pictorem.com/artflow/0.1/deletewebhook/

Delete Webhook

Deactivates a webhook. Delivery history is preserved; re-register the same URL to re-activate it.

Body

Key Type Value
form-data
webhookid text * 12 — returned by registerwebhook / listwebhooks

Response (JSON)

Success
{
  "status": true,
  "msg": [],
  "webhook": {
    "webhookid": 12,
    "active": false
  }
}
Reference

Authentication Header

Every request must include your ArtFlow API key as an HTTP header.

Required Header

Key Value
ArtFlowKey YOUR_API_KEY
Reference

Errors & HTTP Status Codes

Every response carries a boolean status field. Failures also return a meaningful HTTP status code, with human-readable messages in msg.error[].

Status Codes

HTTPMeaningReturned when
200OKRequest succeeded
401UnauthorizedMissing or invalid ArtFlowKey header
404Not FoundOrder or webhook not found (always scoped to your account)
409ConflictDuplicate PO on sendorder, or cancelorder on an order already in production / cancelled
422UnprocessableValidation failed — details in msg.error[]
429Too Many RequestsRate limit exceeded
503Service UnavailableAPI maintenance mode — returned by shc and all other endpoints
500Server ErrorUnexpected failure on our side — safe to retry

Error Body

{
  "status": false,
  "msg": {
    "error": [
      "deliveryInfo[address1] is required.",
      "orderList[0] needs an image source: file, fileurl or collectionID."
    ]
  }
}

sendorder failures may additionally include failedstep (the pipeline stage that rejected the order) and msg.detail[] with a per-item diagnosis — the failing orderList index, the submitted and expected codes, and the sanitizer error codes. See the sendorder fail example.

Reference

Rate Limits

Each API key may make up to 120 requests per minute. Beyond that, requests are rejected with HTTP 429 until the window rolls over. If you need a higher limit for a launch or batch import, contact us. To stay well under the limit: cache getcatalog, batch order lines into a single sendorder call, and prefer webhooks over polling.

429 Response

{
  "status": false,
  "error": "Rate limit exceeded — max 120 requests per minute.",
  "msg": {
    "error": ["Rate limit exceeded — max 120 requests per minute."]
  }
}
Reference

Sandbox / Test Mode

Test your integration end-to-end without creating real orders. In test mode, sendorder runs the full validation pipeline (delivery fields, image sources, preorder codes) but no order is created, no file is stored, no card is charged and no email is sent. All read endpoints (getprice, validatepreorder, getcatalog…) behave normally.

Two Ways to Enable It

testmode=1 Add this form-data field to any sendorder request
Test API key Ask us to flag your key as test-mode — every sendorder through it becomes a dry run, no code changes needed

Test Mode Response

{
  "status": true,
  "msg": [],
  "orderid": null,
  "testmode": true
}
Reference

PHP cURL — Full Example

Complete authenticated request with file upload.

Example

$url       = 'https://www.pictorem.com/artflow/0.1/sendorder/';
$apiKey    = 'YOUR_API_KEY';

$postData = [
  'deliveryInfo[firstname]'    => 'Kathleen',
  'deliveryInfo[lastname]'     => 'Bernal',
  'deliveryInfo[address1]'     => '3371 Sycamore Lake Road',
  'deliveryInfo[city]'         => 'Oshkosh',
  'deliveryInfo[province]'     => 'WI',
  'deliveryInfo[country]'      => 'USA',
  'deliveryInfo[cp]'           => '54901',
  'orderList[0][code]'         => '1|canvas|stretched|horizontal|16|12',
  'orderList[0][file]'         => new CURLFile('/path/to/file.jpg'),
  'orderList[0][bordercolorhex]' => 'ffffff',
  'thanksnotemsg'              => 'Thank you for your order!', // optional 7x5" card, one per order
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  'ArtFlowKey: ' . $apiKey,
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);

if ($response === false) {
  echo 'cURL Error: ' . curl_error($ch);
} else {
  $data = json_decode($response, true);
  var_dump($data);
}

curl_close($ch);
Reference

JavaScript Fetch — Full Example

Complete authenticated request using the Fetch API with FormData.

Example

const apiKey   = 'YOUR_API_KEY';
const endpoint = 'https://www.pictorem.com/artflow/0.1/sendorder/';

const formData = new FormData();
formData.append('deliveryInfo[firstname]',    'Kathleen');
formData.append('deliveryInfo[lastname]',     'Bernal');
formData.append('deliveryInfo[address1]',     '3371 Sycamore Lake Road');
formData.append('deliveryInfo[city]',         'Oshkosh');
formData.append('deliveryInfo[province]',     'WI');
formData.append('deliveryInfo[country]',      'USA');
formData.append('deliveryInfo[cp]',           '54901');
formData.append('orderList[0][code]',         '1|canvas|stretched|horizontal|16|12');
formData.append('orderList[0][fileurl]',      'https://images.unsplash.com/photo-xxxx');
formData.append('orderList[0][filetype]',     'jpg');
formData.append('orderList[0][bordercolorhex]', 'ffffff');
formData.append('thanksnotemsg', 'Thank you for your order!'); // optional 7x5" card, one per order

fetch(endpoint, {
  method:  'POST',
  headers: { 'ArtFlowKey': apiKey },
  body:    formData,
})
  .then(response => {
    if (!response.ok) {
      throw new Error('HTTP error: ' + response.status);
    }
    return response.json();
  })
  .then(data  => console.log('Order placed:', data))
  .catch(error => console.error('Error:', error));
Reference

OpenAPI Specification

The full API is described in a machine-readable OpenAPI 3.0 document. Import it into Postman or Insomnia for a ready-made collection, generate typed client SDKs with openapi-generator, or feed it to AI coding assistants for accurate integrations.

Spec URL

https://www.pictorem.com/artflow/0.1/openapi/
Reference

Changelog & Versioning

The API version is part of every URL (/artflow/0.1/…). Within a version we only make additive changes — new endpoints, new optional fields, new response keys. Breaking changes ship as a new version, and previous versions keep working for at least 6 months after a replacement is announced on this page.

Changelog

2026-09 Shipping can now be quoted before payment. New getshippingquote returns live UPS rates for a whole order to one address — every available service, priced, with a quoteid. Pass that quoteid plus the chosen shippingservice to sendorder and we bill exactly what was quoted, so your customer's shipping charge and ours cannot drift apart. Express services and air-only destinations need nothing special: the returned list is the express options at real rates, and for Hawaii, Alaska and Puerto Rico ground is simply absent with groundavailable: false. Lines are packed the way they actually ship, so a multi-item order is quoted on the cartons it consolidates into rather than per item. Both fields are optional — an integration that sends neither behaves exactly as before, with no shipping charged.
2026-08 Hanging hardware is now orderable and priced. Framed pieces accept a hanging option group — wire, sawtooth, dring, cleat and security — the same hardware the website offers. The group only appears once the code carries frame or moulding, and it is optional: a code without a hanging segment keeps validating exactly as before, so existing integrations are unaffected. Two availability rules are enforced: wire stops at 70 combined inches (width + height) and cleat needs a cleat-compatible moulding. buildproductlist flags an unusable choice with isDisabled, and validatepreorder drops it with Error::5230 (too large for the hardware) or Error::5240 (frame cannot take a cleat).
2026-08 Production stages are now reported at order level. getorderstatus and getorderlist return production_status, production_status_label and production_progress alongside order_status, so stages such as Ready for Print — which only ever existed on the individual line items — are visible without walking lines[]. Line items gained is_option to distinguish attachments (frames, mounts, cards) from products. Webhooks now fire on production stage changes too, carry a changed array plus the production fields, and are retried for about half a day until your endpoint answers 2xx — previously a single failed POST consumed the change. New X-ArtFlow-Delivery and X-ArtFlow-Attempt headers make deliveries idempotent. Status labels in these docs are now read from the same source as the API responses, fixing labels that did not match what the endpoints returned.
2026-08 Added auto as an orientation value — skips the orientation check and takes the print orientation directly from width x height (e.g. 1|canvas|stretched|auto|36|24). Moved the thank-you card to the order-level thanksnotemsg / thanksnoteurl fields on sendorder (one 7x5″ card per order, USD 2.99, free for Premium accounts) — thanksnote is no longer a code option. Fixed validation of codes containing numeric frame models (e.g. 84005), which were previously rejected as invalid. Richer sendorder failures: errors are prefixed with the failing orderList index, failedstep names the pipeline stage, and msg.detail[] returns the expected code plus sanitizer error codes per failing item. Failure HTTP statuses now match this table (422 validation, 409 duplicate PO, 500 internal) instead of always 200.
2026-08 getartworklist reworked. Every preview URL is now verified before it is returned, and unavailable images are omitted instead of advertised as dead links — this fixes downstream importers (WooCommerce, Shopify) aborting on a 404 image. Results are scoped to the account behind the ArtFlowKey: userid is optional and must match your own, otherwise HTTP 403. Originals are served from their real location rather than a guessed S3 path. Added previews, pricing, sort and includeprivate. keywords and categories are now arrays, previews is a flat map of resolved URLs, the per-artwork s3migration flag is gone, and hidden or taken-down artwork is no longer listed. Retired renders removed: canvasPrint.view2/view3, splitPanels, decoFrame, imageLink, wallMockup.generated.
2026-07 Added shc (System Health Check) — lightweight POST endpoint to verify API availability and ArtFlowKey validity.
2026-07 Added getorderlist, cancelorder, getcatalog and webhooks (registerwebhook / listwebhooks / deletewebhook with signed order.status_changed deliveries). Added sandbox test mode, duplicate-PO protection (HTTP 409), rate limiting, meaningful HTTP status codes, rounded pricing values and the OpenAPI spec. Hardened file upload validation.
2026-06 Added getartworklist with full preview image URLs.
2026-02 Initial beta: validatepreorder, getprice, getleadtime, sendorder, getorderstatus, buildproductlist.
Reference

PreOrder Code — Field Reference

The preordercode is a pipe-delimited string: numCopies|material|type|orientation|width|height|additional|additional…. Expand each section below to see the accepted values.

¹ Requires a specific material  |  ² Requires a specific option

Don't assemble this by hand. The interactive code builder walks you through the same choices and writes the code for you — including which options unlock which, and which frames are too large for your size.
Open builder

Any positive integer. Example: 1, 2, 5

acrylic
canvas
metal
paper
wood
panel
puzzle
mural
specialty

Acrylic:- ac220
- da8
- da16
- ac4
- a38
- ng8
Canvas:- cnvr
- cnvm
- cnvg
- cnvs
Metal:- al
- alw
- hd
Paper:- poster
- glossphoto
- art
- vinyl
- pearl
Wood:- ru14
- ru58
- pineveneer
Panel:- plsintra
- plgatorplast
- plfomecor
- plpvc3
- plpvc6
- mdf12
- cor04
Puzzle:- 120pcs
- 315pcs
- 500pcs
- 1000pcs
- 1500pcs
Mural:- regular
Specialty:- guitar
- skateboard
- snowboard
- surfboard
- 12rd
- 12sq
- 16rd
- 16sq
- 24rd
- 24sq

vertical
horizontal
square ¹
auto

auto skips the orientation check entirely: the print orientation is taken directly from the submitted width x height (e.g. 1|canvas|stretched|auto|36|24 prints horizontal, auto|24|36 prints vertical). Use it when your system already knows the exact dimensions and you don't want to compute vertical / horizontal / square yourself.

Any positive number (inches). Example: 16, 24.5, 37.25

Fractional-inch support depends on the product, exposed as decimaldim in getcatalog and buildproductlist:
"1" — any decimal is accepted (e.g. 37.25, 14.5)
"Q" — quarter inches only; values are snapped to the nearest .25 / .5 / .75
"" — whole inches only; decimals are rounded down

If a dimension is adjusted, validatepreorder returns status: false with the corrected code in data.preordersanitize.

Canvas Type ¹:- regular
- matte
- semigloss
- silver
Canvas Wrap ¹ ²:- bordercolor
- mirrorimage
- imagewrap
Canvas Border Color ¹ ²:- textbordercolor
Canvas Thickness ¹:- roll
- c15 ¹
- c075 ¹
White Border ¹:- none
- wb175
- wb25
Mounting ¹:- none
- standoff ¹
- gromet ¹
- box ¹
- float ¹
- moulding ¹
- moulding34 ¹
- frame ¹
- lam1 ¹
- sebbox ¹
- lam2 ¹
- lam4c ¹
- drymount ¹
- kraft ¹
- sintraback ¹
- masoniteback ¹
- dryf ¹
- dryxl ¹
- dryg ¹
Cutting Option ¹:- none
- circular ¹
- roundedcorner ¹
- metalbox ¹
- diecut ¹
- octogonal ¹
- exactcut ¹
- 175inchcut ¹
- 25inchcut ¹
Graphic:- none
- opt
- retouch
Printing ¹:- none
- blackink
- 2intransparency ¹
- selectivetransparency
- frost
- backlit
- autopen
- inborder
- noir ¹
- blanc
Varnish ¹:- none ¹
- knife ¹
Mat Board ²:- none
- mb01
- mb02
- mb03
- mb04
- mb05
- mb06
- mb07
- mb08
- mb09
- mb10
- ws01
- ws02
- ws03
- ws04
- ws05
- ws06
- ws07
- ws08
- ws09
- ws10
Plexi Glass ²:- plexiglass
- plexiglassprint
- glass
Hanging ²:- none
- wire
- crochetf
- cleat
- security
- woodcleat
- sawtooth
- dring
Certificate:- none
- cert
Miscellaneous ¹:- signature
- editioncount
- mirror
Cfs 15 ¹ ²:- cfs15 ¹

Decorative Moulding ²:
301-10 — 301-10 Satin Gold Picture Frame301-11 — 301-11 Bronze Picture Frame301-21 — 301-21 Espresso Floating Frame301-22 — 301-22 White Floating Frame301-29 — 301-29 Black Floating Frame303-11 — 303-11 Espresso Floating Frame303-12 — 303-12 Natural Wood Floating Frame303-19 — 303-19 Black Floating Frame317-11 — 317-11 Bronze Floating Frame 317-21 — 317-21 Espresso Floating Frame317-22 — 317-22 White Floating Frame317-29 — 317-29 Black Floating Frame317-30 — 317-30 Gold Floating Frame317-73 — 317-73 Silver Floating Frame340-21 — 340-21 Espresso Floating Frame340-29 — 340-29 Black Floating Frame348-09 — 348-09 Black Lacquer Picture Frame360-02 — 360-02 White Lacquer Floating Frame360-09 — 360-09 Black Lacquer Floating Frame360-108 — 360-108 Grey Floating Frame360-11 — 360-11 Bronze Floating Frame360-111 — 360-111 Wallnut Floating Frame360-112 — 360-112 Ivory Floating Frame360-118 — 360-118 Brown Floating Frame360-18 — 360-18 Charcoal Floating Frame360-22 — 360-22 White Floating Frame360-23 — 360-23 Warm Silver Floating Frame360-29 — 360-29 Black Floating Frame360-30 — 360-30 Gold Floating Frame360-71 — 360-71 Brown Woodgrain Floating Frame360-72 — 360-72 Off-white Woodgrain Floating Frame360-73 — 360-73 Silver Floating Frame360-78 — 360-78 Grey Woodgrain Floating Frame360-79 — 360-79 Black Woodgrain Floating Frame360-81 — 360-81 Dark Brown Woodgrain Floating Frame360-82 — 360-82 Natural Woodgrain Floating Frame360-88 — 360-88 Charcoal Woodgrain Floating Frame361-121 — 361-121 Heavy Brown Floating Frame361-122 — 361-122 White-brown Wood Floating Frame361-128 — 361-128 Light Grey Wood Floating Frame361-131 — 361-131 Brown Wood Floating Frame361-138 — 361-138 Grey Wood Floating Frame514-42 — 514-42 Floating Frame514-48 — 514-48 Floating Frame514-49 — 514-49 Floating Frame514-71 — 514-71 Floating Frame514-72 — 514-72 Floating Frame514-81 — 514-81 Wood Texture Floating Frame515-48 — 515-48 Charcoal Floating Frame613-50 — 613-50 Gold Floating Framefl-814-08 — Fl-814-08 Gold Antique Floating Framefl-814-18 — Fl-814-18 Walnut Floating Framefl-814-22 — Fl-814-22 Truffle Floating Framefl-814-51 — Fl-814-51 Pewter Floating Framefl-814-52 — Fl-814-52 Charcoal Floating Framefl-814-61 — Fl-814-61 Ebony Floating Framefl-814-66 — Fl-814-66 Champagne Floating Framefl-814-67 — Fl-814-67 Black Floating Framefl-814-711 — Fl-814-711 Silver Floating Framefl-814-722 — Fl-814-722 Gold Floating Framefl-816-908 — Fl-816-908 Antique Floating Framefl-816-922 — Fl-816-922 Truffle Floating Framefl-816-952 — Fl-816-952 Coal Floating Framefl-816-966 — Fl-816-966 Champagne Floating Frame
Picture Frame ²:
240-71 — 240-71 Wood Box Picture Frame240-82 — 240-82 Natural Wood Box Picture Frame241-21 — 241-21 Espresso Picture Frame241-22 — 241-22 White Picture Frame241-29 — 241-29 Black Picture Frame2616-473 — 2616-473 True Silver Large Frame Box329-22 — 329-22 White Picture Frame329-29 — 329-29 Black Picture Frame330-128 — 330 Grey Woodgrain Box Picture Frame330-19 — 330 Black Wood Grain Box Picture Frame330-22 — 330-22 White Box Picture Frame330-29 — 330-29 Black Box Picture Frame330-73 — 330 Silver Box Picture Frame331-09 — 331-09 Black Shadow Box Frame331-22 — 331-22 White Picture Frame331-29 — 331-29 Black Picture Frame432-21 — 432-21 Espresso Picture Frame432-22 — 432-22 White Thin Picture Frame432-29 — 432-29 Black Thin Picture Frame608-61 — 608-61 Oak Woodgrain Thin Frame Box608-78 — 608-78 Charcoal Thin Frame Box608-79 — 608-79 Dark Brown Thin Frame Box608-81 — 608-81 Beige Barnwood Thin Frame Box724-12 — 724-12 Natural Picture Frame724-19 — 724-19 Black Picture Frame724-32 — 724-32 White Picture Frame800-966 — 800-966 Champagne Frame Box820-545 — 820-545 Black Lipped Frame Box820-888 — 820-888 Dark Brownframe Box832-711 — 832-711 Silver Picture Frame832-722 — 832-722 Gold Picture Frame832-733 — 832-733 Red Wood Picture Frame84005 — 84005 Natural Wood Thin Picture Framefl-816-967 — Fl-816-967 Black Floating Frame306-11 — 306-11 Bronze Floating Frame 0.75306-22 — 306-22 White Floating Frame 0.75306-29 — 306-29 Black Floating Frame 0.75306-90 — 306-90 Gold Floating Frame 0.75365-11 — 365-11 Espresso Floating Frame365-12 — 365-12 Natural Floating Frame365-18 — 365-18 Grey Floating Frame365-19 — 365-19 Black Floating Frame365-31 — 365-31 Walnut Floating Frame132-29 — 132-29 Black Picture Frame132-31 — 132-31 Espresso Picture Frame135-200 — 135-200 Verdigris With Black Lined Picture Frame141-10 — 141-10 Gold Picture Frame141-15 — 141-15 Bronze Picture Frame141-21 — 141-21 Espresso Picture Frame141-22 — 141-22 White Picture Frame141-29 — 141-29 Black Picture Frame145-21 — 145-21 Espresso Picture Frame145-22 — 145-22 White Picture Frame145-29 — 145-29 Black Picture Frame157-950 — 157-950 Light Gold Lipped Frame165-21 — 165-21 Light Walnut Picture Frame186-21 — 186-21 Redwood With Black Picture Frame186-24 — 186-24 Magogany With Black Picture Frame186-29 — 186-29 Black Picture Frame22-21 — 22-21 Metal Frame24-260 — 24-260 Gold Ornate Frame24-263 — 24-263 Silver Ornate Frame297-12 — 297-12 Natural Woodgrain Picture Frame297-19 — 297-19 Black Woodgrain Picture Frame297-32 — 297-32 White Woodgrain Picture Frame41-10 — 41-10 Gold Picture Frame41-15 — 41-15 Bronze Picture Frame41-21 — 41-21 Espresso Picture Frame41-22 — 41-22 White Picture Frame41-29 — 41-29 Black Picture Frame429-121 — 429-121 White-brown Barnwood Frame429-122 — 429-122 White-brown Barnwood Frame429-125 — 429-125 Dark Brown Barnwood Frame429-128 — 429-128 Grey Barnwood Frame429-131 — 429-131 Barnwood Frame429-138 — 429-138 Grey Thin Wood Frame430-121 — 430-122 Light Brown Wood Frame430-122 — 430-122 Brown-white Wood Frame430-125 — 430-125 Dark Brown Wood Frame430-128 — 430-128 Light Grey Wood Frame430-131 — 430-131 Brown Wood Frame430-138 — 430-138 Grey Wood Frame431-29 — 431-29 Black Picture Frame520-21 — 520-21 Red Wood Picture Frame58-10 — 58-10 Brushed Gold Classic Frame58-13 — 58-13 Brushed Silver Classic Frame58-20 — 58-20 Gold Classic Frame58-23 — 58-23 Silver Classic Frame59-10 — 59-10 Brushed Gold Large Classic Frame59-13 — 59-13 Brushed Silver Large Classic Frame59-20 — 59-20 Gold Large Classic Frame59-210 — 59-210 Gold Espresso Worn-out Frame59-213 — 59-213 Silver Espresso Worn-out Frame59-23 — 59-23 Silver Panel Frame595-68 — 595-68 Grey Barnwood Large Picture Frame595-72 — 595-72 Oak Barwood Large Picture Frame595-78 — 595-78 Brown Barnwood Large Picture Frame602-53 — 602-53 Silver Black Lipped Picture Frame602-59 — 602-59 Black Silver Lipped Picture Frame608-72 — 608-72 White Woodgrain Thin Frame Box629-102 — 629-102 White Lacquer Picture Frame629-49 — 629-49 Black Picture Frame629-50 — 629-50 Antique Gold Picture Frame631-109 — 631-109 Black Lacquer Picture Frame631-42 — 631-42 White Picture Frame631-473 — 631-473 Silver Picture Frame631-49 — 631-49 Black Picture Frame631-50 — 631-50 Gold Picture Frame631-58 — 631-58 Charcoal Picture Frame631-63 — 631-63 Warm Silver Picture Frame631-71 — 631-71 Walnut Woodgrain Picture Frame631-81 — 631-81 Dark Walnut Woodgrain Picture Frame631-82 — 631-82 Natural Woodgrain Picture Frame631-88 — 631-88 Charcoal Woodgrain Picture Frame631-91 — 631-91 Light Walnut Woodgrain Picture Frame632-42 — 632-42 White Picture Frame632-473 — 632-473 Silver Picture Frame632-48 — 632-48 Charcoal Picture Frame632-49 — 632-49 Black Picture Frame632-55 — 632-55 Bronze Picture Frame661-40 — 661-40 Bronze Silver Bamboo Stem Frame661-43 — 661-43 Silver Bamboo Stem Frame661-49 — 661-49 Espresso Bamboo Stem Frame701-403 — 701-403 Grey Thin Picture Frame701-410 — 701-410 Pink Thin Picture Frame701-415 — 701-415 Red Think Picture Frame701-416 — 701-046 Blue Think Picture Frame701-419 — 701-419 Pink Thin Picture Frame701-851 — 701-851 Champagne Picture Frame701-871 — 701-871 Silver Thin Picture Frame701-948 — 701-948 White Thin Picture Frame701-blk — 701-blk Black Thin Picture Frame702-001 — 702-001 Oak Large Picture Frame702-011 — 702-011 Silver Large Picture Frame702-014 — 702-014 Grey Large Picture Frame702-045 — 702-045 Black Large Picture Frame702-051 — 702-051 Brown Large Picture Frame702-062 — 702-062 Grain Black Large Picture Frame702-067 — 702-067 Grey Brown Large Picture Frame702-084 — 702-084 Red Brown Large Picture Frame702-851 — 702-851 Champagne Large Picture Frame702-948 — 702-948 White Large Picture Frame706-21 — 706-21 Red Wood Pictureframe707-21 — 707-21 Redwood Black Deco Picture Frame707-29 — 707-29 Black Deco Frame725-29 — 725-29762-20 — 762-20 Bronze Wood Frame782-22 — 782-22 White Picture Frame782-29 — 782-29 Black Picture Frame783-22 — 783-22 White Picture Frame783-29 — 783-29 Black Picture Frame78348 — 78348 Omega787-290 — 787-290 Gold Picture Frame787-293 — 787-293 Stainless Picture Frame787-393 — 787-393 Silver Picture Frame790-212 — 790-212 Ivory Curving Frame790-218 — 790-218 Brown Curving Frame790-221 — 790-221 Walnut Curving Frame790-229 — 790-229 Black Curving Frame790-231 — 790-231 Espresso Curving Frame800-967 — 800-967 Black Frame Box832-745 — 832-745 Black Picture Frame868-745 — 868-745 Black Lipped Picture Frame868-755 — 868-755 Black With Gold Lipped Picture Frame868-756 — 868-756 Expresso With Gold Lipped Picture Frame868-767 — Expresso With Gold Lip884-638 — 884-638 Scratched Platinium Large Picture Frame886-690 — 886-690 Red Wood Large Picture Frame886-740 — 886-740 Redwood Large Picture Frame892-1040 — 892-1040 Gold Lipped Picture Frame892-755 — 892-755 Gold Lipped With Black Picture Frame892-756 — 892-756 Gold Lipped With Espresso Picture Frame892-967 — 892-967 Black Lipped Picture Frame8947 — 8947 Gold Picture Frame
Product Listing

Product Codes

Every valid material|type combination. Use these two values as the second and third segments of your preordercode.

Material Type code Product name Min size Max size Lead time
acrylic ac220 Acrylic Print 1/4 ( 0.220 ) 8″ 96″ 6 days
acrylic da8 Acrylic Print 1/8 8″ 96″ 6 days
acrylic da16 Acrylic Print 3/16 8″ 96″ 6 days
acrylic ac4 Acrylic Print 1/4 8″ 96″ 6 days
acrylic a38 Acrylic Print 3/8 8″ 96″ 6 days
acrylic ng8 Acrylic Print Non Glare 1/8 8″ 95″ 6 days
canvas cnvr Canvas Print 8″ 150″ 4 days
canvas cnvm Canvas Print Matte Varnish 8″ 150″ 4 days
canvas cnvg Canvas Print Semi-gloss 8″ 150″ 4 days
canvas cnvs Canvas Print Silver 8″ 150″ 4 days
metal al Brushed Metal Print 8″ 96″ 6 days
metal alw Smooth White Metal Print 8″ 96″ 6 days
metal hd Hd Sublimation Chromaluxe Metal Print 8″ 60″ 6 days
paper poster Satin Photo Paper Print - Poster 8″ 150″ 4 days
paper glossphoto Glossy Photo Print 8″ 150″ 4 days
paper art Fine Art Matte Paper Print 8″ 150″ 4 days
paper vinyl Vinyl Print - Poster 8″ 150″ 4 days
paper pearl Pearlescent Photo Print 8″ 150″ 4 days
wood ru14 Wood Print 8″ 96″ 6 days
wood ru58 Russian Birch 5/8 8″ 96″ 6 days
wood pineveneer Pine Veneer Print 8″ 96″ 6 days
panel plsintra Sintra Print 8″ 96″ 7 days
panel plgatorplast Gatorplast Print 8″ 96″ 6 days
panel plfomecor Foamcore Print 8″ 96″ 6 days
panel plpvc3 Pvc 3mm Panel Print 8″ 96″ 6 days
panel plpvc6 Pvc 6mm Panel Print 8″ 96″ 6 days
panel mdf12 Mdf 1/2 13mm Panel Print 8″ 96″ 6 days
panel cor04 Coroplast 4mm Panel Print 8″ 96″ 7 days
puzzle 120pcs Puzzle Print 11x8-120pcs 11 × 8″ — 6 days
puzzle 315pcs Puzzle Print 17x12-315pcs 17 × 12″ — 6 days
puzzle 500pcs Puzzle Print 21x16-500pcs 21 × 16″ — 6 days
puzzle 1000pcs Puzzle Print 27x17-1000pcs 27 × 17″ — 6 days
puzzle 1500pcs Puzzle Print 36x24-1500pcs 36 × 24″ — 6 days
mural regular Wall Mural Self Adhesive Print — — 4 days
specialty guitar Custom Acrylic Guitar Board 13 X 38 18 × 13″ — 7 days
specialty skateboard Custom Acrylic Skate Board 8 X 30 8 × 30″ — 7 days
specialty snowboard Custom Acrylic Snow Board 12 X 62 12 × 62″ — 7 days
specialty surfboard Custom Acrylic Surf Board 76 X 18 18 × 76″ — 7 days
specialty 12rd Clock 12 Inches Round 12 × 12″ — 7 days
specialty 12sq Clock 12 Inches Square 12 × 12″ — 7 days
specialty 16rd Clock 16 Inches Round 16 × 16″ — 7 days
specialty 16sq Clock 16 Inches Square 16 × 16″ — 7 days
specialty 24rd Clock 24 Inches Round 24 × 24″ — 7 days
specialty 24sq Clock 24 Inches Square 24 × 24″ — 7 days
Product Listing

Option Codes

All valid values for the additional segments of the preordercode. ¹ Requires a specific material  |  ² Requires a specific prior additional  |  ³ Only available on some sizes or some frame models — buildproductlist marks it isDisabled when it cannot be used.

Option code Group Name Req.
regular Canvas Type Regular ¹
matte Canvas Type Canvas Matte Varnish ¹
semigloss Canvas Type Canvas Semi-Gloss Varnish ¹
silver Canvas Type Canvas Silver Finish ¹
bordercolor Canvas Wrap Border Color ¹²
mirrorimage Canvas Wrap Mirror Image ¹²
imagewrap Canvas Wrap Image Wrap ¹²
textbordercolor Canvas Border Color Border Color Input ¹²
roll Canvas Thickness Rolled / Unmounted ¹
c15 Canvas Thickness Stretched Canvas Mount 1.5 Inch ¹
c075 Canvas Thickness Stretched Canvas Mount 0.75 Inch ¹
none White Border None ¹
wb175 White Border Add 1.75" White Border ¹
wb25 White Border Add 2.5" White Border ¹
none Mounting None ¹
standoff Mounting Stand Off Posts ¹
gromet Mounting Grommets On Each Corner ¹
box Mounting Metal Box Shape 1.5 Inch ¹
float Mounting Back Frame Mount ¹
moulding Mounting Floating Frame ¹
moulding34 Mounting Floating Frame 3/4 ¹²
frame Mounting Frames ¹
lam1 Mounting Lamination On 3/8 Plate ¹
sebbox Mounting Shadow Box Mounting ¹
lam2 Mounting Lamination Flushmount ¹
lam4c Mounting Lamination On Masonite ¹
drymount Mounting Giclee Paper Print Dry Mount ¹
kraft Mounting Back Kraft Paper ¹
sintraback Mounting Sintra Backing ¹
masoniteback Mounting Masonite Backing ¹
dryf Mounting Drymount On Foamcore ¹
dryxl Mounting Drymount On Foamcore XL ¹
dryg Mounting Drymount On GatorPlast ¹
none Cutting Option None ¹
circular Cutting Option Circular Cut ¹
roundedcorner Cutting Option Rounded Corner 1/4" Radius ¹
metalbox Cutting Option Metal Box 1.5" ¹
diecut Cutting Option Die-Cut Special Shape ¹
octogonal Cutting Option Octogonal Cut ¹
exactcut Cutting Option Exact Cut ¹
175inchcut Cutting Option 1.75 Inch Extra White Border ¹
25inchcut Cutting Option 2.5 Inch Extra White Border ¹
none Graphic None
opt Graphic Optimization Service
retouch Graphic Retouch Service
none Printing None ¹
blackink Printing Black Ink ¹
2intransparency Printing 2 Inch Transparency ¹
selectivetransparency Printing Selective Transparency ¹
frost Printing White Frost Effect ¹
backlit Printing Back Lit ( Back Lighting Transparency Effect ) ¹
autopen Printing Auto Pen Signature ¹
inborder Printing Inside White Border Print ¹
noir Printing Black Backing ¹
blanc Printing Selective Transparency ¹
none Varnish None ¹
knife Varnish Knife Artistic Varnish ¹
none Mat Board None ²
mb01 Mat Board Matboard 1 Inch ²
mb02 Mat Board Matboard 2 Inches ²
mb03 Mat Board Matboard 3 Inches ²
mb04 Mat Board Matboard 4 Inches ²
mb05 Mat Board Matboard 5 Inches ²
mb06 Mat Board Matboard 6 Inches ²
mb07 Mat Board Matboard 7 Inches ²
mb08 Mat Board Matboard 8 Inches ²
mb09 Mat Board Matboard 9 Inches ²
mb10 Mat Board Matboard 10 Inches ²
ws01 Mat Board White Space 1 Inch ²
ws02 Mat Board White Space 2 Inches ²
ws03 Mat Board White Space 3 Inches ²
ws04 Mat Board White Space 4 Inches ²
ws05 Mat Board White Space 5 Inches ²
ws06 Mat Board White Space 6 Inches ²
ws07 Mat Board White Space 7 Inches ²
ws08 Mat Board White Space 8 Inches ²
ws09 Mat Board White Space 9 Inches ²
ws10 Mat Board White Space 10 Inches ²
plexiglass Plexi Glass Plexiglass ²
plexiglassprint Plexi Glass Plexiglass With White Border ²
glass Plexi Glass Glass ²
none Hanging None ²
wire Hanging Hanging Wire ²
crochetf Hanging Drymount Metal Hook ²
cleat Hanging French Metal Cleat ²
security Hanging Security Hardware ²
woodcleat Hanging French Wood Cleat ²
sawtooth Hanging Sawtooth Hangers ²
dring Hanging D-Ring Hangers ²
none Certificate None
cert Certificate Certificate Of Authenticity
signature Miscellaneous Signature ¹
editioncount Miscellaneous Inscription Edition ¹
mirror Miscellaneous Mirror Edges For Canvas ¹
cfs15 Cfs 15 CFS-15 ¹²
Product Listing

Frame Models

All valid frame codes for the additional (frames) segment. Decorative Moulding requires moulding in additionals. Picture Frame requires frame in additionals.

Frame code Type Name
301-10 Decorative Moulding 301-10 Satin Gold Picture Frame
301-11 Decorative Moulding 301-11 Bronze Picture Frame
301-21 Decorative Moulding 301-21 Espresso Floating Frame
301-22 Decorative Moulding 301-22 White Floating Frame
301-29 Decorative Moulding 301-29 Black Floating Frame
303-11 Decorative Moulding 303-11 Espresso Floating Frame
303-12 Decorative Moulding 303-12 Natural Wood Floating Frame
303-19 Decorative Moulding 303-19 Black Floating Frame
317-11 Decorative Moulding 317-11 Bronze Floating Frame
317-21 Decorative Moulding 317-21 Espresso Floating Frame
317-22 Decorative Moulding 317-22 White Floating Frame
317-29 Decorative Moulding 317-29 Black Floating Frame
317-30 Decorative Moulding 317-30 Gold Floating Frame
317-73 Decorative Moulding 317-73 Silver Floating Frame
340-21 Decorative Moulding 340-21 Espresso Floating Frame
340-29 Decorative Moulding 340-29 Black Floating Frame
348-09 Decorative Moulding 348-09 Black Lacquer Picture Frame
360-02 Decorative Moulding 360-02 White Lacquer Floating Frame
360-09 Decorative Moulding 360-09 Black Lacquer Floating Frame
360-108 Decorative Moulding 360-108 Grey Floating Frame
360-11 Decorative Moulding 360-11 Bronze Floating Frame
360-111 Decorative Moulding 360-111 Wallnut Floating Frame
360-112 Decorative Moulding 360-112 Ivory Floating Frame
360-118 Decorative Moulding 360-118 Brown Floating Frame
360-18 Decorative Moulding 360-18 Charcoal Floating Frame
360-22 Decorative Moulding 360-22 White Floating Frame
360-23 Decorative Moulding 360-23 Warm Silver Floating Frame
360-29 Decorative Moulding 360-29 Black Floating Frame
360-30 Decorative Moulding 360-30 Gold Floating Frame
360-71 Decorative Moulding 360-71 Brown Woodgrain Floating Frame
360-72 Decorative Moulding 360-72 Off-white Woodgrain Floating Frame
360-73 Decorative Moulding 360-73 Silver Floating Frame
360-78 Decorative Moulding 360-78 Grey Woodgrain Floating Frame
360-79 Decorative Moulding 360-79 Black Woodgrain Floating Frame
360-81 Decorative Moulding 360-81 Dark Brown Woodgrain Floating Frame
360-82 Decorative Moulding 360-82 Natural Woodgrain Floating Frame
360-88 Decorative Moulding 360-88 Charcoal Woodgrain Floating Frame
361-121 Decorative Moulding 361-121 Heavy Brown Floating Frame
361-122 Decorative Moulding 361-122 White-brown Wood Floating Frame
361-128 Decorative Moulding 361-128 Light Grey Wood Floating Frame
361-131 Decorative Moulding 361-131 Brown Wood Floating Frame
361-138 Decorative Moulding 361-138 Grey Wood Floating Frame
514-42 Decorative Moulding 514-42 Floating Frame
514-48 Decorative Moulding 514-48 Floating Frame
514-49 Decorative Moulding 514-49 Floating Frame
514-71 Decorative Moulding 514-71 Floating Frame
514-72 Decorative Moulding 514-72 Floating Frame
514-81 Decorative Moulding 514-81 Wood Texture Floating Frame
515-48 Decorative Moulding 515-48 Charcoal Floating Frame
613-50 Decorative Moulding 613-50 Gold Floating Frame
fl-814-08 Decorative Moulding Fl-814-08 Gold Antique Floating Frame
fl-814-18 Decorative Moulding Fl-814-18 Walnut Floating Frame
fl-814-22 Decorative Moulding Fl-814-22 Truffle Floating Frame
fl-814-51 Decorative Moulding Fl-814-51 Pewter Floating Frame
fl-814-52 Decorative Moulding Fl-814-52 Charcoal Floating Frame
fl-814-61 Decorative Moulding Fl-814-61 Ebony Floating Frame
fl-814-66 Decorative Moulding Fl-814-66 Champagne Floating Frame
fl-814-67 Decorative Moulding Fl-814-67 Black Floating Frame
fl-814-711 Decorative Moulding Fl-814-711 Silver Floating Frame
fl-814-722 Decorative Moulding Fl-814-722 Gold Floating Frame
fl-816-908 Decorative Moulding Fl-816-908 Antique Floating Frame
fl-816-922 Decorative Moulding Fl-816-922 Truffle Floating Frame
fl-816-952 Decorative Moulding Fl-816-952 Coal Floating Frame
fl-816-966 Decorative Moulding Fl-816-966 Champagne Floating Frame
240-71 Picture Frame 240-71 Wood Box Picture Frame
240-82 Picture Frame 240-82 Natural Wood Box Picture Frame
241-21 Picture Frame 241-21 Espresso Picture Frame
241-22 Picture Frame 241-22 White Picture Frame
241-29 Picture Frame 241-29 Black Picture Frame
2616-473 Picture Frame 2616-473 True Silver Large Frame Box
329-22 Picture Frame 329-22 White Picture Frame
329-29 Picture Frame 329-29 Black Picture Frame
330-128 Picture Frame 330 Grey Woodgrain Box Picture Frame
330-19 Picture Frame 330 Black Wood Grain Box Picture Frame
330-22 Picture Frame 330-22 White Box Picture Frame
330-29 Picture Frame 330-29 Black Box Picture Frame
330-73 Picture Frame 330 Silver Box Picture Frame
331-09 Picture Frame 331-09 Black Shadow Box Frame
331-22 Picture Frame 331-22 White Picture Frame
331-29 Picture Frame 331-29 Black Picture Frame
432-21 Picture Frame 432-21 Espresso Picture Frame
432-22 Picture Frame 432-22 White Thin Picture Frame
432-29 Picture Frame 432-29 Black Thin Picture Frame
608-61 Picture Frame 608-61 Oak Woodgrain Thin Frame Box
608-78 Picture Frame 608-78 Charcoal Thin Frame Box
608-79 Picture Frame 608-79 Dark Brown Thin Frame Box
608-81 Picture Frame 608-81 Beige Barnwood Thin Frame Box
724-12 Picture Frame 724-12 Natural Picture Frame
724-19 Picture Frame 724-19 Black Picture Frame
724-32 Picture Frame 724-32 White Picture Frame
800-966 Picture Frame 800-966 Champagne Frame Box
820-545 Picture Frame 820-545 Black Lipped Frame Box
820-888 Picture Frame 820-888 Dark Brownframe Box
832-711 Picture Frame 832-711 Silver Picture Frame
832-722 Picture Frame 832-722 Gold Picture Frame
832-733 Picture Frame 832-733 Red Wood Picture Frame
84005 Picture Frame 84005 Natural Wood Thin Picture Frame
fl-816-967 Picture Frame Fl-816-967 Black Floating Frame
306-11 Picture Frame 306-11 Bronze Floating Frame 0.75
306-22 Picture Frame 306-22 White Floating Frame 0.75
306-29 Picture Frame 306-29 Black Floating Frame 0.75
306-90 Picture Frame 306-90 Gold Floating Frame 0.75
365-11 Picture Frame 365-11 Espresso Floating Frame
365-12 Picture Frame 365-12 Natural Floating Frame
365-18 Picture Frame 365-18 Grey Floating Frame
365-19 Picture Frame 365-19 Black Floating Frame
365-31 Picture Frame 365-31 Walnut Floating Frame
132-29 Picture Frame 132-29 Black Picture Frame
132-31 Picture Frame 132-31 Espresso Picture Frame
135-200 Picture Frame 135-200 Verdigris With Black Lined Picture Frame
141-10 Picture Frame 141-10 Gold Picture Frame
141-15 Picture Frame 141-15 Bronze Picture Frame
141-21 Picture Frame 141-21 Espresso Picture Frame
141-22 Picture Frame 141-22 White Picture Frame
141-29 Picture Frame 141-29 Black Picture Frame
145-21 Picture Frame 145-21 Espresso Picture Frame
145-22 Picture Frame 145-22 White Picture Frame
145-29 Picture Frame 145-29 Black Picture Frame
157-950 Picture Frame 157-950 Light Gold Lipped Frame
165-21 Picture Frame 165-21 Light Walnut Picture Frame
186-21 Picture Frame 186-21 Redwood With Black Picture Frame
186-24 Picture Frame 186-24 Magogany With Black Picture Frame
186-29 Picture Frame 186-29 Black Picture Frame
22-21 Picture Frame 22-21 Metal Frame
24-260 Picture Frame 24-260 Gold Ornate Frame
24-263 Picture Frame 24-263 Silver Ornate Frame
297-12 Picture Frame 297-12 Natural Woodgrain Picture Frame
297-19 Picture Frame 297-19 Black Woodgrain Picture Frame
297-32 Picture Frame 297-32 White Woodgrain Picture Frame
41-10 Picture Frame 41-10 Gold Picture Frame
41-15 Picture Frame 41-15 Bronze Picture Frame
41-21 Picture Frame 41-21 Espresso Picture Frame
41-22 Picture Frame 41-22 White Picture Frame
41-29 Picture Frame 41-29 Black Picture Frame
429-121 Picture Frame 429-121 White-brown Barnwood Frame
429-122 Picture Frame 429-122 White-brown Barnwood Frame
429-125 Picture Frame 429-125 Dark Brown Barnwood Frame
429-128 Picture Frame 429-128 Grey Barnwood Frame
429-131 Picture Frame 429-131 Barnwood Frame
429-138 Picture Frame 429-138 Grey Thin Wood Frame
430-121 Picture Frame 430-122 Light Brown Wood Frame
430-122 Picture Frame 430-122 Brown-white Wood Frame
430-125 Picture Frame 430-125 Dark Brown Wood Frame
430-128 Picture Frame 430-128 Light Grey Wood Frame
430-131 Picture Frame 430-131 Brown Wood Frame
430-138 Picture Frame 430-138 Grey Wood Frame
431-29 Picture Frame 431-29 Black Picture Frame
520-21 Picture Frame 520-21 Red Wood Picture Frame
58-10 Picture Frame 58-10 Brushed Gold Classic Frame
58-13 Picture Frame 58-13 Brushed Silver Classic Frame
58-20 Picture Frame 58-20 Gold Classic Frame
58-23 Picture Frame 58-23 Silver Classic Frame
59-10 Picture Frame 59-10 Brushed Gold Large Classic Frame
59-13 Picture Frame 59-13 Brushed Silver Large Classic Frame
59-20 Picture Frame 59-20 Gold Large Classic Frame
59-210 Picture Frame 59-210 Gold Espresso Worn-out Frame
59-213 Picture Frame 59-213 Silver Espresso Worn-out Frame
59-23 Picture Frame 59-23 Silver Panel Frame
595-68 Picture Frame 595-68 Grey Barnwood Large Picture Frame
595-72 Picture Frame 595-72 Oak Barwood Large Picture Frame
595-78 Picture Frame 595-78 Brown Barnwood Large Picture Frame
602-53 Picture Frame 602-53 Silver Black Lipped Picture Frame
602-59 Picture Frame 602-59 Black Silver Lipped Picture Frame
608-72 Picture Frame 608-72 White Woodgrain Thin Frame Box
629-102 Picture Frame 629-102 White Lacquer Picture Frame
629-49 Picture Frame 629-49 Black Picture Frame
629-50 Picture Frame 629-50 Antique Gold Picture Frame
631-109 Picture Frame 631-109 Black Lacquer Picture Frame
631-42 Picture Frame 631-42 White Picture Frame
631-473 Picture Frame 631-473 Silver Picture Frame
631-49 Picture Frame 631-49 Black Picture Frame
631-50 Picture Frame 631-50 Gold Picture Frame
631-58 Picture Frame 631-58 Charcoal Picture Frame
631-63 Picture Frame 631-63 Warm Silver Picture Frame
631-71 Picture Frame 631-71 Walnut Woodgrain Picture Frame
631-81 Picture Frame 631-81 Dark Walnut Woodgrain Picture Frame
631-82 Picture Frame 631-82 Natural Woodgrain Picture Frame
631-88 Picture Frame 631-88 Charcoal Woodgrain Picture Frame
631-91 Picture Frame 631-91 Light Walnut Woodgrain Picture Frame
632-42 Picture Frame 632-42 White Picture Frame
632-473 Picture Frame 632-473 Silver Picture Frame
632-48 Picture Frame 632-48 Charcoal Picture Frame
632-49 Picture Frame 632-49 Black Picture Frame
632-55 Picture Frame 632-55 Bronze Picture Frame
661-40 Picture Frame 661-40 Bronze Silver Bamboo Stem Frame
661-43 Picture Frame 661-43 Silver Bamboo Stem Frame
661-49 Picture Frame 661-49 Espresso Bamboo Stem Frame
701-403 Picture Frame 701-403 Grey Thin Picture Frame
701-410 Picture Frame 701-410 Pink Thin Picture Frame
701-415 Picture Frame 701-415 Red Think Picture Frame
701-416 Picture Frame 701-046 Blue Think Picture Frame
701-419 Picture Frame 701-419 Pink Thin Picture Frame
701-851 Picture Frame 701-851 Champagne Picture Frame
701-871 Picture Frame 701-871 Silver Thin Picture Frame
701-948 Picture Frame 701-948 White Thin Picture Frame
701-blk Picture Frame 701-blk Black Thin Picture Frame
702-001 Picture Frame 702-001 Oak Large Picture Frame
702-011 Picture Frame 702-011 Silver Large Picture Frame
702-014 Picture Frame 702-014 Grey Large Picture Frame
702-045 Picture Frame 702-045 Black Large Picture Frame
702-051 Picture Frame 702-051 Brown Large Picture Frame
702-062 Picture Frame 702-062 Grain Black Large Picture Frame
702-067 Picture Frame 702-067 Grey Brown Large Picture Frame
702-084 Picture Frame 702-084 Red Brown Large Picture Frame
702-851 Picture Frame 702-851 Champagne Large Picture Frame
702-948 Picture Frame 702-948 White Large Picture Frame
706-21 Picture Frame 706-21 Red Wood Pictureframe
707-21 Picture Frame 707-21 Redwood Black Deco Picture Frame
707-29 Picture Frame 707-29 Black Deco Frame
725-29 Picture Frame 725-29
762-20 Picture Frame 762-20 Bronze Wood Frame
782-22 Picture Frame 782-22 White Picture Frame
782-29 Picture Frame 782-29 Black Picture Frame
783-22 Picture Frame 783-22 White Picture Frame
783-29 Picture Frame 783-29 Black Picture Frame
78348 Picture Frame 78348 Omega
787-290 Picture Frame 787-290 Gold Picture Frame
787-293 Picture Frame 787-293 Stainless Picture Frame
787-393 Picture Frame 787-393 Silver Picture Frame
790-212 Picture Frame 790-212 Ivory Curving Frame
790-218 Picture Frame 790-218 Brown Curving Frame
790-221 Picture Frame 790-221 Walnut Curving Frame
790-229 Picture Frame 790-229 Black Curving Frame
790-231 Picture Frame 790-231 Espresso Curving Frame
800-967 Picture Frame 800-967 Black Frame Box
832-745 Picture Frame 832-745 Black Picture Frame
868-745 Picture Frame 868-745 Black Lipped Picture Frame
868-755 Picture Frame 868-755 Black With Gold Lipped Picture Frame
868-756 Picture Frame 868-756 Expresso With Gold Lipped Picture Frame
868-767 Picture Frame Expresso With Gold Lip
884-638 Picture Frame 884-638 Scratched Platinium Large Picture Frame
886-690 Picture Frame 886-690 Red Wood Large Picture Frame
886-740 Picture Frame 886-740 Redwood Large Picture Frame
892-1040 Picture Frame 892-1040 Gold Lipped Picture Frame
892-755 Picture Frame 892-755 Gold Lipped With Black Picture Frame
892-756 Picture Frame 892-756 Gold Lipped With Espresso Picture Frame
892-967 Picture Frame 892-967 Black Lipped Picture Frame
8947 Picture Frame 8947 Gold Picture Frame