Attraction Product API
Bring public Attraction product data into your catalog, product search, or assistant workflow.
Quick start
Run this request from a terminal to fetch public product summaries.
curl "https://api.attraction.com/v1/products?locale=en-US"List products
Fetch product summaries for catalogs, listing pages, search, and filters.
Public request
curl "https://api.attraction.com/v1/products?locale=en-US"{
"locale": "en-US",
"products": [
{
"sku": "100386U",
"slug": "100386u",
"productName": "Crewneck T-shirt",
"brand": "Ethica",
"descriptions": {
"short": "A soft unisex crewneck T-shirt made for branded programs."
},
"links": {
"product": "https://www.attraction.com/en-us/products/100386u/",
"studio": "https://studio.jameo.com/home?lang=en"
},
"pricing": {
"currency": "CAD",
"msrp": [
{ "minQuantity": 36, "maxQuantity": 99, "price": 28 },
{ "minQuantity": 100, "maxQuantity": 299, "price": 26 },
...
]
},
"colors": [
{
"id": "0001",
"name": "White",
"swatches": ["#FFFFFF"]
},
...
],
"inventory": [
{ "colorId": "0001", "size": "XS", "quantity": 149 },
...
],
...
},
...
],
"categories": [
{
"name": "T-shirts",
"order": 10
},
...
],
"brands": [
{
"name": "Ethica",
"description": "Timeless classics, made in Canada with sustainable fibres."
},
...
]
}Get product details
Fetch one product for a product page, catalog sync, inventory check, or asset lookup.
Public request
Fetch product detail, MSRP pricing, inventory, media, and resource links without authentication.
curl "https://api.attraction.com/v1/products/100386U?locale=en-US"{
"sku": "100386U",
"slug": "100386u",
"locale": "en-US",
"productName": "Crewneck T-shirt",
"descriptions": {
"tagline": "A dependable crewneck for everyday branded apparel.",
"short": "A soft unisex crewneck T-shirt made for branded programs.",
"long": "A dependable unisex crewneck T-shirt designed for branded apparel programs that need comfort, consistency, and decoration flexibility."
},
"keywords": ["t shirt","custom t shirt","ethica","made in canada"],
"brand": {
"name": "Ethica",
"url": "https://www.attraction.com/en-us/products/ethica/",
"description": "Timeless classics, made in Canada with sustainable fibres."
},
"catalog": {
"inspiration": ["Promotional"],
"category": "T-shirts",
"for": "Unisex"
},
"links": {
"product": "https://www.attraction.com/en-us/products/100386u/",
"brand": "https://www.attraction.com/en-us/products/ethica/",
"category": "https://www.attraction.com/en-us/products/?cat=t-shirts",
"studio": "https://studio.jameo.com/home?lang=en"
},
"tag": "Best seller",
"minimumOrder": {
"quantity": 36,
"description": "Minimum 36 decorated units. No minimum undecorated."
},
"customization": {
"colorBlocks": false,
"decorations": [],
"options": []
},
"pricing": {
"currency": "CAD",
"msrp": [
{ "minQuantity": 36, "maxQuantity": 99, "price": 28 },
{ "minQuantity": 100, "maxQuantity": 299, "price": 26 },
...
]
},
"assets": {
"images": [
{
"url": "https://www.attraction.com/assets/products/100386u/100386u-primary.webp",
"alt": "White Ethica crewneck T-shirt"
},
...
],
"resources": [
{
"type": "sizeChart",
"label": "Size chart",
"url": "https://attraction.com/assets/products/100386u/100386u.pdf"
},
...
]
},
"colors": [
{
"id": "0001",
"name": "White",
"swatches": ["#FFFFFF"],
"colorFamilies": []
},
...
],
"inventory": [
{ "colorId": "0001", "size": "XS", "quantity": 149 },
...
]
}Net pricing through the API
Public endpoints return product content, MSRP pricing, inventory, media, and resources. Authenticated API access for account-specific net pricing is coming later.
Error responses
Errors use the same status, code, and message fields. Missing authentication does not error because product data is public.
unsupported_locale
400 when locale is not one of en-CA, en-US, or fr-CA.
{
"status": 400,
"code": "unsupported_locale",
"message": "Supported locales are en-CA, en-US, and fr-CA."
}product_not_found
404 for /v1/products/{sku} when the SKU does not exist.
{
"status": 404,
"code": "product_not_found",
"message": "Product not found."
}rate_limited
429 when the request exceeds the v1 rate limit.
{
"status": 429,
"code": "rate_limited",
"message": "Too many requests. Please retry later."
}