Omniscope Custom Blocks › Connectors/Airtable

Airtable

Reads every record of an Airtable table, or of one of its views, through the Airtable REST API, one record per row.

Connectors Python

Open the demo in Omniscope Download demo.ioz Sample data: placeholder.csv Source on GitHub

Omniscope custom block · Connectors

Bookings, inventories or project trackers kept in Airtable? The whole table in your workflow, every page of it, with no export to download first.

Python · pandas, requests · requests installed on first run

The problem it solves

Teams keep live lists in Airtable: bookings, stock, content calendars, project trackers. Reporting on them usually means exporting a CSV by hand, which is out of date by the next morning, or writing an API loop that pages through 100 records at a time and untangles the lists and attachments Airtable returns.

This block reads the table straight from the Airtable API, follows every page, and gives one record per Airtable record, ready to aggregate and chart.

How it works

What goes in

Workshop bookings (an Airtable table)

An invented table of bookings for an arts centre's workshops: who booked, which workshop, how many seats, whether they have paid, tags and a booking form.

Name Email Workshop Seats Paid Tags Booked on
Ana Ribeiro ana@example.com Pottery for beginners 2 ✓ weekend 2026-03-02
Priya Nair priya@example.com Pottery for beginners 3 weekend, group 2026-03-03
Callum Reid callum@example.com Life drawing 1 ✓ evening 2026-03-04
Dev Patel dev@example.com Life drawing 2026-03-12

12 bookings in the invented table.

The options

Option Demo setting What it does
Personal access token (yours) A token with the data.records:read scope.
Base ID (yours) The base, from the table's web address (app...).
Table name or ID Bookings The table, by name or tbl... ID.
View empty Optional: read only one view's records, in its order.
Filter formula empty Optional: read only the records for which an Airtable formula is true.
Page size 100 Records per request; all pages are read whatever the size.

What comes out

Records (selected)

id Name Workshop Seats Paid Tags Booked on
rec01AbCdEfGhIjK Ana Ribeiro Pottery for beginners 2 true ["weekend"] 2026-03-02
rec03AbCdEfGhIjK Priya Nair Pottery for beginners 3 false ["weekend", "group"] 2026-03-03
rec04AbCdEfGhIjK Callum Reid Life drawing 1 true ["evening"] 2026-03-04
rec11AbCdEfGhIjK Dev Patel Life drawing false 2026-03-12

12 records, with Email and an Attachments field (JSON text, on the one booking with a form) as well. Aggregated by workshop: Screen printing has 7 seats booked and all 3 bookings paid; Pottery for beginners has 6 seats and only 1 of 3 paid.

Where it pays off

Events and bookings: Seats, payments and no-shows

Report seats sold and unpaid bookings per event from the booking table the front desk already uses.

Operations: Stock and asset registers

Join an Airtable inventory to sales or usage data from a database, and flag items running low.

Marketing: Content calendars

Count planned, drafted and published pieces per channel and month from a content calendar, with a view such as "This quarter".

Project tracking: Status across trackers

Combine trackers kept in several bases into one status report, refreshed on a schedule.

Use cases describe typical scenarios and are illustrative; the sample data is invented.

Why do this in Omniscope

How it fits into an Omniscope workflow

Airtable (Bookings) → Field Organiser (Booked on to a date) → Aggregate (seats and paid by workshop) → Report

Booked on and other date fields arrive as text; set their type in a Field Organiser before working with dates.

Try it

  1. Open the demo project (demo.iox on the demo server, or import demo.ioz from this folder). It holds the Airtable block, not connected to any base, and a File block with placeholder.csv: what the block outputs for the invented bookings table. The rest of the workflow runs from the File block.
  2. The question: how many seats are booked per workshop, and how many bookings are unpaid?
  3. Look at the File block's output: 12 records, with id first, Paid as true/false and Tags as JSON text.
  4. To read your own table: create a personal access token with the data.records:read scope, open the Airtable block, enter the token, base ID and table name, and run it. Then connect it in place of the File block.
  5. Set a view or a filter formula such as {Paid} = FALSE() and run again: only the matching records arrive.

Running in Omniscope

Omniscope workflow
Omniscope workflow

The demo project's workflow: the block, the sample output in a File block, and a Validate data check on it.

Language and libraries

Python. It uses pandas and requests.

pandas is part of Omniscope's Python environment. requests (Apache License 2.0) is listed in the manifest's dependencies; Omniscope installs it on first run if it is missing.

Tested

The block is covered by automated tests that run its script against a stand-in for Omniscope's Python API and canned Airtable responses (no call reaches Airtable): two pages followed by offset, the request sent (address, token header, page size, timeout), table names with spaces and slashes, views and filter formulas, an empty table, a table with its own id field, mixed text and numbers, a rate-limit answer waited out, error answers and bad options, and 6,000 records in 60 pages.

Reference

Options

NameTypeWhat it does
Personal access tokenPasswordAn Airtable personal access token with the data.records:read scope and access to the base.
Base IDTextThe ID of the base: the part of the table's web address that starts with "app", for example appA1b2C3d4E5f6G7.
Table name or IDTextThe table's name, exactly as shown in Airtable, or its ID (the part of the address that starts with "tbl").
ViewTextOptional. A view's name or ID (starts with "viw"): only the records in that view are read, in its order.
Filter formulaTextOptional. An Airtable formula; only records for which it is true are read, for example {Status} = 'Open'.
Page sizeWhole numberRecords per request, from 1 to 100 (Airtable's maximum). All pages are read whatever the size.

Outputs

OutputWhat it holds
RecordsOne record per Airtable record: the record ID, then the table's fields. Lists and objects as JSON text.