Skip to content
StraventaDocs
Now in Sandbox.
API Reference

Payments Service API

Merchant onboarding, payment intents, refunds, settlements, disputes, webhooks, and public checkout

The Payments Service is the transaction core of 505pay. It handles the full merchant lifecycle — from KYB onboarding through live payment intents, refunds, disbursements, and webhook delivery. Every payment method (QRIS, VA, GoPay, OVO, etc.) runs through this service.

Base URLs

EnvironmentHostname
Sandboxhttps://sandbox.505pay.link
Productionhttps://api.505pay.link

Server-to-server merchant calls (intents, refunds, settings) authenticate with an API key (sk_test_… in sandbox, sk_live_… in production) created at Settings → API Keys in the dashboard. Admin / console flows authenticate with a Bearer JWT issued by the Auth Service. Public checkout endpoints (/v1/public/payments/intents/*) are unauthenticated — they are called by 505pay's hosted payment page, not your server.

Payment intent lifecycle

A payment intent is the authoritative record of a payment attempt. It moves through states as the payer interacts with the PSP.

Idempotency

Pass Idempotency-Key: <uuid> on POST /v1/payments/intents to guarantee at-most-once creation. Replaying the same key returns the original intent without double-charging.

First payment in 3 steps

# 1. Create a payment intent (QRIS Dynamic — change allowed_channels for other methods)
curl -X POST https://sandbox.505pay.link/v1/payments/intents \
  -H "Authorization: Bearer $PAYOPS_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-1234-v1" \
  -d '{
    "merchant_id": "'"$PAYOPS_MERCHANT_ID"'",
    "amount_idr": 50000,
    "max_uses": 1,
    "description": "Order #1234",
    "allowed_channels": ["qris"]
  }'

# 2. Show the payer the checkout — redirect to intent.checkout_url, or render intent.qr_string

# 3. Listen for the payment.completed webhook on your registered endpoint
const intent = await fetch('https://sandbox.505pay.link/v1/payments/intents', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${process.env.PAYOPS_SECRET_KEY}`,
    'Content-Type': 'application/json',
    'Idempotency-Key': 'order-1234-v1',
  },
  body: JSON.stringify({
    merchant_id: process.env.PAYOPS_MERCHANT_ID,
    amount_idr: 50_000,
    max_uses: 1,
    description: 'Order #1234',
    allowed_channels: ['qris_dynamic'],
  }),
}).then((r) => r.json());

console.log(intent.checkout_url);  // hosted page; or render intent.qr_string yourself
import os, requests

intent = requests.post(
    'https://sandbox.505pay.link/v1/payments/intents',
    headers={
        'Authorization': f"Bearer {os.environ['PAYOPS_SECRET_KEY']}",
        'Idempotency-Key': 'order-1234-v1',
    },
    json={
        'merchant_id': os.environ['PAYOPS_MERCHANT_ID'],
        'amount_idr': 50_000,
        'max_uses': 1,
        'description': 'Order #1234',
        'allowed_channels': ['qris_dynamic'],
    },
).json()

print(intent['checkout_url'])
import (
    "bytes"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "os"

    "github.com/google/uuid"
)

body, _ := json.Marshal(map[string]any{
    "merchant_id":      os.Getenv("PAYOPS_MERCHANT_ID"),
    "amount_idr":       50_000,
    "max_uses":         1,
    "description":      "Order #1234",
    "allowed_channels": []string{"qris"},
    "metadata":         map[string]string{"order_id": "1234"},
})
req, _ := http.NewRequest("POST",
    "https://sandbox.505pay.link/v1/payments/intents",
    bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("PAYOPS_SECRET_KEY"))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Idempotency-Key", "order-1234-"+uuid.New().String())
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
// intent.checkout_url is in the JSON response
var intent map[string]any
_ = json.NewDecoder(resp.Body).Decode(&intent)
fmt.Println(intent["checkout_url"])
<?php
require 'vendor/autoload.php'; // Guzzle

$client = new \GuzzleHttp\Client();
$res = $client->post('https://sandbox.505pay.link/v1/payments/intents', [
    'headers' => [
        'Authorization'  => 'Bearer ' . getenv('PAYOPS_SECRET_KEY'),
        'Content-Type'   => 'application/json',
        'Idempotency-Key' => 'order-1234-' . \Ramsey\Uuid\Uuid::uuid4(),
    ],
    'json' => [
        'merchant_id'      => getenv('PAYOPS_MERCHANT_ID'),
        'amount_idr'       => 50000,
        'max_uses'         => 1,
        'description'      => 'Order #1234',
        'allowed_channels' => ['qris_dynamic'],
        'metadata'         => ['order_id' => '1234'],
    ],
]);
$intent = json_decode($res->getBody(), true);
echo $intent['checkout_url']; // hosted page; or render $intent['qr_string'] yourself

See the full Accept your first payment recipe for the webhook + fulfilment loop.


payments-service renders six bilingual legal documents — the MSA, the DPA, the acceptable use policy, the marketplace seller terms, the marketplace buyer terms and the privacy notice — from one tenant-scoped parameter set. The operator fills in a form; the documents its merchants sign and its buyers read are rendered from those values.

The shipped legal text is an engineering-prepared draft

The templates in this repository were prepared by an engineering agent from public sources. They are not legal advice, have not been reviewed by a licensed Indonesian advocate, and must not be published to merchants or buyers as counsel-approved text.

An operator must have its own Indonesian counsel review the rendered documents — with that operator's parameters filled in — before they are put in front of a merchant or a buyer.

Reading the settings and the form schema

GET /v1/payments/legal/settings returns the effective parameter set, the schema the console renders its form from, and the current revision. Effective means platform defaults merged with the tenant's stored values, with fallbacks already applied — an empty complaints email resolves to the support email — so the form shows what the documents will actually say.

GET /v1/payments/legal/settings
{
  "params": {
    "operator.legal_name": "PT Sinar Jaya Digital",
    "operator.brand_name": "Sinar Jaya",
    "contacts.support_email": "[email protected]",
    "contacts.complaints_email": "[email protected]",
    "commercial.terms_change_notice_days": 30,
    "data.breach_notice_hours": 48,
    "data.hosting_countries": ["ID"],
    "marketplace.buyer_min_age": 18,
    "marketplace.return_window_days": 7,
    "marketplace.courier_list": ["JNE", "SiCepat", "J&T"]
  },
  "schema": [
    {
      "key": "data.breach_notice_hours",
      "label_en": "Breach notification (hours)",
      "label_id": "Pemberitahuan insiden data (jam)",
      "type": "int",
      "min": 1,
      "max": 72,
      "required": false,
      "material": true,
      "help_id": "Ceiling 72 hours. UU 27/2022 art. 46: a processor slower than this makes its controller non-compliant."
    }
  ],
  "revision": 4,
  "updated_at": "2026-09-18T11:02:44+07:00"
}

Keys are dotted and grouped by the prefix before the first dot — operator., contacts., commercial., legal., data., aup., marketplace. — and the console groups the form on that prefix. Parameter types are text, textarea, int, percent, enum, email and list.

Admin routes do not auto-gate

requireBearer only checks that a JWT is present. Every handler here calls requirePermission explicitly: payments.tenant.read at scope * for the reads, payments.tenant.write at scope * for the write. A merchant-scoped caller — a sub-merchant owner holds payments.* at merchant:<id> only — gets a 403.

Writing

PUT /v1/payments/legal/settings is a partial update: only the keys present in params are written, and every other stored value survives.

PUT /v1/payments/legal/settings
{
  "params": {
    "commercial.terms_change_notice_days": 45,
    "marketplace.courier_list": ["JNE", "SiCepat"]
  }
}
  • Unknown keys are refused, never dropped. A silent drop is how an operator comes to believe it has shortened a notice period that still renders at 30 days.
  • Bounds are statutory where a statute sets one — breach notification at most 72 hours, data-subject-request assistance at most 3 days, refunds at most 7 days, buyer age at least 18, AML retention at least 5 years. The 400 invalid_legal_settings body names the failing key and the reason, including the legal basis:
400
{
  "error": "invalid_legal_settings",
  "message": "one or more parameters are invalid: data.breach_notice_hours",
  "request_id": "01K5Q7J2Z0000000000000000",
  "fields": {
    "data.breach_notice_hours": "must be at most 72. Ceiling 72 hours. UU 27/2022 art. 46: a processor slower than this makes its controller non-compliant."
  }
}
  • Every write is audit-logged as payments.tenant.legal_settings.updated with the changed keys only — never the values, several of which are contact email addresses.

Versioning, material changes and re-acceptance

revision advances only when a PUT actually changes a stored value. An idempotent re-save of the same form leaves it where it was, because the revision feeds the rendered document version and a bump asks every merchant of the tenant to re-accept.

A rendered document's version is <template version>+r<revision> — and the +r… suffix appears only once a material parameter differs from its default. Each schema entry carries a material bit; changing a material parameter moves the document version and raises needs_reaccept on the agreements list. Changing a non-material one (a support phone number, say) does not disturb anyone's acceptance.

Terms that cannot be set

Some terms are fixed by statute and are absent from the schema by construction, not guarded at the edge — a key with no schema entry can never be stored and can never be rendered. A PUT naming one is rejected as an unknown key. They are:

  • The precedence of the Indonesian text. Locked. UU 24/2009 art. 31 and Perpres 63/2019 art. 26: the Indonesian text exists and prevails for an Indonesian counterparty.
  • Governing law and the buyer dispute forum.
  • The base prohibited-business list. aup.prohibited_additions appends bullets and cannot remove one.

Previewing

GET /v1/payments/legal/preview?doc=marketplace-buyer-terms&locale=id renders one document with the caller tenant's current parameters and returns title, body_markdown, version and hash (the sha256 of the exact body returned). doc accepts msa, dpa, aup, marketplace-seller-terms, marketplace-buyer-terms and privacy-notice.

A required parameter the tenant has not set yet does not fail the preview: it renders as a loud, clearly marked placeholder token so the operator can see what is still owed while filling the form in. Nothing that reaches a merchant or a buyer ever contains one.

locale selects the document title. The body is bilingual in every locale, by design — the Indonesian text must exist and prevails, so no locale strips it. Omitting locale yields Indonesian.

The storefront read

GET /v1/payments/legal/documents/{doc} is the service-to-service read that marketplace-service proxies to its buyer-facing /v1/marketplace/legal/{buyer-terms|privacy-notice}.

It is an ordinary /v1 route rather than a separate internal plane because that is the existing S2S channel: marketplace-service exchanges its service-account credential at auth-service's POST /v1/internal/token-exchange for a bearer minted for the seller's tenant, and calls this with it. The tenant is therefore taken from the caller's claims, never from a query parameter, so there is no cross-tenant read primitive here.

Only the two buyer-facing documents are served — marketplace-buyer-terms and privacy-notice. The MSA, DPA, acceptable use policy and seller terms are B2B documents behind the merchant's own acceptance flow, and serving them on the route a public storefront proxies would publish the operator's commercial terms.

StatusMeaning
404the tenant has no legal settings row, or the document is not buyer-facing
409legal_settings_incomplete — a settings row exists but required parameters are missing; the body lists them in missing_keys. The document is not served half-rendered.

No settings row

A tenant that has never written legal settings keeps its previous behaviour unchanged: revision is 0, updated_at is empty, and the buyer-facing routes simply have nothing to serve, so the storefront's legal pages answer the neutral 404. Nothing else about the tenant's payments behaviour depends on this row.


Endpoint reference

Merchant onboarding (KYB)

Create and submit merchants through KYB. Progress through draft → submitted → approved/rejected.

GET/v1/payments/agreements/current

Get current agreement template

GET/v1/payments/document-requirements

List KYB document requirements

GET/v1/payments/industries

List non-prohibited industries

GET/v1/payments/merchants/{id}

Get a merchant

GET/v1/payments/merchants/{id}/beneficial-owners

List beneficial owners

GET/v1/payments/merchants/{id}/documents

List documents

GET/v1/payments/merchants/me

List caller's merchants

POST/v1/payments/merchants

Create a merchant draft

POST/v1/payments/merchants/{id}/agreements

Record agreement acceptance

POST/v1/payments/merchants/{id}/beneficial-owners

Add a beneficial owner

POST/v1/payments/merchants/{id}/documents

Upload a KYB document

POST/v1/payments/merchants/{id}/submit

Submit merchant through KYB

PATCH/v1/payments/merchants/{id}

Partial-update a draft merchant

PATCH/v1/payments/merchants/{id}/beneficial-owners/{ownerId}

Update beneficial owner

DELETE/v1/payments/merchants/{id}/beneficial-owners/{ownerId}

Delete a beneficial owner

Team

Add and remove merchant team members.

Payment intents

Create, list, and cancel payment intents. Track attempt history.

Refunds

Issue full or partial refunds and list them.

Settlements

View settlement batches and payout settings.

Disbursements

Create, approve/reject disbursements with two-eyes workflow. Manage recipients and batch uploads.

GET/v1/payments/disbursements

List disbursements

GET/v1/payments/disbursements/{id}

Get a single disbursement

GET/v1/payments/disbursements/batches

List uploaded disbursement batches

GET/v1/payments/disbursements/batches/{id}

Get a disbursement batch (with row-level status)

GET/v1/payments/recipients

List disbursement recipients (address book)

GET/v1/payments/recipients/{id}

Get a disbursement recipient

GET/v1/payments/reports/disbursements

List disbursement batches (paginated)

GET/v1/payments/reports/disbursements/{id}

Get a disbursement batch

GET/v1/payments/reports/disbursements/{id}/items

Get line items for a disbursement batch

POST/v1/payments/disbursements

Create a new disbursement (status=pending under threshold, pending_approval over)

POST/v1/payments/disbursements/{id}/approve

Approve a pending_approval disbursement (two-eyes; AC-42.5)

POST/v1/payments/disbursements/{id}/reject

Reject a pending_approval disbursement (two-eyes; AC-42.5)

POST/v1/payments/disbursements/batches

Upload a CSV batch of disbursements (AC-42.6 — idempotent via csv_sha256)

POST/v1/payments/recipients

Create a disbursement recipient

POST/v1/payments/recipients/{id}/verify

Verify a recipient's bank account via PSP account validation

POST/v1/payments/webhooks/{provider}/disbursements

PSP disbursement webhook receiver — Flip and other providers (AC-42.8)

POST/v1/payments/webhooks/uob/disbursements

UOB advisory disbursement webhook (JWKS-kid signed notification)

PATCH/v1/payments/recipients/{id}

Update a disbursement recipient

DELETE/v1/payments/recipients/{id}

Deactivate a disbursement recipient

Payouts

Merchant payout accounts, schedules, and payout history.

GET/v1/payments/merchants/{merchant_id}/payout-accounts

List a merchant's payout accounts

GET/v1/payments/merchants/{merchant_id}/payout-schedule

Get a merchant's payout schedule

GET/v1/payments/merchants/{merchant_id}/payouts

List the merchant's historical payouts (paginated)

GET/v1/payments/merchants/{merchant_id}/payouts/{id}

Get a single payout (with line items)

GET/v1/payments/merchants/{merchant_id}/payouts/next

Get the projected next payout for the merchant

POST/v1/payments/admin/merchants/{merchant_id}/payout-accounts/{id}/reject

Reject a pending payout account (admin)

POST/v1/payments/admin/merchants/{merchant_id}/payout-accounts/{id}/revoke

Revoke a verified payout account (admin; opens a new pending row)

POST/v1/payments/admin/merchants/{merchant_id}/payout-accounts/{id}/verify

Mark a pending payout account as verified (admin)

POST/v1/payments/admin/merchants/{merchant_id}/payout-schedule/pause

Pause a merchant's payout schedule (admin)

POST/v1/payments/admin/merchants/{merchant_id}/payout-schedule/resume

Resume a merchant's payout schedule (admin)

POST/v1/payments/merchants/{merchant_id}/payout-accounts

Submit a payout bank account (lands as pending_verification)

PUT/v1/payments/merchants/{merchant_id}/payout-schedule

Update a merchant's payout schedule

Pricing & billing

Tenant-level pricing templates, per-merchant overrides, billing charges, and statements.

Reporting & transactions

Revenue KPIs, transaction ledger, drill-through detail, and async CSV export.

Disputes (chargebacks)

View, respond to, and accept chargeback disputes.

Payment channels & routing

Enable payment channels and manage routing rules.

PSP credentials

Manage Payment Service Provider credentials and rotation.

API keys

Manage API keys — create, update, revoke, and monitor for leaked keys.

Webhooks

Webhook subscriptions for event delivery.

Public checkout (unauthenticated)

Called by 505pay's hosted payment page — no Authorization header required.

PSP webhooks (inbound)

Inbound webhook endpoint called by PSP providers.

Tenant legal terms

The tenant's configurable legal parameters, the schema the console renders its form from, the document preview, and the service-to-service read the storefront proxies for its buyer-facing documents.

Health & metadata

Liveness and readiness probes.

Ungrouped operations

87 operations in the spec are not listed in the groups file. Add their operationIds to content/docs/api/payments.groups.json.

GET/v1/payments/admin/fee-schedules

List owner downstream fee schedules

GET/v1/payments/admin/owner-invoices

List owner per-period downstream-fee invoices

GET/v1/payments/admin/owner-invoices/{id}

Get an owner invoice with per-event attribution lines

GET/v1/payments/admin/owner-reserve

Get the owner payout reserve percentage

GET/v1/payments/admin/plan-subscriptions

List all tenants' Straventa subscriptions (platform admin)

GET/v1/payments/admin/plans

List Straventa plans

GET/v1/payments/admin/settlement-statements

List PSP settlement reconciliation statements

GET/v1/payments/admin/settlement-statements/{id}

Get a settlement statement with its reconciled lines

GET/v1/payments/admin/subscriptions

List subscriptions for a merchant

GET/v1/payments/admin/subscriptions/{id}

Get a single subscription

GET/v1/payments/cases

List unified payments cases (aggregates disputes + refunds)

GET/v1/payments/cases/{case_id}

Get a single case by composite id ({type}:{uuid})

GET/v1/payments/dashboard/channel-breakdown

Per-channel revenue breakdown for a date range

GET/v1/payments/dashboard/funnel

Conversion funnel (Created / Viewed / Charge submitted / Paid)

GET/v1/payments/dashboard/timeseries

Metric + grain timeseries

GET/v1/payments/dashboard/top-payment-links

Top payment links by paid amount for a date range

GET/v1/payments/disbursements/batches/{id}/export

Export an approved manual_file batch as a bank worksheet (CSV or XLSX)

GET/v1/payments/disbursements/threshold

Get the effective disbursement approval threshold

GET/v1/payments/invoices

List merchant invoices (paginated)

GET/v1/payments/invoices/{id}

Get a single merchant invoice

GET/v1/payments/invoices/{id}/pdf

Download the rendered invoice PDF

GET/v1/payments/merchants/{id}/agreements

List accepted agreements

GET/v1/payments/merchants/{id}/customers

List customers for a merchant

GET/v1/payments/merchants/{id}/customers/{cid}

Get customer profile with aggregates

GET/v1/payments/merchants/{id}/customers/{cid}/export

GDPR Article 15 export — full customer record as JSON

GET/v1/payments/merchants/{id}/customers/{cid}/gdpr-job

Get the active GDPR delete job for a customer (404 when none)

GET/v1/payments/merchants/{id}/customers/{cid}/intents

List payment intents for a customer

GET/v1/payments/merchants/{id}/customers/{cid}/notes

List notes for a customer (most-recent first)

GET/v1/payments/merchants/{id}/customers/{cid}/refunds

List refunds tied to a customer (most-recent first)

GET/v1/payments/merchants/{id}/verification

Get merchant KYC/KYB verification state

GET/v1/payments/onboarding/documents

List the caller's KYC documents (merchant-facing)

GET/v1/payments/onboarding/documents/{id}

Fetch metadata for a single KYC document

GET/v1/payments/platform/kyc-queue

List the platform KYC reviewer queue

GET/v1/payments/platform/kyc-verifications

List the platform KYC/KYB verification review queue

GET/v1/payments/refund-status/{shortcode}

Get public refund status (HMAC-authenticated, no JWT required)

GET/v1/payments/reports/disbursements/export

Stream the merchant's disbursement batches as a CSV file

GET/v1/payments/reports/settlements/export

Stream the merchant's settlements as a CSV file

GET/v1/payments/settings/email/{merchant_id}

Get merchant customer-email settings (reply_to + branding + verification state)

GET/v1/payments/settings/notifications/{merchant_id}

Read merchant notification preferences

GET/v1/payments/settings/webhooks/{id}/deliveries

List webhook delivery attempts for a subscription

GET/v1/payments/settings/webhooks/{id}/dlq

List dead-letter queue rows for a subscription

GET/v1/payments/settings/webhooks/events

List the canonical event catalogue

GET/v1/payments/settings/webhooks/retry-policy

Get the webhook dispatcher's retry policy

GET/v1/payments/subscriptions/current

Get the tenant's active Straventa subscription

GET/v1/public/payments/intents/{shortcode}/invoice.pdf

Download invoice PDF (public)

GET/v1/public/subscriptions/{token}

View subscription portal (anonymous)

POST/v1/customer-email-settings/verify-reply-to

Anonymous HMAC-token verification of merchant reply_to (mailbox round-trip)

POST/v1/payments/admin/fee-schedules

Create an owner downstream fee schedule

POST/v1/payments/admin/plans

Create or update a Straventa plan (platform admin)

POST/v1/payments/admin/settlement-statements

Ingest and reconcile a PSP settlement statement

POST/v1/payments/admin/subscriptions

Create a recurring subscription

POST/v1/payments/admin/subscriptions/{id}/cancel

Merchant-initiated cancel

POST/v1/payments/disbursements/batches/{id}/import-result

Upload the bank/portal result file to settle or fail disbursement rows

POST/v1/payments/disbursements/preview

Preview fee + total debit before submitting a disbursement (AC-42.9)

POST/v1/payments/intents/{id}/3ds-callback

Sandbox 3-D-Secure callback for the card_3ds channel

POST/v1/payments/invoices/{id}/resend

Re-send the invoice email

POST/v1/payments/invoices/{id}/void

Void an invoice

POST/v1/payments/merchants/{id}/customers/{cid}/delete

GDPR Article 17 — schedule customer erasure

POST/v1/payments/merchants/{id}/customers/{cid}/notes

Append a free-form note to a customer profile

POST/v1/payments/merchants/{id}/customers/import

Bulk-import customers from a CSV file

POST/v1/payments/onboarding/documents

Upload a KYC document (merchant-facing, multipart)

POST/v1/payments/onboarding/documents/{id}/replace

Re-upload (replace) a KYC document (multipart)

POST/v1/payments/platform/kyc-queue/{id}/approve

Approve a KYC document (terminal transition)

POST/v1/payments/platform/kyc-queue/{id}/reject

Reject a KYC document (terminal transition)

POST/v1/payments/platform/kyc-queue/{id}/start-review

Transition document from uploaded to under_review

POST/v1/payments/platform/kyc-verifications/{id}/disposition

Dispose a needs_review verification (verified or rejected)

POST/v1/payments/recon-questions

File a recon question / settlement-variance dispute

POST/v1/payments/settings/api-keys/{id}/rotate

Rotate an API key

POST/v1/payments/settings/email/{merchant_id}/send-verification

Send mailbox-round-trip verification email to the current reply_to

POST/v1/payments/settings/webhooks/{id}/deliveries/{deliveryId}/replay

Replay a single webhook delivery

POST/v1/payments/settings/webhooks/{id}/dlq/replay-all

Replay every dead-letter row for a subscription

POST/v1/payments/settings/webhooks/{id}/rotate

Rotate a webhook subscription's signing secret

POST/v1/payments/subscriptions

Subscribe the tenant to a Straventa plan

POST/v1/payments/subscriptions/{id}/cancel

Cancel the tenant's Straventa subscription

POST/v1/public/payments/telemetry/va-copy-click

Record a VA Copy-button click (anonymous telemetry)

POST/v1/public/subscriptions/{token}/cancel

Subscriber-initiated cancel

POST/v1/public/subscriptions/{token}/pause

Pause (active → paused)

POST/v1/public/subscriptions/{token}/resume

Resume (paused → active)

PUT/v1/payments/admin/fee-schedules/{id}

Update an owner downstream fee schedule

PUT/v1/payments/admin/owner-reserve

Set the owner payout reserve percentage

PUT/v1/payments/disbursements/threshold

Set the tenant-level disbursement approval threshold

PUT/v1/payments/settings/email/{merchant_id}

Update merchant customer-email settings

PUT/v1/payments/settings/notifications/{merchant_id}

Update merchant notification preferences

PATCH/v1/payments/cases/{case_id}

Transition a case status (delegates to underlying dispute/refund)

PATCH/v1/payments/merchants/{id}/customers/{cid}/notes/{nid}

Update a customer note (replaces body; bumps updated_at)

PATCH/v1/public/subscriptions/{token}/email

Update subscriber email (rotates portal token)

DELETE/v1/payments/merchants/{id}/customers/{cid}/notes/{nid}

Hard-delete a customer note (irreversible)

Was this page helpful?

On this page