Skip to content

Check whether an update is available for the client (canonical)

GET
/v1/public/aether/update_check
curl --request GET \
--url 'https://api.aetherpush.com/v1/public/aether/update_check?deployment_key=example&is_companion=true&platform=ios'

Canonical Aether acquisition endpoint. Called by the React Native SDK at launch to determine if a newer JS bundle is available. Response fields use snake_case, wrapped in update_info. Successor to /v0.1/public/codepush/update_check with an identical payload.

deployment_key
required
string

Deployment key (provided in app bundle config).

app_version
string

Binary version of the installed app (semver). Missing or empty answers 200 with is_available false, same as an unresolved deployment key.

package_hash
string
client_unique_id
string
is_companion
string
Allowed values: true false
label
string
platform
string
Allowed values: ios android

Optional coarse client platform. Invalid values are dropped; never used for update selection.

os_version
string

Optional OS version; server keeps the leading major digits only.

react_native_version
string
/^[0-9]{1,3}\.[0-9]{1,3}$/

Optional React Native version as major.minor.

sdk_version
string
/^[0-9A-Za-z.+-]{1,32}$/

Optional SDK version string for telemetry.

Update info. is_available: false means no update was selected for this device: it already runs the latest eligible release, nothing targets its binary version, every enabled release covering it is an older range outranked by a newer release that targets exactly its binary version (enabled or not), its deployment key did not resolve, the deployment was deleted after the key was resolved, or the release’s download URL could not be re-signed for a reason retrying will not fix, such as a blob the storage provider no longer holds. A device outside a staged rollout receives the eligible non-rollout fallback; unavailable follows only when that fallback is not eligible. A database failure while refreshing that URL answers 503 instead.

Media typeapplication/json

Wrapper response for update_check. The actual update info lives under update_info.

object
update_info
required

Response shape consumed by the React Native SDK acquisition endpoint. Field names use snake_case for backward compatibility with react-native-code-push. Returned wrapped in { "update_info": ... }.

object
app_version
string
target_binary_range

Semver range of binary versions this update targets.

string
description
string
download_url
string format: uri
is_available
required
boolean
is_mandatory
boolean
label
string
package_hash
string
package_size
integer format: int64
should_run_binary_version
boolean
update_app_version
boolean
throttle_hours

Present only when a free tenant’s monthly active device count is at or above its quota. Hours the client should wait before its next update check. The server sends 48. Omitted when the tenant is not throttled.

integer

Example

{
"update_info": {
"app_version": "1.0.0",
"target_binary_range": "1.0.0",
"throttle_hours": 48
}
}
X-Aether-Mad-Status
string
Allowed values: over_quota_throttled

Present on an update check only when a free tenant’s monthly active device count is at or above its quota. The one current value is over_quota_throttled. The body then also carries throttle_hours on the snake_case routes, or throttleHours on legacy /updateCheck.

The deployment key resolved, but app_version is present, non-empty, and does not conform to semver after the integer and missing-patch expansions this endpoint accepts. A missing or empty app version, and a key that does not resolve (malformed or unknown), answer 200 with is_available false instead.

Media typeapplication/json
Error

Standard error envelope. code is the stable machine identifier for client branching and i18n. The wording of error is a human-readable fallback and is not part of the contract. Specialized responses keep narrower code enums where clients already branch on them.

object
error
required

Human-readable error message.

string
code
required

Stable machine code. Prefer this over matching on error. The values this API can answer with are listed in the ApiErrorCode schema of the raw document at https://api.aetherpush.com/openapi.yaml. The field stays an open string here so that a release adding a value does not invalidate this response.

string
requestId

Unique identifier for the request, also exposed as the X-Request-Id response header.

string

Example

{
"error": "The requested resource was not found.",
"code": "not_found",
"requestId": "req_abc123"
}

The request did not arrive through the trusted edge. This endpoint is unauthenticated; 403 is that refusal, not a missing bearer token.

Media typeapplication/json
Error

Standard error envelope. code is the stable machine identifier for client branching and i18n. The wording of error is a human-readable fallback and is not part of the contract. Specialized responses keep narrower code enums where clients already branch on them.

object
error
required

Human-readable error message.

string
code
required

Stable machine code. Prefer this over matching on error. The values this API can answer with are listed in the ApiErrorCode schema of the raw document at https://api.aetherpush.com/openapi.yaml. The field stays an open string here so that a release adding a value does not invalidate this response.

string
requestId

Unique identifier for the request, also exposed as the X-Request-Id response header.

string

Example

{
"error": "Forbidden",
"code": "forbidden",
"requestId": "req_abc123"
}

The request failed for a reason the server does not classify as retryable, so it carries no Retry-After. A database failure the server recognises answers 503 above instead, and a download URL that cannot be re-signed answers 200 with is_available false, described above. Everything else answers here, a Redis failure and a defect alike, so this status is not by itself evidence of either.

Media typeapplication/json
Error

Standard error envelope. code is the stable machine identifier for client branching and i18n. The wording of error is a human-readable fallback and is not part of the contract. Specialized responses keep narrower code enums where clients already branch on them.

object
error
required

Human-readable error message.

string
code
required

Stable machine code. Prefer this over matching on error. The values this API can answer with are listed in the ApiErrorCode schema of the raw document at https://api.aetherpush.com/openapi.yaml. The field stays an open string here so that a release adding a value does not invalidate this response.

string
requestId

Unique identifier for the request, also exposed as the X-Request-Id response header.

string

Example

{
"error": "The requested resource was not found.",
"code": "not_found",
"requestId": "req_abc123"
}

A database read this request depends on could not be completed, so no update decision was made. Retryable: Retry-After carries the seconds to wait. All three of the request’s reads answer this way: resolving the deployment key when nothing is cached for it, reading that deployment’s releases, and refreshing the download URL of a release the deployment would serve, which covers the staged-rollout candidate as well as the current one, so a failure on either answers this way for every device whose response is not already cached. Whichever of the three an outage reaches, the status is the same, so it no longer depends on which of them the server had cached, and a device is never told it is up to date because the server could not reach its database.

Media typeapplication/json

Returned with HTTP 503 when the server could not complete an operation for a reason it expects to pass, and says so rather than answering as though it had. On the management API, a release or deployment write could not finish because of database contention (lock wait expired, deadlock, or a serialization failure) and nothing was written, or a release upload could not read back the package it had just stored in order to sign its URL. On the acquisition endpoints, a database read the request depends on could not be completed: resolving a deployment key with nothing cached for it, reading that deployment’s releases, or refreshing the download URL of the release it would serve. The release and download-URL reads answer this way for the failures the server recognises as transient, and the deployment lookup answers this way for any failure it cannot serve from a cached entry, so an outage no longer produces a different status depending on which of them it reached. retryAfterSeconds is the minimum interval before a retry is useful for the path that failed, and is also sent as the Retry-After response header. Management lock-contention 503s use the commit lock wait; acquisition and other transient-read 503s use the deployment-cache failure grace. Those intervals are independent and can differ. code is connection_failed on every response this schema describes, management lock contention included. The operation and the message are what distinguish the paths.

object
error
required
string
code
required
string
retryAfterSeconds
required
integer
>= 1
requestId
string

Example

{
"error": "This release could not finish because another release was committing to the same deployment. No release was created. Please try again.",
"code": "connection_failed",
"retryAfterSeconds": 5,
"requestId": "req_abc123"
}
Retry-After
integer

Seconds to wait before retrying.