API reference

FlurryPORT exposes one public API surface: the capture URL that webhook providers send to. Everything else is managed through the UI or the CLI.

Capture URL

The capture URL is the endpoint you register with your webhook provider. It accepts any HTTP method and stores the raw request — headers, body, query string — exactly as sent.

POST https://api.flurryport.io/api/v1/capture/{projectId}/{endpointSlug}
ParameterDescription
projectIdBase62-encoded project ID (shown in the UI)
endpointSlugURL-safe endpoint slug (e.g., stripe-webhook)
⚠️ The capture URL is unauthenticated — webhook providers cannot authenticate. FlurryPORT stores the raw payload with AES-256-GCM envelope encryption.

Quick test:

curl -X POST https://api.flurryport.io/api/v1/capture/{projectId}/{endpointSlug} \
  -H "Content-Type: application/json" \
  -d '{"event": "test.webhook", "data": {"id": "evt_123"}}'

Provider detection

FlurryPORT automatically detects the webhook provider from request headers:

HeaderProvider
Stripe-SignatureStripe
X-Hub-Signature-256GitHub
X-Shopify-Hmac-Sha256Shopify
X-Slack-SignatureSlack
X-Twilio-SignatureTwilio

The provider hint and event type (e.g.,

checkout.session.completed

) are stored as metadata for filtering — they don’t affect how the payload is stored.

Payload limits

PlanMax payloadRetention
Deckhand (free)64 KB3 days
First Mate1 MB20 days
Captain10 MB45 days

Authentication

Authenticated API operations (managing replay targets, triggering replays from the CLI, etc.) use a Personal Access Token (PAT). Generate one in Settings → Access Tokens.

# Generate in the UI, token shown once:
fp_a1b2c3d4e5f6...

# Use in requests:
Authorization: Bearer fp_a1b2c3d4e5f6...

Tokens are SHA256-hashed at rest. Set an expiry when creating — expired tokens are automatically rejected. Revoke compromised tokens immediately in Settings.

Webhook replay compatibility

When replaying webhooks with HMAC signature verification (e.g., Stripe), keep in mind:

1
Timestamp tolerance — Stripe rejects signatures older than 5 minutes by default. Extend the tolerance in your handler: tolerance: 86400 (24 hours).
2
API version mismatch — Replayed captures may use an older Stripe API version. Set throwOnApiVersionMismatch: false in your Stripe SDK.
3
Idempotency — Replayed webhooks carry the same event ID. If your handler uses idempotency keys, replays will be skipped. This is expected for regression testing.
💡 FlurryPORT preserves the original raw bytes via envelope encryption. The HMAC signature will validate as long as you extend the timestamp tolerance.