◆ v1.0  ·  REST API

Playlist Pilot API

Programmatic access to a curated playlist network: AI matching, pitch generation, and bot detection.

No API key yet? Request access →
🔑 API Key
No key

Overview

2M+
Max Followers
8
Endpoints
AI
Pitch & Matching
REST
JSON API

All endpoints return JSON. The base URL for all requests is:

https://playlistpilotapp.com/api/v1

Authentication

All endpoints require a Bearer token in the Authorization header.

Add this header to every request:

Authorization: Bearer your_api_key_here
Example with curl
curl -X GET \
  https://playlistpilotapp.com/api/v1/genres \
  -H "Authorization: Bearer your_api_key_here"

Rate Limits

Rate limits are per API key, per endpoint, on a sliding 1-hour window. Exceeding limits returns 429 RateLimitExceeded.

EndpointLimit / hourNotes
POST /match60Scores against our curator network
POST /expand-artists20AI-powered, higher latency
GET /playlists/{id}120Live fetch, works for any public playlist
GET /playlists/{id}/similar60Requires ID from match results
GET /playlists/{id}/contacts30Always live: fresh scrape + AI extraction
GET /playlists/{id}/bot-check20Live analysis
POST /playlists/{id}/pitch30AI-powered, higher latency
GET /genres120Cached in-memory

Error Reference

HTTP CodeError TypeMeaning
200-Success
400BadRequestMissing or invalid request parameters
401UnauthorizedMissing, invalid, or revoked API key
404NotFoundPlaylist ID not found in database
429RateLimitExceededHourly rate limit reached for this endpoint
500InternalErrorServer-side failure, try again shortly

Matching

POST /api/v1/match 60/hr

AI-powered playlist matching. Returns the top playlists from the curator network ranked by genre and artist overlap.

FieldTypeDescriptionRequired
genresstring[]Song genres (e.g. ["indie pop", "bedroom pop"])required*
artistsstring[]Artist names for audience overlaprequired*
similar_artistsstring[]Similar/comparable artistsoptional
follower_minintegerMinimum playlist followers (default: 50)optional
follower_maxintegerMaximum playlist followers (default: 2,027,415)optional
limitintegerNumber of results, max 50 (default: 10)optional

* At least one of genres or artists is required.

Request
{ "genres": ["indie pop"], "artists": ["Phoebe Bridgers"], "follower_min": 1000, "limit": 5 }
Response
{ "success": true, "total_found": 247, "returned": 5, "matches": [{ "playlist_id": "...", "playlist_name": "Indie Vibes", "followers": 42500, "match_score": 94.2, "spotify_url": "https://open.spotify.com/playlist/..." }] }

Parameters

Response

⚡Click "Send Request" to test this endpoint
POST /api/v1/expand-artists 20/hr

AI artist intelligence. Provide a comma-separated string or an array of artist names and receive inferred genres and tiered similar artists, optimised for use as genres and similar_artists inputs to the match endpoint.

Request
{ "artists": "Billie Eilish, Lorde" }
// or
{ "artists": ["Billie Eilish", "Lorde"] }
Response
{
  "success": true,
  "genres": ["alt pop", "dark pop", "indie pop"],
  "tier1_artists": ["Olivia Rodrigo", "Gracie Abrams", ...],
  "tier2_artists": ["Halsey", "Charli XCX", ...]
}

Parameters

Response

⚡Click "Send Request" to test this endpoint

Playlist Data

GET /api/v1/playlists/{playlist_id} 120/hr

Full metadata for a single playlist, fetched live. Works for any public playlist ID, not limited to our curator network.

Path Parameters

Response

⚡Click "Send Request" to test this endpoint
GET /api/v1/playlists/{playlist_id}/similar 60/hr

Returns playlists most similar to the specified playlist, based on genre and artist overlap.

Note: Only works with playlist IDs returned by the POST /match endpoint. The playlist must exist in our curator network database.

Parameters

Response

⚡Click "Send Request" to test this endpoint
GET /api/v1/genres 120/hr

All unique genres present in our curator network, sorted by playlist count. Returns a flat array of strings. Useful for building genre pickers or validating inputs before a match call. Response is cached in-memory.

Request
GET /api/v1/genres
Response
{ "success": true, "genres": ["hip hop", "indie pop", "r&b", ...] }

No Parameters

Response

⚡Click "Send Request" to test this endpoint

Contacts

Extract verified curator contact details: email addresses, Instagram handles, Twitter/X profiles, TikTok accounts, and personal websites. Results are cached in the Playlist Pilot database, so repeat lookups are instant.

GET /api/v1/playlists/{id}/contacts 30/hr

Fetches the curator's contact info fresh on every request (no stale cache). Any email, Instagram, Twitter/X, TikTok, or website is extracted and returned. Results are written to cache after extraction but never read from it, so you always get the latest data. The response includes a contact_url ready to open directly.

FieldTypeDescription
contact_typestringemail, instagram, twitter, tiktok, website, or other
contact_rawstringRaw value: just the username (no URL prefix) for social platforms, full email address, or URL for websites
contact_displaystringHuman-readable label, e.g. Instagram: @indievibes
contact_urlstringReady-to-use URL: mailto:x@y.com, https://www.instagram.com/user, etc.
Request
GET /api/v1/playlists/37i9dQZF1DXcBWIGoYBM5M/contacts
Response
{
  "success": true,
  "playlist_id": "37i9dQZF1DXcBWIGoYBM5M",
  "spotify_url": "https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M",
  "contact_found": true,
  "contact": {
    "contact_type": "instagram",
    "contact_raw": "indievibes",
    "contact_display": "Instagram: @indievibes",
    "contact_url": "https://www.instagram.com/indievibes"
  }
}

Parameters

Response

⚡Click "Send Request" to test this endpoint

Trust & Safety

GET /api/v1/playlists/{playlist_id}/bot-check 20/hr

Live bot-detection analysis. Returns a trust score (0 to 100), a badge, and the individual signals that contributed to the result.

Badge values: Trusted (score ≥ 70) · Caution (40 to 69) · Risky (below 40)

Path Parameters

Response

⚡Click "Send Request" to test this endpoint

Pitch Generation

POST /api/v1/playlists/{playlist_id}/pitch 30/hr

Generate a personalised AI pitch for a specific playlist, contextualised using the playlist's genre profile and your song metadata.

FieldTypeDescriptionRequired
artist_namestringArtist or band namerequired
song_namestringSong/track titlerequired
song_urlstringStreaming link for the trackoptional
genresstring[]Song genresoptional
similar_artistsstring[]Comparable artistsoptional
tonestringprofessional · casual · enthusiasticoptional
moodstringrespectful · bold · humbleoptional
languagestringOutput language (default: english)optional
custom_instructionsstringFreeform instructions woven into the pitch, e.g. "mention we have 50k monthly listeners" or "keep it under 100 words"optional

Parameters

Response

⚡Click "Send Request" to test this endpoint

Internal · Owner Only

Not available to partner accounts. Requires the private owner key, not a partner API key. Used by our own marketing pipeline.

GET /api/v1/segments 60/hr

Returns the most recent users bucketed into lifecycle segments (max 50 groups) so a marketing pipeline can send one tailored email per group. Only opted-in, active users are included. Opted-out and disabled accounts are never returned. Each user includes a signed unsubscribe_url: embed it in the email footer so recipients can opt out in one click. Once they do, they drop out of every future response automatically.

FieldTypeDescriptionRequired
limitintegerNumber of most-recent users to scan, max 5000 (default: 1000)optional
Request
GET /api/v1/segments?limit=1000
Authorization: Bearer <owner_key>
Response
{ "success": true, "generated_at": "2026-06-26T12:00:00+00:00", "total_users": 1000, "group_count": 8, "max_groups": 50, "groups": [ { "key": "signed_up_idle", "label": "Signed up, did nothing", "description": "...", "count": 240, "users": [ { "email": "a@b.com", "first_name": "Alex", "plan": "free", "days_since_signup": 3, "unsubscribe_url": "https://playlistpilotapp.com/unsubscribe?uid=42&token=..." } ] } ] }
Playlist Pilot Partner API · For access requests or support, contact the Playlist Pilot team.