Skip to content

Get install/active/failure metrics for a deployment

GET
/v1/apps/{appName}/deployments/{deploymentName}/metrics
curl --request GET \
--url https://api.aetherpush.com/v1/apps/example/deployments/example/metrics \
--header 'Authorization: Bearer <token>'

Returns per-release metrics (active installs, downloads, install results) for the deployment, keyed by release label or appVersion. Returns an empty object if Redis (the metrics backend) is not configured.

appName
required
string
deploymentName
required
string

Metrics map.

Media typeapplication/json
object
metrics
required

Map keyed by package label (e.g. v3) or app version (e.g. 1.0.0) when the client did not have a CodePush package installed.

object
key
additional properties
object
active
required
integer
downloaded

Distinct devices that reported a download of this label. A report is accepted for the deployment’s current release and for the fourteen releases before it, so a device served an older release is counted, whether it sits outside an unfinished rollout or is pinned to a binary version the newer releases do not target. A label older than that, or newer than the deployment’s current release, is refused with 400. Retries from the same device do not raise the count while the server still holds that device in its per-release set (retained for 35 days).

integer
failed

Distinct devices that reported DeploymentFailed for this label. A report is accepted while the label is the deployment’s current release and for the fourteen releases before it, matching the download-report window. Failures on the tip also update the auto-halt device set for that label; in-window historical failures raise this hash counter only. A label older than that window, or newer than the tip, is ignored with HTTP 200 and no counter write. Retries from the same device do not raise the count while the server still holds that device in its per-release set (retained for 35 days). After that window a later failure from the same device can count again.

integer
installed

Devices that reported DeploymentSucceeded for this label (or under the binary version when no package label was present). A device already counted for its current active label is not counted again until it reports success for a different label.

integer

Example

{
"metrics": {
"v3": {
"active": 1240,
"downloaded": 1300,
"installed": 1280,
"failed": 20
},
"1.0.0": {
"active": 50
}
}
}

Unauthenticated.

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 API key’s scopes do not grant read, which answers required_scopes. A refusal raised before the route is reached, such as a request that did not arrive through the trusted edge, answers a plain error instead.

Media typeapplication/json
One of:
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

Examples

The API key's scopes do not grant read

{
"error": "Insufficient permissions",
"code": "insufficient_scopes",
"required_scopes": [
"read"
],
"requestId": "req_abc123"
}

App or deployment not found.

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 tenant’s per-minute management API budget is spent. Retry-After and X-RateLimit-* say when to retry. This is not a plan quota: quota 429s use the Error envelope and do not set Retry-After.

Media typeapplication/json
RateLimitError

Returned with HTTP 429 when an endpoint-specific rate limit is hit, including the per-tenant management API budget. Not the process-wide address limiter (see GlobalAddressRateLimitErrorResponse). retryAfterSeconds indicates how long the client should wait before retrying, and matches the Retry-After header when that header is set. code names the limit that fired so clients can translate without matching on error.

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

Example

{
"error": "Rate limit exceeded",
"code": "tenant_rate_limit_exceeded",
"retryAfterSeconds": 60
}
Retry-After
integer
>= 1

Seconds until the tenant window resets.