Catalog mirror
Sync your ERP, PIM, or e-commerce catalog into Awardee. One product per GTIN, kept fresh through
PATCH.Packaging-to-content
A consumer scans the GS1 barcode on the pack. The scan resolves the GTIN against your catalog and routes them to a chatbot, page, or knowledge base.
Retail integrations
Look up a product by raw GTIN from a POS, scanner, or mobile app via
GET /products/by-gtin/{gtin}.Lifecycle
A product moves through four statuses:| Status | Meaning |
|---|---|
unconfigured | Created but no destination set. Default on POST. Scans land on a “not configured” screen. |
active | Live. GTIN scans resolve to the configured destination. |
inactive | Paused. The row stays, scans show a “paused” screen. Useful for seasonal products. |
archived | Soft-deleted. The row is hidden from list views but historical scans keep working for audits. |
active as soon as a destination is set (the dashboard does this automatically; the API leaves it to you). Flip back to inactive or archived whenever — the row is never lost.
GTIN normalization
Thegtin field is always stored and returned in canonical GTIN-14 form, left-padded with zeros. On write the value must be exactly 8, 12, 13, or 14 digits — GTIN-8, GTIN-12 (UPC-A), GTIN-13 (EAN-13), or GTIN-14. Anything else (a 9- or 11-digit string, non-digit characters) is rejected with 400 invalid_payload. Valid input is normalized to GTIN-14 before persisting. Pass null to clear a stored GTIN.
This matters because GS1 Digital Link readers silently pad to 14 digits when parsing. Storing the canonical form means a 13-digit EAN scanned from a pack and a 12-digit UPC typed into your ERP resolve to the same row.
Anatomy
- Properties — typed K/V rows (
vintage,region,case_size). Replaced as a set viaPUT /products/{id}/properties. - Images — uploaded photos. See Images below.
CRUD workflow
A typical first sync from your system:Pull your catalog
Iterate every SKU in your source of truth. You’ll need at minimum a name and a GTIN; everything else is optional.
Create products
POST /products for each SKU. Set status: "active" if you’re shipping a destination at the same time, otherwise leave it default and configure later. Pass image_urls to attach images in the same call (see Images).Attach properties
PUT /products/{id}/properties replaces the property set atomically. Send the full desired state — Awardee upserts it, then drops only the keys you left out, so a failed request never destroys your existing properties. A body that repeats a key is rejected with 422 unprocessable before anything is written.Attach images
POST /products/{id}/images with a public URL — or pass image_urls on the create call to handle them in one shot. See Images.Images
Send a public image URL and Awardee fetches the bytes (SSRF-checked), stores them in your organization’s asset library, and links the resulting asset to the product. The API never accepts raw binary — always pass a URL we can reach over HTTPS. Asset bytes are content-addressed and de-duplicated within the organization: attaching the same image to multiple products stores it once. Thefile_url returned for two products with the same image will be identical, and the storage cost is paid once.
There are two ways to attach images:
- Bulk on create. Pass
image_urls: ["…", "…"]onPOST /products. URLs are stored in the order given. - Incremental.
POST /products/{id}/imageswith one URL at a time. Use this to add a single image to an existing product, or to controlsort_orderper image.
product_image row per image once it’s stored. Subsequent reads expose images via GET /products/{id}/images and you can remove one with DELETE /products/{id}/images/{imageId}.
Accepted formats and size
JPEG, PNG, WebP, and animated GIF up to 15 MiB each. The content is sniffed from the bytes — content-type headers alone aren’t trusted.Bulk on create
cURL
failed_image_urls. The field is omitted entirely when every URL succeeded.
Incremental attach
cURL
Ordering
sort_order controls display order on the product. Lower values come first. When using image_urls, the array order is used directly. There’s no first-class reorder endpoint today — to change the order, delete and re-attach with explicit sort_order values.
Delete an image
DELETE /products/{id}/images/{imageId} detaches the image from the product. Returns 204 No Content. The underlying asset bytes stay in your organization’s library and may still be referenced by other products or features; orphan assets (zero references) are reclaimed by a background GC job. Deleting the product itself detaches every image attached to it.
Webhook events
| Event | Fires on |
|---|---|
product.created | POST /products |
product.updated | PATCH /products/{id} |
product.deleted | DELETE /products/{id} |
product.scanned | A GS1 Digital Link scan resolved this product. |

