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.
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. |
| Logs | Delivery activity streaming live, with per-attempt status, latency, and response details. |
| DLQ | Their dead-lettered deliveries, with replay. |
| 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 are all answerable in the portal without your involvement: did you send it, what's in it, can you resend it.
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:
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}'{
"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:
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.
Keeping customers in your app#
The hosted link is one of four ways to put the portal in front of customers. The other three keep them inside your product:
| Tier | What | Integration cost |
|---|---|---|
| 1 | Hosted portal link (this page) | None, but the customer leaves your app. |
| 2 | Full embed | One component. |
| 3 | Bare surfaces | One component per page. |
| 4 | Your own UI | You own the UI; blocks, components and hooks carry the data. |
The embed is the whole portal as an iframe in one component: token handling, theming, and drawers and dialogs that cover your app's viewport rather than being clipped to the frame. Bare surfaces drop the portal's header and tabs and render one area per page of yours, so the portal reads as your own screens. And if you would rather build the UI yourself, everything the portal shows is available as installable blocks, components and hooks on the same data.
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 and to see exactly what a customer sees before you ship them a link.
Continue#
The whole portal in your app, one component.
Put your name and theme on the portal.
The same catalog, published as public documentation.
Manage the same objects from your backend.
The portal's UI as installable components and hooks, in your frontend.