Error codes
Errors here are sentences, not codes. There is no machine-readable identifier, so the only reliable branching is on the HTTP status, and the only useful debugging is on the message text you were handed.
Open Appsinity StudioThe shape
// every failure, every service
{
"error": "Invalid session"
}
// payments verification is the one exception, and it adds ok
{ "ok": false, "error": "Invalid Razorpay signature." }
// what is never present
// code, subcode, details, request_id, doc_url, trace, fieldCache-Control: no-store on errors as well as successes; the Studio API sends no cache headers on an error, so a bad response can be held by an intermediate cache.Status codes in use
| Status | How often | Meaning here | Your move |
|---|---|---|---|
| 200 | most | Success; ok: true where the handler sets it | Read the payload |
| 201 | rare | Created | None |
| 400 | very common | Input missing, malformed or over a ceiling | Fix the payload |
| 401 | common | No token, bad token, or expired token | Sign in again |
| 403 | common | Authenticated, not permitted | Ask the owner for a role |
| 404 | occasional | Row, listing or route does not exist | Check the identifier |
| 409 | rare | Conflicts with an existing record | Use the existing one |
| 500 | most of the failures | A handler threw | Retry once, then report with the body |
| 502 | payments only | Razorpay refused or failed | Report the upstream description |
| 504 | gateway | Crossed the sixty-second proxy timeout | The work may still have finished; poll state |
| 503 | storage | Object storage unavailable | Back off and retry the PUT |
Authentication and permission
| Message | Status | Cause | Fix |
|---|---|---|---|
| Sign in again first | 401 | No bearer header at all | Send Authorization: Bearer |
| Invalid session | 401 | Token present, verification failed | Log in again |
| Missing login token. | 401 | Presign called without a token | Sign in on Studio |
| Invalid or expired login token. | 401 | Token rejected by both verifiers | Re-auth, then retry |
| Sign in to write a review | 401 | Player endpoint, no verifiable token | Sign in on the store |
| Please sign in to follow creators. | 401 | Follow while signed out | Sign in |
| You do not own this document | 403 | Another account's row | Check the uid in your token |
| Only the workspace owner can manage members | 403 | Not the owner | Ask the owner to act |
| Account not found | 404 | Reset or verification for an unknown address | Correct the address |
Input and account errors
| Message | Status | Fix |
|---|---|---|
| Enter a valid email | 400 | The registration address is malformed |
| Enter a valid email address | 400 | The team invite is malformed; note the different wording |
| Password must be at least 6 characters | 400 | Lengthen it |
| Email or password is incorrect | 401 | One message for both halves, by design |
| An account with this email already exists | 409 | Sign in, or reset |
| Code expired. Please request a new one. | 400 | Resend the OTP; ten-minute window |
| Invalid verification code | 400 | Six digits, exactly, from the newest mail |
| You cannot invite yourself | 400 | Invite a different address |
| App id required | 400 | Send the listing identifier on the build route |
| Missing listing id | 400 | Use listingId, appId or gameId |
| Choose a rating first | 400 | Rating must be 1 to 5 |
| Listing not found | 404 | The row is absent or not visible |
| Page not found | 404 | A Studio webpage, not the store page |
| This domain is already connected to another page. | 409 | Disconnect it from the other page first |
| Email not found | 404 | No account for that address |
Upload and storage
| Message | Where | Fix |
|---|---|---|
| Blocked file extension: .exe | Presign | Package it inside a ZIP |
| File extension not allowed: .xyz | Presign | Use an allowed type or the web upload category |
| Valid fileName is required. | Presign | The sanitiser removed everything |
| Valid file size is required. | Presign | Send real byte length, above zero |
| Invalid upload type. | Presign | One of the four category names |
| File is too large for this upload category. | Presign | 5 GiB, or 250 MiB for app-media |
| App media must be an image or MP4 video. | Presign | png, jpg, jpeg, webp or mp4 |
| Game web uploads cannot be APK or AAB files. | Presign | Use the build category |
| gameId is required. | Presign | Send the listing id |
| Invalid bucket. | File info | Only public is accepted |
| Object key is required. | File info | Send key or objectKey |
| File info lookup failed (404). | File info | The PUT never completed |
| MinIO Worker secrets are not configured. | Worker | Platform-side; report it |
| File too large (X GB). Max 5.00 GB. | Studio client | Split or rebuild |
| Presign API failed (401). | Studio client | Token rejected; sign in again |
| Presign API failed (400). | Studio client | Bad payload from the sheet |
| Direct MinIO PUT failed (503). | Studio client | Storage unavailable; back off and retry |
| Failed to fetch | Browser | Usually a 504 on a synchronous call, not a dead backend |
Frequently asked questions
Is there an error code list I can match on?
No. Responses carry one human sentence and an HTTP status. Branch on the status; treat the text as information for a human reader.
Why does the same problem give different wording?
Because each handler writes its own string. There is no shared error catalogue, and several messages differ by a word between routes.
My call returned 500. Is that my fault?
Usually not. A 500 means the handler threw; retry once after a backoff, then report it with the exact endpoint, the payload shape and the message.
Is a request id available for support?
None is returned. Include the timestamp, the endpoint, the listing id and the message body instead — that is what identifies a request here.
Developer publishing support: [email protected]
General support: [email protected]
Partnerships: [email protected]
APPSINITY