*** title: Routing payments subtitle: >- Define **processor routes**—ordered lists of payment processors—to control how payments are attempted. When a customer pays, PaymentKit tries each processor in order until one succeeds. ---------------------------- # Before you begin Make sure you have: * At least **two connected payment processors**. * Processor IDs handy (find them in **Developers > Payment Processors** or via `GET /v1/processors`). If you only have one processor connected, PaymentKit will only use your default processor. **At this time, payment routes can only be defined via the API.** *** # How payment routes work PaymentKit will try each processor in the order of your defined route until one succeeds. If a processor is unavailable or doesn’t support the currency, PaymentKit skips to the next processor automatically. ```mermaid flowchart TD A[Customer submits payment] --> B[Processor 1: Stripe] B -->|Success| C[Payment complete] B -->|Failed| D[Processor 2: Authorize] D -->|Success| C D -->|Failed| E[Processor 3: Airwallex] E -->|Success| C E -->|Failed| F[Payment failed] ``` Without a defined route, PaymentKit will first try your default processor, and then fall back to other connected processors by connection order. ## Create a route ```bash curl -X POST https://api.paymentkit.com/v1/processor-routes \ -H "Authorization: Bearer sk_live_..." \ -H "Content-Type: application/json" \ -d '{ "name": "US Optimized", "processors": [ { "processor_id": "proc_abc123" }, { "processor_id": "proc_def456" }, { "processor_id": "proc_ghi789" } ] }' ``` Response: ```bash { "id": "proute_xyz789", "name": "US Optimized", "processors": [ { "processor_id": "proc_abc123" }, { "processor_id": "proc_def456" }, { "processor_id": "proc_ghi789" } ], "created_at": "2024-01-15T10:30:00Z" } ``` ## Use a route in checkout Pass a single `processor_route_id` when creating a checkout session. The route itself contains an ordered list of processors — PaymentKit tries each one sequentially until a payment succeeds. You don’t pass multiple processor IDs directly; instead, define the processor list inside the route and reference the route by its ID. **One route ID, multiple processors.** The `processor_route_id` field accepts a single route ID (e.g., `proute_xyz789`), not an array of processor IDs. To control which processors are used and in what order, configure them within the route via `POST /v1/processor-routes`. For cascade pricing, each tier can specify its own `processor_route_id` to use a different fallback chain. Pass the `processor_route_id` when creating a checkout session: ```bash curl -X POST https://api.paymentkit.com/v1/checkout/sessions \ -H "Authorization: Bearer sk_live_..." \ -d customer_id="cus_abc123" \ -d line_items[0][price_id]="price_xyz" \ -d line_items[0][quantity]=1 \ -d processor_route_id="proute_xyz789" \ -d success_url="https://example.com/success" ``` ## Set a default route (optional) Apply a route to all checkout sessions without needing to specify it each time. ```bash curl -X PATCH https://api.paymentkit.com/v1/accounts/acc_xxx \ -H "Authorization: Bearer sk_live_..." \ -d default_processor_route_id="proute_xyz789" ``` ## Manage routes List all routes: ```bash curl https://api.paymentkit.com/v1/processor-routes \ -H "Authorization: Bearer sk_live_..." ``` Update a route: ```bash curl -X PATCH https://api.paymentkit.com/v1/processor-routes/proute_xyz789 \ -H "Authorization: Bearer sk_live_..." \ -H "Content-Type: application/json" \ -d '{ "name": "US Optimized v2", "processors": [ { "processor_id": "proc_def456" }, { "processor_id": "proc_abc123" } ] }' ``` Delete a route: ```bash curl -X DELETE https://api.paymentkit.com/v1/processor-routes/proute_xyz789 \ -H "Authorization: Bearer sk_live_..." ``` Routes currently referenced by **checkout sessions** or set as **account default** cannot be deleted.