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

# Create Unified Standing Order

`POST /wallet-create`

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.net/striga/apis/striga-v1.md) · [All operations](https://skmtc.net/striga/apis/striga-v1/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/striga/striga-v1/revisions/63e57aa7df45/schema)
