Developers

Build against the decision layer.

One stateless call: transaction context and the eligible set in, a ranked, reason-coded decision out. This page documents the contract the live engine serves today, and labels everything beyond it as proposed.

The contract · live today

POST /route

The same contract the in-browser engine answers at usesikka.com/routing. Card names are matched case-insensitively against the catalog; examples here use a generic wallet.

REQUEST
{
  "cards": [
    "option_a",
    "option_b",
    "option_c"
  ],
  "merchant": "GROCERY MART DXB",
  "amountAed": 400
}
200 OK · RESPONSE
{
  "bestCard": "option_a",
  "bestRewardAed": 20.00,
  "bestRatePct": 5,
  "category": "groceries",
  "categoryResolved": true,
  "deltaVsRunnerUpAed": 14.00,
  "reason": "5% on groceries, best of 3",
  "perCard": [ … every card scored, best first … ],
  "latencyMs": 0.25
}

No PAN, no CVV, no credentials, no PII. The request carries card product names, a raw merchant descriptor, and an amount. Values in the example are illustrative; the live engine computes them from its verified rulebook.

The decision object

Every field, defined.

FieldTypeMeaning
bestCardstring | nullThe winning card. null when no card earns a verified reward here: the engine abstains rather than guessing.
bestRewardAednumberThe AED reward the winning card earns on this transaction.
bestRatePctnumberThe effective reward rate, as a percentage.
categorystringThe resolved merchant category. Falls back to everyday.
categoryResolvedbooleanfalse when the descriptor could not be resolved. The transaction routes at base rates, flagged, never guessed.
deltaVsRunnerUpAednumberValue at stake versus the next-best card.
reasonstringA human-readable explanation, ready for a nudge or a statement line.
perCardobject[]Every card scored, best first: the full comparison behind the decision.
latencyMsnumberCompute time for this decision, measured live.

FULL CONTRACT · PROPOSED

The production contract extends the live one with decision_id, reason_code (machine-stable, e.g. GROCERY_BONUS_5PCT), rulebook_version, confidence, and fallback. Proposed means exactly that: scoped and finalized in the pilot, not shipped today.

Determinism & idempotency

Same inputs, same decision. Every time.

The synchronous decision path is a versioned rules engine: no LLM calls, no sampling, no drift. Decisioning is stateless and side-effect-free, so retries are naturally safe: replaying a request returns the identical response.

PROPOSED  Idempotency keys for billing-grade decision accounting (one billable decision per key, replays free) are part of the proposed production contract.

Latency, defined

Three numbers. Three different claims.

NumberWhat it isWhat it is not
~0.08ms p99Core decision compute on a local benchmark: the in-process engine, no network.Not production latency.
<100msTypical round-trip on the live demo, measured in the browser.Not an SLA.
Production SLAA pilot gate: validated on your flows, in your deployment model, before production.Not a marketing number.
Failure & fallbacks

Execution never depends on us.

BOUNDED TIMEOUT BUDGET CONFIGURED FALLBACK: customer_default ABSTAIN OVER GUESS EXECUTION INDEPENDENCE

If a decision cannot be returned inside its budget, your stack proceeds exactly as it does today: the configured fallback applies and the payment executes unchanged. Low confidence returns an abstain, never a silent guess. A Sikka outage cannot block an authorization, by construction: Sikka sits before execution and holds no state your stack needs.

ConditionBehaviour
Invalid context400 with a machine-readable error. Nothing is stored.
Unresolved merchant200 with categoryResolved: false: routed at base rates, flagged, never guessed.
No verified reward200 with bestCard: null: an explicit abstain.
Timeout / unavailableYour configured fallback applies; execution proceeds unchanged.
Integration flow

Four steps. Shadow first.

01

Send the wallet and the purchase

POST /route with the cards, the raw merchant descriptor, and amountAed. No PAN, no PII.

02

Get the decision back

Deterministic JSON: best card, reward, delta, reason, and the full perCard comparison.

03

Surface it on your rails

A "use this card" nudge, a reward attribution, a statement line, or an internal signal.

04

Host it in your perimeter

Stateless, no external calls at decision time. The rulebook ships versioned and freshness-checked.

Shadow mode is the first deployment. A copy of transaction context is scored and compared against actual outcomes. Nothing returns to authorization, so the pilot changes no payment outcome.
Sandbox

The sandbox is already open.

The live engine runs in your browser at usesikka.com/routing: real decisions, real reason strings, no signup, nothing leaves the page. A dedicated pilot environment against representative flows is scoped in the pilot workshop.