Customer portal

A hosted self-service portal for your customers: endpoints, signing secrets, live delivery logs, the dead-letter queue, and your event catalog.

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

AreaWhat they see and do
EndpointsAdd, edit, pause, resume, and delete their endpoints, and choose event-type subscriptions from your catalog.
SecretsReveal and rotate each endpoint's whsec_ signing secret, with overlap-window rotation.
LogsDelivery activity streaming live, with per-attempt status, latency, and response details.
DLQTheir dead-lettered deliveries, with replay.
Event catalogEvery 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.

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": "..."
}
FieldMeaning
expiryLink lifetime in seconds, from 60 to 604800 (7 days). Defaults to 86400 (24 hours).
readOnlyDefaults 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, metadataOptional 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:

TierWhatIntegration cost
1Hosted portal link (this page)None, but the customer leaves your app.
2Full embedOne component.
3Bare surfacesOne component per page.
4Your own UIYou 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