Skip to content

Report download of a release bundle (canonical)

POST
/v1/public/aether/report_status/download
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.

Media typeapplication/json

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
deployment_key
required
string
label
required
string
client_unique_id
required

Stable device identifier. Required. One contribution to Downloaded per device per label.

string
platform

Optional coarse client platform. Invalid values are dropped and never stored.

string
Allowed values: ios android
os_version
string
react_native_version
string
/^[0-9]{1,3}\.[0-9]{1,3}$/
sdk_version
string
/^[0-9A-Za-z.+-]{1,32}$/
key
additional properties
any

Status accepted.

Media typeapplication/json

Lightweight acknowledgment for status reports. Sent in some legacy code paths.

object
status
string
message
string
key
additional properties
any

Example generated

{
"status": "example",
"message": "example"
}

Missing deployment_key, label, or client_unique_id, or invalid combination.

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. 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"
}

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.

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.