Production API base: https://willowriverautomation.com/relay/v1
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"}'
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.
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).