List sync logs

get/v1/datasets/{datasetId}/sources/{sourceId}/logs

Returns 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.

Private keyapi.v1.datasets.sources.logs.listNo demo

Path parameters

2
datasetIdstring (uuid)required

The dataset the source belongs to.

sourceIdstring (uuid)required

The source whose run history to list.

Query parameters

2
pageinteger

1-based page number. Values below 1 or non-numeric values fall back to 1.

default: 1min: 1
limitinteger

Logs per page. Clamped to the range 1–50; non-numeric values fall back to 10.

default: 10min: 1max: 50

Response

200The requested page of logs.
successbooleanrequired

Always true on a 2xx response.

array<SyncLog>required

Logs on this page, most recently started first.

logIdstring (uuid)required

Unique identifier of the log. Referenced by SyncJob.logId.

e.g. "d9f1b3a5-7c2e-4d6f-8a1b-3c5e7f9a1b2d"
sourceIdstring (uuid)required

The source that was synced.

e.g. "8a4d2f1e-3c5b-4e6a-9d7f-2b1c3d4e5f6a"
organizationIdstring (uuid)required

The organization that owns the source.

e.g. "5b7e9c1a-2d4f-4a6b-8c1d-9e2f3a4b5c6d"
datasetIdstring (uuid)required

The dataset the source feeds.

e.g. "3f1c2a9e-6b7d-4c1e-9a2b-1d4e5f6a7b8c"
statusstringrequired

running while the worker is still fetching or diffing; completed or failed once finished.

One ofrunningcompletedfailed
SyncStatsrequired

Counters 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.

errorstring

The failure reason. Present only when status is failed.

e.g. "Shopify API access forbidden (403)"
startedAtstring (date-time)required

When the run began. Lists are sorted by this field, newest first.

e.g. "2026-09-11T02:58:40.005Z"
completedAtstring (date-time)

When the run finished. Absent while running.

e.g. "2026-09-11T03:00:12.418Z"
createdAtstring (date-time)required

When the log record was created.

e.g. "2026-09-11T02:58:40.006Z"
updatedAtstring (date-time)required

When the log last changed.

e.g. "2026-09-11T03:00:12.418Z"
array<SyncLogEntry>required

Chronological entries written during the run. Empty array if none.

totalintegerrequired

Total number of logs for the source.

pageintegerrequired

The page that was returned (1-based).

limitintegerrequired

Page size that was applied after clamping.

Errors

18

Every error is JSON with a single error string unless noted. Match on the status code; the message is for humans.

404
Data source not found or access denied

No 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"
Response · 200
{
  "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
}