{
  "openapi": "3.0.1",
  "info": {
    "title": "Airtable Schema Diff - Compare & Monitor Bases",
    "description": "Compare two Airtable bases field by field, or snapshot one base and see exactly what changed since last run. Renames are reported as renames, not as a delete plus an add. Read-only token, schema.bases:read only - no record access.",
    "version": "1.0",
    "x-build-id": "JQuGE4Kq59IlBg0fu"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/mediocre_interest~airtable-schema-drift/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-mediocre_interest-airtable-schema-drift",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/mediocre_interest~airtable-schema-drift/runs": {
      "post": {
        "operationId": "runs-sync-mediocre_interest-airtable-schema-drift",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/mediocre_interest~airtable-schema-drift/run-sync": {
      "post": {
        "operationId": "run-sync-mediocre_interest-airtable-schema-drift",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "airtableToken": {
            "title": "Airtable personal access token",
            "type": "string",
            "description": "A read-only Airtable personal access token. Only the <code>schema.bases:read</code> scope is needed — this Actor never reads a single record. Create one at <a href='https://airtable.com/create/tokens' target='_blank'>airtable.com/create/tokens</a> and add each base you want under <b>Access</b>.<br><br><b>Leave this empty to see a worked example.</b> The Actor then compares two bundled sample bases instead of your own, and every row it writes is marked <code>source=\"sample\"</code>. That run is free."
          },
          "mode": {
            "title": "What to compare",
            "enum": [
              "comparative",
              "temporal"
            ],
            "type": "string",
            "description": "<b>Compare two bases</b> checks every base below against one template base, so you can see how far copies of the same template have drifted apart.<br><br><b>Track one base over time</b> stores a snapshot of each base and compares it against the snapshot from the previous run. The first run of any base stores its snapshot and reports no changes, because there is nothing yet to compare it against.",
            "default": "comparative"
          },
          "baseIds": {
            "title": "Bases",
            "type": "array",
            "description": "Airtable base IDs, one per line. Paste the whole base URL if that is easier — the ID is taken out of it. Leave empty to use every base the token can see.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "compareToBaseId": {
            "title": "Template base",
            "type": "string",
            "description": "The base everything else is compared against. Only used when comparing two bases. Leave it empty to use the first base listed above, which lets you paste the template first and its copies after it."
          },
          "ignore": {
            "title": "Changes to ignore",
            "type": "array",
            "description": "Kinds of change that will not be reported. The defaults hide the churn that every base produces on its own — someone hiding a column, dragging a field, recolouring a dropdown — so the output stays worth reading on a daily schedule.",
            "items": {
              "type": "string",
              "enum": [
                "fieldDescriptions",
                "tableDescriptions",
                "viewFieldVisibility",
                "fieldOrder",
                "viewOrder",
                "selectColors",
                "views",
                "formulaBodies"
              ],
              "enumTitles": [
                "Field description edits",
                "Table description edits",
                "Columns shown or hidden in a view",
                "Field order within a table",
                "View order within a table",
                "Dropdown option colours",
                "Views entirely (added, removed, renamed)",
                "Formula text changes"
              ]
            },
            "default": [
              "fieldDescriptions",
              "viewFieldVisibility",
              "fieldOrder",
              "viewOrder",
              "selectColors"
            ]
          },
          "minSeverity": {
            "title": "Minimum severity",
            "enum": [
              "critical",
              "high",
              "medium",
              "low"
            ],
            "type": "string",
            "description": "Drop changes milder than this. Leave it at <b>Low</b> to see everything; the output is sorted worst first either way.",
            "default": "low"
          },
          "snapshotStoreName": {
            "title": "Snapshot store name",
            "type": "string",
            "description": "The named key-value store that holds one snapshot per base, used when tracking a base over time. Snapshots are overwritten each run, one record per base. Change this only to keep two schedules from sharing snapshots.",
            "default": "airtable-schema-snapshots"
          },
          "includeHtmlReport": {
            "title": "Write a shareable report",
            "type": "boolean",
            "description": "Produce a self-contained web page per base listing every change, worst first, ready to send to whoever owns the base. The link appears on that base's summary row.",
            "default": true
          },
          "maxBases": {
            "title": "Maximum bases",
            "minimum": 1,
            "type": "integer",
            "description": "Stop after this many bases.",
            "default": 200
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}