Use the Airtable integration to create, read, update, and delete records in your Airtable bases.

Coming soon: subscribing to changes in your Airtable bases using triggers.

Getting started

If you have not yet set up Trigger.dev in your project, go to the quick start guide.

Installation

To get started with the Airtable integration on Trigger.dev, you need to install the @trigger.dev/airtable package. You can do this using npm, pnpm, or yarn:

npm install @trigger.dev/airtable@latest

Authentication

To use the Airtable API with Trigger.dev, you can either use OAuth or a Personal Access Token.

OAuth

import { Airtable } from "@trigger.dev/airtable";

//this will use OAuth
const airtable = new Airtable({
  id: "airtable",
});

Personal Access Token

You can create an Airtable Personal Access Token here on their developer site.

import { Airtable } from "@trigger.dev/airtable";

//this will use the passed in token (defined in your environment variables)
const airtable = new Airtable({
  id: "airtable",
  token: process.env["AIRTABLE_TOKEN"],
});

Usage

Include the Airtable integration in your Trigger.dev job.

You can optionally add the types for your Table – this gives you nice type inference and errors when writing your code.

//this is the type definition for my Table
type LaunchGoalsAndOkRs = {
  "Launch goals"?: string;
  DRI?: Collaborator;
  Team?: string;
  Status?: "On track" | "In progress" | "At risk";
  "Key results"?: Array<string>;
  "Features (from 💻 Features table)"?: Array<string>;
  "Status (from 💻 Features)": Array<
    "Live" | "Complete" | "In progress" | "Planning" | "In reviews"
  >;
};

client.defineJob({
  id: "airtable-example-1",
  name: "Airtable Example 1: getRecords",
  version: "0.1.0",
  trigger: eventTrigger({
    name: "airtable.example",
  }),
  integrations: {
    //make sure to add the integration here
    airtable,
  },
  run: async (payload, io, ctx) => {
    //adding the type to table<YourTableType>("<your table name>") gives you nice type inference and errors
    //you can leave it out as well table("<your table name>")
    const table = io.airtable.base("<your base id>").table<LaunchGoalsAndOkRs>("<your table name>");

    //gets multiple records from the table. Here we only get the Status fields (columns)
    const records = await table.getRecords("muliple records", { fields: ["Status"] });
    await io.logger.log(records[0].fields.Status ?? "no status");

    //Get a single record
    const aRecord = await table.getRecord("single", records[0].id);

    //create a new record
    const newRecords = await table.createRecords("create records", [
      {
        fields: { "Launch goals": "Created from Trigger.dev", Status: "In progress" },
      },
    ]);

    //update the record we just created
    const updatedRecords = await table.updateRecords(
      "update records",
      newRecords.map((record) => ({
        id: record.id,
        fields: { Status: "At risk" },
      }))
    );

    //wait 5 seconds
    await io.wait("5 secs", 5);

    //delete the record we just created + updated
    const deletedRecords = await table.deleteRecords(
      "delete records",
      updatedRecords.map((record) => record.id)
    );
  },
});

Tasks

Function NameDescription
base.table.getRecordsGets multiple records for a table. You can filter
base.table.getRecordGets a single record (using the id) for a table.
base.table.createRecordsCreate one or more records in a table.
base.table.updateRecordsUpdate one or more records in a table.
base.table.deleteRecordsDelete one or more records in a table (using ids).
runTaskDo anything that’s possible with the official Airtable Node SDK