Wavyl
Wavyl · Dashboard API

API & Integrations

Bring listening activity, music discoveries, collections and artist earnings into your dashboard.

Read-only dataJSON over HTTPSPersonal keys + public calls

Connect your account

  1. Sign in to your Wavyl account and open key management. Regular accounts can manage their own key.
  2. Generate a personal read-only key and copy it when shown. If a key is already active, use your saved copy or coordinate replacement before revoking it.
  3. Connect the key to your trusted dashboard. Send it in the Authorization: Bearer YOUR_KEY header from your server.

Keep keys encrypted on the server. Do not place them in URLs, public pages, browser code, source control or shared documents. Revoke a key on the source site to stop future API reads; data already cached by a dashboard may remain until its private cache expires.

Generate or manage my key →

Available calls

Append a route below to this base URL:

https://www.wavyl.com/wp-json/wavyl/v1/dashboard

Expand a call to see its parameters, request and response. Examples use fictional data and may omit fields; they are not your account data or a live quote.

GET/mePersonal key

My profile

Connected account identity and read-only scope.

Parameters · None

Example request

curl --request GET \
  --url 'https://www.wavyl.com/wp-json/wavyl/v1/dashboard/me' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_KEY'

Example response excerpt · HTTP 200

{
  "id": 42,
  "username": "example_user",
  "display_name": "Example User",
  "scope": "dashboard:read",
  "updated_at": "2026-11-05T12:00:00Z"
}
GET/me/listening-statsPersonal key

My listening stats

Recorded play events, distinct music, likes and follow counts.

Parameters · None

Example request

curl --request GET \
  --url 'https://www.wavyl.com/wp-json/wavyl/v1/dashboard/me/listening-stats' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_KEY'

Example response excerpt · HTTP 200

{
  "summary": {
    "recorded_play_events": 120,
    "distinct_played_items": 30,
    "liked_items": 8,
    "following_artists": 5,
    "followers": 12
  },
  "updated_at": "2026-11-05T12:00:00Z"
}
GET/me/recently-playedPersonal key

Recently played

Distinct published music, ordered by the latest recorded event.

Parameters · page: integer 1–10000; per_page: integer 1–50.

Example request

curl --request GET \
  --url 'https://www.wavyl.com/wp-json/wavyl/v1/dashboard/me/recently-played?page=1&per_page=6' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_KEY'

Example response excerpt · HTTP 200

{
  "items": [
    {
      "id": 123,
      "title": "Example track",
      "url": "https://www.wavyl.com/listen/example-track/",
      "artwork": null,
      "kind": "track",
      "artist": "Example Artist",
      "genres": [
        "Electronic"
      ],
      "recorded_plays": 120,
      "likes": 8,
      "last_played_at": "2026-11-05T12:00:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "per_page": 6,
    "total": 1,
    "total_pages": 1
  },
  "updated_at": "2026-11-05T12:00:00Z"
}
GET/me/likesPersonal key

My liked music

Music explicitly liked by the account.

Parameters · page: integer 1–10000; per_page: integer 1–50.

Example request

curl --request GET \
  --url 'https://www.wavyl.com/wp-json/wavyl/v1/dashboard/me/likes?page=1&per_page=6' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_KEY'

Example response excerpt · HTTP 200

{
  "items": [
    {
      "id": 123,
      "title": "Example track",
      "url": "https://www.wavyl.com/listen/example-track/",
      "artwork": null,
      "kind": "track",
      "artist": "Example Artist",
      "genres": [
        "Electronic"
      ],
      "recorded_plays": 120,
      "likes": 8,
      "liked_at": "2026-11-05T12:00:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "per_page": 6,
    "total": 1,
    "total_pages": 1
  },
  "updated_at": "2026-11-05T12:00:00Z"
}
GET/me/playlistsPersonal key

My playlists and albums

Published playlists and albums authored by the account.

Parameters · page: integer 1–10000; per_page: integer 1–50.

Example request

curl --request GET \
  --url 'https://www.wavyl.com/wp-json/wavyl/v1/dashboard/me/playlists?page=1&per_page=6' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_KEY'

Example response excerpt · HTTP 200

{
  "items": [
    {
      "id": 123,
      "title": "Example track",
      "url": "https://www.wavyl.com/listen/example-track/",
      "artwork": null,
      "kind": "playlist",
      "artist": "Example Artist",
      "genres": [
        "Electronic"
      ],
      "recorded_plays": 120,
      "likes": 8
    }
  ],
  "pagination": {
    "page": 1,
    "per_page": 6,
    "total": 1,
    "total_pages": 1
  },
  "updated_at": "2026-11-05T12:00:00Z"
}
GET/me/releasesPersonal key

My releases

Published tracks authored by the account.

Parameters · page: integer 1–10000; per_page: integer 1–50.

Example request

curl --request GET \
  --url 'https://www.wavyl.com/wp-json/wavyl/v1/dashboard/me/releases?page=1&per_page=6' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_KEY'

Example response excerpt · HTTP 200

{
  "items": [
    {
      "id": 123,
      "title": "Example track",
      "url": "https://www.wavyl.com/listen/example-track/",
      "artwork": null,
      "kind": "track",
      "artist": "Example Artist",
      "genres": [
        "Electronic"
      ],
      "recorded_plays": 120,
      "likes": 8
    }
  ],
  "pagination": {
    "page": 1,
    "per_page": 6,
    "total": 1,
    "total_pages": 1
  },
  "updated_at": "2026-11-05T12:00:00Z"
}
GET/me/following-releasesPersonal key

From artists I follow

Latest published music from followed accounts.

Parameters · page: integer 1–10000; per_page: integer 1–50.

Example request

curl --request GET \
  --url 'https://www.wavyl.com/wp-json/wavyl/v1/dashboard/me/following-releases?page=1&per_page=6' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_KEY'

Example response excerpt · HTTP 200

{
  "items": [
    {
      "id": 123,
      "title": "Example track",
      "url": "https://www.wavyl.com/listen/example-track/",
      "artwork": null,
      "kind": "track",
      "artist": "Example Artist",
      "genres": [
        "Electronic"
      ],
      "recorded_plays": 120,
      "likes": 8
    }
  ],
  "pagination": {
    "page": 1,
    "per_page": 6,
    "total": 1,
    "total_pages": 1
  },
  "updated_at": "2026-11-05T12:00:00Z"
}
GET/me/earningsPersonal key

My artist earnings

Listening-earnings ledger with paid, unclaimed and other states kept separate.

Parameters · page: integer 1–10000; per_page: integer 1–50.

Example request

curl --request GET \
  --url 'https://www.wavyl.com/wp-json/wavyl/v1/dashboard/me/earnings?page=1&per_page=6' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_KEY'

Example response excerpt · HTTP 200

{
  "items": [
    {
      "id": 123,
      "music": {
        "id": 123,
        "title": "Example track",
        "url": "https://www.wavyl.com/listen/example-track/",
        "artwork": null,
        "kind": "track",
        "artist": "Example Artist",
        "genres": [
          "Electronic"
        ],
        "recorded_plays": 120,
        "likes": 8
      },
      "amount_mlx": "1000",
      "status": "paid",
      "updated_at": "2026-11-05T12:00:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "per_page": 6,
    "total": 1,
    "total_pages": 1
  },
  "by_status": {
    "paid": {
      "count": 1,
      "amount_mlx": "1000"
    }
  },
  "updated_at": "2026-11-05T12:00:00Z"
}
GET/chartsPublic · no key

Recorded weekly track chart

Ranking for the latest available stored weekly counter. Check period_key before labeling its date.

Parameters · page: integer 1–10000; per_page: integer 1–50.

Example request

curl --request GET \
  --url 'https://www.wavyl.com/wp-json/wavyl/v1/dashboard/charts?page=1&per_page=6' \
  --header 'Accept: application/json'

Example response excerpt · HTTP 200

{
  "items": [
    {
      "id": 123,
      "title": "Example track",
      "url": "https://www.wavyl.com/listen/example-track/",
      "artwork": null,
      "kind": "track",
      "artist": "Example Artist",
      "genres": [
        "Electronic"
      ],
      "recorded_plays": 120,
      "likes": 8,
      "rank": 1,
      "period_plays": 20
    }
  ],
  "pagination": {
    "page": 1,
    "per_page": 6,
    "total": 1,
    "total_pages": 1
  },
  "period_key": "post-count-week-202632",
  "updated_at": "2026-11-05T12:00:00Z"
}
GET/charts/weeklyPublic · no key

Published community chart

Latest published community weekly chart. A successful empty result is possible.

Parameters · page: integer 1–10000; per_page: integer 1–50.

Example request

curl --request GET \
  --url 'https://www.wavyl.com/wp-json/wavyl/v1/dashboard/charts/weekly?page=1&per_page=6' \
  --header 'Accept: application/json'

Example response excerpt · HTTP 200

{
  "items": [],
  "pagination": {
    "page": 1,
    "per_page": 6,
    "total": 0,
    "total_pages": 0
  },
  "chart_week": null,
  "updated_at": "2026-11-05T12:00:00Z"
}
GET/featured-playlistsPublic · no key

Featured playlists

Editorially featured playlists linked to published music pages.

Parameters · page: integer 1–10000; per_page: integer 1–50.

Example request

curl --request GET \
  --url 'https://www.wavyl.com/wp-json/wavyl/v1/dashboard/featured-playlists?page=1&per_page=6' \
  --header 'Accept: application/json'

Example response excerpt · HTTP 200

{
  "items": [
    {
      "id": 123,
      "title": "Example track",
      "url": "https://www.wavyl.com/listen/example-track/",
      "artwork": null,
      "kind": "playlist",
      "artist": "Example Artist",
      "genres": [
        "Electronic"
      ],
      "recorded_plays": 120,
      "likes": 8
    }
  ],
  "pagination": {
    "page": 1,
    "per_page": 6,
    "total": 1,
    "total_pages": 1
  },
  "updated_at": "2026-11-05T12:00:00Z"
}

Parameters and limits

page: integer 1–10000; per_page: integer 1–50. Lists default to 6 items. Personal keys have a soft limit of 120 requests per minute. Source view models may be cached for 60 seconds.

Amounts such as MLX and USD cents may be decimal strings. Preserve their precision instead of converting large values to floating-point numbers. Use the returned pagination totals. Times shown in examples are ISO 8601 UTC; display dates in the user’s timezone.

What the data means

Play events are not listening minutes or unique listeners. Only published, password-free music is returned; no playable audio URLs are exposed. Artist earnings are not a wallet balance. Unclaimed earnings are not guaranteed withdrawable. Charts identify the stored period and may be older than the current week.

Response handling

HTTPMeaning
200Successful read. An empty items array can be a valid result.
400Invalid or out-of-range parameters.
401Missing, invalid or revoked personal key.
429Too many requests. Wait before retrying.
503Data or a required source service is temporarily unavailable. Do not replace this with zero.

Use the HTTP status for error handling. Error bodies vary by route. Keep cached personal data private and short-lived; handle missing values and empty lists.

Optional PHP client

The API works with any language that can make HTTPS requests. A WordPress PHP reference client and README are also available as a convenience.

Download PHP client and README ↓