See what changed in the API.
Every change to the public API is listed here by date, newest first. For changes to the desktop app, see Release notes.
Versions and deprecations
New operations, optional fields and enum values can arrive at any time, so
ignore what you do not know. A breaking change is deprecated first: the
deprecated operation keeps working for at least 90 days, answering with
Deprecation and Sunset headers. The full policy,
with stability levels and header formats, is on
Versioning.
2026-11-11
Changed
- A run group takes up to 60 enrichment fields, one for each enrichment column a table can
now have, and up to 6,000,000 calls. Its
stagesand each stage'sdepends_oncan hold up to 60 items.
2026-11-10
Added
- A bot's
provider_kindand an agent request'svia_agent.kindtakeantigravity, for Google Antigravity.
2026-11-09
Added
- A bot's
provider_kindand an agent request'svia_agent.kindtakegrok, for Grok Build.
2026-11-08
Added
- A bot's
provider_kindand an agent request'svia_agent.kindtakegemini, for Gemini CLI, andgithub_copilot, for GitHub Copilot CLI.
2026-11-07
Changed
- Start a list import needs a signed-in session for now, so it has left the API
reference. An API token is refused
401withsession_required, on adry_runtoo, and nothing is charged. A token's import was charged and then wrote no records. Starting one with a token comes back once imports write their records on the server. Get a list import, List list imports and Stop a list import still take a token.
2026-11-05
Changed
- List records and Search records stop a page near 4 MiB instead of refusing it with
response_too_large, so a page of wide records can hold fewer thanlimititems whilemeta.has_moreistrue. Followmeta.next_cursoras usual. - Add a block answers
201, like every other create (it answered200). - A block's
layout.heightis optional and deprecated: a block is as tall as its content, and no view uses the value. Update a block and the other block routes are now titled Add a block, Update a block, Move a block and Delete a block.
2026-11-04
Changed
- Role refusals name the failure:
role_change_denied,role_name_taken,role_protected,role_limit_reachedandrole_invalidreplacedenied,name_taken,protected,limitandinvalid, at the same statuses. - The Errors table lists only the codes an API token can meet. Sign-in, trial, billing and invitation codes answered only to Appenda's apps are left out.
force_confirmation_requiredsays to sendconfirm_force: true, andoutput_path_emptyasks for a dotted path.
2026-11-03
Changed
- Get provider usage is now Get credit usage, under Credits.
- Whose key paid is one vocabulary. Get a run's and Get a list import's
credits.key_source, and usagekey_source, answerappendaorown(they answeredappenda_credits/own_api_keyandmanaged/byok).
Added
- A run reads the same in Start a run, Get a run and List runs: each answers
object: "run"andrecord_count. Get a run and List runs also name thetable_id,field_id,providerandaction. Get a run counts its records asrecords_done,records_found,records_empty,records_skippedandrecords_failed, and documentsoutcome_class_countsandwaiting_for. - Stop a multi-field run is
POST /v1/run-groups/{group_id}/stop, the way every other job stops. - Credit amounts have a JSON number beside each integer: the balance's
available_decimal,plan_allotment_decimal,rollover_decimal,used_this_period_decimalandspend_cap.monthly_credits_decimal, a transaction'scredits_decimal, usagecredits_decimal, and a run's or list import'scredits.estimated_decimalandcredits.used_decimal. They equal the integers today, since credits are charged whole. - A credit transaction answers
created_at. - Integrations and actions list the keys they run on as
key_sources: ["appenda", "own"];key_source(either) is deprecated. - Counts name records, not rows:
records_added,records_read,records_to_add,records_done,records_found,records_to_create,records_to_updateand usagerecord_countsit beside the deprecatedrows_*names, which keep their values until at least 2027-02-01. - A human label is
name: an integration's actions and an action's inputs answernamebesidelabel, and a CSV import mapping that creates a field takesname(labelstill works; send one of the two). - Start a run and Preview a run take
credential_idalone to run on that key;credential_sourceis no longer needed with it.
Deprecated
requested_rowson a run (userecord_count), and Get a run'scompleted_rows,succeeded_rows,no_result_rows,skipped_rows,failed_rowsandneeds_review_rows(use therecords_*counts). They keep their values until at least 2027-02-01.DELETE /v1/run-groups/{group_id}(now titled Stop a run group). It keeps working until at least 2027-02-01 and answersDeprecationandSunsetheaders.- A credit transaction's
at(usecreated_at), until at least 2027-02-01. labelon integration actions, action inputs and CSV import mappings, andprovider_id/method_idon an enrichment field's configuration (useproviderandaction). They keep working until at least 2027-02-01.
2026-11-02
Changed
- Start a CSV import answers
202instead of201, with aLocationheader naming the import. Poll it with Get a CSV import. A held start answers202too, with the approval in the body. - Import a CSV is deprecated in favour of the CSV import job (Start a CSV
import). It keeps working until at least 2027-02-01 and answers
DeprecationandSunsetheaders. - A held Start a list import is now documented: it answers
202with the approval to poll inLocation. A start that runs still answers201. - A CSV import reports
status(running,succeededorstopped), in the same words as runs and list imports;stateis deprecated. Start a list import answers the import'sid;job_idis deprecated.
2026-10-31
Changed
- Previewing or starting a run on a field that uses the workspace's default key,
when the workspace has no key for that integration, answers
422own_key_requiredinstead of403forbidden. Add the key in Settings → Integrations and retry. A run group answers the same when none of its fields has a key, and leaves out the fields without one (listed inskipped). - A run group, a run preview or a run start with a field whose action isn't
priced per record on Appenda credits answers
422credits_unavailable, withparamnaming the field, instead of403forbidden. An automatic run on such a field stops with the reasoncredits_unavailable.
2026-10-22
Added
- The public spec downloads at
api.appenda.app/v1/openapi.json
and openapi.yaml, and on this site
at
/openapi.jsonand/openapi.yaml. - Guide pages for versioning and field types.
2026-10-21
Added
Idempotency-Keyis optional on every write. An identical request within 10 minutes is answered with the first response instead of acting twice.- Without an
Idempotency-Key, creating a table, field or view that already exists with the same definition returns the existing one. - Guide pages for authentication, conventions, pagination, errors, rate limits, credits and this changelog.
Changed
- The reference lists only operations an API key can call, each with a short title, a description and an example.
- Errors are documented once, on Errors, instead of on every operation.
FAQs
Will my integration break without warning?
No. A breaking change is deprecated first, and a deprecated operation keeps working for at least 90 days.
How do I hear about changes?
Check this page. Deprecated operations also answer with Deprecation and Sunset headers.