Different results querying Sanity via curl vs JavaScript client

8 replies
Last updated: Jan 14, 2026
Hello! Is there any reason I would get different results between these two methods of querying data?

curl <https://xuaf19yr.api.sanity.io/v1/data/query/production>\?query\=\*%5B_type%20%3D%3D%20%22articlePage%22%5D%20%7B%0A%09...%0A%7D

const sanity = require('@sanity/client')

const sanityClient = sanity({
  projectId: 'xuaf19yr',
  dataset: 'production',
  useCdn: false,
})

await sanityClient.fetch(`
  *[_type == "articlePage"] {
    ...
  }
`)
Any help appreciated!
AI Update

Good question! Since both methods are using API v1 (your curl explicitly uses /v1/ and the JavaScript client defaults to v1 when no apiVersion is specified), they should actually return the same results. Here are the most likely reasons you're seeing differences:

1. Missing apiVersion Parameter (Best Practice Issue)

While both default to v1, you should always explicitly set the apiVersion in your client to ensure consistent behavior and avoid surprises when defaults change:

const sanityClient = sanity({
  projectId: 'xuaf19yr',
  dataset: 'production',
  useCdn: false,
  apiVersion: '2024-01-01', // Add this!
})

2. CDN vs API Endpoint

Your JavaScript client has useCdn: false, which should hit the API directly. Double-check that your curl is also using the API endpoint (not the CDN):

  • API: https://xuaf19yr.api.sanity.io ✓ (what you're using)
  • CDN: https://xuaf19yr.apicdn.sanity.io

If one were accidentally hitting the CDN, you might see cached data up to 10 minutes old.

3. Authentication Differences

If your JavaScript client has any authentication token configured (like a token parameter), it would have access to different data than your unauthenticated curl request. Make sure both requests have the same authentication status.

4. URL Encoding or Query Differences

Your curl shows URL-encoded parameters. Verify the actual query string being sent is identical. Try logging the network request from your JavaScript client to compare.

Debugging Steps

  1. Check what's different: Are you getting different numbers of documents, or different content within the documents?
  2. Add explicit apiVersion to rule out any version-related issues
  3. Log the actual requests from both methods to compare headers and query strings
  4. Check for draft documents: If you have documents with IDs starting with drafts., both methods should return them since v1 uses the raw perspective by default

Note: The default perspective only changed from raw to published in API version v2025-02-19, not in v1, so both your methods should be using the same raw perspective and returning all documents including drafts.

What specific differences are you seeing in the results? That would help narrow down the exact cause!

Show original thread
8 replies

Sanity – Build the way you think, not the way your CMS thinks

Sanity is the developer-first content operating system that gives you complete control. Schema-as-code, GROQ queries, and real-time APIs mean no more workarounds or waiting for deployments. Free to start, scale as you grow.

Was this answer helpful?