2025-09-10
v17.7.1

What’s changed in v17.7.1

cli

  • 🐛 Fix zapier scaffold failing when app object contains spread elements (#1115)
  • 🐛 Fix zapier invoke auth may append to last line without a newline (#1138)
  • 🐛 Fix zapier scaffold to use .js extension for TS imports (#1123)
  • 🐛 Fix zapier scaffold to handle shorthand property syntax (#1125)
  • 💅 zapier validate now runs _zapier-build before validation by default (#1130)
  • 💅 Add dev script to package.json of typescript templates generated by zapier init (#1128)
  • 💅 Improve zapier init to list only templates that support selected module and language (#1146)

core

  • 🐛 Censor sensitive info in ResponseError (#1147)

schema

  • 🐛 Fix InputFieldGroupsSchema to have its properties displayed (#1143)
  • 🧪 Allow to skip cleaning arrays in inputData via skipCleanArrayInputData (#1153)
  • 🔨 Support version with label (ongoing work) (#1093)
2025-09-08
Backend change

No more manual handling of 4xx errors in refreshAccessToken

We made a change to how we handle error responses when refreshing OAuth2 access tokens.

Old behavior

When an app gives an error response (status code 4xx or 5xx) while refreshing the OAuth2 access token, Zapier keeps retrying the Zap step indefinitely or until it hits a certain limit, depending on the user’s settings.

New behavior

When an app encounter a 4xx error response (except for the ones listed below) while refreshing the access token, Zapier will mark the connect as stale, and send an email telling the user to reconnect.Exceptions: The following 4xx errors often indicate a temporary issue so they still have the same behavior as before:
  • 408 (Request Timeout)
  • 409 (Conflict)
  • 423 (Locked)
  • 425 (Too Early)
  • 429 (Too Many Requests)
This is how Zapier handles a stale connection:
  • If the stale connection is used by a trigger step, the trigger polling system will skip polling when the scheduled time comes.
  • If the stale connection is used by an action step, the Zap run will be put on hold until the user reconnects and replays the run.

What does it mean to you?

You don’t need to handle 4xx error responses in refreshAccessToken anymore. For example, you might have been catching 4xx errors in refreshAccessToken by enabling skipThrowForStatus and throwing ExpiredAuthError:
const refreshAccessToken = async (z, bundle) => {
  const response = await z.request({
    url: 'https://example.com/token/refresh',
    method: 'POST',
    body: {
      refresh_token: bundle.authData.refresh_token,
      client_id: process.env.CLIENT_ID,
      client_secret: process.env.CLIENT_SECRET,
      grant_type: 'refresh_token',
    },
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
    },
    skipThrowForStatus: true,
  });

  if (response.status >= 400 && response.status < 500) {
    throw new z.errors.ExpiredAuthError('Authentication issue. Please reconnect.');
  }

  return response.data;
};
This is no longer necessary. Now you can simplify your code as follows and let the platform handle it:
const refreshAccessToken = async (z, bundle) => {
  const response = await z.request({
    url: 'https://example.com/token/refresh',
    method: 'POST',
    body: {
      refresh_token: bundle.authData.refresh_token,
      client_id: process.env.CLIENT_ID,
      client_secret: process.env.CLIENT_SECRET,
      grant_type: 'refresh_token',
    },
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
    },
  });
  return response.data;
};
No need to upgrade zapier-platform-core; this change is implemented in the Zapier backend.
2025-08-22
v17.7.0

What’s changed in v17.7.0

This update lays groundwork for Search Pagination, which will allow Search steps to paginate through results so that the most relevant results can be returned. However, this is not yet supported by any Zapier products.

cli

  • 🐛 Fix zapier pull error “listFiles is not a function” (#1113)
  • 🐛 Fix zapier invoke auth writing object values to .env as [object Object] (#1107)
  • 💅 Add logic to zapier build to handle the case where the app directory has symlinks to files on a different drive (#1106)
  • 🎉 zapier invoke supports testing Search Pagination with a paging_token flag (#1082)

core

  • 🎉 Foundational support for Search Pagination (#1082)

schema

  • 🎉 Schema support for Search Pagination (#1082)

misc

  • 💅 Enable Windows in Github Actions CI (#1106)
  • 💅 Add Claude, Copilot, and Cursor instructions/rules (#1107)
  • 🔨 Bump tmp from 0.2.3 to 0.2.4 (#1100)
  • 🔨 Bump sha.js from 2.4.11 to 2.4.12 (#1116)

The rest can be found in CHANGELOG.md.