Skip to main content

Confirm

Are you sure?

Integrations

URLpipe in Google Sheets

A column of URLs in, their titles, descriptions and performance scores out.

By · Last updated: September 2026

TL;DR

Google Sheets calls URLpipe through Apps Script: UrlFetchApp posts JSON to an endpoint such as https://urlpipe.dev/meta with your key from Script Properties. A custom function like =URLPIPE_META(A2) returns the title and description into the row; slower Lighthouse audits run from a menu item instead.

Free plan, no credit card. 1,000 credits a month.

Step 1

Add the script

In your sheet, open Extensions → Apps Script. Under Project Settings → Script Properties, add URLPIPE_API_KEY with a project API key. Then replace the editor's contents with:

Code.gs
const URLPIPE = "https://urlpipe.dev";

function urlpipe_(path, body) {
  const key = PropertiesService.getScriptProperties().getProperty("URLPIPE_API_KEY");
  const res = UrlFetchApp.fetch(URLPIPE + path, {
    method: "post",
    contentType: "application/json",
    headers: { Authorization: "Bearer " + key },
    payload: JSON.stringify(Object.assign({ sync: true }, body)),
    muteHttpExceptions: true,
  });
  const text = res.getContentText();
  if (res.getResponseCode() !== 200) {
    throw new Error("URLpipe " + res.getResponseCode() + ": " + text);
  }
  return JSON.parse(text);
}

/**
 * Title, description and image of a page, across three cells.
 * @param {string} url The page's address.
 * @customfunction
 */
function URLPIPE_META(url) {
  if (!url) return "";
  const m = urlpipe_("/meta", { url: url });
  return [[m.title, m.description, m.main_image_url]];
}

/** Adds a menu that fills column E with mobile performance scores. */
function onOpen() {
  SpreadsheetApp.getUi().createMenu("URLpipe")
    .addItem("Lighthouse scores into column E", "fillLighthouse")
    .addToUi();
}

function fillLighthouse() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const rows = sheet.getRange(2, 1, sheet.getLastRow() - 1, 1).getValues();
  rows.forEach(function (row, i) {
    if (!row[0]) return;
    const audit = urlpipe_("/lighthouse", { url: row[0], device: "mobile" });
    const score = audit.categories.performance.score;
    sheet.getRange(i + 2, 5).setValue(score === null ? "" : Math.round(score * 100));
  });
}

Step 2

Use it

  • Put URLs in column A, and in B2 type =URLPIPE_META(A2). The title, description and image URL fill B, C and D of that row. Drag it down the column.
  • Reload the sheet to see the URLpipe menu, and choose Lighthouse scores into column E to fill column E with 0–100 performance scores. The first run asks you to authorize the script.

Why two shapes? A custom function must return within 30 seconds, which a metadata call does comfortably. A Lighthouse audit usually takes 15–20 seconds per page, so a column of them runs from a menu, where Apps Script allows minutes rather than seconds, and writes each score as it lands.

Cost

Recalculation is free

Sheets re-runs custom functions when it sees fit — on open, on edits, when you copy a column. Each re-run is a request to URLpipe, and a repeat of the same URL inside seven days is served from the cache for nothing. So the sheet costs what its distinct URLs cost: 5 credits per page for metadata, 2 per audit.

A sheet of 150 URLs with metadata and a mobile audit is 1,050 credits — the cheapest plan that covers it is Starter: $19 a month for 20,000 credits, at list price.

Limits

What it doesn't do

  • The API allows 60 requests a minute and 15 per 10 seconds per project. Dragging a formula down a thousand rows fires them all at once; expect some cells to show a rate_limited error until they recalculate.
  • The Free plan runs 1 request at a time, so parallel recalculation queues. See pricing for the parallel limit of each plan.
  • This is a script you own, not an add-on: there is no URLpipe listing in the Workspace Marketplace.

FAQ

Frequently asked questions

Can a Google Sheets custom function call an API?
Yes. Custom functions may use UrlFetchApp, as long as they return within 30 seconds. /meta does; a column of Lighthouse audits runs better from a menu item.
Where should I keep the API key in Apps Script?
In Project Settings → Script Properties, read with PropertiesService.getScriptProperties(). Keep it out of the code and out of the sheet's cells.
Does recalculating the sheet spend credits again?
Not for seven days. Repeats of the same request inside max_age are free cache hits.
Why do some cells show a rate limit error?
Filling many rows at once sends many requests at once. The API allows 60 a minute per project; those cells succeed when they recalculate.

Connect it in five minutes.

Free plan, no card. Confirm your email and your API key is live — you'll be making real requests in minutes.