> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://tieback.io/docs/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://tieback.io/docs/_mcp/server.

# API: Products

> Create, read and update products programmatically, covering single and batch patches, schema validation, error semantics and identifier restrictions.

> **Programmatic access — early access**
>
> The
>
> **tie*back***
>
> API is available to selected workspaces during early access. Endpoints in production today are
> authenticated with an authenticated session. Standalone API-key access is being onboarded per
> workspace. Contact
>
> **tie*back***
>
> to enable API credentials for your workspace.

## What It Does

The Products API provides RPCs for updating individual products and applying bulk updates across many products in a single request.

## Who It's For

Developers building integrations that sync product catalogues, apply attribute corrections, or automate product data management.

---

### update\_product

#### What it does

Updates a single product's attributes by applying a JSON patch. The patch is merged server-side, only included fields are changed. Attribute values are validated against the brand's DPP schema.

#### Request

```json
{
  "_brand_id": "b1a2c3d4-0000-0000-0000-000000000001",
  "_product_id": "p1a2c3d4-0000-0000-0000-000000000001",
  "_patch": {
    "commercial_status": "ACTIVE",
    "attributes": {
      "weight_kg": 1.5,
      "country_of_origin": "GB"
    }
  }
}
```

#### Response (example)

```json
{
  "ok": true,
  "product_id": "<uuid>",
  "validation_warnings": []
}
```

#### Errors (examples)

* **Not authenticated**: request has no valid JWT.
* **Forbidden**: caller does not have sufficient access for this operation.
* **Invalid input**: request is malformed or cannot be processed.

---

### bulk\_update\_products

#### What it does

Applies patches to multiple products in a single synchronous request. Each product is processed independently, a failure on one row does not roll back others.

#### Request

```json
{
  "_brand_id": "b1a2c3d4-0000-0000-0000-000000000001",
  "_patches": [
    {
      "product_id": "p1a2c3d4-0000-0000-0000-000000000001",
      "patch": { "attributes": { "country_of_origin": "FR" } }
    },
    {
      "product_id": "p1a2c3d4-0000-0000-0000-000000000002",
      "patch": { "attributes": { "country_of_origin": "DE" } }
    }
  ]
}
```

#### Response (example)

```json
{
  "ok": true,
  "results": [
    {
      "product_id": "<uuid>",
      "status": "success",
      "error_message": null,
      "validation_warnings": []
    }
  ]
}
```

#### Errors (examples)

* **Not authenticated**: request has no valid JWT or the token has expired.
* **Forbidden**: caller does not have admin access to the specified brand.
* **Invalid input**: patches array is malformed or contains invalid field values.

---

## Limits & Notes

* Both RPCs require authentication with an admin role for the specified brand.
* Attribute patches are validated against the brand's DPP schema.
* `bulk_update_products` processes all items synchronously; for larger workloads, use the asynchronous bulk update job workflow.
* Identifier fields (SKU, GTIN, EAN, UPC) cannot be updated via product patches, use the [Identifiers API](/api-reference/api-identifiers) instead.

## FAQ

**Can I create a product via this API?**
Product creation is handled via the import workflow. `update_product` is for updating existing products.

**Is the bulk update synchronous or asynchronous?**
`bulk_update_products` is synchronous. For large-scale updates with progress tracking, use the async job workflow documented in [Bulk Updates](/product-module/bulk-updates).

## Related Docs

* [Products](/product-module/products)
* [API: Identifiers](/api-reference/api-identifiers)
* [API: Attachments](/api-reference/api-attachments)
* [API: Bulk Updates](/api-reference/api-bulk-updates)