Announcements

Help Wizard

Step 1

NEXT STEP

FAQs

Please see below the most popular frequently asked questions.

Loading article...

Loading faqs...

VIEW ALL

Ongoing Issues

Please see below the current ongoing issues which are under investigation.

Loading issue...

Loading ongoing issues...

VIEW ALL

Incorrect pagination https://api.spotify.com/v1/users/{user_id}/playlists

Incorrect pagination https://api.spotify.com/v1/users/{user_id}/playlists

Plan

Premium

Country

Canada

Device

REST API

My Question or Issue

 

Hi everyone!

I ran into a weird issue with paginating over users playlists. Steps to reproduce are:

  1. Request some number of users playlists with no offset: ?limit=5&offset=0
  2. Request same amount of playlists for the "next page", i.e. offset of the second request is equal limit of the first one: ?limit=5&offset=5

Expected result: in total, 10 unique playlists are returned.

Actual result:in total, 9 unique playlists are returned.

Since third page it works as expected, i.e. two requests with ?limit=5&offset=5 and ?limit=5&offset=10 return non-intersecting lists of items.

 

Below is a python snippet for reproducing.

 

import requests
token = '...'

user_id = 'ht1j0ynnwu4hdgfw6g7a0y1nx'

response1 = requests.request(
    method='GET',
    url=f'https://api.spotify.com/v1/users/{user_id}/playlists',
    params={'limit': 5, 'offset': 0},
    headers={'Authorization': f'Bearer {token}'},
)
items1 = [(p['id']) for p in response1.json()['items']]

response2 = requests.request(
    method='GET',
    url=f'https://api.spotify.com/v1/users/{user_id}/playlists',
    params={'limit': 5, 'offset': 5},
    headers={'Authorization': f'Bearer {token}'},
)
items2 = [(p['id']) for p in response2.json()['items']]

print(items1)
print(items2)

 

It prints:

 

['6kL8wAlMOYicjD4WE5h5UY', '0L5Ub41BC6UPiOR2i99XDE', '37i9dQZEVXcGu90ywFf8Id', '37i9dQZEVXbmu9hXKCIN5q', '4uJLFAfVHXIGUWIRj95BZ5']
['4uJLFAfVHXIGUWIRj95BZ5', '6NQkzRDINJC25OefUAz8g3', '4jLfWUF6JBVwaieOu8er6K', '1VER2y1u7Q3ymjNscEQoXc', '0VC4kqlB1SdoJsihGG2Vya']

 

 

The last item of the first list is equal to the first item of the second list: 4uJLFAfVHXIGUWIRj95BZ5.

Since next page it start working nornally:

 

response3 = requests.request(
    method='GET',
    url=f'https://api.spotify.com/v1/users/{user_id}/playlists',
    params={'limit': 5, 'offset': 10},
    headers={'Authorization': f'Bearer {token}'},
)
items3 = [(p['id']) for p in response3.json()['items']]

print(items3)

 

 prints

 

['1lm98dZ23rv7bFlOkTj5yV', '37EgzYlwQVFPKUUrKTcDvq', '7fSyMpbKv4gH4pJV04JjcJ', '6sGesrjKWbNTVN3YNMJlXl', '2QzAr27YvIQOyB72lySjzW']

 

 which is correct since it doesn't share items with previous pages.

What is also strange is that this "overlapping" depends on limit. For instance, for limit=3:

 

['6kL8wAlMOYicjD4WE5h5UY', '0L5Ub41BC6UPiOR2i99XDE', '37i9dQZEVXcGu90ywFf8Id']
['37i9dQZEVXbmu9hXKCIN5q', '4uJLFAfVHXIGUWIRj95BZ5', '6NQkzRDINJC25OefUAz8g3']
['6NQkzRDINJC25OefUAz8g3', '4jLfWUF6JBVwaieOu8er6K', '1VER2y1u7Q3ymjNscEQoXc']

 

overlapping happens for 2nd and 3rd pages: 6NQkzRDINJC25OefUAz8g3.

Same for limit=4. But since limit=5 overlapping happens between 1st and 2nd pages.

 

Let me know what you think about it, and please do let me know if any extra information is required!

Reply
0 Replies

Suggested posts

Staff
Let's introduce ourselves!

Hey there you,   Yeah, you! 😁   Welcome - we're glad you joined the Spotify Community!   While you here, let's have a fun game and get…

Staff
ModeratorStaff / Moderator/ 3 years ago  in Social & Random

Type a product name