---
title: "Authenticatestart"
method: POST
path: "/v1/crypto_wallets/authenticate/start"
tags: ["Crypto Wallet"]
---

# Authenticatestart

`POST /v1/crypto_wallets/authenticate/start`

## Request

- Base URL: `https://api.stytch.com`
- URL: `https://api.stytch.com/v1/crypto_wallets/authenticate/start`
- Auth: HTTP basic

Initiate the authentication of a crypto wallet. After calling this endpoint, the user will need to sign a message containing the returned `challenge` field.

For Ethereum crypto wallets, you can optionally use the Sign In With Ethereum (SIWE) protocol for the message by passing in the `siwe_params`. The only required fields are `domain` and `uri`.
If the crypto wallet detects that the domain in the message does not match the website's domain, it will display a warning to the user.

If not using the SIWE protocol, the message will simply consist of the project name and a random string.

## Request body

- ApiCryptoWalletV1AuthenticateStartRequest: Request type
  - `crypto_wallet_type` string, required: The type of wallet to authenticate. Currently `ethereum` and `solana` are supported. Wallets for any EVM-compatible chains (such as Polygon or BSC) are also supported and are grouped under the `ethereum` type.
  - `crypto_wallet_address` string, required: The crypto wallet address to authenticate.
  - `user_id` string: The unique ID of a specific User. You may use an `external_id` here if one is set for the user.
  - `session_token` string: The `session_token` associated with a User's existing Session.
  - `session_jwt` string: The `session_jwt` associated with a User's existing Session.
  - `siwe_params` ApiCryptoWalletV1SIWEParams
    - `domain` string, required: Only required if `siwe_params` is passed. The domain that is requesting the crypto wallet signature. Must be an RFC 3986 authority.
    - `uri` string, required: Only required if `siwe_params` is passed. An RFC 3986 URI referring to the resource that is the subject of the signing.
    - `resources` string[], required: A list of information or references to information the user wishes to have resolved as part of authentication. Every resource must be an RFC 3986 URI.
    - `chain_id` string: The EIP-155 Chain ID to which the session is bound. Defaults to 1. Must be the string representation of an integer between 1 and 9,223,372,036,854,775,771, inclusive.
    - `statement` string: A human-readable ASCII assertion that the user will sign. The statement may only include reserved, unreserved, or space characters according to RFC 3986 definitions, and must not contain other forms of whitespace such as newlines, tabs, and carriage returns.
    - `issued_at` string: The time when the message was generated. Defaults to the current time. All timestamps in our API conform to the RFC 3339 standard and are expressed in UTC, e.g. `2021-12-29T12:33:09Z`.
    - `not_before` string: The time when the signed authentication message will become valid. Defaults to the current time. All timestamps in our API conform to the RFC 3339 standard and are expressed in UTC, e.g. `2021-12-29T12:33:09Z`.
    - `message_request_id` string: A system-specific identifier that may be used to uniquely refer to the sign-in request. The `message_request_id` must be a valid pchar according to RFC 3986 definitions.

## Response `200`

Successful response

- ApiCryptoWalletV1AuthenticateStartResponse
  - `request_id` string, required: Globally unique UUID that is returned with every API call. This value is important to log for debugging purposes; we may ask for this value to help identify a specific API call when helping you debug an issue.
  - `user_id` string, required: The unique ID of the affected User.
  - `challenge` string, required: A challenge string to be signed by the wallet in order to prove ownership.
  - `user_created` boolean, required: In `login_or_create` endpoints, this field indicates whether or not a User was just created.
  - `status_code` integer, required: The HTTP status code of the response. Stytch follows standard HTTP response status code patterns, e.g. 2XX values equate to success, 3XX values are redirects, 4XX are client errors, and 5XX are server errors.

## Other responses

- `400`: Bad request
- `401`: Unauthorized
- `429`: Too Many Requests
- `500`: Internal server error

## Changes

- **2026-03-07** `110f26a94e5b`: 1 info
  - endpoint added
- **2026-03-06** `9cab20b8eca7`: 1 breaking
  - api path removed without deprecation
- **2025-09-17** `8270cf3a3d4c`: 3 info
  - added the media type `application/json` for the response with the status `401`
  - added the media type `application/json` for the response with the status `500`
  - added the non-success response with the status `429`
- **2025-09-17** `864b9f438ac0`: 2 breaking
  - the `status_code` response's property type changed from `string` to `integer`, and format from no format to `int32` for status `200`
  - the `user_created` response's property type changed from `string` to `boolean` for status `200`

[Operation history](https://skmtc.dev/stytch/apis/stytch-api/changes/v1/crypto_wallets/authenticate/start/post.md)

---

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