# POST /portals/:portal_id/invite

**Resource:** [Portals](./portals.md)  
**MCP tool:** `invite_portal_member`  
**Scopes:** `portals:write`  
**Write operation:** yes

Invite an external person to a portal by email and send them a workspace-branded invite email. Records them as a company-less member (broker / client / site staff) who NEVER joins your company. Handles all three identity states automatically: a brand-new person gets a set-password link; a person with an un-activated account gets a fresh set-password link re-issued; a person already active on the platform gets an 'access granted' notice and signs in with their existing password. Set `send_email: false` to grant access silently instead. Idempotent per email. Returns `state` (new | pending | active) and `email_sent`.

## Parameters

| Name | In | Type | Required | Description |
|------|----|------|----------|-------------|
| `portal_id` | path | string | yes |  |
| `email` | body | string | yes | The person to invite. Required. |
| `full_name` | body | string | no | Optional display name shown in the portal. |
| `send_email` | body | boolean | no | Send the invite email. Defaults to true. False grants access and portal chat silently, but someone who has no TrustPager login yet then has no way in until you resend their access link. |
| `require_approval` | body | boolean | no | Optional. Set true to route this write into the approval queue for human review instead of executing it immediately (returns 202 + an approval_id). Works even when your key/token has permission to execute directly. |

## Request example

```bash
curl -X POST   "https://api.trustpager.com/functions/v1/api/v1/portals/:portal_id/invite"   -H "Authorization: Bearer YOUR_API_KEY"   -H "Content-Type: application/json"   -d '{"email":"...","full_name":"..."}'
```

---
Base URL: `https://api.trustpager.com/functions/v1/api/v1` — Auth: `Authorization: Bearer YOUR_API_KEY`