> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.solvimon.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.solvimon.com/_mcp/server.

## Summary

This release removes steps between Solvimon and the people and tools that use it. An AI client connects with your Solvimon login, so you no longer paste an API key into a configuration file. A sales rep can ask whether a quote version needs approval before they finalize it. A quote version and an invoice both give out a short-lived link to their PDF, so your portal or CRM does not proxy the file. A checkout page can show your terms and conditions, and a customer can buy an on-demand item from the portal and pay for it in one visit.

For integrations, the file lines endpoint filters on several statuses in one call, and a subscription created from a template accepts your own fields. Invoice paging is now stable, only a draft customer can be deleted, and Desk creates enum and boolean custom fields.

## Event ingestion

**Filter file lines on several statuses at once**
[GET /v1/files/\{id}/lines](https://docs.solvimon.com/api-docs/event-api/files/get-files-by-resource-id-lines) takes a repeatable `statuses[]` parameter. One call returns every line you still have to act on, for example `statuses[]=ERROR&statuses[]=SKIPPED`. Before this, reviewing a processed [file upload](/platform-guides/meter-and-event-design/usage-events/file-uploads) took one request for each status. A line reports `IMPORTED`, `DONE`, `SKIPPED` or `ERROR`. The same `statuses[]` parameter is now on [GET /v1/files](https://docs.solvimon.com/api-docs/event-api/files/get-files), so you can list the files that are still running or that ended in error. The single-valued `status` parameter on the lines endpoint still works and is deprecated.

### Fixes

bug-fix

* A [cost prediction](/platform-guides/meter-and-event-design/usage-events/event-cost-prediction) for a configuration that the engine does not price yet now reports `NOT_MATCHED`. The separate `NOT_SUPPORTED` status is removed. It described the same outcome, and two values for one result meant that every caller had to handle both.

## Quotes

**Ask whether a quote version needs approval before you finalize it**
[POST /v1/approval-policies/evaluate](https://docs.solvimon.com/api-docs/configuration-api/approval-policy/post-approval-policies-evaluate) with a `quote_version_id` reports what [finalizing](https://docs.solvimon.com/api-docs/configuration-api/quote-versions/post-quote-versions-by-resource-id-finalize) that quote version would do about approval. It creates and changes nothing:

**`Response`**

```json Response
{
  "object_type": "APPROVAL_POLICY_EVALUATION",
  "status": "APPROVAL_REQUIRED",
  "triggered_approval_policy_ids": ["appo_5RmXe2QbtKfYuA9DcNH3P"],
  "approval_strategy": "EVERYONE_HAS_TO_APPROVE",
  "approvers": [ ... ]
}
```

`status` is `NO_APPROVAL_REQUIRED`, `APPROVAL_REQUIRED`, or `CANNOT_BE_DETERMINED`. The last value means that a rule could not be answered, and finalize would refuse in that case. The response also names the policies that would be breached, the reason, and the approvers who would receive the request. A sales rep learns what a discount costs them in approval time while they still edit the quote. An integration no longer has to re-implement the rule engine against [GET /v1/approval-policies](https://docs.solvimon.com/api-docs/configuration-api/approval-policy/get-approval-policies), where it would drift from the evaluation on the server. The endpoint needs `QUOTE.VIEW` and `APPROVAL_POLICY.VIEW`. See [Approval policies](/platform-guides/customers-and-billing/quoting/approval-policy).

**Signature anchors on the quote PDF**
The quote PDF now renders a signing section with a labeled anchor for each signer. The e-signature integration places each signature box on a literal string in the PDF. A quote with several signers now routes each box to the correct person. See [Quote templates](/platform-guides/customers-and-billing/quoting/quote-templates).

## Invoices

**A short-lived link to the PDF**
[GET /v1/invoices/\{id}/download-url](https://docs.solvimon.com/api-docs/transaction-api/invoices/get-invoices-by-resource-id-download-url) and [GET /v1/quote-versions/\{id}/download-url](https://docs.solvimon.com/api-docs/configuration-api/quote-versions/get-quote-versions-by-resource-id-download-url) return a signed link to the rendered PDF. A portal, a CRM or an email template can give the document to the reader directly. Your own service does not have to proxy the bytes. See [Downloading the invoice PDF](/platform-guides/invoicing/invoices/invoice-operations#downloading-the-invoice-pdf).

### Fixes

bug-fix

* Paging [GET /v1/invoices](https://docs.solvimon.com/api-docs/transaction-api/invoices/get-invoices) now returns each invoice exactly one time. Without `order_by`, the list sorted on invoice date alone, and a billing run gives many invoices the same date. Rows with the same date could come back in a different order for each query. A page boundary then moved between calls, so the same invoice appeared two times while another was skipped.
* A self-billing invoice that was overpaid now shows "Total amount payable" instead of a negative "Amount due".

## Subscriptions

**Set your own fields when you create a subscription from a template**
[POST /v1/pricing-plan-subscriptions/init](https://docs.solvimon.com/api-docs/configuration-api/pricing-plan-subscriptions/post-pricing-plan-subscriptions-init) now accepts a set of fields on top of the copy from the template, instead of only `reference` and `status`. You can set `customer_id`, `variant`, `forward_customer_id`, `billing_entity_id`, `billing_currency`, `combine`, `custom_fields`, `purchase_order_number`, `name`, `description` and the invoice-line display flags. A subscription created from a template can now be forward billed. This was not possible while templates had to be `DEFAULT`. The template stays the source of truth for pricing. Solvimon refuses a field outside the set by name, so it never ignores a new field silently.

### Fixes

bug-fix

* Deleting a draft subscription now releases the [coupon](/platform-guides/products-and-pricing/product-catalog/coupons) redemptions that it held. Before this, the redemption stayed behind and pointed at a subscription that no longer existed. The detail screen of the coupon then failed to load.
* A `SELF_BILLING` subscription now shows the customer and the billing entity in the correct positions, as its invoices already did. Editing its details no longer resets the variant to `DEFAULT`.

## Customers

**Only a draft customer can be deleted**
[DELETE /v1/customers/\{id}](https://docs.solvimon.com/api-docs/configuration-api/customers/delete-customers-by-resource-id-or-reference) is now refused unless the [customer](/platform-guides/customers-and-billing/customer) has status `DRAFT`. A customer that has been active can have invoices, subscriptions and events that point at it. Deleting it left those references dangling. To take an active customer out of use, archive it with [POST /v1/customers/\{id}/archive](https://docs.solvimon.com/api-docs/configuration-api/customers/post-customers-by-resource-id-or-reference-archive). The archive keeps its history.

## Customer portal

**Terms and conditions on a checkout page**
A [checkout page](/platform-guides/customers-and-billing/hosted-checkout) portal URL now carries a `note`: up to 2,000 characters of Markdown that the customer sees on the page. Use it for your terms, a link to them, or anything the customer has to read before they subscribe. The field sits next to `success_url` on [POST /v1/portal-urls](https://docs.solvimon.com/api-docs/transaction-api/portal-urls/post-portal-urls) and [PATCH /v1/portal-urls/\{id}](https://docs.solvimon.com/api-docs/transaction-api/portal-urls/patch-portal-urls-by-resource-id). In Desk, you can edit it from the checkout page after you publish, not only in the publish dialog.

**Buy an on-demand item from the portal**
A customer can now buy an [on-demand item](/platform-guides/products-and-pricing/pricing-plans/on-demand-charges) from the [customer portal](/platform-guides/customers-and-billing/customer-portal). They select the item, set a quantity on a [one-off](/platform-guides/products-and-pricing/pricing-plans/one-off-pricing) item priced `FLAT`, see a preview of the cost, and pay. The preview is the same invoice preview that the API returns. The amount that the customer confirms is the amount that Solvimon charges.

**The SEPA direct debit mandate text**
Selecting SEPA direct debit in the [hosted checkout](/platform-guides/customers-and-billing/hosted-checkout) or the [customer portal](/platform-guides/customers-and-billing/customer-portal) now shows the mandate wording. The text names the billing entity that collects the payments. The customer sees what they authorize at the moment they authorize it.

## AI and MCP

**Connect an AI client with your Solvimon login**
An MCP client now signs in with OAuth 2.0 instead of a pasted API key. The Solvimon identity host publishes `/.well-known/oauth-authorization-server` and `/.well-known/jwks.json`. It registers a client through `POST /v1/oauth2/register`, and it runs the authorization code flow with PKCE over `GET /v1/oauth2/authorize` and `POST /v1/oauth2/token`. The browser step lands on a consent screen in Desk. The screen names the application, shows the access that it asks for, and lists the platforms that you are a member of. You select the platforms that the client may reach, then you approve or deny. A client asks for `solvimon:read`, `solvimon:write` or both. A request that names neither is narrowed to `solvimon:read` instead of refused.

To add Solvimon to an AI client, you enter the URL and log in. There is no key in a configuration file and no setup on our side. A token is bound to the platforms you selected and the scope that was granted, so a client you connected for one platform cannot read another. See [Connect with OAuth](/mcp-server/oauth) and the [Claude integration](/integrations/ai-assistants/claude).

## Desk

**Enum and boolean custom fields**
Creating a [custom field](/platform-guides/platform-configuration/custom-fields) in Desk now offers the types that [POST /v1/custom-fields](https://docs.solvimon.com/api-docs/configuration-api/custom-fields/post-custom-fields) already accepted: string, enum and boolean. An enum takes its allowed values in the same form. Before this, Desk created a string field whatever the field was meant to hold.

**Discounts on a one-off invoice line**
Adding a [one-off line](/platform-guides/invoicing/invoices/one-off-invoices) to an invoice now offers to include it in the invoice-level discounts of the subscriptions on that invoice. [POST /v1/invoices/\{id}/add-line](https://docs.solvimon.com/api-docs/transaction-api/invoices/post-invoices-by-resource-id-add-line) gained this last release as `applicable_for_clauses`. The option appears only when the invoice has subscription clauses to apply.

### Fixes

bug-fix

* The status filter on [products](/platform-guides/products-and-pricing/product-catalog) and pricing plans no longer starts on "Deprecated". The default hid the active resources that you were looking for.
* Publishing a [checkout page](/platform-guides/customers-and-billing/hosted-checkout) no longer creates the portal URL when activation failed. The two calls ran without the second waiting on the first.

## Deprecated API fields

The following parameter is now deprecated. It continues to work for backwards compatibility. Migrate to the replacement.

* **`status`** ([GET /v1/files/\{id}/lines](https://docs.solvimon.com/api-docs/event-api/files/get-files-by-resource-id-lines)): use `statuses[]` instead. It takes one or more line statuses in a single request, where `status` takes exactly one.