Chartmetric Stats and Metrics API

Time-series streaming and social statistics for artists, tracks, and albums by data source (Spotify, Apple Music, YouTube, TikTok, Instagram, and others), including follower counts, listeners, and engagement metrics.

OpenAPI Specification

chartmetric-openapi.yml Raw ↑
openapi: 3.0.1
info:
  title: Chartmetric API
  description: >-
    REST API for the Chartmetric music analytics and artist-intelligence
    platform. Provides programmatic access to artists, tracks, albums,
    playlists, and charts along with cross-platform streaming, social, and
    radio statistics across Spotify, Apple Music, YouTube, TikTok, Instagram,
    and other platforms, plus a unified search endpoint. Authentication uses a
    short-lived Bearer access token minted by exchanging a long-lived refresh
    token at POST /token.
  termsOfService: https://chartmetric.com/terms-of-service
  contact:
    name: Chartmetric Support
    email: hi@chartmetric.com
    url: https://apidocs.chartmetric.com/
  version: '1.0'
servers:
  - url: https://api.chartmetric.com/api
    description: Chartmetric production API
security:
  - bearerAuth: []
tags:
  - name: Authentication
    description: Exchange a refresh token for a short-lived access token.
  - name: Artists
    description: Artist metadata, stats, related artists, and placements.
  - name: Tracks
    description: Track metadata, stats, charts, and playlist placements.
  - name: Albums
    description: Album metadata, tracks, followers, charts, and placements.
  - name: Playlists
    description: Playlist metadata, track listings, snapshots, and evolution.
  - name: Charts
    description: Platform chart rankings and Chartmetric Score (cm-score).
  - name: Search
    description: Unified entity search.
paths:
  /token:
    post:
      operationId: createToken
      tags:
        - Authentication
      summary: Mint an access token
      description: >-
        Exchange a long-lived refresh token for a short-lived (1 hour) access
        token. Reuse the access token across requests until it expires.
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TokenRequest'
      responses:
        '200':
          description: An access token and its expiration.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TokenResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /search:
    get:
      operationId: search
      tags:
        - Search
      summary: Search entities
      description: >-
        Free-text search across artists, tracks, albums, playlists, curators,
        and other entity types, returning Chartmetric IDs for follow-on lookups.
      parameters:
        - name: q
          in: query
          required: true
          description: Search query string.
          schema:
            type: string
        - name: type
          in: query
          required: false
          description: Comma-separated entity types to restrict the search to (for example artists, tracks, albums, playlists, curators).
          schema:
            type: string
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            default: 10
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            default: 0
      responses:
        '200':
          description: Search results grouped by entity type.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SearchResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /artist/{id}:
    get:
      operationId: getArtist
      tags:
        - Artists
      summary: Get artist metadata
      parameters:
        - $ref: '#/components/parameters/ArtistId'
      responses:
        '200':
          description: Artist metadata object.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ArtistResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /artist/{id}/stat/{source}:
    get:
      operationId: getArtistStat
      tags:
        - Artists
      summary: Get artist stats by data source
      description: Time-series streaming/social statistics for an artist from a given data source (for example spotify, applemusic, youtube, tiktok, instagram).
      parameters:
        - $ref: '#/components/parameters/ArtistId'
        - $ref: '#/components/parameters/Source'
        - $ref: '#/components/parameters/Since'
        - $ref: '#/components/parameters/Until'
      responses:
        '200':
          description: Time-series stat values for the artist on the given source.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StatResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /artist/{id}/urls:
    get:
      operationId: getArtistUrls
      tags:
        - Artists
      summary: Get artist streaming and social URLs
      parameters:
        - $ref: '#/components/parameters/ArtistId'
      responses:
        '200':
          description: Streaming, social, and service URLs for the artist.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericObject'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /artist/{id}/relatedartists:
    get:
      operationId: getRelatedArtists
      tags:
        - Artists
      summary: Get related artists
      parameters:
        - $ref: '#/components/parameters/ArtistId'
      responses:
        '200':
          description: A list of artists related to the given artist.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericObject'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /artist/{id}/where-people-listen:
    get:
      operationId: getArtistWherePeopleListen
      tags:
        - Artists
      summary: Get where-people-listen geography
      description: Top cities and countries where the artist's audience listens.
      parameters:
        - $ref: '#/components/parameters/ArtistId'
      responses:
        '200':
          description: Geographic listening distribution for the artist.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericObject'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /artist/{id}/tracks:
    get:
      operationId: getArtistTracks
      tags:
        - Artists
      summary: Get artist tracks
      parameters:
        - $ref: '#/components/parameters/ArtistId'
      responses:
        '200':
          description: Tracks attributed to the artist.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericObject'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /artist/{id}/albums:
    get:
      operationId: getArtistAlbums
      tags:
        - Artists
      summary: Get artist albums
      parameters:
        - $ref: '#/components/parameters/ArtistId'
      responses:
        '200':
          description: Albums attributed to the artist.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericObject'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /artist/{id}/{source}/{status}/playlists:
    get:
      operationId: getArtistPlaylists
      tags:
        - Artists
      summary: Get artist playlist placements
      parameters:
        - $ref: '#/components/parameters/ArtistId'
        - $ref: '#/components/parameters/Source'
        - $ref: '#/components/parameters/PlaylistStatus'
      responses:
        '200':
          description: Playlists the artist's catalog appears on for the given source and status.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericObject'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /track/{id}:
    get:
      operationId: getTrack
      tags:
        - Tracks
      summary: Get track metadata
      parameters:
        - $ref: '#/components/parameters/TrackId'
      responses:
        '200':
          description: Track metadata object.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TrackResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /track/{id}/{platform}/stats:
    get:
      operationId: getTrackStats
      tags:
        - Tracks
      summary: Get track stats by platform
      parameters:
        - $ref: '#/components/parameters/TrackId'
        - $ref: '#/components/parameters/Platform'
        - $ref: '#/components/parameters/Since'
        - $ref: '#/components/parameters/Until'
      responses:
        '200':
          description: Time-series stat values for the track on the given platform.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StatResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /track/{id}/{chartType}/charts:
    get:
      operationId: getTrackCharts
      tags:
        - Tracks
      summary: Get track chart history
      parameters:
        - $ref: '#/components/parameters/TrackId'
        - $ref: '#/components/parameters/ChartType'
      responses:
        '200':
          description: Chart appearances for the track.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericObject'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /track/{id}/{platform}/{status}/playlists:
    get:
      operationId: getTrackPlaylists
      tags:
        - Tracks
      summary: Get track playlist placements
      parameters:
        - $ref: '#/components/parameters/TrackId'
        - $ref: '#/components/parameters/Platform'
        - $ref: '#/components/parameters/PlaylistStatus'
      responses:
        '200':
          description: Playlists the track appears on for the given platform and status.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericObject'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /album/{id}:
    get:
      operationId: getAlbum
      tags:
        - Albums
      summary: Get album metadata
      parameters:
        - $ref: '#/components/parameters/AlbumId'
      responses:
        '200':
          description: Album metadata object.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AlbumResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /album/{id}/tracks:
    get:
      operationId: getAlbumTracks
      tags:
        - Albums
      summary: Get album tracks
      parameters:
        - $ref: '#/components/parameters/AlbumId'
      responses:
        '200':
          description: Tracks belonging to the album.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericObject'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /album/{id}/{source}/followers:
    get:
      operationId: getAlbumFollowers
      tags:
        - Albums
      summary: Get album followers by source
      parameters:
        - $ref: '#/components/parameters/AlbumId'
        - $ref: '#/components/parameters/Source'
      responses:
        '200':
          description: Follower time series for the album on the given source.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StatResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /album/{id}/{source}/{status}/playlists:
    get:
      operationId: getAlbumPlaylists
      tags:
        - Albums
      summary: Get album playlist placements
      parameters:
        - $ref: '#/components/parameters/AlbumId'
        - $ref: '#/components/parameters/Source'
        - $ref: '#/components/parameters/PlaylistStatus'
      responses:
        '200':
          description: Playlists the album appears on for the given source and status.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericObject'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /playlist/{platform}/{id}:
    get:
      operationId: getPlaylist
      tags:
        - Playlists
      summary: Get playlist metadata
      parameters:
        - $ref: '#/components/parameters/Platform'
        - $ref: '#/components/parameters/PlaylistId'
      responses:
        '200':
          description: Playlist metadata object.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PlaylistResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /playlist/{platform}/{id}/{span}/tracks:
    get:
      operationId: getPlaylistTracks
      tags:
        - Playlists
      summary: Get playlist tracks
      description: Current or historical track listing for a playlist over a given span (for example current, past).
      parameters:
        - $ref: '#/components/parameters/Platform'
        - $ref: '#/components/parameters/PlaylistId'
        - name: span
          in: path
          required: true
          description: Time span of the track listing (for example current, past).
          schema:
            type: string
      responses:
        '200':
          description: Tracks on the playlist for the given span.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericObject'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /playlist/{platform}/{id}/snapshot:
    get:
      operationId: getPlaylistSnapshot
      tags:
        - Playlists
      summary: Get playlist snapshot
      parameters:
        - $ref: '#/components/parameters/Platform'
        - $ref: '#/components/parameters/PlaylistId'
      responses:
        '200':
          description: A point-in-time snapshot of the playlist.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericObject'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /playlist/{platform}/lists:
    get:
      operationId: getPlaylistLists
      tags:
        - Playlists
      summary: List playlists by platform
      parameters:
        - $ref: '#/components/parameters/Platform'
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            default: 50
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            default: 0
      responses:
        '200':
          description: A list of playlists tracked for the platform.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericObject'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /charts/{platform}:
    get:
      operationId: getCharts
      tags:
        - Charts
      summary: Get platform charts
      description: Chart rankings for a streaming, social, or radio platform (for example spotify, applemusic, youtube, shazam, itunes, deezer, soundcloud, beatport, amazon, qq).
      parameters:
        - $ref: '#/components/parameters/Platform'
        - name: date
          in: query
          required: false
          description: Chart date (YYYY-MM-DD).
          schema:
            type: string
            format: date
        - name: country_code
          in: query
          required: false
          description: Two-letter country code to scope the chart.
          schema:
            type: string
        - name: type
          in: query
          required: false
          description: Chart type or metric (for example streams, popularity).
          schema:
            type: string
      responses:
        '200':
          description: Ranked chart entries for the platform.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChartResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /charts/artist/{id}/{chartType}/cm-score:
    get:
      operationId: getArtistCmScore
      tags:
        - Charts
      summary: Get artist Chartmetric Score ranking
      parameters:
        - $ref: '#/components/parameters/ArtistId'
        - $ref: '#/components/parameters/ChartType'
      responses:
        '200':
          description: Chartmetric Score (cm-score) ranking history for the artist.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericObject'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /charts/track/{id}/{chartType}/cm-score:
    get:
      operationId: getTrackCmScore
      tags:
        - Charts
      summary: Get track Chartmetric Score ranking
      parameters:
        - $ref: '#/components/parameters/TrackId'
        - $ref: '#/components/parameters/ChartType'
      responses:
        '200':
          description: Chartmetric Score (cm-score) ranking history for the track.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericObject'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /charts/album/{id}/{chartType}/cm-score:
    get:
      operationId: getAlbumCmScore
      tags:
        - Charts
      summary: Get album Chartmetric Score ranking
      parameters:
        - $ref: '#/components/parameters/AlbumId'
        - $ref: '#/components/parameters/ChartType'
      responses:
        '200':
          description: Chartmetric Score (cm-score) ranking history for the album.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericObject'
        '401':
          $ref: '#/components/responses/Unauthorized'
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: Bearer access token obtained from POST /token.
  parameters:
    ArtistId:
      name: id
      in: path
      required: true
      description: Chartmetric artist ID.
      schema:
        type: integer
    TrackId:
      name: id
      in: path
      required: true
      description: Chartmetric track ID.
      schema:
        type: integer
    AlbumId:
      name: id
      in: path
      required: true
      description: Chartmetric album ID.
      schema:
        type: integer
    PlaylistId:
      name: id
      in: path
      required: true
      description: Chartmetric playlist ID.
      schema:
        type: integer
    Source:
      name: source
      in: path
      required: true
      description: Data source / platform (for example spotify, applemusic, youtube, tiktok, instagram, deezer).
      schema:
        type: string
    Platform:
      name: platform
      in: path
      required: true
      description: Streaming, social, or radio platform identifier.
      schema:
        type: string
    ChartType:
      name: chartType
      in: path
      required: true
      description: Chart type for the platform (for example library, listeners, popularity).
      schema:
        type: string
    PlaylistStatus:
      name: status
      in: path
      required: true
      description: Placement status (current or past).
      schema:
        type: string
        enum:
          - current
          - past
    Since:
      name: since
      in: query
      required: false
      description: Start date for time-series data (YYYY-MM-DD).
      schema:
        type: string
        format: date
    Until:
      name: until
      in: query
      required: false
      description: End date for time-series data (YYYY-MM-DD).
      schema:
        type: string
        format: date
  responses:
    Unauthorized:
      description: Missing or invalid access token.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: The requested entity was not found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    TokenRequest:
      type: object
      required:
        - refreshtoken
      properties:
        refreshtoken:
          type: string
          description: Long-lived refresh token issued by Chartmetric.
    TokenResponse:
      type: object
      properties:
        token:
          type: string
          description: Short-lived Bearer access token.
        expires_in:
          type: integer
          description: Token lifetime in seconds (3600).
          example: 3600
        scope:
          type: string
        refresh_token:
          type: string
    SearchResponse:
      type: object
      properties:
        obj:
          type: object
          description: Search results grouped by entity type (artists, tracks, albums, playlists, curators).
          additionalProperties: true
    ArtistResponse:
      type: object
      properties:
        obj:
          $ref: '#/components/schemas/Artist'
    Artist:
      type: object
      properties:
        id:
          type: integer
          description: Chartmetric artist ID.
        name:
          type: string
        image_url:
          type: string
        isni:
          type: string
        country:
          type: string
        genres:
          type: array
          items:
            type: string
        cm_artist_rank:
          type: integer
          description: Current Chartmetric artist rank.
    TrackResponse:
      type: object
      properties:
        obj:
          $ref: '#/components/schemas/Track'
    Track:
      type: object
      properties:
        id:
          type: integer
          description: Chartmetric track ID.
        name:
          type: string
        isrc:
          type: string
        artist_names:
          type: array
          items:
            type: string
        album_names:
          type: array
          items:
            type: string
        release_dates:
          type: array
          items:
            type: string
            format: date
    AlbumResponse:
      type: object
      properties:
        obj:
          $ref: '#/components/schemas/Album'
    Album:
      type: object
      properties:
        id:
          type: integer
          description: Chartmetric album ID.
        name:
          type: string
        upc:
          type: string
        label:
          type: string
        release_date:
          type: string
          format: date
        artist_names:
          type: array
          items:
            type: string
    PlaylistResponse:
      type: object
      properties:
        obj:
          $ref: '#/components/schemas/Playlist'
    Playlist:
      type: object
      properties:
        id:
          type: integer
          description: Chartmetric playlist ID.
        name:
          type: string
        platform:
          type: string
        followers:
          type: integer
        owner_name:
          type: string
        num_track:
          type: integer
    StatResponse:
      type: object
      properties:
        obj:
          type: object
          description: Time-series stat values keyed by metric.
          additionalProperties: true
    ChartResponse:
      type: object
      properties:
        obj:
          type: array
          description: Ranked chart entries.
          items:
            type: object
            additionalProperties: true
    GenericObject:
      type: object
      properties:
        obj:
          description: Response payload, shape varies by endpoint.
          oneOf:
            - type: object
              additionalProperties: true
            - type: array
              items:
                type: object
                additionalProperties: true
    Error:
      type: object
      properties:
        error:
          type: string
          description: Human-readable error message.
        status:
          type: integer
          description: HTTP status code.