> For clean Markdown content of this page, append .md to this URL. For the complete documentation index, see https://docs.postnuvia.com/llms.txt.

## Summary

Agents can now sign up without a human's email address. They get an inbox that receives email right away, and they attach a human later when they have one. Sending stays locked until a human is attached, so an agent can start receiving mail without waiting on anyone.

### What's new?

**New endpoints:**

* `POST /v0/agent/human`: attach a human to an unverified agent organization. The human is emailed a 6-digit OTP for `POST /v0/agent/verify`, and the agent can email that human until it verifies.

**Changes:**

* `human_email` is now optional on `POST /v0/agent/sign-up`. Without it, the inbox is receive-only and cannot send to anyone until a human is attached. The API key also cannot be recovered, so store it durably: calling sign-up again without `human_email` creates a new organization, which needs a different `username`.
* Calling `POST /v0/agent/human` again with the same email resends the OTP if it was never delivered, or issues a new one if it expired, without rotating the API key. Any unverified agent can use this to get a new OTP.
* Calling it with a different email replaces the attached human, up to 2 times per organization.
* The `pod_update` API key permission, which controls updating pods, is now listed in the API key permissions.

### Breaking changes

⚠️ **Unverified agent organizations can no longer create, update, or delete pods.**

`pod_create`, `pod_update`, and `pod_delete` now require a verified organization, like creating API keys and list entries already did. These requests return a `403` with `code: "missing_permission"` until the organization completes `POST /v0/agent/verify`. Reading pods is unchanged.

### Use cases

* Build agents that sign themselves up and start receiving email before anyone has given them a human contact.
* Build onboarding flows where the agent asks for its human's email later, then attaches it.
* Let agents fix a mistyped human email before verifying, without starting over.

**`Python`**

```python title="Python"
from postnuvia import PostNuvia

# sign up with no human email: the inbox is receive-only
response = PostNuvia().agent.sign_up(username="my-agent")

# later, attach a human; they are emailed an OTP
client = PostNuvia(api_key=response.api_key)
client.agent.attach_human(human_email="you@example.com")
client.agent.verify(otp_code="123456")
```

**`TypeScript`**

```typescript title="TypeScript"
import { PostNuviaClient } from "postnuvia";

// sign up with no human email: the inbox is receive-only
const response = await new PostNuviaClient().agent.signUp({ username: "my-agent" });

// later, attach a human; they are emailed an OTP
const client = new PostNuviaClient({ apiKey: response.apiKey });
await client.agent.attachHuman({ humanEmail: "you@example.com" });
await client.agent.verify({ otpCode: "123456" });
```

> **Note**
>
> See [Sign up without a human email](https://docs.postnuvia.com/agent-onboarding#sign-up-without-a-human-email) in the Agent Onboarding guide.