# Email registration: verify code — `POST /v1/account/register/email/verify`

> Complete 2-step email registration with the OTP code and persist a caller-owned Connected Workspace account_id (Scale+).

- **Canonical URL:** https://api.tikultra.com/v1/account/register/email/verify
- **Docs Reference:** https://tikultra.com/docs/api/register-email-verify
- **Raw Markdown:** https://tikultra.com/docs/md/api/register-email-verify
- **Family:** Connected sessions
- **Execution Pool:** Caller-Owned Account · Dedicated 1:1 FullPool — Runs exclusively on a Connected Workspace account_id you own
- **Plan Access:** Scale and up
- **Cost:** 50 credits (`0` credits on any failed call)
- **Upstream Mobile Path(s):** `/passport/email/register_verify_login/`

## What this endpoint does

Complete 2-step email registration with the OTP code and persist a caller-owned Connected Workspace account_id (Scale+). Executes `/passport/email/register_verify_login/` on the caller-owned Connected Workspace session (`account_id`), preserving 1:1 hardware identity, cookie state, `X-Cylons` session binding, and city-level egress.

- Never an SMM panel: Tikultra never executes likes, follows, comments, DMs, or uploads from shared or internal pool accounts. Passing an unowned or corpus account_id returns 403 account_forbidden.
- Predictable billing: 50 cr on HTTP 200; upstream 5xx, rate-limit 429, and validation 4xx responses always charge 0 credits.
- Plan & proxy requirement: available on Scale and Enterprise plans and requires a caller-supplied residential or mobile `proxy` URL.

### Execution pool & account boundary

Executes on the dedicated 1:1 mobile hardware fingerprint, persistent MSSDK sec_device_token, cookie jar, and city egress bound to your own account_id (connected via session import, email OTP login, or Scale+ BYO-proxy email registration). Never an SMM panel: Tikultra never executes likes, follows, comments, DMs, or uploads from shared or internal pool accounts. Passing an unowned or corpus account_id returns 403 account_forbidden.

## Authorization & parameters

- Header `x-api-key` (`string`, **required**): Your Tikultra API key.

| Parameter | Type | Required | Description | Example |
| --- | --- | --- | --- | --- |
| `context_id` | `string` | yes | The context_id returned by /v1/account/register/email/send. | `7392011847562901234` |
| `email` | `string` | yes | The same email address. | `studio@acme.dev` |
| `code` | `string` | yes | One-time registration code delivered to the email. | `591024` |
| `password` | `string` | yes | The same password. | `StrongPassword!2026` |
| `birthday` | `string` | yes | The same YYYY-MM-DD birthday. | `1999-04-15` |
| `proxy` | `string` | yes | The same caller-supplied residential or mobile proxy URL. | `http://user:pass@res-us-miami.proxy.example:8080` |

## What it returns

Returns `200 OK` `application/json` decoded from `/passport/email/register_verify_login/`. Field names (`aweme_id`, `uid`, `sec_uid`, `unique_id`, `room_id`, `product_id`) are consistent across all 200+ endpoints so outputs pipe directly into follow-up calls. If TikTok returns an upstream timeout, empty challenge, or 5xx error, the gateway surfaces a structured error `code` and sets `x-credits-cost: 0`.

### Billing & telemetry headers on every response

- `x-credits-cost`: Exact credits billed for this call (50 on 200 OK; always 0 on failed calls).
- `x-credits-tier`: Pricing tier bucket (fixed).
- `x-credits-remaining`: Live remaining credit balance on your API key after this response.

### Key decoded response fields

| Field | Type | Description |
| --- | --- | --- |
| `status` | `string` | Decoded `status` value returned from /passport/email/register_verify_login/. |
| `account_id` | `string` | Caller-owned Connected Workspace session identifier. |
| `context_id` | `string` | Dedicated mobile device context identifier. |
| `device_id` | `string` | 64-bit registered mobile `device_id` bound to the context. |
| `os` | `string` | Decoded `os` value returned from /passport/email/register_verify_login/. |
| `app_flavour` | `string` | Decoded `app_flavour` value returned from /passport/email/register_verify_login/. |
| `app_version` | `string` | Decoded `app_version` value returned from /passport/email/register_verify_login/. |
| `region` | `string` | Decoded `region` value returned from /passport/email/register_verify_login/. |

## How to use it: 2-Step Scale+ Email Registration with BYO Proxy

Register a brand-new account on a fresh FullPool hardware profile routed strictly through your own residential or mobile proxy, verify the email OTP, and immediately configure the profile.

1. **Check desired @username availability** *(optional)* — [`GET /v1/user/check-username`](https://tikultra.com/docs/api/check-username) (2 cr): Verify your target handle is free with GET /v1/user/check-username (2 credits) before starting registration.
2. **Bootstrap device & send registration code** — [`POST /v1/account/register/email/send`](https://tikultra.com/docs/api/register-email-send) (25 cr): Pass email, password, birthday (YYYY-MM-DD), region/city, and your residential/mobile proxy URL. Save the returned context_id.
3. **Verify email OTP & persist account_id** **(THIS ENDPOINT)** — [`POST /v1/account/register/email/verify`](https://tikultra.com/docs/api/register-email-verify) (50 cr): Submit the 6-digit email code along with the exact same context_id and proxy URL to finalize registration and mint account_id.
4. **Claim @username & set bio/avatar** *(optional)* — [`POST /v1/account/profile/username`](https://tikultra.com/docs/api/profile-username) (25 cr): Set your handle (/v1/account/profile/username), bio (/v1/account/profile/update), and avatar (/v1/account/profile/avatar).
5. **Calibrate initial For You niche** *(optional)* — [`POST /v1/account/warm/niche`](https://tikultra.com/docs/api/warm-niche) (25 cr): Warm the newly registered session with organic topic searches and feed dwells via POST /v1/account/warm/niche.

> **Agent Tip:** Registration requires Scale or Enterprise plus a caller-supplied residential/mobile proxy (byo_proxy_required). Always pass the identical context_id and proxy in both step 1 and step 2.

## Code examples (cURL, TypeScript SDK, Python SDK)

### TypeScript SDK
```ts
import { TikUltra } from 'tikultra'

const client = new TikUltra({ apiKey: process.env.TIKULTRA_KEY })

const res = await client.request('POST', '/v1/account/register/email/verify', { body: {
  context_id: '7392011847562901234',
  email: 'studio@acme.dev',
  code: '591024',
  password: 'StrongPassword!2026',
  birthday: '1999-04-15',
  proxy: 'http://user:pass@res-us-miami.proxy.example:8080',
} })
console.log(res.creditsCost, res.data)
```

### Python SDK
```python
import os
from tikultra import TikUltra

with TikUltra(api_key=os.environ["TIKULTRA_KEY"]) as client:
    res = client.request(
        "POST",
        "/v1/account/register/email/verify",
        json_body={
            "context_id": "7392011847562901234",
            "email": "studio@acme.dev",
            "code": "591024",
            "password": "StrongPassword!2026",
            "birthday": "1999-04-15",
            "proxy": "http://user:pass@res-us-miami.proxy.example:8080",
        },
    )
    print(res.credits_cost, res.data)
```

### cURL
```bash
curl -X POST https://api.tikultra.com/v1/account/register/email/verify \
  -H "x-api-key: $TIKULTRA_KEY" \
  -H "content-type: application/json" \
  -d '{"context_id":"7392011847562901234","email":"studio@acme.dev","code":"591024","password":"StrongPassword!2026","birthday":"1999-04-15","proxy":"http://user:pass@res-us-miami.proxy.example:8080"}'
```

### Python (HTTP)
```python
import os, requests

r = requests.post(
    "https://api.tikultra.com/v1/account/register/email/verify",
    json={
        "context_id": "7392011847562901234",
        "email": "studio@acme.dev",
        "code": "591024",
        "password": "StrongPassword!2026",
        "birthday": "1999-04-15",
        "proxy": "http://user:pass@res-us-miami.proxy.example:8080",
    },
    headers={"x-api-key": os.environ["TIKULTRA_KEY"]},
)
print(r.headers["x-credits-cost"], r.json())
```

### JavaScript
```bash
const res = await fetch('https://api.tikultra.com/v1/account/register/email/verify', {
  method: 'POST',
  headers: { 'x-api-key': process.env.TIKULTRA_KEY, 'content-type': 'application/json' },
  body: JSON.stringify({"context_id":"7392011847562901234","email":"studio@acme.dev","code":"591024","password":"StrongPassword!2026","birthday":"1999-04-15","proxy":"http://user:pass@res-us-miami.proxy.example:8080"}),
})
console.log(res.headers.get('x-credits-cost'), await res.json())
```

## Sample 200 JSON response

```json
{
  "status": "registered",
  "account_id": "acc_9Kp4",
  "context_id": "7392011847562901234",
  "device_id": "7392011847562901234",
  "os": "android",
  "app_flavour": "tiktok",
  "app_version": "47.5.41",
  "region": "US",
  "city": "miami",
  "email": "studio@acme.dev",
  "uid": "6970000000000000002",
  "sec_uid": "MS4wLjABAAAAkbfan991xQp2mN8vR4wL7tH3zK5y",
  "username": "user849201938",
  "session_persisted": true
}
```
