n8n Workflow
Expert

Airtable CRUD API Endpoint

Create a full CRUD REST API for your Airtable data using this n8n template. Handle GET, POST, PUT, and DELETE requests to manage records without writing any code.

Overview

Builds a complete RESTful API to perform Create, Read, Update, and Delete (CRUD) operations on an Airtable database via webhook endpoints.

🧠 Description & Use Case

This workflow template creates a fully functional REST API for an Airtable base, allowing you to perform all standard CRUD (Create, Read, Update, Delete) operations. It uses two Webhook nodes to define endpoints that listen for different HTTP methods and routes requests to the appropriate Airtable action.

🔄 How It Works:

The workflow is built around two primary webhook endpoints:

  1. /customers Endpoint (for collections):

    • GET /customers: Triggers the Get All node to retrieve every record from the specified Airtable table.
    • POST /customers: Triggers the Create node to add a new record to the Airtable table using data from the request body. It returns a 201 Created status.
  2. /customers/:id Endpoint (for individual records):

    • GET /customers/:id: Triggers the Get Single node to search for and retrieve a specific record by its customer_id.
    • PUT /customers/:id: Triggers the Airtable (Update) node to find a record by its customer_id and update its fields with the data provided in the request.
    • DELETE /customers/:id: Triggers a two-step process. First, it finds the record by its customer_id to get the unique Airtable record ID, then passes that ID to the Airtable (Delete) node to remove it.

Each path concludes with a Respond to Webhook node, which sends the result of the Airtable operation (or a success message) back to the client.

✅ Real-World Use Cases:

  • Headless CMS: Use Airtable as a simple, powerful backend for a website, blog, or web application, managing content through API calls.
  • Rapid Prototyping: Quickly stand up a backend for a new application or service without the overhead of setting up a traditional database and server.
  • Internal Tooling: Create a standardized API for internal tools to read from or write to a central Airtable base, ensuring data consistency.
  • Mobile App Backend: Provide a simple data store for a mobile app to manage user data, settings, or content.
  • Integrating Legacy Systems: Expose data from an Airtable sheet as a modern REST API that other services can easily consume.

Instructions

Basic steps

  1. Download workflow JSON
  2. Import into n8n
  3. Configure node parameters as needed
  4. Test and enable the workflow

💡 Tips

After importing, verify all connectors and credentials match your environment.

Preview

Workflow Visualization

18 nodes
100%
Respond to WebhookrespondToWebhookRespond to Webhook1respondToWebhookRespond to Webhook2respondToWebhookRespond to Webhook4respondToWebhookSticky NotestickyNoteCreateairtableGet AllairtableSticky Note1stickyNoteSticky Note2stickyNoteGet SingleairtableSticky Note3stickyNoteAirtableairtableRespond to Webhook5respondToWebhookSticky Note4stickyNoteAirtable1airtableGet Single1airtableWebhookwebhookWebhook (with ID)webhook

Nodes

1

Respond to Webhook

respondToWebhook

v1.1
2

Respond to Webhook1

respondToWebhook

v1.1
3

Respond to Webhook2

respondToWebhook

v1.1
4

Respond to Webhook4

respondToWebhook

v1.1
5

Sticky Note

stickyNote

v1
6

Create

airtable

v2.1
7

Get All

airtable

v2.1
8

Sticky Note1

stickyNote

v1
9

Sticky Note2

stickyNote

v1
10

Get Single

airtable

v2.1
11

Sticky Note3

stickyNote

v1
12

Airtable

airtable

v2.1
13

Respond to Webhook5

respondToWebhook

v1.1
14

Sticky Note4

stickyNote

v1
15

Airtable1

airtable

v2.1
16

Get Single1

airtable

v2.1
17

Webhook

webhook

v2
18

Webhook (with ID)

webhook

v2

Statistics

Total nodes:18
Disabled nodes:0
Node types:4
Connections:8
View full JSON structure
{
  "nodes": [
    {
      "id": "d5b5010f-97fb-4f80-871b-e9f04b3977a9",
      "name": "Respond to Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        1220,
        -180
      ],
      "parameters": {
        "options": {},
        "respondWith": "allIncomingItems"
      },
      "typeVersion": 1.1
    },
    {
      "id": "46711e2f-6cd1-4947-9452-7a1484ae562f",
      "name": "Respond to Webhook1",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        1220,
        860
      ],
      "parameters": {
        "options": {
          "responseCode": 201
        },
        "respondWith": "allIncomingItems"
      },
      "typeVersion": 1.1
    },
    {
      "id": "20489a88-39a5-4cf7-8c08-826e4e9a7f34",
      "name": "Respond to Webhook2",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        1220,
        340
      ],
      "parameters": {
        "options": {
          "responseCode": 200
        },
        "respondWith": "allIncomingItems"
      },
      "typeVersion": 1.1
    },
    {
      "id": "04320a5f-29fe-42b0-9e01-31035f23b9dc",
      "name": "Respond to Webhook4",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        1220,
        600
      ],
      "parameters": {
        "options": {},
        "respondWith": "allIncomingItems"
      },
      "typeVersion": 1.1
    },
    {
      "id": "45ef8f08-f765-440d-be85-12096b6b4105",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        940,
        765.3897477624087
      ],
      "parameters": {
        "color": 4,
        "width": 514,
        "height": 255.253864930838,
        "content": "#### Creation\nCreates a new record"
      },
      "typeVersion": 1
    },
    {
      "id": "2e820357-250c-41a7-9daa-4eb77e7eded6",
      "name": "Create",
      "type": "n8n-nodes-base.airtable",
      "position": [
        1000,
        860
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "app662qLY5J8ys4fU",
          "cachedResultUrl": "https://airtable.com/app662qLY5J8ys4fU",
          "cachedResultName": "customers"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tblwvA7Wrmvmv37rq",
          "cachedResultUrl": "https://airtable.com/app662qLY5J8ys4fU/tblwvA7Wrmvmv37rq",
          "cachedResultName": "Table 1"
        },
        "columns": {
          "value": {
            "email": "={{ $json.query.email }}",
            "phone": "={{ $json.query.phone }}",
            "address": "={{ $json.query.address }}",
            "last_name": "={{ $json.query.last_name }}",
            "first_name": "={{ $json.query.first_name }}",
            "customer_id": "={{ $json.query.customer_id }}"
          },
          "schema": [
            {
              "id": "customer_id",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "customer_id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "first_name",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "first_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "last_name",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "last_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "email",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "phone",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "phone",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "address",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "address",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": []
        },
        "options": {},
        "operation": "create"
      },
      "credentials": {
        "airtableTokenApi": {
          "id": "yX3WnQ0zNClN0JoN",
          "name": "Airtable giulio@n8n"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "dceb7ad3-3c29-4cb9-b097-00c5ae1d2732",
      "name": "Get All",
      "type": "n8n-nodes-base.airtable",
      "position": [
        1000,
        600
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "app662qLY5J8ys4fU",
          "cachedResultUrl": "https://airtable.com/app662qLY5J8ys4fU",
          "cachedResultName": "customers"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tblwvA7Wrmvmv37rq",
          "cachedResultUrl": "https://airtable.com/app662qLY5J8ys4fU/tblwvA7Wrmvmv37rq",
          "cachedResultName": "Table 1"
        },
        "options": {},
        "operation": "search"
      },
      "credentials": {
        "airtableTokenApi": {
          "id": "yX3WnQ0zNClN0JoN",
          "name": "Airtable giulio@n8n"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "15a418ac-9de1-4c1d-ada7-057c280373df",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        940,
        522.9617575264442
      ],
      "parameters": {
        "color": 4,
        "width": 514,
        "height": 228.6908055329536,
        "content": "#### Get All\nRetrieves all records"
      },
      "typeVersion": 1
    },
    {
      "id": "9736394d-3298-485c-b907-19804bbd48fb",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        940,
        -260
      ],
      "parameters": {
        "color": 4,
        "width": 514,
        "height": 228,
        "content": "#### Get\nRetrieves a single record"
      },
      "typeVersion": 1
    },
    {
      "id": "b5544fc2-10cf-47dd-815c-51e8044e073d",
      "name": "Get Single",
      "type": "n8n-nodes-base.airtable",
      "position": [
        1000,
        -180
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "app662qLY5J8ys4fU",
          "cachedResultUrl": "https://airtable.com/app662qLY5J8ys4fU",
          "cachedResultName": "customers"
        },
        "limit": 1,
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tblwvA7Wrmvmv37rq",
          "cachedResultUrl": "https://airtable.com/app662qLY5J8ys4fU/tblwvA7Wrmvmv37rq",
          "cachedResultName": "Table 1"
        },
        "options": {},
        "operation": "search",
        "returnAll": false,
        "filterByFormula": "=({customer_id} = {{ $json.params.id }})"
      },
      "credentials": {
        "airtableTokenApi": {
          "id": "yX3WnQ0zNClN0JoN",
          "name": "Airtable giulio@n8n"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "0f08fcee-b892-47ec-b13c-639f7e5b4b91",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        940,
        260
      ],
      "parameters": {
        "color": 4,
        "width": 508.2945484133443,
        "height": 248.8478437754271,
        "content": "#### Update\nUpdates of an existing record"
      },
      "typeVersion": 1
    },
    {
      "id": "56ff1769-15fe-475d-96aa-9c0f1a9edf05",
      "name": "Airtable",
      "type": "n8n-nodes-base.airtable",
      "position": [
        1000,
        340
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "app662qLY5J8ys4fU",
          "cachedResultUrl": "https://airtable.com/app662qLY5J8ys4fU",
          "cachedResultName": "customers"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tblwvA7Wrmvmv37rq",
          "cachedResultUrl": "https://airtable.com/app662qLY5J8ys4fU/tblwvA7Wrmvmv37rq",
          "cachedResultName": "Table 1"
        },
        "columns": {
          "value": {
            "email": "={{ $json.query.email }}",
            "phone": "={{ $json.query.phone }}",
            "address": "={{ $json.query.address }}",
            "last_name": "={{ $json.query.last_name }}",
            "first_name": "={{ $json.query.first_name }}",
            "customer_id": "={{ $json.query.customer_id }}"
          },
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "id",
              "defaultMatch": true
            },
            {
              "id": "customer_id",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "customer_id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "first_name",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "first_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "last_name",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "last_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "email",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "phone",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "phone",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "address",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "address",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "customer_id"
          ]
        },
        "options": {},
        "operation": "update"
      },
      "credentials": {
        "airtableTokenApi": {
          "id": "yX3WnQ0zNClN0JoN",
          "name": "Airtable giulio@n8n"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "e20c0448-9688-47ae-873b-7cc5ac6e826a",
      "name": "Respond to Webhook5",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        1420,
        80
      ],
      "parameters": {
        "options": {
          "responseCode": 200
        },
        "respondWith": "allIncomingItems"
      },
      "typeVersion": 1.1
    },
    {
      "id": "f13eb006-b576-4e65-9c04-7a8516dccb35",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        940,
        -20
      ],
      "parameters": {
        "color": 4,
        "width": 737.8307567127741,
        "height": 267.4320585842148,
        "content": "#### Delete\nDeletes a record"
      },
      "typeVersion": 1
    },
    {
      "id": "0f434e52-2fda-41c0-9f40-38bf1977b8a6",
      "name": "Airtable1",
      "type": "n8n-nodes-base.airtable",
      "position": [
        1200,
        80
      ],
      "parameters": {
        "id": "={{ $json.id }}",
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "app662qLY5J8ys4fU",
          "cachedResultUrl": "https://airtable.com/app662qLY5J8ys4fU",
          "cachedResultName": "customers"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tblwvA7Wrmvmv37rq",
          "cachedResultUrl": "https://airtable.com/app662qLY5J8ys4fU/tblwvA7Wrmvmv37rq",
          "cachedResultName": "Table 1"
        },
        "operation": "deleteRecord"
      },
      "credentials": {
        "airtableTokenApi": {
          "id": "yX3WnQ0zNClN0JoN",
          "name": "Airtable giulio@n8n"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "c58724ab-354b-43af-8a60-495837f8a4a2",
      "name": "Get Single1",
      "type": "n8n-nodes-base.airtable",
      "position": [
        1000,
        80
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "app662qLY5J8ys4fU",
          "cachedResultUrl": "https://airtable.com/app662qLY5J8ys4fU",
          "cachedResultName": "customers"
        },
        "limit": 1,
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tblwvA7Wrmvmv37rq",
          "cachedResultUrl": "https://airtable.com/app662qLY5J8ys4fU/tblwvA7Wrmvmv37rq",
          "cachedResultName": "Table 1"
        },
        "options": {},
        "operation": "search",
        "returnAll": false,
        "filterByFormula": "=({customer_id} = {{ $json.params.id }})"
      },
      "credentials": {
        "airtableTokenApi": {
          "id": "yX3WnQ0zNClN0JoN",
          "name": "Airtable giulio@n8n"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "1b8fc8af-4892-4804-85d0-8e84904a3cf0",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        500,
        720
      ],
      "webhookId": "580ccc56-f308-4b64-961d-38323501a170",
      "parameters": {
        "path": "customers",
        "options": {},
        "responseMode": "responseNode",
        "multipleMethods": true
      },
      "typeVersion": 2
    },
    {
      "id": "7a8a9006-c2ea-4a87-8a94-fb925ed91abd",
      "name": "Webhook (with ID)",
      "type": "n8n-nodes-base.webhook",
      "position": [
        500,
        80
      ],
      "webhookId": "580ccc56-f308-4b64-961d-38323501a170",
      "parameters": {
        "path": "customers/:id",
        "options": {},
        "httpMethod": [
          "GET",
          "DELETE",
          "PUT"
        ],
        "responseMode": "responseNode",
        "multipleMethods": true
      },
      "typeVersion": 2
    }
  ],
  "connections": {
    "Create": {
      "main": [
        [
          {
            "node": "Respond to Webhook1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get All": {
      "main": [
        [
          {
            "node": "Respond to Webhook4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook": {
      "main": [
        [
          {
            "node": "Get All",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Create",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Airtable": {
      "main": [
        [
          {
            "node": "Respond to Webhook2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Airtable1": {
      "main": [
        [
          {
            "node": "Respond to Webhook5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Single": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Single1": {
      "main": [
        [
          {
            "node": "Airtable1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook (with ID)": {
      "main": [
        [
          {
            "node": "Get Single",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Get Single1",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Airtable",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Actions

Share
Categories:
Tags:
airtablewebhookstickynoterespondtowebhook

Technical Specs

Complexity:
Expert
Node Count:
18 nodes
Published:11 months ago
Updated:6 days ago

Compatibility

Platform:
N8N Cloud & Self-hosted
Min Version:
N8N v1.0.0+
Supports cloud and self-hosted deployment

License

This workflow template follows MIT license, you can freely use, modify and distribute.

Please comply with relevant third-party service terms when using.

Related Workflows