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

> Start 2-step email registration on a dedicated FullPool device context using your own residential/mobile proxy (Scale+).

- **Canonical URL:** https://api.tikultra.com/v1/account/register/email/send
- **Docs Reference:** https://tikultra.com/docs/api/register-email-send
- **Raw Markdown:** https://tikultra.com/docs/md/api/register-email-send
- **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:** 25 credits (`0` credits on any failed call)
- **Upstream Mobile Path(s):** `/passport/user/check_email_registered`, `/passport/email/send_code/`

## What this endpoint does

Start 2-step email registration on a dedicated FullPool device context using your own residential/mobile proxy (Scale+). Executes `/passport/user/check_email_registered, /passport/email/send_code/` 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: 25 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 |
| --- | --- | --- | --- | --- |
| `email` | `string` | yes | Unregistered email address you control. | `studio@acme.dev` |
| `password` | `string` | yes | Account password (8+ characters). | `StrongPassword!2026` |
| `birthday` | `string` | yes | Date of birth in YYYY-MM-DD format. | `1999-04-15` |
| `proxy` | `string` | yes | Caller-supplied residential or mobile proxy URL (required; never runs on shared pool IPs). | `http://user:pass@res-us-miami.proxy.example:8080` |
| `context_id` | `string` | optional | Optional existing caller-owned device context ID to reuse. | `—` |
| `warmup` | `boolean` | optional | Run initial device bootstrap & warm-up if fresh. | `true` |
| `os` | `string` | optional | android or ios. | `android \| ios` |
| `app_flavour` | `string` | optional | Which app to run as. | `tiktok \| lite \| lite_coin \| pro \| studio \| shop \| tv \| douyin` |
| `app_version` | `string` | optional | A release of that app. Defaults to the current default for (os, app_flavour). | `47.5.41` |
| `region` | `string` | optional | Two-letter country code for egress and storefront. | `US` |
| `city` | `string` | optional | A city in that region. See the supported cities list. | `miami` |

## What it returns

Returns `200 OK` `application/json` decoded from `/passport/user/check_email_registered`. 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 (25 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/user/check_email_registered. |
| `otp_channel` | `string` | Decoded `otp_channel` value returned from /passport/user/check_email_registered. |
| `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/user/check_email_registered. |
| `app_flavour` | `string` | Decoded `app_flavour` value returned from /passport/user/check_email_registered. |
| `app_version` | `string` | Decoded `app_version` value returned from /passport/user/check_email_registered. |
| `region` | `string` | Decoded `region` value returned from /passport/user/check_email_registered. |

## 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** **(THIS ENDPOINT)** — [`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** — [`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,
  os: 'android',
  appFlavour: 'tiktok',
  appVersion: '47.5.41',
  region: 'US',
  city: 'miami',
})

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

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

with TikUltra(
    api_key=os.environ["TIKULTRA_KEY"],
    os="android",
    app_flavour="tiktok",
    app_version="47.5.41",
    region="US",
    city="miami",
) as client:
    res = client.request(
        "POST",
        "/v1/account/register/email/send",
        json_body={
            "email": "studio@acme.dev",
            "password": "StrongPassword!2026",
            "birthday": "1999-04-15",
            "proxy": "http://user:pass@res-us-miami.proxy.example:8080",
            "warmup": True,
        },
    )
    print(res.credits_cost, res.data)
```

### cURL
```bash
curl -X POST https://api.tikultra.com/v1/account/register/email/send \
  -H "x-api-key: $TIKULTRA_KEY" \
  -H "content-type: application/json" \
  -d '{"email":"studio@acme.dev","password":"StrongPassword!2026","birthday":"1999-04-15","proxy":"http://user:pass@res-us-miami.proxy.example:8080","os":"android","app_flavour":"tiktok","app_version":"47.5.41","region":"US","city":"miami","warmup":true}'
```

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

r = requests.post(
    "https://api.tikultra.com/v1/account/register/email/send",
    json={
        "email": "studio@acme.dev",
        "password": "StrongPassword!2026",
        "birthday": "1999-04-15",
        "proxy": "http://user:pass@res-us-miami.proxy.example:8080",
        "os": "android",
        "app_flavour": "tiktok",
        "app_version": "47.5.41",
        "region": "US",
        "city": "miami",
        "warmup": True,
    },
    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/send', {
  method: 'POST',
  headers: { 'x-api-key': process.env.TIKULTRA_KEY, 'content-type': 'application/json' },
  body: JSON.stringify({"email":"studio@acme.dev","password":"StrongPassword!2026","birthday":"1999-04-15","proxy":"http://user:pass@res-us-miami.proxy.example:8080","os":"android","app_flavour":"tiktok","app_version":"47.5.41","region":"US","city":"miami","warmup":true}),
})
console.log(res.headers.get('x-credits-cost'), await res.json())
```

## Sample 200 JSON response

```json
{
  "status": "registration_code_sent",
  "otp_channel": "email",
  "context_id": "7392011847562901234",
  "device_id": "7392011847562901234",
  "os": "android",
  "app_flavour": "tiktok",
  "app_version": "47.5.41",
  "region": "US",
  "city": "miami",
  "email": "studio@acme.dev",
  "code_type": 1,
  "check_email": {
    "message": "success",
    "data": {
      "is_registered": 0
    }
  },
  "result": {
    "message": "success",
    "data": {
      "next_send_sec": 60
    }
  }
}
```
