API access · Methodology · Public, citable
How AppMeta Pulse
talks to App Store Connect.
AppMeta Pulse authenticates to App Store Connect using Apple's official API with a key you generate in your own account. This page documents which endpoints the app calls, which API key role each one needs, how the short-lived JWT tokens are signed and refreshed, where credentials live, and what the app cannot do because of the scope it works under. You can check all of it against Apple's own documentation.
What you generate and what the app stores
App Store Connect API keys are generated in your App Store Connect account, not by AppMeta Pulse. The app cannot generate or escalate a key; it can only use the one you give it.
- Sign in to App Store Connect with an account that has permission to create API keys (Admin or Account Holder).
- Open Users and Access → Integrations → App Store Connect API.
- Generate a new key with the Admin role. AppMeta Pulse asks for Admin because it is the role that covers sales reports, App Analytics, and review replies together; App Manager and Developer keys can't read sales reports, and Apple answers them with a 403 error.
- Download the
.p8private key file. Apple only lets you download it once; if you lose it, you generate a new one. - Copy the Key ID (10-character string) and the Issuer ID (your team's UUID, shown above the keys list). Pulse also needs your Vendor Number from Payments and Financial Reports to download sales reports.
- Paste or import the
.p8file, Key ID, and Issuer ID into AppMeta Pulse. - The three values are stored together in the iPhone Keychain, the secure storage iOS uses for passwords and Wi-Fi credentials. The .p8 key is kept for this device only.
- The .p8 key is never written to plain files, iCloud Drive, iCloud Sync, or any server, and the app contains no analytics SDKs. With iCloud Sync on, the account name and vendor number you entered sync to your own private iCloud database; the key stays on this iPhone.
- Revoke the key any time in App Store Connect → Users and Access → Integrations. Revocation takes effect at Apple's API immediately; the app cannot circumvent it.
How each request is signed
Per Apple's documented requirements for API tokens, every request to the App Store Connect API must include a short-lived JSON Web Token signed with ES256 using your private key. AppMeta Pulse does this signing locally, so the .p8 private key never leaves your device.
alg: ES256, kid: <your Key ID>, typ: JWT. Payload: iss: <your Issuer ID>, iat: <now>, exp: <now + ≤20 min>, aud: appstoreconnect-v1. Apple's documentation specifies a maximum token lifetime of 20 minutes, and the API rejects tokens with a longer expiry.Authorization: Bearer <token> header on each HTTPS request to https://api.appstoreconnect.apple.com. The request goes directly to Apple, with no intermediate proxy, Lagerland server, or third-party analytics endpoint in between.iat and exp. There is no refresh token in the OAuth sense; Apple's API uses self-signed short-lived JWTs only.Endpoints called and the role each needs
AppMeta Pulse asks for one key with the Admin role, because that role covers everything below. Apple's role permissions decide what a key can reach; when a request is refused, Settings → Connection in the app shows which data source failed and why.
GET /v1/salesReports with report type SALES, daily (and yearly for the By Year chart), using your Vendor Number. Returns units, customer price, and developer proceeds per product and territory.Role: Admin. App Manager and Developer keys can list your apps but can't download sales reports; Apple answers them with a 403 error, and the app says so at sign-in.
This is the endpoint that drives the proceeds, sales, downloads, and territory views.
GET /v1/salesReports with report types SUBSCRIPTION and SUBSCRIPTION_EVENT, daily.Role: Admin, as for the Sales report.
Drives the subscription views: MRR, active subscriptions, trials, churn, and cancellations. The trial and conversion figures are estimates built from new subscriptions and the current number of active trials, not an exact trial-to-paid rate.
GET on /v1/apps/{id}/analyticsReportRequests, the reports, instances, and segments under it, plus the time-limited download links Apple returns; and POST /v1/analyticsReportRequests for an app that has no request yet (an ongoing one, plus a one-time snapshot for history on the first sync), which asks Apple to start preparing the reports.Role: Admin. With a key that lacks it, Pulse skips analytics for that app and reports it in Settings → Connection.
Drives impressions, product page views, and the App Store conversion funnel.
GET /v1/apps, each app's in-app purchases and subscription groups, and GET /v1/apps/{id}/customerReviews with any developer responses.Role: a key that can't post replies can still read reviews; replying needs Admin, and the app asks for an Admin key when a reply is refused.
Drives the app list, product names, and the reviews screens.
POST, PATCH, and DELETE on /v1/customerReviewResponses when you send, edit, or delete a review reply, and POST /v1/analyticsReportRequests, which asks Apple to start preparing your analytics reports.What the app can and cannot change
There are two layers of limits: what the app's code does, and what your key's role allows.
- The network layer reads with
GET. Its only writes are review replies you send (POST,PATCH,DELETEon customer review responses) and analytics report requests (POST). There is no code for builds, metadata, pricing, or TestFlight. - The UI has no "submit," "publish," metadata, or pricing controls. The only buttons that change App Store Connect are Reply (to one review or a batch of up to 25), Edit, and Delete on your own review responses.
- You cannot push the wrong build or raise the wrong price inside AppMeta Pulse, because the code for it does not exist.
- The role you set on the API key determines what the key can do. An Admin key could change far more than Pulse ever asks of it. What Pulse can change is set by its code, listed on the left.
- You can revoke the key in App Store Connect at any time; the next API call from AppMeta Pulse fails with a 401 error, and Settings → Connection shows it.
- Apple's API enforces the role on every request and does not rely on trusting the calling app.
How fresh the data is
App Store Connect's own reporting cadence is the upper bound on freshness; no third-party dashboard can be faster than Apple's source data.
What we do not promise
- Numbers can never be fresher than Apple's reporting cadence. Pulse can't make Apple publish its reports sooner.
- Pulse converts every amount into your display currency with the European Central Bank's monthly average rates. Apple pays with its own exchange rates and after withholding and bank fees, so converted totals will not match what hits your bank account.
- If your API key's role can't read a data source (an App Manager or Developer key can't download reports), Settings → Connection says which one failed and why, so you don't get silently empty charts.
- Apple sets the App Store Connect API rate limits. Very frequent syncing can be throttled for a while.
- Where the .p8 key lives (the iPhone Keychain, never iCloud Drive, a plaintext file, or a third-party server).
- Where your data goes when iCloud Sync is on (your own private iCloud database, which we can't access; the .p8 key never syncs).
- What the app does with your data after fetching it (keeps it on your iPhone; nothing is sent to us, and there is no Pulse server).
- Which App Store Connect writes the app makes (only the review replies you send and analytics report requests, listed above).
About AppMeta Pulse
Use it
Try AppMeta Pulse
App Store Connect sales, subscriptions, and reviews on your iPhone. Pulse can't change your prices, builds, or metadata, the .p8 key stays in your iPhone Keychain, and your requests go only to Apple.