Move and match data between tables.
Appenda has three built-in table methods. Each one is an enrichment field: you create it on a table, run it, and read its cells, the same way as any other enrichment.
| Method | Name | What it does |
|---|---|---|
send_row | Send row to table | Writes this row, or the fields you choose from it, as a row of another table. |
send_list | Send list to table | Writes each item of a JSON list in this row as its own row of another table. |
find_rows | Find rows in table | Finds the rows of another table whose field matches this row's value. |
All three are free and spend no credits. They run on your desktop and in the Cloud, and they need no key.
Find the methods
List integrations returns Appenda like any other provider. It is always connected and takes no credential:
curl https://api.appenda.app/v1/integrations \
-H "Authorization: Bearer $APPENDA_API_KEY"
{
"provider_id": "appenda",
"name": "Appenda",
"connection": "built_in",
"connected": true,
"methods": [
{
"id": "send_row",
"label": "Send row to table",
"kind": "row_action",
"category": "tables",
"runs_on": "local_and_cloud",
"price": "free"
}
]
}
| Field | Meaning |
|---|---|
connection | built_in: always connected, never given a key. credential: connect your own key first. |
runs_on | local_and_cloud: runs on your desktop and in the Cloud. cloud: runs only in the Cloud. |
price | free: never spends credits. credits: spends Appenda credits. null for other providers. |
Appenda never appears in List credentials. To see a method's inputs and its
schema_version, call Get an integration action, for example
GET /v1/integrations/appenda/actions/send_row.
Send rows to another table
Create a Send row field on the source table. target_table is the table the
rows go to, and mapping says which field fills which target field. Send the
schema_version that Get an integration action returns:
curl https://api.appenda.app/v1/tables/tbl_67ad65ba34a7bbfc643711b8531cba3f/enrichment-fields \
-H "Authorization: Bearer $APPENDA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Send to Accounts",
"provider": "appenda",
"action": "send_row",
"schema_version": 1,
"inputs": {
"target_table": {"value": "tbl_5246f913f71a9485a05033249a6dc75e"},
"mapping": {"value": [{"from": "fld_1e57b877a78db86124936f976015f646", "to_field_id": "fld_a6806b5f732319fbc6a15bafac71f658"}]},
"match_field": {"value": "fld_a6806b5f732319fbc6a15bafac71f658"},
"overwrite": {"value": "fill_empty"}
}
}'
| Input | Meaning |
|---|---|
target_table | Required. A table in the same workspace. |
mapping | Required. Up to 256 pairs of a source field (from) and the target field it fills (to_field_id). |
match_field | Optional. A target field whose value finds the row to update instead of adding a new one. |
overwrite | Optional. supplied (the default) replaces the mapped fields; fill_empty fills only empty ones. |
A re-run updates the row it wrote before instead of adding another one.
Send a list to another table
Send list turns each item of a JSON list into its own row: contacts from an AI
field, for example. list reads a JSON field of the source table, and
item_key names the paths tried in order for the value that identifies each
item:
{
"name": "Send contacts",
"provider": "appenda",
"action": "send_list",
"schema_version": 1,
"inputs": {
"list": {"field": "contacts", "path": "/contacts"},
"target_table": {"value": "tbl_5246f913f71a9485a05033249a6dc75e"},
"item_key": {"value": ["email", "linkedin_url"]},
"mapping": {"value": [{"from": "email", "to_field_id": "fld_338c2bfa9bb89f2b984226fc02164a31"}]}
}
}
Here from is a dotted path inside each item. A row sends at most 100 items.
Run it again after a sixth contact appears and you get one new row; the five
it sent before are updated or left unchanged, never duplicated.
Find matching rows
Find rows looks up this row's value in a field of another table. Domains,
URLs, emails and profile URLs are compared after normalizing, so
northbeam.io matches https://www.northbeam.io/:
{
"name": "Existing account",
"provider": "appenda",
"action": "find_rows",
"schema_version": 1,
"inputs": {
"value": {"field": "domain"},
"target_table": {"value": "tbl_5246f913f71a9485a05033249a6dc75e"},
"target_field": {"value": "fld_a6806b5f732319fbc6a15bafac71f658"},
"return_fields": {"value": ["fld_582332f7866237ee3a5caf97bcbfc9eb"]},
"limit": {"value": 10}
}
}
Each cell answers found, the exact count, and up to limit matched rows
(1 to 10, 10 by default). It reads "Found" with the count, or "Not found".
Find rows only reads.
Run the field
Start a run the same way as any enrichment, and leave the credential out:
curl https://api.appenda.app/v1/runs \
-H "Authorization: Bearer $APPENDA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"kind": "enrichment", "table_id": "tbl_67ad65ba34a7bbfc643711b8531cba3f", "field_id": "fld_a8c67e33f4b27927f0d28612b4472f0a", "options": {"force": false, "mode": {"kind": "all"}}}'
The run answers 202 and works in the background; check it with Get a run.
Read the results in the field's cells with List records. A Send cell reads
"Rows sent" with how many rows it created, updated or left unchanged.
A run writes all of its rows in one step and adds one entry to the history of each table it changes. If it fails part way, it writes nothing.
Permissions and limits
- Same workspace only. A target table in another workspace answers
404, exactly like a table that does not exist. - Your role decides. A Send field needs write access to the target table; Find rows needs read access. Approvals follow your role's rules.
- No credential. A
credential_idorcredential_sourceon a field answers422credential_not_applicable. - No loops. A field that would send rows back into a table that feeds it,
such as a table sending to itself, answers
422table_enrichment_cycle. - Bounds. 100 items per list, 256 mappings and 10 returned matches per row.
See Errors for every code.