Syncs
Trigger feed syncs, check sync status, and retrieve the latest sync operation.
Trigger a sync
POST
/v1/syncs Starts a new feed sync. A full sync re-fetches products from Shopify and regenerates the feed. A regenerate sync re-applies transformations to existing product data without re-fetching.
Returns 202 Accepted — the sync runs asynchronously. Poll the returned sync ID to check progress.
Required scope: write_exports
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
type | string | full | Sync type: full or regenerate. |
Request
curl -X POST https://app.simpleproductfeeds.com/v1/syncs \
-H "Authorization: Bearer spf_live_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{"type": "full"}'
Response
{
"data": {
"id": "sync_568",
"object": "sync",
"status": "pending",
"progress": 10,
"product_count": 0,
"excluded_count": 0,
"rows_count": 0,
"started_at": null,
"completed_at": null,
"failed_at": null,
"error_details": null,
"created_at": "2026-03-09T15:00:00Z"
}
}
Errors
| Status | Code | Description |
|---|---|---|
| 409 | export_in_progress | A sync is already running. Wait for it to complete before starting another. |
| 422 | no_feed | No feed has been configured for this shop. |
| 422 | invalid_param | Invalid sync type. Must be full or regenerate. |
Get a sync
GET
/v1/syncs/:id Returns a sync operation by ID.
Required scope: read_exports
Request
curl https://app.simpleproductfeeds.com/v1/syncs/sync_568 \
-H "Authorization: Bearer spf_live_sk_your_key_here"
The sync_ prefix is optional — both sync_568 and 568 are accepted.
Response
Returns a single sync object wrapped in data.
Errors
| Status | Code | Description |
|---|---|---|
| 404 | resource_not_found | No sync found with the given ID. |
Get latest sync
GET
/v1/syncs/latest Returns the most recent sync operation.
Required scope: read_exports
Request
curl https://app.simpleproductfeeds.com/v1/syncs/latest \
-H "Authorization: Bearer spf_live_sk_your_key_here"
Response
{
"data": {
"id": "sync_568",
"object": "sync",
"status": "completed",
"progress": 100,
"product_count": 1482,
"excluded_count": 23,
"rows_count": 1482,
"started_at": "2026-03-09T15:00:05Z",
"completed_at": "2026-03-09T15:05:30Z",
"failed_at": null,
"error_details": null,
"created_at": "2026-03-09T15:00:00Z"
}
}
Sync response fields
| Field | Type | Description |
|---|---|---|
id | string | Unique identifier with sync_ prefix. |
object | string | Always "sync". |
status | string | Sync status: "pending", "running", "completed", "failed", or "cancelled". |
progress | integer | Sync progress percentage (10=scheduled, 25=fetching, 50=fetched, 75=merging, 100=complete). |
product_count | integer | Number of product rows processed (alias for rows_count). |
excluded_count | integer | Number of products excluded by rules during transformation. |
rows_count | integer | Number of product rows processed. |
started_at | string | null | ISO 8601 timestamp when the sync started processing. |
completed_at | string | null | ISO 8601 timestamp when the sync completed. |
failed_at | string | null | ISO 8601 timestamp if the sync failed. |
error_details | string | null | Error message if the sync failed. |
created_at | string | ISO 8601 timestamp when the sync was created. |
Errors
| Status | Code | Description |
|---|---|---|
| 404 | resource_not_found | No syncs have been created yet. |