`lumail@2.1.0` · [`lumail.tokens`](/docs/sdk/v2/tokens)

```typescript
tokens.create(params: CreateApiTokenParams): Promise<LumailResult<CreateApiTokenResponse>>
```

Secret returned once. Optional `preset` or `permissions`.

## Body Parameters

| Name | Type | Description |
| --------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------ |
| `name` | string | **Required.** Token label. |
| `reuseIfExists` | boolean | When `true`, return an existing token with the same name instead of minting another. |
| `permissions` | string[] | Explicit permission list. |
| `preset` | `"app"` / `"marketing"` / `"sender"` / `"full"` | Permission preset. Used when `permissions` is omitted. |

## Response Fields

| Field | Type | Description |
| ------------- | -------- | ------------------------------------------------------- |
| `id` | string | Token id. |
| `name` | string | Token label. |
| `token` | string | Full `lum_` secret. Shown once. |
| `permissions` | string[] | Granted permissions. |
| `createdAt` | string | ISO 8601 timestamp. |
| `reused` | boolean | `true` when `reuseIfExists` returned an existing token. |

`data` is the minted token. Failures return `{ data: null, error: { name, message, statusCode } }`.


## API Reference
**Method:** POST
**Endpoint:** /api/v2/tokens

### SDK
```ts
import { Lumail } from "lumail";

const lumail = new Lumail({ apiKey: process.env.LUMAIL_API_KEY });
const { data, error } = await lumail.tokens.create({
  name: "CI",
  preset: "app",
});
if (error) {
  throw error;
}
console.log(data.token);
```

### cURL
```bash
curl -X POST https://lumail.io/api/v2/tokens \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"CI","preset":"app"}'
```

### JavaScript
```javascript
const response = await fetch("https://lumail.io/api/v2/tokens", {
  method: "POST",
  headers: {
    Authorization: "Bearer YOUR_API_TOKEN",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ name: "CI", preset: "app" }),
});
const data = await response.json();
```

### Success Response
```json
{
  "id": "tok_abc123",
  "name": "CI",
  "token": "lum_...",
  "permissions": ["emails", "subscribers"],
  "createdAt": "2026-09-05T10:30:00.000Z",
  "reused": false
}
```

### Error Response
```json
{
  "name": "validation_error",
  "message": "name is required",
  "statusCode": 422
}
```
