Errors & limits
Ingest responses are JSON. Control-plane errors use the same shape: { "error": "…" }.
HTTP status
| Code | When | What to do |
|---|---|---|
200 | Accepted (may be sampled out) | Check sampledOut / spanport.destinations |
400 | Bad JSON/protobuf body or control payload | Fix encoding / required fields |
401 | Missing / invalid / revoked API key (invalid api key) | Mint a new key; check Bearer header |
429 | Indie plan quota exceeded (plan_quota_throttled) | Upgrade via POST /v1/billing/checkout |
503 | Vault not configured for sealing destination secrets | Set SPANPORT_VAULT_MASTER_KEY |
Plan quotas (ingest)
| Plan | Included | Over quota |
|---|---|---|
| Indie | 5 GB / mo | Throttle → 429 |
| Startup | 50 GB / mo | Allowed; metered overage |
| Team | 200 GB / mo | Allowed; metered overage |
Soft limits are evaluated before decode fan-out. See billing docs in the repo for Stripe Checkout / Portal.