Developers

Attraction publishes a read-only public Product API and Markdown mirrors of this site so people and AI agents can bring current product data and company context into their own tools. This page is the starting point; the full API reference covers every endpoint, parameter, and response field.

Start here

GET /v1/products?locale=en-CA

bash
curl "https://api.attraction.com/v1/products?locale=en-CA"

Authentication

Public product data needs no key and no signed-in account: product lists, product detail, colours, sizes, live inventory, MSRP pricing, images, and decoration compatibility are all open reads. Account API keys for distributor net pricing are not available yet; the API keys page stays hidden until that ships.

Rate limits

Every response from /v1/products and /v1/products/{sku} carries rate-limit headers for a policy named default: 600 requests per minute per client IP. This count is advisory and tracked per API instance, not a single global counter, so do not size an integration against 600/min as a guarantee. Infrastructure also enforces a hard backstop of 100 requests per second (burst 200) regardless of the advisory count. Always honour Retry-After on a 429. These follow draft-ietf-httpapi-ratelimit-headers. Requests over the limit get a 429 with Retry-After and a rate_limited error.

  • RateLimit-Policy: "default";q=600;w=60
  • RateLimit: "default";r=<remaining>;t=<seconds>

Catalogue routes also serve gzip: send Accept-Encoding: gzip and the roughly 274 KB product list compresses to about 24 KB.

Versioning and deprecation

The API is versioned in the URL: today's endpoints are under /v1. Breaking changes ship as /v2 rather than changing /v1 in place; additive changes, such as a new field or a new optional parameter, never bump the version.

When a version is deprecated, we announce it at least three months ahead and mark every response with a Deprecation header (RFC 9745) and a Sunset header (RFC 8594) naming the retirement date.

Errors

Errors are RFC 9457 problem+json objects, served as application/problem+json:

product_not_found — 404

json
{
  "type": "https://www.attraction.com/developers/#error-product_not_found",
  "title": "Product not found",
  "status": 404,
  "detail": "No product matches SKU NOPE-NOT-A-SKU.",
  "instance": "/v1/products/nope-not-a-sku",
  "code": "product_not_found"
}

Each code below has its own type URI on this page: https://www.attraction.com/developers/#error-<code>.

route_not_found404

No route matches the request path.

method_not_allowed405

The route exists but not for that HTTP method. The response carries Allow: GET, HEAD, OPTIONS.

invalid_request400

The request does not match what the route expects, for example a malformed query parameter.

unsupported_locale400

locale must be en-CA, en-US, or fr-CA.

invalid_sku400

The sku path parameter is not a valid SKU.

unauthorized401

Reserved for the private /v1/sync/* routes; the public product endpoints never return this.

product_not_found404

No product matches the given SKU.

rate_limited429

The client is over the rate-limit policy. The response carries Retry-After and the RateLimit/RateLimit-Policy headers.

upstream_unavailable503

The catalogue source is temporarily unreachable. The response carries Retry-After: 30.

internal_error500

An unexpected server error, with no stack trace or internal detail in the response.

Agent resources

Status and support

/v1/health reports API status. For anything else, reach the team at customerservice@attraction.com.

Changelog

  • 2026-08-24 Published this developer hub. Error responses moved to RFC 9457 application/problem+json; added rate-limit headers and a versioning and deprecation policy.
  • 2026-06-26 Official launch: the read-only public Product API at api.attraction.com — product list and detail under /v1, no key required — with its OpenAPI description and interactive documentation.