Report download of a release bundle (canonical)
const url = 'https://api.aetherpush.com/v1/public/aether/report_status/download';const options = { method: 'POST', headers: {'Content-Type': 'application/json'}, body: '{"deployment_key":"example","label":"example","client_unique_id":"example","platform":"ios","os_version":"example","react_native_version":"example","sdk_version":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.aetherpush.com/v1/public/aether/report_status/download \ --header 'Content-Type: application/json' \ --data '{ "deployment_key": "example", "label": "example", "client_unique_id": "example", "platform": "ios", "os_version": "example", "react_native_version": "example", "sdk_version": "example" }'Canonical Aether acquisition endpoint. Successor to /v0.1/public/codepush/report_status/download with identical semantics. Counts distinct devices per label, not raw requests.
Request Bodyrequired
Section titled “Request Bodyrequired”Body shape for report_status/download. The server counts each
distinct client_unique_id once per label; repeats from the same
device return 200 without incrementing Downloaded.
object
Stable device identifier. Required. One contribution to
Downloaded per device per label.
Optional coarse client platform. Invalid values are dropped and never stored.
Responses
Section titled “Responses”Status accepted.
Lightweight acknowledgment for status reports. Sent in some legacy code paths.
object
Example generated
{ "status": "example", "message": "example"}Missing deployment_key, label, or client_unique_id, or invalid combination.
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
Human-readable error message.
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.
Unique identifier for the request, also exposed as the X-Request-Id response header.
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.
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
Human-readable error message.
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.
Unique identifier for the request, also exposed as the X-Request-Id response header.
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.
Everything else answers here, a Redis failure and a defect
alike, so this status is not by itself evidence of either.
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
Human-readable error message.
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.
Unique identifier for the request, also exposed as the X-Request-Id response header.
Example
{ "error": "The requested resource was not found.", "code": "not_found", "requestId": "req_abc123"}The deployment key could not be resolved because the server
could not reach its database, and nothing was cached for that
key. Retryable: Retry-After carries the seconds to wait.
This is the cold-key case, not a whole-server refusal: a key
the server still holds in its deployment cache resolves
normally during the same outage, and the rest of this
request reads Redis rather than the database.
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
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"}Headers
Section titled “Headers”Seconds to wait before retrying.