---
title: "Create Unified Standing Order"
method: POST
path: "/wallet-create"
tags: ["standing-orders"]
---

# Create Unified Standing Order

`POST /wallet-create`

## Request

- Base URL: `https://www.sandbox.striga.com/api/v1/standing-orders`
- URL: `https://www.sandbox.striga.com/api/v1/standing-orders/wallet-create`
- Auth: API key in header `api-key` and API key in header `Authorization`

Create one `SWAP_ONLY` standing order per eligible non-EUR account in a wallet under a single SCA challenge. Today only `direction=CRYPTO_TO_FIAT` is supported: every crypto account in the wallet will auto-swap its deposits into the wallet's EUR account, with no external SEPA payout. `FIAT_TO_CRYPTO` is intentionally not supported here — use the per-account `/create` endpoint, since a single EUR source has many possible crypto destinations.

The endpoint is all-or-nothing: if any candidate account already has an active SO, the call rejects up front. On success, the SCA challenge returned covers the entire batch — confirm it once via the standard `/confirm` endpoint and one SO row is materialized per account.

## Request body

- UnifiedStandingOrderCreateRequest
  - `userId` string, uuid, required: Unique ID of the user that owns the wallet
  - `walletId` string, required: The wallet to set up auto-conversion on. All eligible non-EUR accounts in this wallet will receive a SWAP_ONLY standing order.
  - `direction` 'CRYPTO_TO_FIAT' | 'FIAT_TO_CRYPTO', required: Direction of the unified standing orders. Today only `CRYPTO_TO_FIAT` is supported — `FIAT_TO_CRYPTO` is rejected (see route description for why).
  - `verificationMethod` 'sms' | 'totp' | 'passkey': SCA factor to issue the setup challenge against. Defaults to `sms`. For `passkey`, run PASSKEY_APPROVAL_START before calling `/wallet-confirm`. Honoured only when the application has scaEnabled=true; ignored otherwise.
  - `fixedFee` string: Fixed fee in cents to apply to each materialized SO (optional override).
  - `percentFeeBps` string: Percentage fee in basis points to apply to each materialized SO (optional override).

## Response `201`

success

- UnifiedStandingOrderCreateResponse
  - `challengeId` string, uuid, required: Unique challenge ID to be used when confirming via `/wallet-confirm`. Covers the whole batch under a single SCA.
  - `dateExpires` string, date-time, required: Date at which this challenge ID expires.
  - `verificationMethod` 'sms' | 'totp' | 'passkey': SCA factor the challenge is bound to.
  - `affectedAccountIds` string[], required: The account IDs in the wallet that will each get a SWAP_ONLY standing order on confirm.
  - `skippedAccountIds` string[]: Account IDs excluded from the batch because an active standing order already covers them.

## Other responses

- `400`: Bad Request. The request was unacceptable, often due to missing a required parameter.
- `401`: Invalid authentication header
- `500`: Unexpected server error.

---

[API](https://skmtc.dev/striga/apis/standing-orders.md) - [All operations](https://skmtc.dev/striga/apis/standing-orders/llms.txt) - [OpenAPI document](https://skmtc.dev/striga/apis/standing-orders/revisions/55fb35478f9d?raw)
