---
title: "Claim an account created without credentials"
method: POST
path: "/users/@me/claim"
tags: ["Users"]
---

# Claim an account created without credentials

`POST /users/@me/claim`

## Request

- Base URL: `https://web.fluxer.app/api/v1`
- URL: `https://web.fluxer.app/api/v1/users/@me/claim`
- Auth: API key in header `Authorization`
- TypeScript: <https://skmtc.dev/fluxer/apis/fluxer-api/docs/users/@me/claim/post.ts> (a function with typed inputs; its response is checked against the schema)

Claims an account created without credentials. On email instances it adds an email address, and optionally a password. When the instance sends email, the address is stored at once and waits for confirmation with the emailed code, and next_step is confirm_email. When it does not, the account needs a password or an existing passkey, and next_step is none. An address stored on another account, confirmed or not, answers EMAIL_ALREADY_IN_USE. On username instances it sets a password, and next_step is none.

## Request body

- ClaimAccountRequest
  - `email` string
  - `password` string

## Response `200`

Success

- union
  - NoneClaimAccountResponse
    - `next_step` 'none', required: The account is set up, nothing else is needed
    - `user` UserPrivateResponse, required
      - `id` string, snowflake, required
      - `username` string, required: The username of the user, not unique across the platform
      - `discriminator` string, required: The four-digit discriminator tag of the user
      - `global_name` string, nullable, required: The display name of the user, if set
      - `avatar` string, nullable, required: The hash of the user avatar image
      - `avatar_color` integer, required
      - `bot` boolean: Whether the user is a bot account
      - `system` boolean: Whether the user is an official system user
      - `flags` integer, required: The public flags on the user account
      - `mention_flags` 0 | 1 | 2: Reply mention preference
      - `is_staff` boolean, required: Whether the user has staff permissions
      - `acls` string[], required: Access control list entries for the user
      - `traits` string[], required: Special traits assigned to the user account
      - `email` string, nullable, required: The email address associated with the account
      - `email_bounced` boolean: Whether the current email address is marked as bounced by the mail provider
      - `has_verified_phone` boolean, required: Deprecated. Always false.
      - `bio` string, nullable, required: The user biography text
      - `pronouns` string, nullable, required: The preferred pronouns of the user
      - `accent_color` integer, required
      - `timezone` string, nullable: The IANA timezone identifier saved by the user
      - `timezone_privacy_flags` integer: Bitfield controlling who can see the profile timezone
      - `banner` string, nullable, required: The hash of the user profile banner image
      - `banner_color` integer, required
      - `mfa_enabled` boolean, required: Whether multi-factor authentication is enabled
      - `authenticator_types` UserAuthenticatorTypes[]: The types of authenticators configured for MFA
      - `verified` boolean, required: Whether the email address has been verified
      - `account_limited` boolean: Whether the account is limited
      - `premium_type` 0 | 1 | 2, required: Premium subscription type
      - `premium_since` string, nullable, required: ISO8601 timestamp of when premium was first activated
      - `premium_until` string, nullable, required: ISO8601 timestamp of when premium access ends, including stacked gift time
      - `premium_will_cancel` boolean, required: Whether premium is set to cancel at the end of the billing period
      - `premium_billing_cycle` string, nullable, required: The billing cycle for the premium subscription
      - `premium_lifetime_sequence` integer, required
      - `premium_grace_ends_at` string, nullable, required: ISO8601 timestamp at which grace access ends after premium_until passes: after a failed renewal payment (7 days from the renewal for monthly plans, 14 for yearly), after a subscription ends (3 days), or during an App Store or Google Play grace period. Perks stay active and the original premium_since is kept on resubscribe until this timestamp passes. Null when no grace is recorded, in which case access lasts 3 days after premium_until.
      - `premium_discriminator` boolean, required: Whether the user selected a premium-only discriminator that will be rerolled when non-lifetime premium access ends
      - `hidden_profile_badges` string[], required: Keys of the badges hidden from other people, as in the key field of a profile badge
      - `premium_badge_hidden` boolean, required: Deprecated, use hidden_profile_badges. Whether the premium badge held is in that list
      - `premium_badge_masked` boolean, required: Whether the premium badge shows a masked appearance
      - `premium_badge_timestamp_hidden` boolean, required: Whether the premium start timestamp is hidden
      - `premium_badge_sequence_hidden` boolean, required: Deprecated, use hidden_profile_badges. Whether visionary_number is in that list
      - `premium_purchase_disabled` boolean, required: Whether premium purchases are disabled for this account
      - `premium_enabled_override` boolean, required: Whether premium features are enabled via override
      - `premium_perks_disabled` boolean, required: Whether premium perks are temporarily disabled for this account
      - `operator_pass_badge_hidden` boolean: Deprecated, use hidden_profile_badges. Whether operator_pass is in that list. Only present on the current user response. Older servers omit it
      - `operator_pass_badge_timestamp_hidden` boolean: Whether the month and year the Operator Pass was first held are hidden from other people. Only present on the current user response. Older servers omit it
      - `operator_pass_badge_count_hidden` boolean: Whether the number of Operator Passes held is hidden from other people, on the badge and the Operators' wall. Only present on the current user response. Older servers omit it
      - `operator_pass_since` string, nullable: ISO8601 timestamp of when the account got the Operator Pass, or null without one. Only present on the current user response.
      - `password_last_changed_at` string, nullable, required: ISO8601 timestamp of the last password change
      - `last_voice_activity_sharing_change_at` string, nullable, required: ISO8601 timestamp of the last bulk voice-activity-sharing change. Drives the 24-hour cooldown for re-toggling the Active Now sharing default.
      - `required_actions` string[], required: Deprecated. Always empty.
      - `nsfw_allowed` boolean, required: Whether the user is allowed to view NSFW content
      - `has_dismissed_premium_onboarding` boolean, required: Whether the user has dismissed the premium onboarding flow
      - `has_ever_purchased` boolean, required: Whether the user has ever made a purchase
      - `has_unread_gift_inventory` boolean, required: Whether there are unread items in the gift inventory
      - `unread_gift_inventory_count` integer, required
      - `pending_bulk_message_deletion` object, nullable, required: Information about a pending bulk message deletion request. Only populated when the legacy delayed-deletion flow is in progress; the new immediate-deletion flow does not surface a pending state here.
        - `scheduled_at` string, required: ISO8601 timestamp of when the deletion was scheduled
        - `channel_count` integer, required
        - `message_count` integer, required
      - `mature_content_unlocked` boolean: Whether mature content is unlocked for the account in regions where a date of birth typed in is not enough for mature content. It is true when the iOS or Android app sent an age range of 18 or over, when staff set it, or when the account already had mature content unlocked before. Never true from an age range on a self-hosted instance
      - `terms_agreed_at` string, nullable, required: ISO8601 timestamp of when the user last agreed to the terms of service
      - `privacy_agreed_at` string, nullable, required: ISO8601 timestamp of when the user was last shown the current privacy policy. People are informed of it, they do not agree to it
      - `claimed` boolean: Whether the account can be signed in to again from another device: an email on instances that sign in with an email, a password otherwise
      - `account_tier` 'unclaimed' | 'unverified' | 'verified': How far the account has got with setting up a way to sign in
      - `verification_need` 'add_email' | 'confirm_email' | 'password': What the account still has to do before it can use everything
      - `has_password` boolean: Whether the account has a password
      - `date_of_birth_required` boolean: Whether the account still has to enter its date of birth, which clients ask for before anything else
      - `has_age_range` boolean: Whether Fluxer keeps an age range for the account that the iOS or Android app sent from the Apple or Google account. The range itself is not included
      - `profile_restricted` boolean: Whether other people see only the username and tag of this account until it has a confirmed email address
  - ConfirmEmailClaimAccountResponse
    - `next_step` 'confirm_email', required: Enter the code sent to the new email address to finish
    - `user` UserPrivateResponse, required
      - `id` string, snowflake, required
      - `username` string, required: The username of the user, not unique across the platform
      - `discriminator` string, required: The four-digit discriminator tag of the user
      - `global_name` string, nullable, required: The display name of the user, if set
      - `avatar` string, nullable, required: The hash of the user avatar image
      - `avatar_color` integer, required
      - `bot` boolean: Whether the user is a bot account
      - `system` boolean: Whether the user is an official system user
      - `flags` integer, required: The public flags on the user account
      - `mention_flags` 0 | 1 | 2: Reply mention preference
      - `is_staff` boolean, required: Whether the user has staff permissions
      - `acls` string[], required: Access control list entries for the user
      - `traits` string[], required: Special traits assigned to the user account
      - `email` string, nullable, required: The email address associated with the account
      - `email_bounced` boolean: Whether the current email address is marked as bounced by the mail provider
      - `has_verified_phone` boolean, required: Deprecated. Always false.
      - `bio` string, nullable, required: The user biography text
      - `pronouns` string, nullable, required: The preferred pronouns of the user
      - `accent_color` integer, required
      - `timezone` string, nullable: The IANA timezone identifier saved by the user
      - `timezone_privacy_flags` integer: Bitfield controlling who can see the profile timezone
      - `banner` string, nullable, required: The hash of the user profile banner image
      - `banner_color` integer, required
      - `mfa_enabled` boolean, required: Whether multi-factor authentication is enabled
      - `authenticator_types` UserAuthenticatorTypes[]: The types of authenticators configured for MFA
      - `verified` boolean, required: Whether the email address has been verified
      - `account_limited` boolean: Whether the account is limited
      - `premium_type` 0 | 1 | 2, required: Premium subscription type
      - `premium_since` string, nullable, required: ISO8601 timestamp of when premium was first activated
      - `premium_until` string, nullable, required: ISO8601 timestamp of when premium access ends, including stacked gift time
      - `premium_will_cancel` boolean, required: Whether premium is set to cancel at the end of the billing period
      - `premium_billing_cycle` string, nullable, required: The billing cycle for the premium subscription
      - `premium_lifetime_sequence` integer, required
      - `premium_grace_ends_at` string, nullable, required: ISO8601 timestamp at which grace access ends after premium_until passes: after a failed renewal payment (7 days from the renewal for monthly plans, 14 for yearly), after a subscription ends (3 days), or during an App Store or Google Play grace period. Perks stay active and the original premium_since is kept on resubscribe until this timestamp passes. Null when no grace is recorded, in which case access lasts 3 days after premium_until.
      - `premium_discriminator` boolean, required: Whether the user selected a premium-only discriminator that will be rerolled when non-lifetime premium access ends
      - `hidden_profile_badges` string[], required: Keys of the badges hidden from other people, as in the key field of a profile badge
      - `premium_badge_hidden` boolean, required: Deprecated, use hidden_profile_badges. Whether the premium badge held is in that list
      - `premium_badge_masked` boolean, required: Whether the premium badge shows a masked appearance
      - `premium_badge_timestamp_hidden` boolean, required: Whether the premium start timestamp is hidden
      - `premium_badge_sequence_hidden` boolean, required: Deprecated, use hidden_profile_badges. Whether visionary_number is in that list
      - `premium_purchase_disabled` boolean, required: Whether premium purchases are disabled for this account
      - `premium_enabled_override` boolean, required: Whether premium features are enabled via override
      - `premium_perks_disabled` boolean, required: Whether premium perks are temporarily disabled for this account
      - `operator_pass_badge_hidden` boolean: Deprecated, use hidden_profile_badges. Whether operator_pass is in that list. Only present on the current user response. Older servers omit it
      - `operator_pass_badge_timestamp_hidden` boolean: Whether the month and year the Operator Pass was first held are hidden from other people. Only present on the current user response. Older servers omit it
      - `operator_pass_badge_count_hidden` boolean: Whether the number of Operator Passes held is hidden from other people, on the badge and the Operators' wall. Only present on the current user response. Older servers omit it
      - `operator_pass_since` string, nullable: ISO8601 timestamp of when the account got the Operator Pass, or null without one. Only present on the current user response.
      - `password_last_changed_at` string, nullable, required: ISO8601 timestamp of the last password change
      - `last_voice_activity_sharing_change_at` string, nullable, required: ISO8601 timestamp of the last bulk voice-activity-sharing change. Drives the 24-hour cooldown for re-toggling the Active Now sharing default.
      - `required_actions` string[], required: Deprecated. Always empty.
      - `nsfw_allowed` boolean, required: Whether the user is allowed to view NSFW content
      - `has_dismissed_premium_onboarding` boolean, required: Whether the user has dismissed the premium onboarding flow
      - `has_ever_purchased` boolean, required: Whether the user has ever made a purchase
      - `has_unread_gift_inventory` boolean, required: Whether there are unread items in the gift inventory
      - `unread_gift_inventory_count` integer, required
      - `pending_bulk_message_deletion` object, nullable, required: Information about a pending bulk message deletion request. Only populated when the legacy delayed-deletion flow is in progress; the new immediate-deletion flow does not surface a pending state here.
        - `scheduled_at` string, required: ISO8601 timestamp of when the deletion was scheduled
        - `channel_count` integer, required
        - `message_count` integer, required
      - `mature_content_unlocked` boolean: Whether mature content is unlocked for the account in regions where a date of birth typed in is not enough for mature content. It is true when the iOS or Android app sent an age range of 18 or over, when staff set it, or when the account already had mature content unlocked before. Never true from an age range on a self-hosted instance
      - `terms_agreed_at` string, nullable, required: ISO8601 timestamp of when the user last agreed to the terms of service
      - `privacy_agreed_at` string, nullable, required: ISO8601 timestamp of when the user was last shown the current privacy policy. People are informed of it, they do not agree to it
      - `claimed` boolean: Whether the account can be signed in to again from another device: an email on instances that sign in with an email, a password otherwise
      - `account_tier` 'unclaimed' | 'unverified' | 'verified': How far the account has got with setting up a way to sign in
      - `verification_need` 'add_email' | 'confirm_email' | 'password': What the account still has to do before it can use everything
      - `has_password` boolean: Whether the account has a password
      - `date_of_birth_required` boolean: Whether the account still has to enter its date of birth, which clients ask for before anything else
      - `has_age_range` boolean: Whether Fluxer keeps an age range for the account that the iOS or Android app sent from the Apple or Google account. The range itself is not included
      - `profile_restricted` boolean: Whether other people see only the username and tag of this account until it has a confirmed email address
    - `code_expires_at` string, date-time, required: When the emailed code stops working
    - `resend_available_at` string, date-time, required: When another code can be requested

## 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

> 64 revisions in range; 2 not diffed.

- **2026-11-07** `fb6a6a77d71f`: 2 warning, 4 info
  - removed the optional property `oneOf[#/components/schemas/ConfirmEmailClaimAccountResponse]/user/age_verified_adult` from the response with the `200` status
  - removed the optional property `oneOf[#/components/schemas/NoneClaimAccountResponse]/user/age_verified_adult` from the response with the `200` status
  - added the optional property `oneOf[#/components/schemas/ConfirmEmailClaimAccountResponse]/user/has_age_range` to the response with the `200` status
  - added the optional property `oneOf[#/components/schemas/ConfirmEmailClaimAccountResponse]/user/mature_content_unlocked` to the response with the `200` status
  - …2 more
- **2026-10-26** `2feeda8f8dd5`: 2 info
  - added the required property `oneOf[#/components/schemas/ConfirmEmailClaimAccountResponse]/user/hidden_profile_badges` to the response with the `200` status
  - added the required property `oneOf[#/components/schemas/NoneClaimAccountResponse]/user/hidden_profile_badges` to the response with the `200` status
- **2026-10-24** `2ecd716d4472`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/fluxer/apis/fluxer-api/changes/users/@me/claim/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/2092bc8b2edf?raw)
