---
title: "Send phone verification code"
method: POST
path: "/users/@me/phone/send-verification"
tags: ["Users"]
---

# Send phone verification code

`POST /users/@me/phone/send-verification`

Send a one-time code on the requested channel. Defaults to the first available channel from server policy. Pass channel="sms" to request SMS (only honoured for SMS-allowlisted destinations) or channel="inbound_challenge" to receive challenge details to text in. Expensive outbound destinations always downgrade to an inbound challenge.

## Request body

- PhoneSendVerificationRequest
  - `phone` string, required
  - `channel` 'sms' | 'inbound_challenge' — Channel to deliver the OTP on. Defaults to the first available channel from server policy. Server may override to an available fallback when the requested channel is disabled.

## Response `200`

Success

- union
  - object
    - `channel` 'sms', required — Channel actually used for delivery (may differ from request when server adjusts)
  - object
    - `channel` 'inbound_challenge', required — The user must send Fluxer an SMS instead of receiving one
    - `challenge_code` string, required — The numeric code the user must text to our number
    - `our_number` string, required — The Twilio number the user must text the code to (E.164)
    - `expires_at` string, date-time, required — ISO 8601 timestamp when this inbound challenge expires
    - `reason` 'voip' | 'canadian' | 'unknown_line_type' | 'expensive_destination' | 'account_forced' | 'behavioural_risk', required — Why inbound verification is required

## Other responses

- `400` — Bad Request - The request was malformed or contained invalid data
- `401` — Unauthorized - Authentication is required or the token is invalid
- `403` — Forbidden - You do not have permission to perform this action
- `429` — Too Many Requests - You are being rate limited
- `500` — Internal Server Error - An unexpected error occurred

## Changes

> 14 revisions in range; 1 not diffed.

- **2026-09-18** `dd0ad4ea1c88` — 1 info
  - the `anyOf[subschema #2]/expires_at` response's property pattern was changed from `^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$` to `^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$` for the status `200`
- **2026-09-06** `a52a2cf49d9b` — 32 warning
  - added the new `IP_BAN_DECLINED` enum value to the `code` response property for the response status `400`
  - added the new `IP_BAN_DECLINED` enum value to the `code` response property for the response status `401`
  - added the new `IP_BAN_DECLINED` enum value to the `code` response property for the response status `403`
  - added the new `IP_BAN_DECLINED` enum value to the `code` response property for the response status `500`
  - …28 more
  - …this revision’s changelog is incomplete
- …earlier changes not shown

[Full history](https://skmtc.dev/fluxer/apis/fluxer-api/changes/users/@me/phone/send-verification/post.md)

---

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