AsoBeast Charts API
The charts API from AsoBeast — 5 operation(s) for charts.
The charts API from AsoBeast — 5 operation(s) for charts.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/asobeast-com:asobeast-com-charts-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: asobeast Charts API
description: 'Self hosted ASO toolkit API.
A metered instance carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset on every response, for the tightest limit the request touched. A self hosted instance has no request rate limits and sends no such header. Limits are per workspace, so minting more tokens does not buy more capacity, and they are sized per plan across three classes: read for stored data, write for configuration changes and store for the endpoints that reach the App Store or Google Play.
A 429 carries Retry-After and a rateLimit object naming the window that closed, or an aiAllowance object when the workspace has spent the AI calls its plan includes this month. A 403 with a quota object means a plan capacity limit such as apps or tracked keyword markets, which is a different problem from a rate limit. A 402 with an entitlement object means the workspace needs a plan.
Positions are 1-based and null means checked but not found within the captured depth, never zero. Daily granularity uses UTC dates.'
version: 1.15.0
contact: {}
servers:
- url: http://localhost:3000/api/backend
description: Web origin proxy
- url: http://localhost:4000
description: Direct API
security:
- personalApiToken: []
tags:
- name: Charts
paths:
/charts:
get:
description: 'One day of a free, paid or grossing chart of one store, country, category and device: every row with its position, its position on the comparison day and the movement between them, the climbers, fallers, new entries and exits, the days a capture exists for, whether this workspace follows the chart, and which rows are its own apps or competitors. Reads what the daily run or a capture stored; never reaches the store.'
operationId: ChartsController_page
parameters:
- name: store
required: true
in: query
schema:
type: string
enum:
- APP_STORE
- GOOGLE_PLAY
- name: country
required: true
in: query
schema:
pattern: ^[a-z]{2}$
example: us
type: string
- name: collection
required: true
in: query
schema:
type: string
enum:
- free
- paid
- grossing
- name: genre
required: true
in: query
description: A chart genre of the store, or overall
schema:
maxLength: 32
example: '6014'
type: string
- name: device
required: true
in: query
schema:
type: string
enum:
- iphone
- android
- name: date
required: false
in: query
description: The UTC day to read. Omitted reads the newest capture.
schema:
pattern: ^\d{4}-\d{2}-\d{2}$
example: '2026-10-13'
type: string
- name: compare
required: false
in: query
schema:
default: 1d
type: string
enum:
- 1d
- 7d
- 30d
- name: dates
required: false
in: query
description: How many captured days to list, newest first.
schema:
minimum: 1
maximum: 365
default: 90
type: integer
responses:
'200':
description: ''
content:
application/json:
schema:
type: object
summary: Read a top chart for one day
tags:
- Charts
/charts/genres:
get:
operationId: ChartsController_genres
parameters:
- name: store
required: true
in: query
schema:
type: string
enum:
- APP_STORE
- GOOGLE_PLAY
responses:
'200':
description: ''
summary: List the chart categories of a store
tags:
- Charts
/charts/capture:
post:
description: Fetches today's chart from the store while you wait and stores it for every workspace, then answers the page for today. A chart already captured today is answered without a store request. Reaches the store, so it answers within the store deadline and spends one chart capture of the daily allowance only when a request is made; a refused key spends nothing. A chart the store answers with no apps is stored as empty when it was empty before; a first empty answer is not stored and comes back with answeredNoApps, and the daily run stores it after retrying.
operationId: ChartsController_capture
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ChartCaptureDto'
responses:
'200':
description: ''
content:
application/json:
schema:
type: object
summary: Capture a top chart today
tags:
- Charts
/charts/follows:
get:
operationId: ChartsController_listFollows
parameters: []
responses:
'200':
description: ''
content:
application/json:
schema:
type: array
items:
type: object
summary: List the top charts this workspace follows
tags:
- Charts
post:
description: Asks the daily run to capture this chart every day. The plan's follow limit counts categories, so the free, paid and grossing charts of one store, country, category and device cost one follow together. Answers 201 for a new follow and 200 with the existing one when the workspace already follows the chart. Writes nothing to the store; capture today separately.
operationId: ChartsController_follow
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ChartFollowDto'
responses:
'200':
description: The workspace already follows the chart; the existing follow
content:
application/json:
schema:
type: object
'201':
description: The chart is now followed; the new follow
content:
application/json:
schema:
type: object
summary: Follow a top chart
tags:
- Charts
/charts/follows/{id}:
delete:
operationId: ChartsController_forget
parameters:
- name: id
required: true
in: path
schema:
type: string
responses:
'204':
description: ''
summary: Stop following a top chart
tags:
- Charts
components:
schemas:
ChartCaptureDto:
type: object
properties:
store:
enum:
- APP_STORE
- GOOGLE_PLAY
type: string
country:
type: string
example: us
pattern: ^[a-z]{2}$
collection:
enum:
- free
- paid
- grossing
type: string
genre:
type: string
maxLength: 32
example: '6014'
description: A chart genre of the store, or overall
device:
enum:
- iphone
- android
type: string
required:
- store
- country
- collection
- genre
- device
ChartFollowDto:
type: object
properties:
store:
enum:
- APP_STORE
- GOOGLE_PLAY
type: string
country:
type: string
example: us
pattern: ^[a-z]{2}$
collection:
enum:
- free
- paid
- grossing
type: string
genre:
type: string
maxLength: 32
example: '6014'
description: A chart genre of the store, or overall
device:
enum:
- iphone
- android
type: string
required:
- store
- country
- collection
- genre
- device
securitySchemes:
personalApiToken:
scheme: bearer
bearerFormat: asob
type: http