---
title: "Manually trigger an orchestration"
method: POST
path: "/v2/users/{userId}/orchestration-addresses/{orchestrationAddressId}/orchestrate"
tags: ["Orchestration Address"]
---

# Manually trigger an orchestration

`POST /v2/users/{userId}/orchestration-addresses/{orchestrationAddressId}/orchestrate`

## Request

- Base URL: `https://production.hifibridge.com`
- URL: `https://production.hifibridge.com/v2/users/{userId}/orchestration-addresses/{orchestrationAddressId}/orchestrate`
- Auth: HTTP bearer

Force an immediate batch of all currently-`PENDING` deposits for the
address, regardless of the configured mode. Useful for `SCHEDULED`
addresses that you want to drain ahead of schedule, for `THRESHOLD`
addresses that haven't crossed yet, or simply for operational backfill.

**Idempotent.** If no PENDING deposits exist (or the address was
deactivated between the read and the row lock), returns 200 with
`triggered: false` and a `reason`.

For `SCHEDULED` addresses, manual trigger does NOT advance
`nextRunAt` — the scheduled tick still fires at its appointed time
(it'll find zero PENDING deposits and no-op).

The endpoint serializes against concurrent THRESHOLD webhooks and the
SCHEDULED job via a `FOR UPDATE` row lock, so at most one batch is ever
produced for a given set of PENDING deposits.

## Path parameters

- `userId` string, required
- `orchestrationAddressId` string, uuid, required

## Response `200`

Result of `POST /orchestrate`. Either a freshly-created batch
(`triggered: true`, with `batch` populated) or an idempotent no-op
(`triggered: false`, with `reason` indicating why).

- union: Result of a manual `POST /orchestrate` call. Either a freshly-created batch (`triggered: true`) or an idempotent no-op (`triggered: false`).
  - OrchestrationManualTriggerTriggered: Response shape when the manual trigger produced a new batch.
    - `triggered` true, required
    - `batch` OrchestrationBatchObject, required: A batch of one or more deposits rolled up into a single offramp transaction.
      - `id` string, uuid
      - `orchestrationAddressId` string, uuid
      - `totalAmount` string: Sum of the included deposits' amounts, in the source `currency`.
      - `currency` 'usdc' | 'usdt'
      - `status` 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED': Batch lifecycle. * `PENDING` — created; the worker has not yet picked it up. * `PROCESSING` — the linked offramp has been created and is in flight. * `COMPLETED` — the linked offramp reached `COMPLETED`. * `FAILED` — terminal failure. See `failureReason`.
      - `failureReason` 'ADDRESS_NOT_ACTIVE' | 'NOT_INITIATED' | 'QUOTE_FAILED' | 'CRYPTO_FAILED' | 'FIAT_FAILED' | 'EXPIRED' | 'REJECTED' | 'CANCELLED': Populated when `status=FAILED`. * `ADDRESS_NOT_ACTIVE` — the address was deactivated before the worker created the offramp. The only input condition that terminally fails a batch. * All other values are terminal statuses surfaced from the linked offramp transaction (e.g. lost product access → `NOT_INITIATED`, a rejected AML review → a terminal status). Internal inconsistencies (missing address, payout account lost its rail, a processor-validation bug) do **not** appear here — the worker pauses the batch (leaves it `PENDING`) and alerts ops instead of marking it `FAILED`.
      - `createdAt` string, date-time
      - `updatedAt` string, date-time
      - `depositIds` string[]: IDs of all deposits included in this batch.
      - `offrampTransactionId` string, uuid, nullable: ID of the offramp transaction produced from this batch. `null` while `status=PENDING` (the worker has not yet created the offramp). Call `GET /v2/offramps/{transferId}` for full offramp details.
  - OrchestrationManualTriggerNoOp: Response shape when the manual trigger was an idempotent no-op (no PENDING deposits, or the address was deactivated under the row lock).
    - `triggered` false, required
    - `reason` 'no_pending_deposits' | 'address_no_longer_active' | 'below_offramp_minimum', required: Reason the manual trigger was a no-op (returned when `triggered=false`). * `no_pending_deposits` — the address has no `PENDING` deposits to batch. * `address_no_longer_active` — the address was deactivated between the read and the row-lock acquisition. * `below_offramp_minimum` — the summed `PENDING` deposits are below the destination rail's offramp minimum, so they are held to accumulate rather than batched.
    - `batch` object, nullable, required: Always `null` in the no-op variant.

## Other responses

- `400`: Bad request - validation error
- `401`: Unauthorized
- `404`: Resource not found
- `500`: Internal Server Error

---

[API](https://skmtc.dev/hifi/apis/hifi-api.md) - [All operations](https://skmtc.dev/hifi/apis/hifi-api/llms.txt) - [OpenAPI document](https://skmtc.dev/hifi/apis/hifi-api/revisions/319fa6bd5bc6?raw)
