Catalyte

Developers

One API. Every shopping surface.

REST endpoints, webhooks, and an MCP server. Built for catalogs that change every second.

Authentication

Bearer-token auth, scoped to one workspace

Generate a key from your dashboard → API keys. Every request must include Authorization: Bearer <token>. Your token always acts on its own workspace — there is no workspaceId in the URL or body, ever.

curl https://your-app.lovable.app/api/public/v1/products \
  -H "Authorization: Bearer cat_live_XXXXXXXXXXXXXXXX"

Create a product

POST /api/public/v1/products

Validates with the same schema the dashboard uses. Returns 201 with the created row, 402 if the plan cap is hit, 422 on validation errors.

curl -X POST https://your-app.lovable.app/api/public/v1/products \
  -H "Authorization: Bearer $CATALYTE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "sku": "AERO-001",
    "title": "Aero Runner",
    "price_amount": 129,
    "price_currency": "USD",
    "brand": "Catalyte",
    "availability": "in_stock",
    "condition": "new"
  }'

Bulk import

POST /api/public/v1/products/bulk

Up to 1,000 rows per call. The full batch must fit under your plan cap, otherwise the whole call rejects with 402 (nothing is written).

curl -X POST https://your-app.lovable.app/api/public/v1/products/bulk \
  -H "Authorization: Bearer $CATALYTE_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "products": [ { "sku": "A-1", "title": "..." }, ... ] }'

List, read, update, delete

/api/public/v1/products and /:id

GET list (?limit=&offset=, max 200). GET /:id, PATCH /:id (partial), DELETE /:id. Any :id outside your workspace returns 404 — keys can never read or touch another workspace's data.

GET    /api/public/v1/products?limit=50
GET    /api/public/v1/products/<id>
PATCH  /api/public/v1/products/<id>
DELETE /api/public/v1/products/<id>

Errors

JSON error envelope

Every non-2xx response is { error: { code, message } }. Codes: UNAUTHORIZED (401), FORBIDDEN (403), NOT_FOUND (404), VALIDATION (422), PLAN_LIMIT (402), INTERNAL (500).

{
  "error": {
    "code": "PLAN_LIMIT",
    "message": "Plan free caps products at 50.",
    "plan": "free",
    "limit": 50
  }
}

Plan limits

Caps apply to every surface

The same product cap is enforced in the dashboard, the importer, and the API. Bulk imports that would exceed it are rejected up front.

PlanProductsAPI keysChannelsTeammates
Free50111
Starter2,000333
Growth25,00010810
Scale250,000502050
EnterpriseUnlimitedUnlimitedUnlimitedUnlimited