Talk to your AI agent to run Simetrik. →
SimetrikDocs

Troubleshooting

Files that never arrive, notifications that never fire, and the checks that resolve most of both.

The call is rejected with 403

Nothing reached JaaS — authorization stopped it at the edge, and the response deliberately doesn't say which check failed. Work through the list in Authentication: the key, the workspace it was issued for, whether that workspace is enabled for ingestion, and the account id.

Records are accepted, but nothing reaches reconciliation

A Success from the feed endpoint means the record was accepted, not processed. Before assuming something broke:

  • Give it the batching window. Records are grouped into a file first, and that window can run to several minutes. Checking a few seconds after posting will always look empty.
  • Check the source id in the path. Posting to a different source than the one you're watching produces exactly this symptom, with no error.
  • Subscribe to the failure events. Without a notification_config there's nothing to tell you a batch failed conversion — see Status notifications.

The CSV arrives, but the columns are empty

The mapping of each column points at a path in your JSON that doesn't resolve. A mapping that finds nothing produces an empty cell rather than an error, so this fails quietly.

Take one line of your file and walk the mapping by hand: payment.method needs a payment object with a method key inside it, at the top level of each record.

A batch fails with a validation error

download_status.validation_failed means the records in that batch couldn't be read. Remember that the batch is the unit: one malformed record fails the whole file it landed in, taking every record batched alongside it with it.

Post one JSON object per call — not an array, not several objects in one body. The file ingestion overview shows the shape.

The webhook replies 404

The webhook_id in the path doesn't match a registered webhook. Check for a truncated value — the id has the shape <source_id>_wh_<suffix> — and confirm you're not using an id from another environment.

The webhook replies 400 about a missing field

The url_field your webhook was registered with isn't present in the payload you sent. Either your payload changed shape, or the mapping was registered against a different one. Both the URL and the name fields support dot and index notation — see Send a notification.

The webhook accepted the file, then nothing happened

The reply to your notification means accepted, not processed. If the file never reaches the source, the download is what failed — subscribe to download_status.download_failed to see the error message. Common causes:

  • The URL expired before the download started. Signed URLs need enough lifetime to cover the queue plus the transfer.
  • The credentials registered on the webhook don't match what the file server expects.
  • The download took longer than 300 seconds.

Status notifications never arrive

  • Confirm the event is in notification_config.events. Events you didn't subscribe to are never sent, silently.
  • Your endpoint must answer within 10 seconds. Slower than that counts as a failed attempt.
  • A 4xx from your endpoint is treated as permanent and is not retried.
  • Deliveries that fail all three attempts are dropped. The file itself is unaffected — a missing notification is not evidence that a file failed.

The signature never matches

The payload is signed with its keys sorted, but it arrives in natural order. Re-serialize it with sorted keys before computing the HMAC — the verification snippet in Status notifications does exactly that.

If you never set a signing_secret, one was generated and is not retrievable. Register the source again with a secret you control.

A retry created a duplicate

There's no deduplication on the way in, in either flow: two notifications with the same URL produce two files, and the same record posted twice produces two rows. Deduplicate before you send. In the webhook flow a track id also lets you tell a retry from a genuinely new file on the way out.

The columns don't line up with what I posted

Column order follows each column's position, not the order you declared them in and not the key order of your JSON. And two fields are added to every record on the way in — source_id and sk-int-id — which overwrite your own values if you happen to use those names.

On this page