> ## Documentation Index
> Fetch the complete documentation index at: https://repost.sh/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# The Customer Portal

> A hosted self-service portal for your customers: endpoints, signing secrets, live delivery logs, the dead-letter queue, and your event catalog, reached through a link your backend mints.

Every environment includes a hosted portal where your customers manage their own webhook integration. There are no customer accounts to provision. Your backend mints a link, the customer opens it, and they land in a portal carrying [your name and theme](/docs/send/customization).

## What customers can do

| Area          | What they see and do                                                                                                                                                           |
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Endpoints     | Add, edit, pause, resume, and delete their endpoints, and choose event-type subscriptions from your catalog.                                                                   |
| Secrets       | Reveal and rotate each endpoint's `whsec_` signing secret, with [overlap-window rotation](/docs/send/signing).                                                                      |
| Logs          | Delivery activity streaming live, with per-attempt status, latency, and response details.                                                                                      |
| DLQ           | Their dead-lettered deliveries, with [replay](/docs/send/delivery).                                                                                                                 |
| Event catalog | Every deployed event type with its description, JSON Schema, and sample payloads, plus downloadable type definitions and a button that sends a sample event to their endpoint. |

The three questions that fill webhook support queues — did you send it, what's in it, can you resend it — are all answerable in the portal without your involvement.

## Mint an access link

Access is link-based. Your backend requests a URL and hands it to the customer, typically behind a "Manage webhooks" button in your product or in an onboarding email:

```bash theme={"languages":{"custom":["/languages/repost.json"]}}
curl -X POST https://api.repost.sh/v1/customers/acme/portal-access \
  -H "Authorization: Bearer $REPOST_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"expiry": 86400}'
```

```json 200 OK theme={"languages":{"custom":["/languages/repost.json"]}}
{
  "url": "https://portal.../e/env_.../#token=...",
  "token": "..."
}
```

| Field              | Meaning                                                                                                                                                           |
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `expiry`           | Link lifetime in seconds, from 60 to 604800 (7 days). Defaults to 86400 (24 hours).                                                                               |
| `readOnly`         | Defaults to `false`. A read-only link can browse everything but change nothing, and signing secrets are hidden. Useful for support views and embedded dashboards. |
| `name`, `metadata` | Optional label and metadata for the grant.                                                                                                                        |

The token travels in the URL fragment, which browsers do not send to servers, so it stays out of access logs. Links are cheap to create; mint a fresh one per click rather than storing them.

### Revoking access

Sessions expire on their own. To cut access off early, for example when a customer's staff member leaves or a link leaks, expire everything for that customer at once:

```bash theme={"languages":{"custom":["/languages/repost.json"]}}
curl -X POST https://api.repost.sh/v1/customers/acme/portal-access/expire-all \
  -H "Authorization: Bearer $REPOST_TOKEN"
```

All outstanding links and sessions for that customer stop working immediately.

## Embedding

The portal can run inside your product as an iframe. Embedding is off by default and allow-listed per environment: add your app's origins under **Settings → Portal** (up to 20), and the portal will only render inside frames on those origins. Combine an embedded portal with short-lived or read-only links minted per page view.

## Previewing

From any customer's page in the dashboard you can open their portal directly in a one-hour preview session. Use it to check your [branding](/docs/send/customization) and to see exactly what a customer sees before you ship them a link.

## Continue

<Columns cols={3} className="gap-y-4">
  <Card title="Customization" icon="palette" href="/docs/send/customization" cta="Branding" arrow="true">
    Put your name and theme on the portal.
  </Card>

  <Card title="Event docs" icon="book-open" href="/docs/send/event-docs" cta="Public docs" arrow="true">
    The same catalog, published as public documentation.
  </Card>

  <Card title="Customers & endpoints" icon="users" href="/docs/send/endpoints" cta="API" arrow="true">
    Manage the same objects from your backend.
  </Card>
</Columns>
