---
title: "Changelog"
description: "Dated changes to the Fluveo API and to these docs, newest first."
url: https://docs.fluveo.com/changelog/
---

> Index of every page: https://docs.fluveo.com/llms.txt. Integrating Fluveo? Read https://docs.fluveo.com/agents/integrate.md first.

# Changelog

Dated changes to the Fluveo API and to these docs, newest first.

This page lists changes to the Fluveo API and to these docs, newest first. Each change sits under the day it landed, in UTC, and links to the page it is about. The changelog starts on 2026-11-10 and lists nothing from before that day. Which changes need a new API version is in the [deprecation policy](https://docs.fluveo.com/start/deprecation.md).

## 2026-11-12

- **Docs** [Errors](https://docs.fluveo.com/errors.md) now explains [`setup_intent_unexpected_state`](https://docs.fluveo.com/errors.md#setup_intent_unexpected_state) and [`setup_intent_authentication_failure`](https://docs.fluveo.com/errors.md#setup_intent_authentication_failure), so the `doc_url` of both opens their section. The links that some error messages print, such as the one to tax codes or to the expire call of a Checkout Session, now open the page that explains them instead of a page that does not exist.
- **Docs** New page [Appearance](https://docs.fluveo.com/payments/fluveo-js-appearance.md): the payment form's three themes, each with a photograph and an example to copy, what each of the ten variables changes and its default in each theme, floating labels, condensed inputs, animations, what the text inside the card fields follows, a change of look on a form that is already on the page, and what the script refuses. [Payment Element](https://docs.fluveo.com/payments/payment-element.md#appearance) now shows the three themes side by side.
- **Docs** New section [Mount the form before its PaymentIntent](https://docs.fluveo.com/payments/fluveo-js.md#mode) walks the form's second way in order, with the Pay handler to copy: `fluveo.elements({ mode: "payment", amount, currency })`, `elements.update()`, then at the press of Pay `elements.submit()`, the PaymentIntent your server creates and `confirmPayment()` with its `clientSecret`. [Payment Element](https://docs.fluveo.com/payments/payment-element.md#compatible-apis) names that way, and [/llms/payment-element.txt](https://docs.fluveo.com/llms/payment-element.txt) now holds the section and its three error codes in place of Test mode and `element_not_supported`, which it names by their addresses.
- **Docs** [fluveo.js](https://docs.fluveo.com/payments/fluveo-js.md#form-options-appearance) now gives the whole `appearance` option: its three themes, its ten variables with the kind of value each takes, where the labels go, how the fields join and whether the form animates, with an example.
- **Docs** The entries of [`locale`](https://docs.fluveo.com/payments/fluveo-js.md#form-options-locale) and [`loader`](https://docs.fluveo.com/payments/fluveo-js.md#form-options-loader) now say what each value does and which one is the default, each with an example.
- **Docs** The entries of [`layout`](https://docs.fluveo.com/payments/fluveo-js.md#form-options-layout), [`fields`](https://docs.fluveo.com/payments/fluveo-js.md#form-options-fields) and [`defaultValues`](https://docs.fluveo.com/payments/fluveo-js.md#form-options-defaultValues) now list every part of each option with its type, its values and its default, each with an example.
- **Docs** New sections [elements.update()](https://docs.fluveo.com/payments/fluveo-js.md#elements-update) and [element.update()](https://docs.fluveo.com/payments/fluveo-js.md#element-update) say what each call changes on a form that is already made, and which error an option it cannot change throws. [fluveo.js errors](https://docs.fluveo.com/payments/fluveo-js-errors.md#option_not_supported) now lists what both calls take, and the values of `appearance` and of `layout`.
- **Docs** [fluveo.js](https://docs.fluveo.com/payments/fluveo-js.md#elements) now documents the options `mode`, `amount` and `currency` of `fluveo.elements()`, which mount the form before a PaymentIntent exists, with `elements.update()` for a new amount and `elements.submit()` at the press of Pay. [fluveo.js errors](https://docs.fluveo.com/payments/fluveo-js-errors.md#confirm_client_secret_missing) explains the three codes of that way: `confirm_client_secret_missing`, [`submit_not_mounted`](https://docs.fluveo.com/payments/fluveo-js-errors.md#submit_not_mounted) and [`submit_required`](https://docs.fluveo.com/payments/fluveo-js-errors.md#submit_required).
- **Docs** [fluveo.js](https://docs.fluveo.com/payments/fluveo-js.md#payment-element) now says where the form shows each error: a field's under that field, a declined card's under the card number, and all of them under the block of fields when the inputs are condensed.
- **Docs** The photographs of [Payment Element](https://docs.fluveo.com/payments/payment-element.md) were taken again and show the form's new look: the test mode line is larger and sits in a box, bordered in the default theme, with its words in the text colour, and the security code's icon is one colour. A declined card's message now shows right under the card number, as [Errors](https://docs.fluveo.com/payments/payment-element.md#errors) on that page says.
- **Docs** New page [Payment Element](https://docs.fluveo.com/payments/payment-element.md): what Fluveo's payment form is, the payment methods it shows, its three layouts, its look, its options and its errors, with photographs of the form and examples to copy. [/llms/payment-element.txt](https://docs.fluveo.com/llms/payment-element.txt) holds the page whole.
- **Docs** [fluveo.js](https://docs.fluveo.com/payments/fluveo-js.md#payment-element) now says that the `loaderror` event also comes when the form gave no answer 20 seconds after `mount()` and when its PaymentIntent takes no card. [fluveo.js errors](https://docs.fluveo.com/payments/fluveo-js-errors.md#payment_intent_unexpected_state) explains the code of the second case, `payment_intent_unexpected_state`.
- **Docs** The page of [Custom checkout](https://docs.fluveo.com/payments/custom-checkout.md#build) is now a whole checkout: Pay stays disabled until the form is ready, the button shows the PaymentIntent's amount, and a spinner turns while the payment confirms. Its React tab is written with `@fluveo/fluveo-js` and `@fluveo/react-fluveo-js`.
- **Docs** The file an AI agent reads to build a checkout is now two: [/llms/custom-checkout.txt](https://docs.fluveo.com/llms/custom-checkout.txt) stays the whole first checkout, and the new [/llms/payment-element.txt](https://docs.fluveo.com/llms/payment-element.txt) holds what changes the payment form after that, which is its calls, its events and its options, with the errors they throw. [Build with AI agents](https://docs.fluveo.com/agents.md#what-we-publish-for-agents) lists both.
- **Docs** The `doc_url` of an error that `fluveo.js` throws now opens [fluveo.js errors](https://docs.fluveo.com/payments/fluveo-js-errors.md) in the browser, at that error's section. It used to open the page's Markdown copy, which a browser shows as plain text.
- **Docs** The reference now gives `allowed_payment_method_types` its real values: on the [PaymentIntent object](https://docs.fluveo.com/api/payment_intents.md#object-payment_intent) it is the list of payment methods when a Checkout Session made the PaymentIntent, and `null` on any other, and the [SetupIntent object](https://docs.fluveo.com/api/setup_intents.md#object-setup_intent) now lists it, always `null`. The [Checkout Session object](https://docs.fluveo.com/api/checkout_sessions.md#object-checkout_session) no longer lists `optional_items` and `presentment_details`, which the API never sends.
- **Docs** [fluveo.js](https://docs.fluveo.com/payments/fluveo-js.md#packages) now documents the npm packages `@fluveo/fluveo-js` (`loadFluveo()` and the types) and `@fluveo/react-fluveo-js` (`Elements`, `PaymentElement`, `useFluveo()` and `useElements()`), which load the same script as the script tag. [fluveo.js errors](https://docs.fluveo.com/payments/fluveo-js-errors.md#wrong_prop) now explains `wrong_prop` and [`elements_provider_missing`](https://docs.fluveo.com/payments/fluveo-js-errors.md#elements_provider_missing).
- **Docs** [fluveo.js errors](https://docs.fluveo.com/payments/fluveo-js-errors.md#billing_details_missing) now explains `billing_details_missing` and [`appearance_value_invalid`](https://docs.fluveo.com/payments/fluveo-js-errors.md#appearance_value_invalid), and [fluveo.js](https://docs.fluveo.com/payments/fluveo-js.md#form-options) lists the options `appearance`, `locale` and `loader` of `fluveo.elements()` and `layout`, `fields` and `defaultValues` of `elements.create("payment")`.
- **MCP** New guide [MCP sign-in with OAuth](https://docs.fluveo.com/agents/mcp/oauth.md): a client signs in through the Dashboard with no key, the person picks the store's permissions on the consent page, and the connection shows in **Connections**, where it can be revoked. [Connect to Fluveo MCP](https://docs.fluveo.com/agents/mcp/connect.md) now gives the OAuth way first for Claude Code, Cursor, Codex and VS Code.
- **MCP** A request to the MCP endpoint without an admitted agent key now answers 401 on any method, a browser's `GET` included, with `WWW-Authenticate` and a JSON error that links to [Fluveo MCP](https://docs.fluveo.com/agents/mcp.md). With an admitted key, any method but `POST` answers 405 with `Allow: POST`. [Connect to Fluveo MCP](https://docs.fluveo.com/agents/mcp/connect.md) says what a client must send.
- **Docs** The MCP pages now point to **Settings > Developers > AI agents** in the Dashboard: [MCP authentication](https://docs.fluveo.com/agents/mcp/authentication.md) shows each agent key with its last use and how to revoke it, [Agent approvals](https://docs.fluveo.com/agents/mcp/approvals.md) where the pending requests are listed, and [MCP security](https://docs.fluveo.com/agents/mcp/security.md) the switch that turns agent access off for the store and how to list only the agents' calls in Logs.

## 2026-11-11

- **MCP** [Fluveo MCP](https://docs.fluveo.com/agents/mcp.md) now lists its 28 tools, with the payment and refund tools: `list_payments`, `retrieve_payment`, `search_payments`, `list_refunds` and `retrieve_refund` read, and `create_refund`, `capture_payment` and `cancel_payment` wait for a person to approve each call in the Dashboard, within 15 minutes. [Agent approvals](https://docs.fluveo.com/agents/mcp/approvals.md) names the native tools that end in an approval.

- **MCP** Six new tools on [MCP tools](https://docs.fluveo.com/agents/mcp/tools.md) for customers and checkout: `list_customers` and `retrieve_customer` read the store's customers, `create_customer` and `update_customer` change them, and `create_checkout_session` and `create_payment_link` make a Fluveo payment page or a payment link for a buyer. The four that write answer like `fluveo_api_write` and run at once, since their operations are allowed for an agent key.

- **MCP** Seven new tools on [MCP tools](https://docs.fluveo.com/agents/mcp/tools.md) that each read one kind of store data with named arguments: `get_balance`, `list_disputes`, `retrieve_dispute`, `list_events`, `retrieve_event`, `list_webhook_endpoints` and `retrieve_webhook_endpoint`. They only read, answer like `fluveo_api_read`, and appear for a key with **Read** on the resource each one reads.

- **MCP** On protocol revision `2026-07-28`, a client that declares URL elicitation gets the approval link of `fluveo_api_write` as an `input_required` result it can show the person, and its retry carries the token in `requestState`. Other clients still get the link in the answer. [Agent approvals](https://docs.fluveo.com/agents/mcp/approvals.md) shows the flow.

- **MCP** New tool `fluveo_api_write` on [MCP tools](https://docs.fluveo.com/agents/mcp/tools.md): an agent runs one create, update or delete operation of the API with its agent key. An operation that needs approval answers the approval link and a token, and the call with that token sends the same request after a person approves it. [Agent approvals](https://docs.fluveo.com/agents/mcp/approvals.md) shows the flow.

- **MCP** `fluveo_api_search` and `fluveo_api_details` now answer `available: true` for each `POST` and `DELETE` operation an agent key may run, at once or after approval. [MCP tools](https://docs.fluveo.com/agents/mcp/tools.md) lists them.

- **MCP** A restricted key without the agent mark is refused with 401 `agent_key_required`. Make the key with **This key is for an AI agent** checked, as [MCP authentication](https://docs.fluveo.com/agents/mcp/authentication.md) shows.

- **MCP** New guide [Fluveo MCP](https://docs.fluveo.com/agents/mcp.md): a remote MCP server that lets an AI client search these docs, look up API operations and read your test store with an agent key.

- **MCP** New guide [Connect to Fluveo MCP](https://docs.fluveo.com/agents/mcp/connect.md): the configuration for Claude Code, Cursor, Codex, VS Code and any other client that speaks MCP over HTTP, and what each refused answer means.

- **MCP** New guide [MCP authentication](https://docs.fluveo.com/agents/mcp/authentication.md): make a restricted test key for an AI agent, choose its permissions, and rotate or expire it.

- **MCP** New reference [MCP tools](https://docs.fluveo.com/agents/mcp/tools.md): every tool the server lists, with its arguments and answers, and what an agent key may do on each API operation.

- **MCP** New guide [Agent approvals](https://docs.fluveo.com/agents/mcp/approvals.md): which requests of an agent key wait for a person in the Dashboard, how long an approval lasts, and how the agent retries with `Fluveo-Approval`.

- **MCP** New guide [MCP security](https://docs.fluveo.com/agents/mcp/security.md): what the API and the MCP server mask, refuse or mark as untrusted when an AI agent holds a key.

- **Docs** [llms.txt](https://docs.fluveo.com/llms.txt) and [the agent playbook](https://docs.fluveo.com/agents/integrate.md) now send an agent that speaks MCP straight to [Fluveo MCP](https://docs.fluveo.com/agents/mcp.md).

- **Docs** The example of [creating a PaymentIntent](https://docs.fluveo.com/api/payment_intents.md#post-v1-payment-intents-return_url) now sends `return_url` with `confirm=true`. Without it, or without `payment_method_types`, that call answers `400`; the old example showed it succeeding.

- **Docs** The token example on [Apple Pay](https://docs.fluveo.com/payments/apple-pay.md#create-a-token) no longer shows `dynamic_last4` inside `card.wallet`: a token carries it on `card`, and the PaymentMethod and the Charge carry it in `wallet`.

- **API** An error of a logged call now carries `error.request_log_url`, a link to that call's log in the Dashboard. New guide [Request logs](https://docs.fluveo.com/dashboard/request-logs.md): what each log shows, what it hides, how long it is kept and how to open it from an error.

- **Docs** The API reference now marks as [Preview](https://docs.fluveo.com/api.md#preview) each operation and parameter that works but is not locked yet and may change.

- **Docs** [Receive webhooks](https://docs.fluveo.com/webhooks.md#create) and [Test webhooks](https://docs.fluveo.com/webhooks/testing.md) now say that a test-mode endpoint takes a public `http` URL as well as `https`; only live mode requires `https`. Before, they said `http` was always refused.

## 2026-11-10

- **Docs** The [Payments](https://docs.fluveo.com/payments.md) overview, and the pages on cards, Pix, payouts and Dashboard payment links, now link to the new guides below.
- **Docs** New guide [Save a card](https://docs.fluveo.com/payments/save-a-card.md): save a card with a SetupIntent and charge it later while the buyer is away.
- **API** The reference now lists the fields the API always sends as `null`: `allowed_payment_method_types`, `payment_record` and `shared_payment_granted_token` on the [PaymentIntent object](https://docs.fluveo.com/api/payment_intents.md#object-payment_intent), and `shared_payment_granted_token` on the [PaymentMethod object](https://docs.fluveo.com/api/payment_methods.md#object-payment_method).
- **Docs** New guide [Reserves](https://docs.fluveo.com/payments/reserves.md): see what part of your sales is held back, why, and when it is released.
- **API** The reference now lists `setup_future_usage` on PaymentIntent [create](https://docs.fluveo.com/api/payment_intents.md#post-v1-payment-intents-setup_future_usage), update and confirm, and `off_session` on [create](https://docs.fluveo.com/api/payment_intents.md#post-v1-payment-intents-off_session) and confirm. The API already took both; only the reference was missing them.
- **Docs** New guide [Payment links](https://docs.fluveo.com/payments/payment-links.md): sell your Prices through a link, switch the link off and read its payments.
- **Docs** New guide [Capture or cancel](https://docs.fluveo.com/payments/capture-and-cancel.md): hold an amount on a card, then capture all or part of it, or cancel the payment.
- **Docs** New guide [Customers](https://docs.fluveo.com/payments/customers.md): create, find, update and delete a Customer, and keep its tax IDs.
- **Docs** New page [Permissions](https://docs.fluveo.com/permissions.md): what each restricted key permission allows. Each operation in the reference now shows the permission a restricted key needs to call it.
