---
title: "Remove Member"
method: DELETE
path: "/api/v1/org/members"
tags: ["Organization"]
---

# Remove Member

`DELETE /api/v1/org/members`

## Request

- Base URL: `http://localhost:3009`
- URL: `http://localhost:3009/api/v1/org/members`
- Auth: HTTP bearer

Removes a person from your organization. Their API keys are revoked and their shared credentials are withdrawn from the org before the roster entry is dropped.

If the address has a pending invitation rather than a membership, the invitation is revoked — `data.removed` says which happened.

**Check `data.warnings`.** Removal is never blocked, so anything of theirs the org was relying on is affected: workflows using a connection they owned start failing, active sources they owned stop importing, and workflows they still own keep running — scheduled runs charge the owner, so the org keeps paying for them. Each warning names the affected resources so you can reassign them. An empty array means none of those checks found anything, not that the member was inconsequential.

Requires the `members:write` scope, which only an org admin's API key can carry. You cannot remove yourself.

Percent-encode the address: a literal `+` in a query string decodes to a space, so `sam+team@acme.com` must be sent as `sam%2Bteam%40acme.com`.

Refusals carry a `code`:

| `code` | Status | Meaning |
|--------|--------|---------|
| `NOT_A_MEMBER` | 404 | No member or pending invitation for that address |
| `CANNOT_REMOVE_SELF` | 403 | Another admin has to remove you |
| `SSO_MEMBER_MANAGED_IN_IDP` | 403 | Managed by your SSO provider — remove them there |
| `LAST_LEAD` / `LAST_MEMBER` | 409 | An org cannot be left with no admin or no members |

## Query parameters

- `email` string, required

## Response `200`

Default Response

- object
  - `status` integer
  - `message` string
  - `data` OrgMemberRemoval: What the call removed.
    - `email` string, required: The removed email address, lowercased.
    - `removed` 'member' | 'invitation', required: `member` when an active member was removed, `invitation` when a pending invitation was revoked.
    - `warnings` object[], required: What the removal broke or left behind. The removal still succeeded — these are consequences to act on, not failures. An empty array means none of the checks below found anything, not that the member was inconsequential.
      - `code` 'WORKFLOWS_LOST_CONNECTION' | 'WORKFLOWS_LOST_OWNER' | 'SOURCES_LOST_OWNER' | 'IMPACT_UNKNOWN', required: `WORKFLOWS_LOST_CONNECTION` — workflows used a connection they owned and now fail. `WORKFLOWS_LOST_OWNER` — workflows they own keep running; scheduled runs still bill the org. `SOURCES_LOST_OWNER` — active sources they owned stop importing. `IMPACT_UNKNOWN` — a lookup failed or was capped, so check their integrations by hand.
      - `message` string, required: Human-readable summary.
      - `resources` object[]: What is affected. Absent on `IMPACT_UNKNOWN`.
        - `id` string, required
        - `name` string, required
        - `type` 'workflow' | 'draft' | 'subfloq' | 'source', required

## Other responses

- `401`: Unauthorized — missing or invalid API key
- `403`: Forbidden — not an org admin, removing yourself, or an SSO-managed member
- `404`: Not Found — no member or pending invitation for that address
- `409`: Conflict — would leave the organization with no admin or no members
- `429`: Too Many Requests — rate limit exceeded. Check `Retry-After` header for seconds until the limit resets.

---

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