✨Discover storytelling in the AI age with Pixar's Matthew Luhn at Sanity Connect, May 8th—register now

Serious issue with audiobook app caused by Sanity, resolved with a change rolled out over the weekend.

11 replies
Last updated: Feb 13, 2024
Dear Sanity team,
We are experiencing a serious issue on our audiobook app which seems to be caused by Sanity and is currently preventing all of our users from downloading new audiobooks on the app. For this reason we would really appreciate a quick response.

All of a sudden our cdn downloads don't respond with the entities that we expect, which leads to un-downloadable content for our users.

After lengthy investigations over the weekend we discovered that the illustrations array and the respective illustration object does not contain the cdn url anymore. This means our illustration images can not be resolved.
The references do not work, meaning that anything that is referenced in another document seems to no longer be resolved.

We have not changed anything on our side. We have not changed the Sanity studio version nor the GROQ query. The issue described is happening on both our production and staging apps, on both Android and iOS.

For now we have reached the conclusion that something might have changed on Sanity's side? Has anything GROQ related deprecated? All the other assets can be loaded smoothly.

I hope you understand how urgent and potentially damaging this is for our business - we'd really appreciate some support! Thank you.
Feb 12, 2024, 1:57 PM
Query:`const bookListFields = ``
"slug": slug.current,
"bookSample": bookSample.asset -> {url, size},
themes[] ->,
categories[] ->,
creators[] -> {
"portrait": portrait.asset -> {url, size}
"illustration": illustrations[0] -> {
...image.asset -> {url, size},

const booksQuery = 
*[_type == "book" ${territoryCondition} && (
"user" in access[].roleName ||
$role in access[].roleName ||
$email in access[].emailAddress

const resolveImageOrIllustration =
    _type == "image" => {
      ...asset -> {size, url}
    _type == "illustration" => @-> {
      ...image.asset-> {size, url},
    _type == "creator" => @-> {
      ...portrait.asset-> {size, url},

const fetchBookDetailsQuery = `
*[_type == "book" && _id == $id]{
characters[] ->,
chapters[] -> {
"illustration": illustration[0]${resolveImageOrIllustration},
"notes": notes[]->{
_type == "imageNote" => {
"image": image[0]${resolveImageOrIllustration}
_type == "audioNote" => {
"audio": track.asset -> {url, size}
_type == "textNote" => {...},
_type == "videoNote" => {...},
_type == "spotifyNote" => {...}
"audio": audio.asset -> {url, size}
Feb 12, 2024, 1:58 PM
👋 I asked for more information about specific error logs in a thread that another member of your team posted, but haven’t gotten them yet. I received a response with a description of what had been tried, but I can’t help you diagnose your issue with that, unfortunately. As I said, I’ve checked on our end and we’re not blocking your project. There also aren’t any changes to GROQ that I’m aware of, but I will ask internally.
Feb 12, 2024, 4:50 PM
In the mean time, can you also share how your client is configured and the version you’re using?
Feb 12, 2024, 5:11 PM
Hi rd,
we don't have any specific Sanity related logs regarding the issue, only errors, that we throw, when something does not work like the download.

Also: the issue did resolve without us doing anything. Did you experience any data loss and recovered those? Otherwise I can not explain, why it suddenly would not work and suddenly work. To me it seems like a weekend bug, that was resolved yesterday evening (morning on your side of the world).

Our client:
We do use Sanity as PicoSanity version: 4.1.1 in our Expo managed React Native application.
This is the config:

import PicoSanity from 'picosanity'

import config, {getEnvironment} from '../config'

export const sanityClient = PicoSanity({
  projectId: config.sanity.projectId,
  dataset: config.sanity.dataset,
  apiVersion: '2022-06-05', // use current UTC date - see "specifying API version"!
  useCdn: getEnvironment() === 'production',

export const fetch = (query: string, args: Args) =>
  sanityClient.fetch(query, args)

type ArgsPrimitives = string | null | number | boolean
type Args = Record<string, ArgsPrimitives | ArgsPrimitives[]>

export const fetchMulti = <T extends string>(
  queries: Record<T, string>,
  args: Args
) => {
  const query = Object.entries(queries)
    .map(([name, query]) => `'${name}': ${query}`)

  return sanityClient.fetch(`{${query}}`, args)
'Our Sanity Studio is version
. The latest version is `3.28.0`'
Feb 13, 2024, 4:05 PM
We did not experience any outages or data loss and you are the only person to report behavior such as this. I strongly suspect it was something on your side. Without knowing error codes or logs, there’s not much I can do to diagnose your issue.
Feb 13, 2024, 4:12 PM
Oh, can you also share where you are? It may be helpful as we investigate.
Feb 13, 2024, 5:10 PM
So the company is based in London Great Britain, I do work from Hamburg.The app is used in all over the world
Feb 13, 2024, 5:13 PM
Would you be able to share a link to a query that gave this behavior?
Feb 13, 2024, 5:34 PM
Ok, I tracked down the behavior. A change was rolled out over the weekend to free plans that changed the way that references were resolved on the backend. The scope of this was not made clear to me and I apologize that you experienced it. It has been turned off.
Feb 13, 2024, 5:50 PM
Hi rd! Thank you very much for tracking it down, I was able to identify, that our references haven’t been resolved but I was not able to find anything on our side.
I’m happy that it was resolved, but how can we make sure, that it doesn’t happen again?

Also one question: we are considering to move to the payed plan. Does this change anything in regard of our data fetching? Is there anything to consider for our production environment?
Feb 13, 2024, 9:09 PM
Hopefully, in the future we don’t decide to roll out changes to our backend over the weekend without notifying everyone that it’s going to happen. A paid plan won’t change your data fetching behavior. It’ll all still operate the same under the hook. Paid plans mostly unlock things like more quota and extra collaboration features. Things like an Enterprise plan include guaranteed uptime and dedicated support.
Feb 13, 2024, 9:21 PM

Sanity– build remarkable experiences at scale

Sanity is a modern headless CMS that treats content as data to power your digital business. Free to get started, and pay-as-you-go on all plans.

Was this answer helpful?