API overview
There is no single Appsinity API. Studio, the store front, file uploads and payments are four separate services with different hosts and different credentials, and this page is the map of which one answers which question.
Open Appsinity StudioThe four surfaces
| Service | Base URL | Auth | What it owns |
|---|---|---|---|
| Studio API | https://api.appsinity.com | Bearer session token | Accounts, listings, analytics, reviews, teams, ads, webpages, licences |
| Store API | https://api.appsinity.com through the store server | None for reads | Catalogue, listing pages, traffic events, streams, support |
| Upload service | the appsinity-upload Worker | Bearer session token | Presigned PUTs and object HEAD info |
| Payments service | the Razorpay proxy Worker | None; key pairs server-side | Donation order creation and signature verification |
Access-Control-Allow-Origin: *, so they are callable from any browser origin. That is a deliberate consequence of being called from Studio pages, not an invitation to call them from a player's machine with your token.Common response rules
- Every endpoint answers JSON with
Content-Type: application/json; charset=utf-8. - Success bodies carry a boolean
okwhere the handler bothers to set one; list endpoints return the collection under a named key such asitems,games,reviewsorsources. - Errors are one shape:
{ "error": "a human sentence" }. There is no error code field, no error catalogue and no machine-readable reason, so branch on the status, not on the text. - Workers add
Cache-Control: no-store; the Studio API sends no cache headers of its own, so a CDN in front of it decides freshness. - Preflight: both Workers answer
OPTIONSwith 204 and a 24-hour max age.
// every failure you will see
{
"error": "Could not load listing analytics"
}
// and the status that actually identifies it
400 bad or missing input
401 no or invalid session token
403 authenticated but not permitted
404 row does not exist (or is not yours)
409 conflict with an existing record
500 handler threw
502 an upstream provider failed
504 a gateway timeout, see Rate limitsHow the data is stored
The Studio API is a Node service over PostgreSQL, and listings are not rows with columns. Almost everything is a JSON document in one table.
| Relation | Contents | Notes |
|---|---|---|
studio_users | One row per developer account | uid, email, display_name, onboarding_complete, approval_status |
studio_docs | Everything else, keyed by collection + id + owner_uid + JSONB data | Listings live here as collections games and apps |
listing_events | One row per view or download event | source, country, event_type, uid |
listing_reviews | One row per (collection, listing, uid) | Rating and text, upserted |
web_game_sessions | Reported play sessions | play_seconds per session |
GET /api/docs/:collection -> that user's documents, newest first
GET /api/docs/:collection/:id -> one document
PATCH /api/docs/:collection/:id -> data = data || patch (a merge, not a replace)
DELETE /api/docs/:collection/:id
// collections whose rows are only readable by their owner
webpages, notifications, payoutRequests, appeals, supportTicketsPublic, optional and gated routes
Three tiers exist on the Studio API, and the tier is enforced per handler rather than by a global middleware.
| Tier | Examples | Token behaviour |
|---|---|---|
| Public | GET /api/catalog, GET /api/developers/:id, GET /api/listing-traffic, GET /api/streams/scheduled | Not required |
| Optional | POST /api/listing-traffic, POST /api/listing-play | A valid token attaches a uid; a bad one is ignored and the write still happens |
| Gated | /api/auth/me, /api/team/*, /api/webpages/*, /api/ads/*, /api/apps/:id/builds/* | 401 without a valid bearer token |
What is not offered
- No API version in the path. Endpoints are whatever is deployed today.
- No sandbox environment and no test data mode; writes hit the same rows the store reads.
- No change log and no deprecation window. If an endpoint is documented here and behaves differently in production, production is right.
- No client libraries, no OpenAPI document, no SDK.
- No keys, no OAuth and no webhooks, see API keys, OAuth and Webhooks.
Frequently asked questions
What is the base URL for everything?
Studio functionality is https://api.appsinity.com. Uploads and payments are separate Cloudflare Workers with their own hosts, and their URLs are in the Studio page source rather than in a config file you are given.
Is there a single list of endpoints?
This documentation set is the closest thing. The Studio API also answers GET /api/listing-analytics, /api/listing-reviews, /api/listing-play-stats, /api/team/*, /api/ads/*, /api/webpages/*, /api/licenses/* and /api/docs/*, plus the /api/auth/* and /api/user-auth/* account pairs.
Why do developer and player auth live on two route families?
History and separation: /api/auth/* is the developer (Studio) account, /api/user-auth/* is the store player account. Different tables, different token subjects, different profile rules.
Can I read another developer's listing?
Public listing data comes from the catalogue and the listing page, which is exactly the view a player has. Owner-only documents live in the four private collections above.
Developer publishing support: [email protected]
General support: [email protected]
Partnerships: [email protected]
APPSINITY