---
title: "Estimate monthly revenue for an app (single or bulk)"
method: GET
path: "/api/v1/apps/revenue"
tags: ["Apps"]
---

# Estimate monthly revenue for an app (single or bulk)

`GET /api/v1/apps/revenue`

## Request

- Base URL: `https://api.trysonar.app`
- URL: `https://api.trysonar.app/api/v1/apps/revenue`
- Auth: HTTP bearer

Pass `id` for a single app or `ids` (comma-separated, up to 25) for bulk lookup. Bulk counts as one request. Each estimate includes a `confidence` grade (high/medium/low) and `confidence_factors` explaining it. Apps Sonar synced on the same storefront within the last day are estimated from the stored listing. When the store can't answer, an estimate from an older stored listing is returned flagged `stale: true` (bulk: per item; single: `meta.stale` + `meta.stale_as_of`); with nothing stored, a bulk item carries `error.code` `rate_limited` or `unavailable` with `retry_after_seconds` (not billed), and the request is 429/503 only when every id failed.

## Query parameters

- `store` 'ios' | 'android', required
- `id` string
- `ids` string
- `country` string

## Response `200`

Monthly revenue estimate(s). Bulk items may carry `stale: true` or a per-id `error` (`not_found`, `rate_limited`, `unavailable`).

- object
  - `data` object, required: Result payload — full field reference at https://trysonar.app/docs/api

## Other responses

- `400`: Missing or invalid request parameters
- `401`: Missing or invalid API key
- `429`: rate_limited — Sonar's store lanes are busy and nothing is stored for the app (single id), or every bulk id was shed; honor Retry-After.
- `500`: Unexpected server error
- `503`: unavailable — the store throttled or failed and nothing is stored for the app (single id), or every bulk id failed; honor Retry-After.

---

[API](https://skmtc.dev/trysonar/apis/sonar-api.md) · [All operations](https://skmtc.dev/trysonar/apis/sonar-api/llms.txt) · [OpenAPI document](https://skmtc.dev/trysonar/apis/sonar-api/revisions/bf1d31dadd5f?raw)
