I’m working with the Notion API in Unity and running into a pagination issue. When I query my database normally without any parameters, everything works fine. But when I try to use the start_cursor parameter to get the next page of results, I get a 400 Bad Request error.
The first request to the database works perfectly, but subsequent requests using the cursor from the previous response fail. I’m following the official API documentation for pagination but something seems wrong with my implementation.
Here’s my current code:
public class DatabaseManager<T> : APIHandler where T : IProperty, new()
{
public DatabaseManager(string token, string dbId) : base(token)
{
DatabaseId = dbId;
QueryUrl = $"https://api.notion.com/v1/databases/{dbId}/query";
}
private readonly string DatabaseId;
private readonly string QueryUrl;
private DatabaseResult<T> Response;
public virtual async void FetchData(Action<T[]> success = null, Action<string> error = null)
{
List<Entry<T>> combinedResults = new();
string cursor = null;
bool morePages = true;
RequestLimiter limiter = new RequestLimiter(2);
while (morePages)
{
await limiter.WaitAsync();
string requestUrl = string.IsNullOrEmpty(cursor) ? QueryUrl : QueryUrl + $"?start_cursor={cursor}";
Debug.Log(requestUrl);
using var request = CreateAuthenticatedRequest(requestUrl, RequestType.POST);
request.SendWebRequest();
while (!request.isDone)
{
await Task.Yield();
}
if (request.result != UnityWebRequest.Result.Success)
{
Debug.Log($"Database fetch failed: {request.error}");
error?.Invoke(request.error);
return;
}
Response = JsonUtility.FromJson<DatabaseResult<T>>(request.downloadHandler.text);
combinedResults.AddRange(Response.results);
if (ParseHasMore(request.downloadHandler.text) == "false")
{
morePages = false;
}
else
{
cursor = ParseNextCursor(request.downloadHandler.text);
}
}
success?.Invoke(combinedResults.ConvertAll(x => x.properties).ToArray());
}
}
Any ideas what might be causing this 400 error on paginated requests?