AppSkyline API reference

Every endpoint of the AppSkyline REST API, generated from the API itself.

All endpoints are relative to https://api.appskyline.com. Create an API key in your AppSkyline dashboard, then authenticate every request with it.

apiKey HTTP Basic auth carrying only the API key secret: Authorization: Basic base64(<key secret>).

accessToken Operator session token issued by the AppSkyline dashboard: Authorization: Token <access token>.

Download the OpenAPI specification for use with your own tooling.

Stats

GET/api/apple-app-store-engagement

Apple App Store engagement rows

Downloads/sessions engagement rows for your organization, optionally filtered by appId and a days cutoff. Requires the stats:read scope.

stats:readapiKeyaccessToken
Parameters
NameInTypeDescription
appIdquerystring
daysqueryinteger
API-Versionheaderstring (1)Compatibility version. Omit to use version 1; unsupported versions return 400.
Responses
StatusMeaning
200Array of engagement rows
403API key is missing the stats:read scope
429API key rate limit exceeded

Apps

GET/api/apps

List apps

Lists the apps of your organization. Requires the apps:read scope.

apps:readapiKeyaccessToken
Parameters
NameInTypeDescription
API-Versionheaderstring (1)Compatibility version. Omit to use version 1; unsupported versions return 400.
Responses
StatusMeaning
200Array of apps
401Missing or invalid credentials
403API key is missing the apps:read scope
429API key rate limit exceeded
POST/api/apps

Create an app

Requires the apps:write scope.

apps:writeapiKeyaccessToken
Parameters
NameInTypeDescription
API-Versionheaderstring (1)Compatibility version. Omit to use version 1; unsupported versions return 400.
Idempotency-KeyheaderstringUnique retry key retained for 24 hours (maximum 255 characters).
Responses
StatusMeaning
200The created app
403API key is missing the apps:write scope
409Domain is already taken
GET/api/apps/{appId}

Get an app by id

Requires the apps:read scope.

apps:readapiKeyaccessToken
Parameters
NameInTypeDescription
appIdrequiredpathstring
API-Versionheaderstring (1)Compatibility version. Omit to use version 1; unsupported versions return 400.
Responses
StatusMeaning
200The app
403API key is missing the apps:read scope
404No such app in your organization
PUT/api/apps/{appId}

Update an app

Requires the apps:write scope.

apps:writeapiKeyaccessToken
Parameters
NameInTypeDescription
appIdrequiredpathstring
API-Versionheaderstring (1)Compatibility version. Omit to use version 1; unsupported versions return 400.
Idempotency-KeyheaderstringUnique retry key retained for 24 hours (maximum 255 characters).
Responses
StatusMeaning
200The updated app
404No such app in your organization
409Domain is already taken

Batch

POST/api/batch

Read multiple collections in one request

Executes an array of authenticated read operations and returns an object keyed by each operation alias. Only the allowlisted app, keyword, preference, role and metadata collections can be read.

accessToken
Parameters
NameInTypeDescription
API-Versionheaderstring (1)Compatibility version. Omit to use version 1; unsupported versions return 400.
Idempotency-KeyheaderstringUnique retry key retained for 24 hours (maximum 255 characters).
Responses
StatusMeaning
200Results keyed by operation alias
401Missing or invalid credentials
403A requested collection is not batch-readable

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
NameInTypeDescription
appIdquerystring
paginationquerystring (cursor)Set to cursor for a stable page envelope
cursorquerystringOpaque nextCursor from the preceding cursor page
limitqueryintegerPage size. Cursor mode defaults to 100 rows and caps at 500; the default array mode keeps 0 as unbounded.
skipqueryinteger
sortFieldquerystring
sortDirectionquerystring (ASC | DESC)
fieldsquerystringComma-separated projection of fields to return
API-Versionheaderstring (1)Compatibility version. Omit to use version 1; unsupported versions return 400.
Responses
StatusMeaning
200Array of keywords, or {items, nextCursor} in cursor mode
400Malformed cursor, or a sort incompatible with cursor pagination
401Missing or invalid credentials
403API key is missing the keywords:read scope
429API key rate limit exceeded
POST/api/keywords

Create a keyword

Requires the keywords:write scope.

keywords:writeapiKeyaccessToken
Parameters
NameInTypeDescription
API-Versionheaderstring (1)Compatibility version. Omit to use version 1; unsupported versions return 400.
Idempotency-KeyheaderstringUnique retry key retained for 24 hours (maximum 255 characters).
Responses
StatusMeaning
200The created keyword
403API key is missing the keywords:write scope
GET/api/keywords/{keywordId}

Get a keyword by id

Requires the keywords:read scope.

keywords:readapiKeyaccessToken
Parameters
NameInTypeDescription
keywordIdrequiredpathstring
API-Versionheaderstring (1)Compatibility version. Omit to use version 1; unsupported versions return 400.
Responses
StatusMeaning
200The keyword
403API key is missing the keywords:read scope
404No such keyword in your organization
PUT/api/keywords/{keywordId}

Update a keyword

Requires the keywords:write scope.

keywords:writeapiKeyaccessToken
Parameters
NameInTypeDescription
keywordIdrequiredpathstring
API-Versionheaderstring (1)Compatibility version. Omit to use version 1; unsupported versions return 400.
Idempotency-KeyheaderstringUnique retry key retained for 24 hours (maximum 255 characters).
Responses
StatusMeaning
200The updated keyword
404No such keyword in your organization
DELETE/api/keywords/{keywordId}

Delete a keyword

Requires the keywords:write scope.

keywords:writeapiKeyaccessToken
Parameters
NameInTypeDescription
keywordIdrequiredpathstring
API-Versionheaderstring (1)Compatibility version. Omit to use version 1; unsupported versions return 400.
Idempotency-KeyheaderstringUnique retry key retained for 24 hours (maximum 255 characters).
Responses
StatusMeaning
200Deleted
404No 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
NameInTypeDescription
API-Versionheaderstring (1)Compatibility version. Omit to use version 1; unsupported versions return 400.
Responses
StatusMeaning
200Demonstration keyword-rank rows.
429Anonymous 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
NameInTypeDescription
API-Versionheaderstring (1)Compatibility version. Omit to use version 1; unsupported versions return 400.
Idempotency-KeyheaderstringUnique retry key retained for 24 hours (maximum 255 characters).
Responses
StatusMeaning
202Job accepted; poll the Location URL for the result.
429Anonymous 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
NameInTypeDescription
jobIdrequiredpathstring
API-Versionheaderstring (1)Compatibility version. Omit to use version 1; unsupported versions return 400.
Responses
StatusMeaning
200Current job state.
404Unknown 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
NameInTypeDescription
API-Versionheaderstring (1)Compatibility version. Omit to use version 1; unsupported versions return 400.
Responses
StatusMeaning
200Array 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
NameInTypeDescription
API-Versionheaderstring (1)Compatibility version. Omit to use version 1; unsupported versions return 400.
Idempotency-KeyheaderstringUnique retry key retained for 24 hours (maximum 255 characters).
Request body
FieldTypeDescription
urlrequiredstring
eventsarray (app.created | app.updated | keyword.created | keyword.updated | keyword.deleted)Empty array subscribes to all events
Responses
StatusMeaning
200The 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
NameInTypeDescription
webhookSubscriptionIdrequiredpathstring
API-Versionheaderstring (1)Compatibility version. Omit to use version 1; unsupported versions return 400.
Idempotency-KeyheaderstringUnique retry key retained for 24 hours (maximum 255 characters).
Responses
StatusMeaning
200The updated subscription (without secret)
DELETE/api/webhooksubscriptions/{webhookSubscriptionId}

Delete a webhook subscription

accessToken
Parameters
NameInTypeDescription
webhookSubscriptionIdrequiredpathstring
API-Versionheaderstring (1)Compatibility version. Omit to use version 1; unsupported versions return 400.
Idempotency-KeyheaderstringUnique retry key retained for 24 hours (maximum 255 characters).
Responses
StatusMeaning
200Deleted