Errors
Every HTTP status and error body the RevenueHog APIs return, what each one means, and whether your client should fix the request, retry with backoff or drop it.
JSON endpoints return errors as { "error": "<message>" }. Store notification endpoints return plain text.
Status codes
| Status | Meaning | What to do |
|---|---|---|
200 | Accepted. On SDK endpoints this includes writes that were dropped because the bundle ID resolved to nothing. | Nothing. Verify in the dashboard if data does not appear. |
201 | Created (API key, feedback via API key). | |
204 | CORS preflight. | |
400 | Malformed JSON, a missing required field, or a validation failure. | Fix the request. Do not retry as-is. |
401 | Invalid credential. | SDK: clear the device token and re-enroll once. API key: check or replace the key. Session: sign in again. |
403 | API key lacks the required scope. | Use a key with feedback:write. |
404 | Unknown resource, or an app outside your workspace. | Check IDs. |
409 | A state conflict (experiment lifecycle, missing configuration). | Read the sentence; change state first. |
429 | Rate limited. | Wait retry-after seconds, then retry. |
5xx | Server error. | Retry with exponential backoff. |
The SDKs retry 429, 5xx and network errors up to 3 times, then queue; they drop every other 4xx.
Error messages by endpoint
| Endpoint | Messages |
|---|---|
| All SDK writes | invalid JSON, invalid device token (401), rate_limited (429) |
attest | missing keyId, attestation, challenge or bundleId, attestation too large, invalid or expired challenge, attestation verification failed, app not connected |
identify | missing appUserId, missing bundleId, attributes must be a small JSON object |
attribute | missing appUserId, missing bundleId, missing originalTransactionId |
events | missing bundleId, missing events, too many events (max 50) |
adservices | missing bundleId, missing installId, missing token |
paywall | missing bundleId, missing installId, missing appUserId, missing entitlement |
paywall/impression | missing bundleId, missing installId, missing experimentId |
| Feedback (both paths) | invalid kind, message is required, message is too long (max 5000), data must be an object, metadata must be an object, data is too large (max 8192 bytes), metadata is too large (max 8192 bytes), rating must be an integer from 1 to 5; SDK path also missing bundleId |
/api/v1/feedback | invalid API key (401), insufficient scope (403) |
/api/settings/api-keys | missing name, name too long, invalid mode, missing id, not found |
/api/settings/sdk-devices | missing deviceId, not found |
| Session endpoints | unauthorized (401) |
/api/export/revenue | unknown app (404) |
Paywall management sentences are listed on Paywall management.
Related
Last updated on
Server-to-server endpoints
The per-connection endpoints that receive App Store Server Notifications, Google Play notifications and Stripe webhooks, with verification and responses.
Rate limits
Per-minute request limits for the RevenueHog SDK, enrollment, API key, session and mobile endpoints, how 429 responses look, and how clients should back off.