List sync logs
/v1/datasets/{datasetId}/sources/{sourceId}/logsReturns the run history of a source, most recently started first. One log is written per sync run that reached the fetch stage, whether the run was triggered manually or by the scheduler, and logs are kept indefinitely — unlike jobs, which are purged a week after they finish.
Each log carries its final counters, an error if the run failed, and the
run's line-by-line logs entries. Log entries on this endpoint contain only
timestamp, level and message.
An unknown datasetId or sourceId, or a source that belongs to a different
dataset, returns 404. A source with no logs returns an empty list.
Path parameters
2The dataset the source belongs to.
The source whose run history to list.
Query parameters
21-based page number. Values below 1 or non-numeric values fall back to 1.
Logs per page. Clamped to the range 1–50; non-numeric values fall back to 10.
Response
Always true on a 2xx response.
Logs on this page, most recently started first.
Unique identifier of the log. Referenced by SyncJob.logId.
The source that was synced.
The organization that owns the source.
The dataset the source feeds.
running while the worker is still fetching or diffing; completed or failed once finished.
runningcompletedfailedCounters for one sync run. retrieved is how many products the store returned;
the other four describe what the run did with them in the dataset's ingest
queue. Items are processed asynchronously afterwards, so added and updated
count queued changes rather than items that are already searchable.
The failure reason. Present only when status is failed.
When the run began. Lists are sorted by this field, newest first.
When the run finished. Absent while running.
When the log record was created.
When the log last changed.
Chronological entries written during the run. Empty array if none.
Total number of logs for the source.
The page that was returned (1-based).
Page size that was applied after clamping.
Errors
18Every error is JSON with a single error string unless noted. Match on the status code; the message is for humans.
Data source not found or access deniedNo source with that sourceId belongs to the organization that owns the key, or the source belongs to a different datasetId than the path.
curl -X GET "https://stylor.ai/api/v1/datasets/YOUR_DATASET_ID/sources/YOUR_SOURCE_ID/logs" \
-H "Authorization: Bearer $STYLOR_API_KEY"{
"success": true,
"logs": [
{
"logId": "d9f1b3a5-7c2e-4d6f-8a1b-3c5e7f9a1b2d",
"sourceId": "8a4d2f1e-3c5b-4e6a-9d7f-2b1c3d4e5f6a",
"organizationId": "5b7e9c1a-2d4f-4a6b-8c1d-9e2f3a4b5c6d",
"datasetId": "3f1c2a9e-6b7d-4c1e-9a2b-1d4e5f6a7b8c",
"status": "completed",
"stats": {
"retrieved": 1284,
"added": 12,
"updated": 37,
"archived": 3,
"failed": 0
},
"startedAt": "2026-09-11T02:58:40.005Z",
"completedAt": "2026-09-11T03:00:12.418Z",
"createdAt": "2026-09-11T02:58:40.006Z",
"updatedAt": "2026-09-11T03:00:12.418Z",
"logs": [
{
"timestamp": "2026-09-11T02:58:40.005Z",
"level": "info",
"message": "Sync started by worker v1-sync-9c0f1a2b-3d4e-4f5a-8b6c-7d8e9f0a1b2c"
},
{
"timestamp": "2026-09-11T02:59:31.880Z",
"level": "info",
"message": "Retrieved 1284 products"
},
{
"timestamp": "2026-09-11T03:00:01.412Z",
"level": "info",
"message": "Processing batch 1/3 (500/1284 ops)"
},
{
"timestamp": "2026-09-11T03:00:12.417Z",
"level": "info",
"message": "Sync completed: 12 added, 37 updated, 3 archived, 0 failed"
}
]
},
{
"logId": "2b8d4f6a-0c1e-4a3b-9d5f-7e9a1b3c5d7f",
"sourceId": "8a4d2f1e-3c5b-4e6a-9d7f-2b1c3d4e5f6a",
"organizationId": "5b7e9c1a-2d4f-4a6b-8c1d-9e2f3a4b5c6d",
"datasetId": "3f1c2a9e-6b7d-4c1e-9a2b-1d4e5f6a7b8c",
"status": "failed",
"stats": {
"retrieved": 0,
"added": 0,
"updated": 0,
"archived": 0,
"failed": 0
},
"error": "Shopify API access forbidden (403)",
"startedAt": "2026-09-10T02:58:39.210Z",
"completedAt": "2026-09-10T02:58:40.988Z",
"createdAt": "2026-09-10T02:58:39.211Z",
"updatedAt": "2026-09-10T02:58:40.988Z",
"logs": [
{
"timestamp": "2026-09-10T02:58:39.210Z",
"level": "info",
"message": "Sync started by worker v1-sync-4a6c8e0b-2d4f-4a6c-8e0b-2d4f6a8c0e2b"
},
{
"timestamp": "2026-09-10T02:58:40.987Z",
"level": "error",
"message": "Sync failed: Shopify API access forbidden (403)"
}
]
}
],
"total": 2,
"page": 1,
"limit": 10
}