Dismiss a possible-duplicate pair (a permanent "not the same transaction" verdict)
const url = 'https://api.tovarifinancial.com/duplicate-suggestions/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/dismiss';const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.tovarifinancial.com/duplicate-suggestions/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/dismiss \ --header 'Authorization: Bearer <token>'Sets the pair to dismissed behind a status guard; a confirmed pair is terminal and answers 404. The dismissal is a tombstone: detection never re-offers the same two transactions. Merges nothing and moves no money. No X-Idempotency-Key is declared or read (KAN-1359): the write is a convergent state assignment with no insert, so a redelivery re-reaches the same state and the response is re-derived from the row. A key sent anyway is ignored. A non-UUID id answers 400 before any database work. A database-level access refusal answers 403 DATABASE_ERROR, a code the shared 403 entry (TenantGateError) does not name.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Duplicate suggestion id
Responses
Section titled “Responses”The pair, re-read after the write
object
object
object
SIGNED whole days, bank MINUS manual.
Signed — equal on both legs by construction.
Detection-time verdict. Always false for ‘bank-vs-bank’.
object
Calendar date, ‘YYYY-MM-DD’
SIGNED ledger cents, exactly as stored.
Raw bank text. UNTRUSTED — render as text, never as markup.
object
Calendar date, ‘YYYY-MM-DD’
SIGNED ledger cents, exactly as stored.
Raw bank text. UNTRUSTED — render as text, never as markup.
SERVER-DECIDED — echo it back; never guess a survivor.
For ‘bank-vs-bank’, bankLeg is the SURVIVOR and manualLeg is the surplus bank copy proposed for retirement.
BANK KIND ONLY. Frozen detection-time evidence, not recomputed on read.
BANK KIND ONLY. copyCount - 1, frozen on the same terms.
BANK KIND ONLY. Whether retiring this copy would move the account balance. Recomputed on every read.
object
SIGNED, PER-RETIREE — this copy’s own amount.
BANK KIND ONLY. The survivor’s status after a retire. Recomputed on every read.
Example
{ "data": { "suggestion": { "origin": "sync", "status": "open", "pairKind": "manual-vs-bank", "balanceHazard": { "kind": "clear" }, "survivorStatusAfter": "uncleared" } }}Validation failed — see errorCode / fieldErrors
object
Machine-readable error code (AUTH_ERROR_CODES).
Optional field-level validation errors, keyed by field name.
object
Example
{ "errorCode": "INVALID_EMAIL_FORMAT"}Missing, invalid, or expired bearer token
object
Machine-readable error code (AUTH_ERROR_CODES).
Optional field-level validation errors, keyed by field name.
object
Example
{ "errorCode": "INVALID_EMAIL_FORMAT"}Authenticated, but the tenant gate refuses the request until the caller resolves a precondition. errorCode is one of EMAIL_NOT_VERIFIED, POLICY_ACCEPTANCE_REQUIRED, or SUBSCRIPTION_REQUIRED, evaluated in exactly that order (contract term CCR-1: email verification first, then policy acceptance, then subscription — so a subscriber who has merely not re-accepted the current policies always sees POLICY_ACCEPTANCE_REQUIRED). A POLICY_ACCEPTANCE_REQUIRED body additionally carries details.outstanding (the policy versions still to accept) and details.firstAcceptance. The SUBSCRIPTION_REQUIRED arm is INERT unless the server-side BILLING_ENABLED flag is exactly the string true; while it is off, only the first two codes are reachable. Not retryable as sent — resolve the named condition, then resend.
object
Which precondition refused the request. Evaluated in this order (CCR-1); SUBSCRIPTION_REQUIRED is unreachable while BILLING_ENABLED is not exactly true.
object
Active policy versions the user has not yet accepted.
object
True when the user has accepted no policy before — the client renders the new-signup screen rather than the re-acceptance one.
Example
{ "errorCode": "EMAIL_NOT_VERIFIED"}Suggestion not found, not owned by the caller org, or not in a state this action accepts
object
Machine-readable error code (AUTH_ERROR_CODES).
Optional field-level validation errors, keyed by field name.
object
Example
{ "errorCode": "INVALID_EMAIL_FORMAT"}Internal error (no internal detail leaked)
object
Machine-readable error code (AUTH_ERROR_CODES).
Optional field-level validation errors, keyed by field name.
object
Example
{ "errorCode": "INVALID_EMAIL_FORMAT"}Service temporarily unavailable — errorCode is SERVICE_UNAVAILABLE. A TRANSIENT, RETRYABLE condition rather than a defect in the request: a query that exceeded its time budget, a lost or refused database connection, a saturated connection pool, or an outage at an upstream provider the request depends on (the authentication provider, or the bank data provider on a bank-connection operation). The identical request may succeed on retry — back off briefly and, on a write, resend the same X-Idempotency-Key where the operation accepts one.
object
Machine-readable error code (AUTH_ERROR_CODES).
Optional field-level validation errors, keyed by field name.
object
Example
{ "errorCode": "INVALID_EMAIL_FORMAT"}