🔮 Sanity Create is here. Writing is reinvented. Try now, no developer setup

Error integrating Algolia with NextJS and Sanity

6 replies
Last updated: Jan 24, 2022
Hello, I am trying to integrate algolia on one my NextJS project. I was trying to sync with
via Next API but I keep getting error
error - TypeError: Cannot read property 'created' of undefined
    at _callee$ (/Volumes/workspace/clients/radiology-associates/ra-frontend/node_modules/sanity-algolia/dist/sanity-algolia.cjs.development.js:891:57)
    at tryCatch (/Volumes/workspace/clients/radiology-associates/ra-frontend/node_modules/sanity-algolia/dist/sanity-algolia.cjs.development.js:129:40)
    at Generator.invoke [as _invoke] (/Volumes/workspace/clients/radiology-associates/ra-frontend/node_modules/sanity-algolia/dist/sanity-algolia.cjs.development.js:359:22)
    at Generator.next (/Volumes/workspace/clients/radiology-associates/ra-frontend/node_modules/sanity-algolia/dist/sanity-algolia.cjs.development.js:184:21)
    at asyncGeneratorStep (/Volumes/workspace/clients/radiology-associates/ra-frontend/node_modules/sanity-algolia/dist/sanity-algolia.cjs.development.js:29:24)
    at _next (/Volumes/workspace/clients/radiology-associates/ra-frontend/node_modules/sanity-algolia/dist/sanity-algolia.cjs.development.js:51:9) {
  page: '/api/sanityAlgolia'
Nov 3, 2021, 2:29 AM
Here is my current file looks like

import sanityClient from "@sanity/client";
import algoliasearch from "algoliasearch";
import { NextApiRequest, NextApiResponse } from "next";
import indexer from "sanity-algolia";

const algolia = algoliasearch(
const sanity = sanityClient({
  projectId: process.env.NEXT_PUBLIC_PROJECTID,
  dataset: process.env.NEXT_PUBLIC_DATASET,
  apiVersion: "v2021-03-25",
  token: process.env.SANITY_TOKEN,
  useCdn: false,

export default function handler(req: NextApiRequest, res: NextApiResponse) {
  if (req.headers["content-type"] !== "application/json") {
    res.json({ message: "Bad request" });
  try {
    const sanityAlgolia = indexer(
      // The first parameter maps a Sanity document type to its respective Algolia
      // search index. In this example both `post` and `article` Sanity types live
      // in the same Algolia index. Optionally you can also customize how the
      // document is fetched from Sanity by specifying a GROQ projection.
        news: {
          index: algolia.initIndex("news"),
          projection: `{
            "slug": slug.current,
            "body": pt::text(body)
        page: {
          index: algolia.initIndex("pages"),
          projection: `{
            "slug": slug.current,
            "body": pt::text(body)
        service: {
          index: algolia.initIndex("services"),
          projection: `{
            "slug": slug.current,
            "text": section1.short_description
        physician: {
          index: algolia.initIndex("physicians"),
        staff: {
          index: algolia.initIndex("staff"),
        location: {
          index: algolia.initIndex("locations"),
        patientForm: {
          index: algolia.initIndex("patientForms"),
      // The second parameter is a function that maps from a fetched Sanity document
      // to an Algolia Record. Here you can do further mutations to the data before
      // it is sent to Algolia.
      (document) => {
        return document;
    return sanityAlgolia
      .webhookSync(sanity, req.body)
      .then(() => res.status(200).send("ok"));
  } catch (error) {
    return error;
Nov 3, 2021, 2:35 AM
There are couple things I would like to note that. I have tried console.log the
but it doesn’t give the format as
want to return
ids: {
        created: string[];
        updated: string[];
        deleted: string[];
But I am just sending
as github stated
Nov 3, 2021, 2:44 AM
Hey Shoaib! I think you're running into an issue with that Algolia package relying on Sanity's legacy webhooks. About a month ago, we switched to the new GROQ Powered Webhooks. You can't re-enable the legacy behavior, but you can mimic the old behavior using the method in the changelog .
Nov 3, 2021, 6:22 PM
Thank you
user M
, I am wondering if there is a way we know how to detect whether the webhook is for (created or updated or deleted)
Nov 3, 2021, 6:39 PM
Thank you
user M
, I am wondering if there is a way we know how to detect whether the webhook is for (created or updated or deleted)
Nov 3, 2021, 6:39 PM
user K
Were you able to resolve the above issue? 😊
Jan 24, 2022, 6:40 AM

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?