These are the docs for Trigger.dev v2 which will be deprecated on January 31st, 2025. You probably want the v3 docs.

Tasks are executed after the job is triggered and are the main building blocks of a job. You can string together as many tasks as you want.


All tasks

base.table.getRecords

Gets multiple records for a table. You can filter. Official Airtable Docs.

example.ts
// Gets multiple records from the table.
await table.getRecords("multiple records", {
  fields: ["Status"], // Here we only get the Status fields (columns)
});

base.table.getRecord

Gets a single record (using the id) for a table. Official Airtable Docs.

example.ts
// Get a single record using the ID of the first record in the fetched records.
await table.getRecord("single", records[0].id);

base.table.createRecords

Create one or more records in a table. Official Airtable Docs.

example.ts
// Create newRecords by adding a record to the table.
await table.createRecords("create records", [
  {
    // Define the new record to be created
    fields: {
      "Launch goals": "Created from Trigger.dev",
      Status: "In progress",
    },
  },
]);

base.table.updateRecords

Update one or more records in a table. Official Airtable Docs.

example.ts
// Update the record that was just created.
await table.updateRecords(
  // Specify the table's name as "update records."
  "update records",
  // Use the `map` method to create an array of records to be updated.
  newRecords.map((record) => ({
    // For each record, specify the: ID and the field to update ("Status" to "At risk").
    id: record.id,
    fields: {
      Status: "At risk",
    },
  }))
);

base.table.deleteRecords

Delete one or more records in a table (using ids). Official Airtable Docs.

example.ts
// Delete records from the table.
await table.deleteRecords(
  // Specify the table's name as "delete records."
  "delete records"
);

Example Usage

In this demo we will use the Airtable to get records from a table, create a new record, update it and then delete it.

// Importing necessary modules and packages.
import { TriggerClient, eventTrigger } from "@trigger.dev/sdk";
import { Airtable } from "@trigger.dev/airtable";
import { z } from "zod";

// Creating an instance of the Airtable client with personal access token obtained from an environment variable.
const airtable = new Airtable({
  id: "airtable",
  apiKey: process.env.AIRTABLE_PERSONAL_ACCESS_TOKEN!,
});

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",
  name: "Airtable Example: 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("multiple 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 for 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)
    );
  },
});