expected_livemode:false selects
no separate Airtable sandbox: it asserts that the authenticated gigstack mode shown
in your confirmation is test mode. Provider webhook creation/deletion still affects
the real connected Airtable account. Confirm those effects before sending.
Choose a base and table
data.data. If data.has_more is true, repeat with the opaque
data.next_cursor as the cursor query parameter. Then call
GET /teams/{id}/integrations/airtable/bases/{baseId}/tables to list each table’s
fields. Table results are not paginated. Save provider IDs from these responses.
Register an import mapping
Create and save a UUIDv4 before submitting. Replace the example IDs with the selected base/table/field IDs. This example imports Airtable amounts as gigstack payments; inspect your table and mapping before confirmation.field_map maps payment paths to existing Airtable field names or IDs. amount is
required. Supported paths include currency, status, payment_form, exchange,
items, documented client identity/address fields and safe metadata.* paths.
Arbitrary payment fields and prototype-like paths are rejected. Currency and
payment-form defaults follow the exact request schema.
A successful HTTP response is {success:true,data:...,timestamp:...}. For mutations,
inspect data.status: completed confirms that operation, while processing and
outcome_unknown do not. A first confirmed registration may include data.webhook;
replay/readback may omit it. List the local mappings to read current state.
Inspect mappings and results
GET /teams/{id}/integrations/airtable/webhookslists the selected mode’s mappings. Uselimit,cursor,base_idandstatusfor scoped paging/filtering.GET /teams/{id}/integrations/airtable/webhooks?scope=sharedexplicitly inspects both modes and legacy records. It requires configuration authority.GET /teams/{id}/integrations/airtable/bases/{baseId}/webhooks/remotereads the shared provider inventory. It returns no notification URLs, MACs or tokens.GET /teams/{id}/integrations/airtable/operations/{operationId}reads the saved operation. Itstargetshas separatehas_moreandnext_cursorpagination.
can_manage, can_recover_registration and an appropriately
scoped blocking_operation_id. These help present available actions; the backend
rechecks current authority when you act. Disconnected teams can still list their
local mappings without OAuth credentials.
Remove mappings or disconnect
DELETE /teams/{id}/integrations/airtable/webhooks/{webhookId} takes a new saved
operation_id, expected_livemode and confirmed:true in its JSON body.
POST /teams/{id}/integrations/airtable/disconnect also requires
acknowledge_shared_connection:true. It disables imports and removes stored hooks
across both modes, including legacy records. It retains encrypted OAuth credentials
and does not revoke the person’s Airtable grant.
Cleanup is bounded. If continuation_required:true, an explicit continuation uses
the same UUID and identical payload to process previously unattempted targets.
It does not resend a target whose outcome is unknown. Never change the payload under
the same UUID; that returns 409 idempotency_conflict. Local disablement is not
proof of remote deletion; inspect the target statuses and counts.
Recover an uncertain result
Keep the operation ID after any timeout. Read it, then callPOST /teams/{id}/integrations/airtable/operations/{operationId}/reconcile with {}.
Reconcile reads evidence and never repeats an uncertain create/delete. A new UUID
is a new action, not an idempotent retry. Registration cannot recover a lost one-time
MAC by recreating the same webhook.
If an uncertain OAuth refresh blocks cleanup, a current administrator can prepare a
reviewed browser recovery session with:
POST /teams/{id}/integration-connection-sessions. Preparation disables
local imports in bounded pages. Inspect data.recovery.snapshot_complete; each
continuation needs explicit acknowledgment. GET never advances preparation. The
person then completes the returned authenticated browser handoff.
Recovery stores restricted credentials with imports disabled. It preserves the old
unknown outcome and does not release its lock. Only a verified matching Airtable
identity can establish old target evidence. A different or previously unverified
identity cannot prove cleanup by seeing no webhooks; legacy unverified identity
requires operator-assisted verification.
The browser guides the person through a separately confirmed cleanup with a new
operation UUID referencing recovery_operation_id, shared-connection acknowledgment
and acknowledgment of unconfirmed effects. For a registration orphan, cleanup uses
DELETE on its proven webhook ID; unregister/disconnect recovery uses POST disconnect.
The old receipt points to cleanup_operation_id and stays unknown. Reconnect through
ordinary reviewed setup only after that separate cleanup completes. Reconnection is
never automatic.
Errors and validation
401 requires a verified personal credential. 403 indicates current authority or
account state refused the operation. 409 mode_changed requires reviewing the newly
selected mode; lock/recovery conflicts require inspecting the existing operation.
After 504 or an interrupted request, preserve the UUID and read its receipt.
These workflows have offline tests with mocked provider effects. Public deployment,
provider authorization and end-to-end live verification are separate release steps.