AppsinityAPPSINITY
APIs

Webhooks

Nothing on Appsinity will call you. There is no endpoint registration, no signed delivery, no retry queue and no event feed. Every state change has to be read by asking.

Open Appsinity Studio

What does not exist

FeatureStatusNearest available
Endpoint registrationNoneNot possible
Outbound event deliveryNonePoll the read endpoint
HMAC signatures on eventsNoneNot applicable
Retry or replay queueNoneYour own scheduler
Dead-letter or failure viewNoneYour own log
Build-signed notificationNoneThe signer polls every 30 seconds
Review notificationNoneRe-read /api/listing-reviews
Payout status eventNoneRead the payout request row
Report or takedown alertNoneEmail from support
Note: The one asynchronous job that does run on the platform is internal: an auto-signer that polls for unsigned Android builds on a thirty-second cycle. It is a poller, not a webhook, and it does not notify you when it finishes.

Polling loops that work

Intervals here are advice, not a documented quota; there is no published limit to stay inside.
You want to knowAsk thisSane intervalWhat changed looks like
A build finished signingGET /api/listings/:id60s until done, then stopsigningStatus and signedApkUrl
A review was postedGET /api/listing-reviews5 to 15 minA newer updatedAt than your last seen
Traffic movedGET /api/listing-analyticshourly or dailyA larger downloads or visits
A listing went liveGET /api/catalog or the listing5 minThe row appears or its status changes
A payout progressedthe payout request documentdailyIts status field
A stream startedGET /api/streams/scheduledat the scheduled minuteThe entry's live state
Watch out: Reading analytics has a write side effect: it recomputes and patches the counters onto the listing document. A five-second polling loop is therefore not a harmless read.

Designing a poller

  1. Store a cursor. Keep the last value you acted on — a timestamp, a status, a count — and only fire on a change.
  2. Back off on error. Exponential backoff up to a floor of about sixty seconds. A 500 here is transient more often than not.
  3. Re-auth once on 401. Fetch a fresh token, retry once, then stop and alert rather than looping against an expired session.
  4. Respect that reads are cheap. These are indexed aggregates, so a modest interval costs the platform little. What hurts is a loop that fans out per listing.
  5. Treat absence as unknown. Nothing tells you that a decision was made. No change means no information, not approval.

Frequently asked questions

Is a webhook planned?

No. Nothing in the current platform calls out to a developer endpoint, and this page exists so the absence is not discovered mid-integration.

How do I learn that my listing was suspended?

You do not get a push. The status is visible in Studio and in the listing document, and the store's catalogue read simply stops including the row.

Can I at least get an email?

Email exists for account events: verification codes, team invitations and app-deletion confirmation. Not for publishing state.

How often can I poll?

There is no documented quota, see Rate limits. Poll at a human interval and keep a cursor so a run is cheap.

Need help?

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