> For the complete documentation index, see [llms.txt](https://developers.flipsnack.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://developers.flipsnack.com/api-reference/collection.synccatalog.md).

# collection.syncCatalog

Starts a product-feed sync for an existing catalog or flipbook.

Starts a sync for an existing catalog or flipbook that has a connected product feed. Use this after [products.create](/products/create.md) or [products.update](/products/update.md) to apply the latest product data — prices, descriptions, images, SKUs — to the catalog content.

The call returns as soon as the sync is queued. `collectionStatus` becomes `processing`.

{% hint style="warning" %}
Sync updates the stored catalog. Live readers keep serving the previously published catalog until you republish with [collection.update](/api-reference/api-method-collection.update.md).
{% endhint %}

**Note:** Requests must be made to **<https://api.flipsnack.com/v1/>** using **GET**. A POST request returns `40 - Bad Request`.

#### Supported collections

Works for any flipbook with at least one connected product feed (`sourceHash` linked through Automation):

* Catalogs created with [collection.createCatalog](/api-reference/collection.createcatalog.md)
* Catalog-generator catalogs created in the Flipsnack app
* Flipbooks that had a product feed applied in the editor

Collections with no connected feed — for example a PDF uploaded with [collection.create](/api-reference/api-method-collection.create.md) — are rejected with code `40` and message `Catalog has no associated product feed`.

#### While the sync is running

* [collection.getCollection](/api-reference/api-method-collection.getcollection.md) and [collection.getList](/api-reference/api-method-collection.getlist.md) report `collectionStatus: processing`
* [collection.update](/api-reference/api-method-collection.update.md) and [collection.downloadHTML](/api-reference/api-method-collection.downloadhtml.md) are unavailable for this collection
* Calling `collection.syncCatalog` again before the current sync or publish finishes returns code `38`

When the sync completes, `collectionStatus` returns to its previous value (`public`, `editable`, `unlisted`, and so on). Poll [collection.getCollection](/api-reference/api-method-collection.getcollection.md) until `collectionStatus` is no longer `processing`.

#### Request parameters

| Name                        | Type   | Description                                                                                                                                        |
| --------------------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| `apiKey` (required)         | string | The API key provided for your user. Omission returns `30 - Missing mandatory parameter`. An invalid key returns `41 - Invalid credentials`.        |
| `signature` (required)      | string | Request signature. See [How to sign a request](/how-to-sign-a-request.md). Omission returns `30`. An invalid signature returns `44`.               |
| `action` (required)         | string | Must be `collection.syncCatalog`.                                                                                                                  |
| `collectionHash` (required) | string | Hash of the catalog or flipbook to re-sync. A missing hash returns `30`. An unknown hash returns `46`. A hash from another workspace returns `43`. |

#### Response parameters

A successful request queues the sync and returns immediately.

| Name               | Type   | Description                                                                    |
| ------------------ | ------ | ------------------------------------------------------------------------------ |
| `collectionHash`   | string | Hash of the catalog the sync was started for.                                  |
| `collectionStatus` | string | Always `processing` on success.                                                |
| `syncStartedDate`  | date   | UTC timestamp when the sync was triggered, formatted as `YYYY-MM-DD HH:MM:SS`. |

#### Error codes

See [API status codes](/api-status-codes.md) for all error codes.

| Code | Status                      | When                                                                                       |
| ---- | --------------------------- | ------------------------------------------------------------------------------------------ |
| `30` | Missing mandatory parameter | `apiKey`, `signature`, `action`, or `collectionHash` is missing.                           |
| `38` | Collection is in progress   | A sync or publish is already running for this collection. Poll `collection.getCollection`. |
| `40` | Bad Request                 | Wrong HTTP method (must be GET), or the collection has no connected product feed.          |
| `41` | Invalid credentials         | The API key is invalid.                                                                    |
| `43` | Forbidden                   | The collection was deleted or belongs to another user.                                     |
| `44` | Invalid signature           | The request signature is invalid.                                                          |
| `46` | Invalid collection hash     | The collection hash does not exist.                                                        |
| `50` | Operation failed            | The sync could not be started. Retry after a few seconds.                                  |

A missing product feed includes `data.message`:

```json
{
  "code": 40,
  "status": "Bad Request",
  "data": {
    "message": "Catalog has no associated product feed"
  }
}
```

#### Recommended workflow

{% stepper %}
{% step %}

### Update the product feed

Call [products.create](/products/create.md) or [products.update](/products/update.md) with the feed's `sourceHash`.
{% endstep %}

{% step %}

### Start the catalog sync

Call `collection.syncCatalog` with the `collectionHash` of the catalog linked to that feed.
{% endstep %}

{% step %}

### Wait until processing finishes

Poll [collection.getCollection](/api-reference/api-method-collection.getcollection.md) until `collectionStatus` is no longer `processing`.
{% endstep %}

{% step %}

### Republish so readers see the data

Call [collection.update](/api-reference/api-method-collection.update.md) with the collection's current `collectionStatus` (`public`, `unlisted`, or `editable`) to republish.
{% endstep %}
{% endstepper %}

#### Sync behavior

* **API catalogs** created with [collection.createCatalog](/api-reference/collection.createcatalog.md): the catalog is regenerated from the saved catalog sections, the same way as the initial create.
* **Other flipbooks with a connected feed**: product data is synced onto the existing pages.

#### Examples

**Request**

{% tabs %}
{% tab title="cURL" %}

```bash
# GET
curl -X GET \
     -G \
     https://api.flipsnack.com/v1/ \
     -d action=collection.syncCatalog \
     -d apiKey=<YOUR-API-KEY> \
     -d signature=<YOUR-REQUEST-SIGNATURE> \
     -d collectionHash=<COLLECTION-HASH>
```

{% endtab %}

{% tab title="HTML" %}

```html
<form method="get" action="https://api.flipsnack.com/v1/">
    <input type="hidden" name="action" value="collection.syncCatalog">
    <input type="hidden" name="apiKey" value="<YOUR-API-KEY>">
    <input type="hidden" name="signature" value="<YOUR-REQUEST-SIGNATURE>">
    <input type="hidden" name="collectionHash" value="<COLLECTION-HASH>">
    <button type="submit">Submit</button>
</form>
```

{% endtab %}
{% endtabs %}

**Response**

{% tabs %}
{% tab title="Success" %}

```json
{
  "code": 20,
  "status": "OK",
  "data": {
    "collectionHash": "d3m0h45h",
    "collectionStatus": "processing",
    "syncStartedDate": "2026-07-29 09:41:00"
  }
}
```

{% endtab %}

{% tab title="Error" %}

```json
{
  "code": 38,
  "status": "Collection is in progress. Please try again later"
}
```

{% endtab %}
{% endtabs %}
