API reference
This page lists every endpoint in version 1 of the Fulify API, along with the conventions they share: authentication, SKU matching, partial updates, pagination and limits. Each area has its own page with request and response examples.
If you haven't made a call yet, start with Get started with the API.
Base URL and authentication
The base URL is https://api.fulify.io/v1. Send an API key from Settings → API Keys as a bearer token:
Keys start with flfy_live_. A key only ever sees its own organization's data.
Endpoints
| Method | Path | Scope | Purpose |
|---|---|---|---|
| GET | /health | none | Liveness check. The only endpoint that needs no key. |
| GET | /me | any valid key | The calling key's organization, access preset and scopes. |
| GET | /products | products:read | List products, with filters and pagination. |
| GET | /products/{sku} | products:read | One product, with its categories, destinations and variants. |
| POST | /products | products:write | Create or update products by SKU, one or up to 500 at a time. Supports dry runs. |
| POST | /variant-groups/bulk | products:write | Create variant groups from CSV-style rows. |
| GET | /selection-guides | selection-guides:read | List size charts. |
| POST | /selection-guides | selection-guides:write | Create a size chart. |
| GET | /selection-guides/{id} | selection-guides:read | One size chart, with its product count. |
| PATCH | /selection-guides/{id} | selection-guides:write | Update a size chart. |
| DELETE | /selection-guides/{id} | selection-guides:write | Delete a size chart that no product uses. |
| GET | /selection-guides/{id}/products | selection-guides:read | The products a size chart is attached to. |
| POST | /selection-guides/{id}/products | selection-guides:write | Attach or detach a size chart by SKU. |
Sending isActive, syncEnabled or destinations on POST /products also needs the sync:write scope. See Sync control.
Where to find the details:
- Products: listing, delta sync, reading by SKU, upserts, dry runs and the result format.
- Variants: updating and creating variants through
POST /products. - Sync control: the sync switches and Linnworks opt-ins.
- Size charts and variant groups: the selection-guide and variant-group endpoints.
- Webhooks: events Fulify sends to you.
- Errors and rate limits: status codes, error codes and retry advice.
- Data schema: every field on a product and variant.
Conventions
Products are identified by SKU
A product's SKU is its identity in the API. SKUs are unique within your organization and are compared ignoring case and surrounding spaces, so abc-123 and ABC-123 are the same product. POST /products creates a product when the SKU is new and updates it when the SKU already exists. Variants are matched the same way, by variant SKU within their product.
URL-encode a SKU when you put it in a path, for example GET /products/ACC%2F72580.
Products that have been merged into another product during de-duplication don't appear in the API.
Writes are partial
On an update, only the fields you send change. Send null to clear a field. Fields you leave out keep their current value. List fields such as images and categories replace the whole list when you send them.
Brands and categories are set by name or id
Set a product's brand with brand and its categories with categories, using names or ids. They must already exist in Fulify. The API never creates brands or categories. brandId and categoryIds appear on reads but are read-only.
Prices and measurements are decimal strings
Prices, weights and dimensions are returned as strings, such as "19.99", so no precision is lost. On a write you can send a number (19.99) or a string ("19.99"). Weights and dimensions are in the units set in Settings → General → Units, and prices are in your organization's currency.
Timestamps
Timestamps are ISO 8601 in UTC, for example 2026-10-20T14:03:11.412Z. Query parameters that take a time, such as updatedSince, accept any ISO 8601 value.
Pagination
GET /products and GET /selection-guides return a page of results and a pagination object, newest updatedAt first:
pageSizedefaults to 50 and is capped at 200.- Use
pagefor simple paging, or passnextCursorback as?after=for cursor paging, which stays fast however deep you go. In cursor modepageis left out of the response. nextCursoris set whenever a page comes back full, so the last page can be followed by one empty page withnextCursor: null.totalis always the total for your filters, not the number remaining.- Treat the cursor as opaque and pass back exactly what you received.
GET /selection-guides/{id}/products pages with page only.
Dry runs
POST /products?dryRun=true and POST /variant-groups/bulk with "dryRun": true validate the request and report what would happen, without writing anything.
Limits
| Limit | Value |
|---|---|
| Request body | 5 MB |
| Products per POST /products | 500 |
| Variants per product per request | 500 |
| Rows per POST /variant-groups/bulk | 5,000 |
| SKUs per size-chart assignment | 1,000 |
| Read requests | 600 per minute per key |
| Write requests | 300 per minute per key |
| POST /variant-groups/bulk | 60 per minute per key, counted in the write budget |
See Errors and rate limits for what happens when you go over a limit.
Stock is not part of the API
Fulify doesn't hold stock quantities, and the API neither returns nor accepts them. Your OMS owns quantities and sends them to your sales channels directly. The low-stock threshold, inventoryWarningLevel, is still available on variants, because it's merchandising data rather than a count.
OpenAPI specification
The API is described by an OpenAPI 3.1 specification, with an operationId on every operation and an x-required-scope extension naming the scope each one needs. You can load it into Postman, Insomnia, Swagger UI, Redoc or Scalar to browse and try the API. Ask Fulify support for the current file.