Intake Relay billing, auth, and quota

Production API base: https://willowriverautomation.com/relay/v1

Auth & signup

You can sign up through the signup page or via API:

curl -X POST https://willowriverautomation.com/relay/v1/auth/signup \
  -H 'Content-Type: application/json' \
  -d '{"email":"you@example.com","password":"your-long-password","org_name":"My SaaS"}'

# Verify with the code from your email:
curl -X POST https://willowriverautomation.com/relay/v1/auth/verify \
  -H 'Content-Type: application/json' \
  -d '{"email":"you@example.com","code":"123456"}'

# Mint an API key (shown once; re-run to rotate and revoke previous keys):
curl -X POST https://willowriverautomation.com/relay/v1/auth/api-key \
  -H 'Content-Type: application/json' \
  -d '{"email":"you@example.com","password":"your-long-password"}'

Account & billing API

curl https://willowriverautomation.com/relay/v1/account \
  -H "Authorization: Bearer mfk_..."

curl -X PATCH https://willowriverautomation.com/relay/v1/account/billing \
  -H "Authorization: Bearer mfk_..." \
  -H 'Content-Type: application/json' \
  -d '{"allow_overage": true}'

curl -X POST https://willowriverautomation.com/relay/v1/billing/checkout \
  -H "Authorization: Bearer mfk_..." \
  -H 'Content-Type: application/json' \
  -d '{"plan":"starter"}'

Checkout and customer portal URLs are returned in the API response. Paid plans are billed through Stripe.

Plan limits (enforced in API)

These limits match the Intake Relay pricing page. The API enforces them at request time. Check current usage with GET /v1/account or GET /v1/billing/usage (see API reference).

Limit Free Starter Growth Scale
Intake submissions / period 10 2,000 20,000 Custom
Flows 1 5 Unlimited Unlimited
Webhook endpoints (active) 1 3 10 Custom
Version pinning (?version=N) Yes Yes Yes Yes
Webhook retries + delivery log Yes Yes Yes Yes
File uploads No Yes Yes Yes
File upload size (per file) No 10 MB 10 MB By request
Uploaded file retention No 60 days 60 days 60 days
Overage (submissions past cap) No Opt in @ $0.05/sub Opt in @ $0.025/sub Custom

Periods: Free usage rolls every 30 days from email verification. Paid periods follow the Stripe subscription cycle.

Enforcement:

Limit When checked Error code HTTP
Submissions POST /flows/{id}/intake quota_exceeded 429
Flows POST /flows quota_exceeded 429
Webhooks POST /flows/{id}/webhooks quota_exceeded 429
File uploads presign or intake with file fields uploads_not_available 403
File size presign (paid plans) validation_error 400
Version pin intake/presign without ?version=N when required version_required 400
Billing inactive any write while past due / canceled billing_inactive 402

File upload attempts on the free plan return uploads_not_available (HTTP 403). On paid plans, presigned uploads are capped at 10 MB per file (UPLOAD_MAX_BYTES). Uploaded objects are deleted after 60 days via GCS bucket lifecycle. Scale customers can request higher per file limits by contact.

Webhook retries (exponential backoff, up to 5 attempts) and the delivery log (GET /flows/{id}/webhooks/deliveries) are available on all plans. See Webhooks.

After a plan downgrade, excess active webhook endpoints may be deactivated automatically (oldest kept first).