AppsinityAPPSINITY
APIs

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 Studio

The four surfaces

Every endpoint documented on this site belongs to exactly one of these services.
ServiceBase URLAuthWhat it owns
Studio APIhttps://api.appsinity.comBearer session tokenAccounts, listings, analytics, reviews, teams, ads, webpages, licences
Store APIhttps://api.appsinity.com through the store serverNone for readsCatalogue, listing pages, traffic events, streams, support
Upload servicethe appsinity-upload WorkerBearer session tokenPresigned PUTs and object HEAD info
Payments servicethe Razorpay proxy WorkerNone; key pairs server-sideDonation order creation and signature verification
Note: Both Cloudflare Workers answer with 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 ok where the handler bothers to set one; list endpoints return the collection under a named key such as items, games, reviews or sources.
  • 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 OPTIONS with 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 limits
Watch out: A 500 from these services is a genuine unhandled failure, and there are a lot of them wired in: the handler count is roughly fifty-three 500 paths against nineteen 404 paths. Log the response body; it names the failing operation.

How 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.

RelationContentsNotes
studio_usersOne row per developer accountuid, email, display_name, onboarding_complete, approval_status
studio_docsEverything else, keyed by collection + id + owner_uid + JSONB dataListings live here as collections games and apps
listing_eventsOne row per view or download eventsource, country, event_type, uid
listing_reviewsOne row per (collection, listing, uid)Rating and text, upserted
web_game_sessionsReported play sessionsplay_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, supportTickets
Watch out: The patch is a JSONB merge. A field you omit keeps its old value, and the only way to clear one is to write it as empty explicitly. This surprises anyone who builds a partial payload and expects a replace.

Public, optional and gated routes

Three tiers exist on the Studio API, and the tier is enforced per handler rather than by a global middleware.

TierExamplesToken behaviour
PublicGET /api/catalog, GET /api/developers/:id, GET /api/listing-traffic, GET /api/streams/scheduledNot required
OptionalPOST /api/listing-traffic, POST /api/listing-playA 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
Note: Optional auth is a real consequence for your metrics: a traffic event recorded from a signed-out visitor is counted, it simply carries no uid. That is how anonymous reach stays measurable.

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.
Not available: Read these pages as documentation of a live internal service, not as a public API contract you are entitled to build against. Nothing on this list is stable-by-promise.

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.

Need help?

Developer publishing support: [email protected]
General support: [email protected]
Partnerships: [email protected]