Skip to navigation

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 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 took one request for each status. A line reports IMPORTED, DONE, SKIPPED or ERROR. The same statuses[] parameter is now on GET /v1/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

  • A 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 with a quote_version_id reports what finalizing that quote version would do about approval. It creates and changes nothing:

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, where it would drift from the evaluation on the server. The endpoint needs QUOTE.VIEW and APPROVAL_POLICY.VIEW. See Approval policies.

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.

Invoices

A short-lived link to the PDF GET /v1/invoices/{id}/download-url and GET /v1/quote-versions/{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.

Fixes

  • Paging GET /v1/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 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

  • Deleting a draft subscription now releases the coupon 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} is now refused unless the 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. The archive keeps its history.

Customer portal

Terms and conditions on a checkout page A checkout page 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 and PATCH /v1/portal-urls/{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 from the customer portal. They select the item, set a quantity on a one-off 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 or the 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 and the Claude integration.

Desk

Enum and boolean custom fields Creating a custom field in Desk now offers the types that POST /v1/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 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 gained this last release as applicable_for_clauses. The option appears only when the invoice has subscription clauses to apply.

Fixes

  • The status filter on products and pricing plans no longer starts on “Deprecated”. The default hid the active resources that you were looking for.
  • Publishing a checkout page 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): use statuses[] instead. It takes one or more line statuses in a single request, where status takes exactly one.