---
title: "Switch automatic withdrawal on or off for up to 50 teams"
method: POST
path: "/api/v1/teams/auto-withdrawal/bulk"
tags: ["Teams"]
---

# Switch automatic withdrawal on or off for up to 50 teams

`POST /api/v1/teams/auto-withdrawal/bulk`

## Request

- Base URL: `https://partner-api.monta.com`
- URL: `https://partner-api.monta.com/api/v1/teams/auto-withdrawal/bulk`
- Auth: HTTP bearer

Switch automatic bank withdrawal on (`enabled: true`) or off (`enabled: false`) for up to 50 teams in one call, the bulk form of `autoWithdraw` on `PATCH /teams/{id}`. Page through larger lists in several requests.</br></br>*Partial success*: each team is changed on its own and gets one entry in `results`, in request order, so a batch with mixed results still returns 200. Check `result` for each team: for example `no-bank-account` means the team was switched on but is not paid until it adds a bank account, and `ineligible` comes with a `reason`.</br></br>*Safe to repeat*: a team that is already on keeps its next withdrawal date (`already-on`), and a team that is already off is left alone (`already-off`).</br></br>*Scope*: if any id does not exist or belongs to a team outside your operator's scope, the whole request is refused with 403 `TEAMS_NOT_IN_OPERATOR_SCOPE` and `context.teamIds` lists those ids. Nothing is changed in that case.</br></br>A call can take up to about 30 seconds for 50 teams. Run these calls one after another: requests over the per-consumer concurrency cap get 429 `CONCURRENCY_LIMIT_EXCEEDED`.</br></br>Required scope: `teams:write` </br>Organization authorization: `supported`

## Request body

- BulkTeamAutoWithdrawal
  - `teamIds` integer[], required: Ids of the teams to switch automatic withdrawal on or off for: between 1 and 50 distinct, positive ids. Page through larger lists in several requests.
  - `enabled` boolean, required: `true` switches automatic withdrawal on for every listed team, `false` switches it off.

## Response `200`

One result per requested team

- BulkTeamAutoWithdrawalResult
  - `summary` TeamAutoWithdrawalSummary, required
    - `requested` integer, required: Number of teams in the request.
    - `enabled` integer, required: Teams switched on (`enabled`), including those whose bank-account lookup failed (`reason` `bank-account-unknown`).
    - `alreadyOn` integer, required: Teams that were already on (`already-on`).
    - `noBankAccount` integer, required: Teams switched on that have no bank account yet (`no-bank-account`).
    - `invoiceWithdrawConflict` integer, required: Teams not switched on because invoice withdrawal is on (`invoice-withdraw-conflict`).
    - `ineligible` integer, required: Teams that cannot use automatic withdrawal (`ineligible`).
    - `disabled` integer, required: Teams switched off (`disabled`).
    - `alreadyOff` integer, required: Teams that were already off (`already-off`).
    - `notYours` integer, required: Teams that left the caller's operator while the request ran (`not-yours`).
    - `failed` integer, required: Teams that could not be changed because of an unexpected error (`failed`).
  - `results` TeamAutoWithdrawalResult[], required: One entry per requested team, in request order.
    - `teamId` integer, required: The team the result refers to.
    - `result` 'enabled' | 'already-on' | 'no-bank-account' | 'invoice-withdraw-conflict' | 'ineligible' | 'disabled' | 'already-off' | 'not-yours' | 'failed', required: What happened to one team:</br>- `enabled`: switched on; if the bank-account lookup failed, `reason` is `bank-account-unknown`.</br>- `already-on`: already on; nothing changed and the next withdrawal date is kept.</br>- `no-bank-account`: switched on, but no payout happens until the team adds a bank account.</br>- `invoice-withdraw-conflict`: not switched on, because invoice withdrawal is on for the team.</br>- `ineligible`: not switched on; `reason` says why.</br>- `disabled`: switched off.</br>- `already-off`: already off; nothing changed.</br>- `not-yours`: not changed, because the team moved to another operator while the request ran.</br>- `failed`: not changed; `reason` says why, and retrying is safe.
    - `reason` 'personal-team' | 'frozen' | 'invoiced-team' | 'no-operator' | 'bank-account-unknown' | 'unexpected-error' | 'not-attempted', required: Why a team got its result:</br>- `personal-team`, `frozen`, `invoiced-team` (the team pays by invoice), `no-operator`: the team is `ineligible`.</br>- `bank-account-unknown`: the team is `enabled`, but whether it has a bank account could not be checked.</br>- `unexpected-error`: the team `failed` because of an unexpected error.</br>- `not-attempted`: the team `failed` because the request ran out of time before reaching it; nothing changed, so send it again.
    - `autoWithdrawNextAt` string, date-time, nullable, required: When the next automatic withdrawal is due. Set for `enabled`, `no-bank-account` and `already-on` (the existing date, unchanged), null otherwise.

## Other responses

- `400`: The request is invalid: `teamIds` is empty, has more than 50 ids, has duplicates or a non-positive id, or `enabled` is missing. Nothing is changed.
- `401`: Consumer with provided credentials was not found
- `403`: Missing `teams:write` scope, or `TEAMS_NOT_IN_OPERATOR_SCOPE`: some teams do not exist or are outside your operator's scope. `context.teamIds` lists them and nothing is changed.
- `404`: Entity with the provided id was not found
- `422`: The server refused the request as invalid. Nothing is changed.
- `429`: Too many bulk auto-withdrawal requests in flight for this consumer (errorCode `CONCURRENCY_LIMIT_EXCEEDED`)

## Changes

- **2026-11-03** `0ca400461c52`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/monta/apis/monta-partner-api/changes/api/v1/teams/auto-withdrawal/bulk/post.md)

---

[API](https://skmtc.dev/monta/apis/monta-partner-api.md) - [All operations](https://skmtc.dev/monta/apis/monta-partner-api/llms.txt) - [OpenAPI document](https://skmtc.dev/monta/apis/monta-partner-api/revisions/0ca400461c52?raw)
