Google Play Publishing
GET/api/apps/{appId}/google-play/credentials/check
Verify saved Google Play release-read credentials without opening an edit
Requires releases:read. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.
releases:readapiKeyaccessToken
Parameters
| Name | In | Type | Description |
|---|
| appIdrequired | path | string | |
| track | query | string | |
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
Responses
| Status | Meaning |
|---|
| 200 | Operation result; includes appId and packageName. Commit is not proof of publication. |
| 400 | Invalid input or Google API error; details retain upstream status and review action |
| 401 | Authentication required |
| 403 | Insufficient scope, app binding, or administrator role |
| 404 | App not found in the authenticated organization |
GET/api/apps/{appId}/google-play/releases
List Google Play review lifecycle states; policy explanations are unavailable
Requires releases:read. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.
releases:readapiKeyaccessToken
Parameters
| Name | In | Type | Description |
|---|
| appIdrequired | path | string | |
| track | query | string | |
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
Responses
| Status | Meaning |
|---|
| 200 | Operation result; includes appId and packageName. Commit is not proof of publication. |
| 400 | Invalid input or Google API error; details retain upstream status and review action |
| 401 | Authentication required |
| 403 | Insufficient scope, app binding, or administrator role |
| 404 | App not found in the authenticated organization |
POST/api/apps/{appId}/google-play/release/plan
Preview full track release replacement without writing
Requires releases:read. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.
releases:readapiKeyaccessToken
Parameters
| Name | In | Type | Description |
|---|
| appIdrequired | path | string | |
| track | query | string | |
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
| Idempotency-Key | header | string | Unique retry key retained for 24 hours (maximum 255 characters). |
Request body
| Field | Type | Description |
|---|
| versionCodesrequired | array | |
| status | string (draft | completed | inProgress | halted) | |
| userFraction | number | |
| name | string | |
| releaseNotes | array | |
Responses
| Status | Meaning |
|---|
| 200 | Operation result; includes appId and packageName. Commit is not proof of publication. |
| 400 | Invalid input or Google API error; details retain upstream status and review action |
| 401 | Authentication required |
| 403 | Insufficient scope, app binding, or administrator role |
| 404 | App not found in the authenticated organization |
POST/api/apps/{appId}/google-play/edits
Open a Google Play edit; may invalidate an earlier edit
Requires releases:write. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.
releases:writeapiKeyaccessToken
Parameters
| Name | In | Type | Description |
|---|
| appIdrequired | path | string | |
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
| Idempotency-Key | header | string | Unique retry key retained for 24 hours (maximum 255 characters). |
Responses
| Status | Meaning |
|---|
| 200 | Operation result; includes appId and packageName. Commit is not proof of publication. |
| 400 | Invalid input or Google API error; details retain upstream status and review action |
| 401 | Authentication required |
| 403 | Insufficient scope, app binding, or administrator role |
| 404 | App not found in the authenticated organization |
GET/api/apps/{appId}/google-play/edits/{editId}
Read an edit
Requires releases:read. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.
releases:readapiKeyaccessToken
Parameters
| Name | In | Type | Description |
|---|
| appIdrequired | path | string | |
| editIdrequired | path | string | |
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
Responses
| Status | Meaning |
|---|
| 200 | Operation result; includes appId and packageName. Commit is not proof of publication. |
| 400 | Invalid input or Google API error; details retain upstream status and review action |
| 401 | Authentication required |
| 403 | Insufficient scope, app binding, or administrator role |
| 404 | App not found in the authenticated organization |
DELETE/api/apps/{appId}/google-play/edits/{editId}
Discard an edit
Requires releases:write. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.
releases:writeapiKeyaccessToken
Parameters
| Name | In | Type | Description |
|---|
| appIdrequired | path | string | |
| editIdrequired | path | string | |
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
| Idempotency-Key | header | string | Unique retry key retained for 24 hours (maximum 255 characters). |
Responses
| Status | Meaning |
|---|
| 200 | Operation result; includes appId and packageName. Commit is not proof of publication. |
| 400 | Invalid input or Google API error; details retain upstream status and review action |
| 401 | Authentication required |
| 403 | Insufficient scope, app binding, or administrator role |
| 404 | App not found in the authenticated organization |
POST/api/apps/{appId}/google-play/edits/{editId}/validate
Validate an edit without committing
Requires releases:write. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.
releases:writeapiKeyaccessToken
Parameters
| Name | In | Type | Description |
|---|
| appIdrequired | path | string | |
| editIdrequired | path | string | |
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
| Idempotency-Key | header | string | Unique retry key retained for 24 hours (maximum 255 characters). |
Responses
| Status | Meaning |
|---|
| 200 | Operation result; includes appId and packageName. Commit is not proof of publication. |
| 400 | Invalid input or Google API error; details retain upstream status and review action |
| 401 | Authentication required |
| 403 | Insufficient scope, app binding, or administrator role |
| 404 | App not found in the authenticated organization |
GET/api/apps/{appId}/google-play/edits/{editId}/bundles
List bundles within an edit
Requires releases:read. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.
releases:readapiKeyaccessToken
Parameters
| Name | In | Type | Description |
|---|
| appIdrequired | path | string | |
| editIdrequired | path | string | |
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
Responses
| Status | Meaning |
|---|
| 200 | Operation result; includes appId and packageName. Commit is not proof of publication. |
| 400 | Invalid input or Google API error; details retain upstream status and review action |
| 401 | Authentication required |
| 403 | Insufficient scope, app binding, or administrator role |
| 404 | App not found in the authenticated organization |
POST/api/apps/{appId}/google-play/edits/{editId}/bundle-upload
Start a resumable AAB upload directly to Google
Requires releases:write. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported. Returns a secret uploadUrl capability, never OAuth credentials. PUT AAB bytes directly to that URL; do not log it. The edit is not committed.
releases:writeapiKeyaccessToken
Parameters
| Name | In | Type | Description |
|---|
| appIdrequired | path | string | |
| editIdrequired | path | string | |
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
| Idempotency-Key | header | string | Unique retry key retained for 24 hours (maximum 255 characters). |
Request body
| Field | Type | Description |
|---|
| sizerequired | integer | |
Responses
| Status | Meaning |
|---|
| 200 | Operation result; includes appId and packageName. Commit is not proof of publication. |
| 400 | Invalid input or Google API error; details retain upstream status and review action |
| 401 | Authentication required |
| 403 | Insufficient scope, app binding, or administrator role |
| 404 | App not found in the authenticated organization |
GET/api/apps/{appId}/google-play/edits/{editId}/listings
Read localized listings in an edit
Requires releases:read. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.
releases:readapiKeyaccessToken
Parameters
| Name | In | Type | Description |
|---|
| appIdrequired | path | string | |
| editIdrequired | path | string | |
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
Responses
| Status | Meaning |
|---|
| 200 | Operation result; includes appId and packageName. Commit is not proof of publication. |
| 400 | Invalid input or Google API error; details retain upstream status and review action |
| 401 | Authentication required |
| 403 | Insufficient scope, app binding, or administrator role |
| 404 | App not found in the authenticated organization |
PUT/api/apps/{appId}/google-play/edits/{editId}/listings
Stage localized listing text
Requires releases:write. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.
releases:writeapiKeyaccessToken
Parameters
| Name | In | Type | Description |
|---|
| appIdrequired | path | string | |
| editIdrequired | path | string | |
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
| Idempotency-Key | header | string | Unique retry key retained for 24 hours (maximum 255 characters). |
Request body
| Field | Type | Description |
|---|
| localesrequired | array | |
Responses
| Status | Meaning |
|---|
| 200 | Operation result; includes appId and packageName. Commit is not proof of publication. |
| 400 | Invalid input or Google API error; details retain upstream status and review action |
| 401 | Authentication required |
| 403 | Insufficient scope, app binding, or administrator role |
| 404 | App not found in the authenticated organization |
PUT/api/apps/{appId}/google-play/edits/{editId}/tracks/{track}
Replace all releases on this track within an edit
Requires releases:write. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.
releases:writeapiKeyaccessToken
Parameters
| Name | In | Type | Description |
|---|
| appIdrequired | path | string | |
| editIdrequired | path | string | |
| trackrequired | path | string | |
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
| Idempotency-Key | header | string | Unique retry key retained for 24 hours (maximum 255 characters). |
Request body
| Field | Type | Description |
|---|
| versionCodesrequired | array | |
| status | string (draft | completed | inProgress | halted) | |
| userFraction | number | |
| name | string | |
| releaseNotes | array | |
Responses
| Status | Meaning |
|---|
| 200 | Operation result; includes appId and packageName. Commit is not proof of publication. |
| 400 | Invalid input or Google API error; details retain upstream status and review action |
| 401 | Authentication required |
| 403 | Insufficient scope, app binding, or administrator role |
| 404 | App not found in the authenticated organization |
POST/api/apps/{appId}/google-play/edits/{editId}/commit
Validate and commit; fail if changes are already in review
Requires releases:write. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported. A commit is not publication. deferReview=true requires subsequent Play Console submission. No automatic retry or review cancellation.
releases:writeapiKeyaccessToken
Parameters
| Name | In | Type | Description |
|---|
| appIdrequired | path | string | |
| editIdrequired | path | string | |
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
| Idempotency-Key | header | string | Unique retry key retained for 24 hours (maximum 255 characters). |
Request body
| Field | Type | Description |
|---|
| deferReview | boolean | |
Responses
| Status | Meaning |
|---|
| 200 | Operation result; includes appId and packageName. Commit is not proof of publication. |
| 400 | Invalid input or Google API error; details retain upstream status and review action |
| 401 | Authentication required |
| 403 | Insufficient scope, app binding, or administrator role |
| 404 | App not found in the authenticated organization |
POST/api/apps/{appId}/google-play/rollout/{track}
Update or halt one existing rollout and commit, preserving other releases
Requires releases:write. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported. Opens and commits a new edit. Coordinate per-app jobs to avoid invalidating other edits. Fraction cannot decrease; 1 completes rollout.
releases:writeapiKeyaccessToken
Parameters
| Name | In | Type | Description |
|---|
| appIdrequired | path | string | |
| trackrequired | path | string | |
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
| Idempotency-Key | header | string | Unique retry key retained for 24 hours (maximum 255 characters). |
Request body
| Field | Type | Description |
|---|
| actionrequired | string (set | halt) | |
| versionCoderequired | string | |
| fraction | number | Required for set |
Responses
| Status | Meaning |
|---|
| 200 | Operation result; includes appId and packageName. Commit is not proof of publication. |
| 400 | Invalid input or Google API error; details retain upstream status and review action |
| 401 | Authentication required |
| 403 | Insufficient scope, app binding, or administrator role |
| 404 | App not found in the authenticated organization |
POST/api/apps/{appId}/google-play/data-safety
Upload Data safety CSV outside the edit workflow
Requires releases:write. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.
releases:writeapiKeyaccessToken
Parameters
| Name | In | Type | Description |
|---|
| appIdrequired | path | string | |
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
| Idempotency-Key | header | string | Unique retry key retained for 24 hours (maximum 255 characters). |
Request body
| Field | Type | Description |
|---|
| safetyLabelsrequired | string | Google Data safety CSV, maximum 1 MiB |
Responses
| Status | Meaning |
|---|
| 200 | Operation result; includes appId and packageName. Commit is not proof of publication. |
| 400 | Invalid input or Google API error; details retain upstream status and review action |
| 401 | Authentication required |
| 403 | Insufficient scope, app binding, or administrator role |
| 404 | App not found in the authenticated organization |
Keywords
GET/api/keywords
List keywords
Lists the tracked keywords of your organization, optionally filtered by appId. Requires the keywords:read scope. For stable traversal, set pagination=cursor; the response becomes {items, nextCursor} and is ordered by _id. Pass nextCursor back as cursor until it is null. The default array response and offset pagination remain unchanged when cursor pagination is not requested.
keywords:readapiKeyaccessToken
Parameters
| Name | In | Type | Description |
|---|
| appId | query | string | |
| pagination | query | string (cursor) | Set to cursor for a stable page envelope |
| cursor | query | string | Opaque nextCursor from the preceding cursor page |
| limit | query | integer | Page size. Cursor mode defaults to 100 rows and caps at 500; the default array mode keeps 0 as unbounded. |
| skip | query | integer | |
| sortField | query | string | |
| sortDirection | query | string (ASC | DESC) | |
| fields | query | string | Comma-separated projection of fields to return |
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
Responses
| Status | Meaning |
|---|
| 200 | Array of keywords, or {items, nextCursor} in cursor mode |
| 400 | Malformed cursor, or a sort incompatible with cursor pagination |
| 401 | Missing or invalid credentials |
| 403 | API key is missing the keywords:read scope |
| 429 | API key rate limit exceeded |
POST/api/keywords
Create a keyword
Requires the keywords:write scope.
keywords:writeapiKeyaccessToken
Parameters
| Name | In | Type | Description |
|---|
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
| Idempotency-Key | header | string | Unique retry key retained for 24 hours (maximum 255 characters). |
Responses
| Status | Meaning |
|---|
| 200 | The created keyword |
| 403 | API key is missing the keywords:write scope |
GET/api/keywords/{keywordId}
Get a keyword by id
Requires the keywords:read scope.
keywords:readapiKeyaccessToken
Parameters
| Name | In | Type | Description |
|---|
| keywordIdrequired | path | string | |
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
Responses
| Status | Meaning |
|---|
| 200 | The keyword |
| 403 | API key is missing the keywords:read scope |
| 404 | No such keyword in your organization |
PUT/api/keywords/{keywordId}
Update a keyword
Requires the keywords:write scope.
keywords:writeapiKeyaccessToken
Parameters
| Name | In | Type | Description |
|---|
| keywordIdrequired | path | string | |
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
| Idempotency-Key | header | string | Unique retry key retained for 24 hours (maximum 255 characters). |
Responses
| Status | Meaning |
|---|
| 200 | The updated keyword |
| 404 | No such keyword in your organization |
DELETE/api/keywords/{keywordId}
Delete a keyword
Requires the keywords:write scope.
keywords:writeapiKeyaccessToken
Parameters
| Name | In | Type | Description |
|---|
| keywordIdrequired | path | string | |
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
| Idempotency-Key | header | string | Unique retry key retained for 24 hours (maximum 255 characters). |
Responses
| Status | Meaning |
|---|
| 200 | Deleted |
| 404 | No such keyword in your organization |
Sandbox
GET/api/sandbox/keywords
Read sandbox keyword ranks without authentication
Returns a fixed set of demonstration keyword-rank rows in the same {searchTerms, store, country, rank} shape as authenticated keyword reads. No account, credential, or key is required, so agents can evaluate the API before onboarding. Responses carry the standard RateLimit response headers and the anonymous pacing limit applies.
Parameters
| Name | In | Type | Description |
|---|
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
Responses
| Status | Meaning |
|---|
| 200 | Demonstration keyword-rank rows. |
| 429 | Anonymous rate limit exceeded; retry after Retry-After seconds. |
POST/api/sandbox/rankchecks
Start a demonstration asynchronous rank check
Demonstrates the API's asynchronous-job pattern without authentication. The response is 202 Accepted with a Location header pointing at the job resource and a body carrying the job _id and status. Poll the Location URL until the status is succeeded, then read the ranks from the job body. The job is deterministic fixture work that completes about two seconds after creation.
Parameters
| Name | In | Type | Description |
|---|
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
| Idempotency-Key | header | string | Unique retry key retained for 24 hours (maximum 255 characters). |
Responses
| Status | Meaning |
|---|
| 202 | Job accepted; poll the Location URL for the result. |
| 429 | Anonymous rate limit exceeded; retry after Retry-After seconds. |
GET/api/sandbox/rankchecks/{jobId}
Poll a demonstration rank check
Reads the status of a demonstration job started at POST /api/sandbox/rankchecks. While the job runs the status is running; afterwards it is succeeded and the body carries the checked term's rank in every store carrying it. No authentication is required.
Parameters
| Name | In | Type | Description |
|---|
| jobIdrequired | path | string | |
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
Responses
| Status | Meaning |
|---|
| 200 | Current job state. |
| 404 | Unknown job id. |
Webhook subscriptions
GET/api/webhooksubscriptions
List webhook subscriptions
Webhook subscriptions deliver app.created, app.updated, keyword.created, keyword.updated and keyword.deleted events to your server as signed POST requests (X-Appskyline-Signature: t=<timestamp>,v1=<hex HMAC-SHA256 of "timestamp.body">). An endpoint failing 20 times in a row is disabled automatically. Subscriptions are managed with an operator access token; the secret is only returned once, on create.
accessToken
Parameters
| Name | In | Type | Description |
|---|
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
Responses
| Status | Meaning |
|---|
| 200 | Array of webhook subscriptions (without secrets) |
POST/api/webhooksubscriptions
Create a webhook subscription
The response includes the signing secret exactly once — store it; it cannot be retrieved again.
accessToken
Parameters
| Name | In | Type | Description |
|---|
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
| Idempotency-Key | header | string | Unique retry key retained for 24 hours (maximum 255 characters). |
Request body
| Field | Type | Description |
|---|
| urlrequired | string | |
| events | array (app.created | app.updated | keyword.created | keyword.updated | keyword.deleted) | Empty array subscribes to all events |
Responses
| Status | Meaning |
|---|
| 200 | The created subscription, including its secret |
PUT/api/webhooksubscriptions/{webhookSubscriptionId}
Update a webhook subscription
url, events and active are editable; the secret and organization are immutable. Re-enabling an auto-disabled endpoint is done by setting active back to true.
accessToken
Parameters
| Name | In | Type | Description |
|---|
| webhookSubscriptionIdrequired | path | string | |
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
| Idempotency-Key | header | string | Unique retry key retained for 24 hours (maximum 255 characters). |
Responses
| Status | Meaning |
|---|
| 200 | The updated subscription (without secret) |
DELETE/api/webhooksubscriptions/{webhookSubscriptionId}
Delete a webhook subscription
accessToken
Parameters
| Name | In | Type | Description |
|---|
| webhookSubscriptionIdrequired | path | string | |
| API-Version | header | string (1) | Compatibility version. Omit to use version 1; unsupported versions return 400. |
| Idempotency-Key | header | string | Unique retry key retained for 24 hours (maximum 255 characters). |
Responses