---
title: "Start login with any identity type"
method: POST
path: "/v1/auth/login/start"
tags: ["auth"]
---

# Start login with any identity type

`POST /v1/auth/login/start`

Start the login flow by providing any supported identifier:

- **Email**: `user@example.com`
- **Phone**: `+15551234567` (E.164 format)
- **Handle**: `@myhandle` or `myhandle`
- **Wallet**: `0x1234...` (EVM) or Solana address

Returns available authentication methods for the account.

**For email/SMS**: Use CDP SDK to authenticate, then call `/auth/login/complete` with the CDP token.
**For wallet**: Sign the challenge message, then call `/auth/login/complete` with the signature.

**Design notes (intentional disclosure):**
- This endpoint returns wallet challenge messages (including full addresses). While this can reveal
  linked wallets for a handle, those wallets are already visible via public leaderboards. We accept
  this correlation risk as an explicit product decision.
- This endpoint also returns the available auth modalities (email/SMS/wallet) for a handle. This can
  reveal which channels are linked, but we accept this as an explicit product decision given public
  activity surfaces already imply these modalities.

**Completion requirement:** When calling `/auth/login/complete`, clients must send the exact
`identity_value` for the chosen method (full email/phone/address) to disambiguate accounts
with multiple identities of the same type.

The login session expires in 10 minutes.

## Request body

- LoginStartRequest — Request model for starting login flow.
  - `identifier` string, required — User identifier: email, phone (+1...), wallet address (0x...), or handle (@...)

## Response `200`

Successful Response

- LoginStartResponse — Response model for login start.
  - `login_token` string, required — Signed session token (use in login/complete). Contains all session state - no server storage required.
  - `identity_type` string, required — Resolved identity type (email, sms, handle, evm, solana)
  - `handle` string, nullable — Handle if login was initiated with handle
  - `available_methods` LoginAuthMethod[], required — Available authentication methods
    - `type` string, required — Identity type (email, sms, evm, solana)
    - `value` string, required — Masked identity value (e.g., u***@example.com, +1***5678, 0x1234...abcd)
    - `auth_method` string, required — Authentication method: 'cdp_otp' for email/SMS, 'signature' for wallets
    - `challenge_message` string, nullable — Challenge message to sign (only for wallet signature auth)
  - `otp_available` boolean, required — Whether OTP-based auth is available (email or SMS)

## Other responses

- `404` — No account found for identifier
- `422` — Validation Error

---

[API](https://skmtc.net/grove/apis/grove-api.md) · [All operations](https://skmtc.net/grove/apis/grove-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/grove/grove-api/revisions/f286b48a8105/schema)
