Before you retry
The four values worth preserving on any failure are the HTTP status, the stable errorcode, the item index, and the X-Request-ID. Together they identify what happened
without carrying a single financial field, and they answer the question a retry depends
on: did Reconify store the event?
API keys, full event bodies, provider responses, and unredacted financial data never
belong in logs, tickets, or AI tools.
Authentication fails
Two statuses cover every credential failure. The status names the problem, and for403
the method you called picks the fix.
A key test needs a protected route, because
GET /v2 and GET /v2/health answer without
validating credentials:
cURL
A batch contains a rejected item
POST /v2/events validates each item independently, so a 202 can carry both stored and
rejected results. A batch where every item fails returns 422. The recovery runs in five
steps:
- The result carries a zero-based
indexthat locates the item you sent. - Your handler branches on
code, not onmessage. - The
fieldnames the input to correct. - Only the corrected item goes back out.
- Its original
idgets reused only when the corrected payload is the same event identity.
A retry returns duplicate or idempotency_conflict
These two results look similar and mean opposite things.
An event sent without an
id receives a generated one, which means Reconify cannot
recognize its replay. Automatic retries of those events create a second event.
An event stays in received or published
Processing is asynchronous, so a status read a second after ingestion often shows an early
state. The four states run in order:
receivedmeans Reconify holds the durable receipt.publishedmeans the event entered asynchronous processing.processedmeans evaluation finished.failedmeans evaluation could not complete.
accepted event pushes nothing along and creates a second delivery attempt
for the same evidence. A state that has not advanced past its flow’s deadline justifies a
look at the status page and a support packet.
An accepted event produced no finding
accepted means stored, not evaluated, and not failed. Five conditions decide whether a
finding is even expected:
- The events share the same
flowandreference. - The
entity_idvalues follow that flow’s participant rules. - The relevant deadline has passed.
payment_to_walletallows five minutes, andpayment_to_orderallows 24 hours for fulfillment. - The event status reads
processed, rather thanreceivedorpublished. - The expected evidence is genuinely missing, late, mismatched, failed, or conflicting.
reference, entity_type, and status.
Reads come back empty
The read key and the write key have to belong to the same organization. Reconify resolves the organization from the key, and no query parameter or body field selects another tenant, so a key from a second organization returns an empty list rather than an error. For cursor reads, theafter parameter takes the exact next_cursor value from the
previous response. Cursors are opaque, so parsing, editing, or constructing one produces
nothing usable.
Related activity is missing or wrong
Related activity expands from an exact, case-sensitivecorrelation_id match.
See Trace a flow across services.
Provider tracking is degraded
A provider timeout, authentication failure, rate limit, or unmapped status is a provider issue, and Reconify converts none of them into a syntheticpayment.failed event. The fix
runs through the integration:
- The saved integration in the dashboard shows its latest health reason and environment.
- Expired or incorrect credentials get replaced.
- The optional test, run with a safe provider-side identifier, confirms the fix.
- The status mapping gets checked against the provider value that went unmapped.
The API returns 503
503 database_unavailable means durable ingestion or a required public-data dependency is
unavailable. The response deserves a retry, under three conditions:
- Exponential backoff with jitter separates the attempts.
- The event IDs and payloads stay identical.
- Concurrency stays bounded, so recovery does not meet a retry surge.
429 and no Retry-After header. The status page is
worth a check before escalating.