Drag

Developers

One API. Honestly, just one. REST, JSON, webhooks, sandbox.

Stripe-shaped on purpose
Developer settings in the dashboard

Our complexity stays on our side of the API. Integrate once; every rail we add later is our work, not yours.

01

REST API

Payment intents, checkout sessions, payment links, refunds, disputes, payouts, balances, events, webhooks, traces. Cursor pagination, expandable objects, idempotency keys, typed errors with a request_log_url.

02

Hosted checkout

Hosted page, two-line embedded overlay, payment links with QR, and a direct server-to-server API for merchants with the entitlement. Card fields are always hosted by the licensed provider.

03

Webhooks

Signed with rotating secrets and a 30-day dual-signature grace window. Per-endpoint delivery logs, one-click retry, resendable events.

04

Sandbox

Test cards for approvals, declines, 3DS challenges, async failures, disputes and gateway refusals, plus magic amounts for the failure modes that only show up at 2am.

Three calls.
One trace.

Copy, paste,
ship

// 1. Create a checkout session. Routing, rescue, trace: ours.
const session = await sr.checkoutSessions.create({
  amount: '4800',            // base units, string, never float
  currency: 'EUR',
  success_url: 'https://shop.example/thanks',
  customer: { email: 'buyer@example.com', country: 'DE' },
  metadata: { order: '1042' },
}, { idempotencyKey: 'order_1042' });

// 2. Send the buyer to the hosted page, or mount the overlay.
redirect(session.url); // pay.settlerock.com/c/cs_01JD…

// 3. Verify the signature, then trust the event.
const event = sr.webhooks.construct(req.rawBody, req.headers['sr-signature'], SECRET);
switch (event.type) {
  case 'payment_intent.succeeded':
    // event.data.routing = { rail: 'rail_b', hops: 2, rescued: true }
    fulfil(event.data.metadata.order); break;
  case 'dispute.created':
    // evidence_due_by: ISO timestamp. Countdown starts now.
    break;
}
// GET /v1/payment_intents/pi_01JD3K8F/trace
{
  "eligible": ["rail_a", "rail_b", "rail_c"],
  "segment": "sca.lt50.visa.prefer_3ds",
  "scores": [
    { "rail": "rail_b", "score": "0.59", "attempts": 29 },
    { "rail": "rail_c", "score": "0.41", "attempts": 17 },
    { "rail": "rail_a", "score": "0.23", "attempts": 30 }
  ],
  "explored": false,
  "hops": [
    { "rail": "rail_a", "outcome": "gateway_refusal", "ms": 786 },
    { "rail": "rail_b", "outcome": "approved", "ms": 707 }
  ],
  "explain_url": "https://app.settlerock.com/payments/pi_01JD3K8F#explain"
}

or

For your checkout

Hosted checkout gets you live fastest: five locales, express wallet row, trust row. Direct API gives full control for merchants with the entitlement.

For your back office

One feed, one file. Every state change pushed to you, every money movement in an append-only ledger you can export.

REST
JSON
WEBHOOKS
IDEMPOTENT
SANDBOX
TRACE

Developer
questions.

Answered by
people who ship

What does the API look like?

REST, JSON, cursor pagination, expandable objects, idempotency keys on every money-moving call, typed errors with a request_log_url. Stripe-shaped on purpose, so your team already knows it.

Do I need to handle card data?

No. Card inputs are the provider’s hosted fields or a full redirect, so your integration stays SAQ A eligible. Merchants with a current PCI DSS attestation may use the direct API, where card data is transmit-only.

How are webhooks secured?

Signed with rotating secrets and a 30-day dual-signature grace window, sent from a transactional outbox written inside the money-moving transaction. Per-endpoint delivery logs with one-click retry.

Can I test declines and cascades?

Yes. Test cards cover approvals, declines, 3DS challenges, async failures, disputes and gateway refusals, plus magic amounts for the failure modes that only show up in production at 2am.

How does outcome routing decide?

Eligibility is static: scope, currency, country, scheme, entitlement and the compliance layer decide which terminals may see a payment. Among the survivors, the observed approval rate for that payment’s segment decides who goes first.

The score is (approved + 2) / (attempts + 4) over seven days, with the last 24 hours counted twice. Not a model. Not a mystery.

What is same-call rescue?

When a gateway refuses a card before any issuer saw it (a country rule, a BIN block, a terminal policy), the payment hops to the next eligible terminal inside the same request. Depth cap two. Issuer declines and fraud verdicts are never retried.

We'll see you there!
A
B
C
S

Nine rails, one contract

Ready to
integrate?

A sandbox key is instant. Live keys follow a human review.