> ## Documentation Index
> Fetch the complete documentation index at: https://docs.closient.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Manage Product Links

> Add, update, reorder, list, and delete a product's GS1 call-to-action links (promotion, loyalty program, reviews and the like) -- the programmatic equivalent of the dashboard's brand links page.

Programmatic equivalent of the dashboard's `products/<gtin>/brand-links/` page.

## When to use

* A brand owner wants a shopper who scans the product to be offered the brand's own pages
  for it: a promotion, a loyalty program, a recipe, a place to leave a review.
* A link on file points somewhere stale and needs correcting or removing.

## Auth

`X-API-Key` header or OAuth token. The caller must be a member of the product's
organization with the contribute role (Editor or Manager). A read-only key is refused with
`403`; a link or product another organization owns answers `404`, so the API never confirms
it exists.

## Flow

```
GET    /products/api/v1/product-links?owner_type=product&owner_id={product_id}
POST   /products/api/v1/product-links
PUT    /products/api/v1/product-links/{link_id}
DELETE /products/api/v1/product-links/{link_id}
POST   /products/api/v1/product-links/reorder
```

* **List** -- every link on the product (`owner_type=brand` lists brand-wide links).
* **Create** -- the body names the owner with `product_id` (or `brand_id` for a link
  shown on every product of a brand) and the GS1 `link_type` (e.g. `gs1:promotion`); fields
  are listed in the OpenAPI document at `/products/api/v1/openapi.json`. `url` must be an
  http(s) address and may carry `{gtin}`, `{lot}` and `{serial}` substitution tokens.
* **Update** -- `PUT` only the fields to change.
* **Reorder** -- set the display order within a link type in one call.
* **Delete** -- removes one link permanently.
* **Read back** -- every write returns the saved link; list again to confirm.

Returns `403` for a read-only key, `404` for a link or product the caller cannot see, and
`422` for an invalid value.

## Notes

The fields a brand writes on a link are defined once on the model
(`ProductLink.BRAND_EDITABLE_FIELDS`); the dashboard form and both API schemas are pinned
to that set.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.