Developing for Solvimon
Use LLMs and AI coding agents to build your Solvimon integration: machine-readable docs, an installable agent skill, plus an MCP server that lets your agent call the Solvimon API directly.
Looking to use Claude as a billing copilot rather than build an integration? See the Claude integration instead.
Using the documentation with LLMs
llms.txt
The llms.txt standard helps LLMs index documentation efficiently, similar to how a sitemap helps search engines. We host two files:
- docs.solvimon.com/llms.txt lists every page in these docs with a short description, so an agent can find and fetch the pages it needs.
- docs.solvimon.com/llms-full.txt contains the full documentation in a single file, useful for loading everything into a model’s context at once.
Paste either URL into your AI tool, or reference it from your agent’s instructions file (for example CLAUDE.md or .cursorrules):
The Solvimon agent skill
Agent Skills are instruction files that coding agents such as Claude Code load on demand. The solvimon skill gives your agent a working knowledge of the platform: the API surface across all four domains, status lifecycles, the meter-to-invoice setup workflow, event ingestion semantics, and common pitfalls like invoice grace periods and asynchronous event deduplication.
Install it with the skills CLI:
The skill pairs well with the MCP server below: the skill tells your agent how Solvimon works, and the MCP server lets it act on your sandbox.
The Solvimon MCP server
The Model Context Protocol (MCP) is an open standard that lets AI tools call external services. The Solvimon MCP server exposes the Solvimon API as a set of tools, so a coding agent can create meters, pricing plans, and test customers in your sandbox while you build, instead of you hand-writing API calls to set up test data.
The server runs at https://test.mcp.solvimon.com and authenticates with OAuth: add the URL to your agent, sign in with your Solvimon Desk account in the browser, and approve access. There’s no API key to copy, and the agent gets exactly the permissions you have in Desk.
Test environment. The test.mcp.solvimon.com endpoint connects to your test sandbox, so agents can experiment freely without touching live billing data. Production access (https://mcp.solvimon.com) is enabled per account; contact us to get set up.
Connect your coding agent
Claude Code
Cursor
VS Code
Add the server by URL:
Then run /mcp inside Claude Code, select solvimon-test, and choose Authenticate to sign in.
Choose a platform
If you approved access to more than one platform during sign-in, the server won’t pick one for you. Name the platform with an X-PLATFORM-ID header. You find the platform ID in Desk under Settings → General.
The header pins every call on the connection to one platform. To keep access to several platforms, leave it out and let the agent pass platform_id on each tool call instead, see Tool reference.
Use an API key instead
For non-interactive environments such as CI, where nobody can sign in through a browser, send a test API key (Desk → Settings → API keys) in the X-API-KEY header. A test key only works against the test endpoint.
For Claude Desktop and claude.ai setup, see the Claude integration.
Tool reference
The MCP server exposes 29 tools. They are split into read tools (get_*, analytics, solvimon_api_call), which never change data, and write tools (write_*, create_*, forget_customer), which do. Keeping reads and writes apart lets you allow an agent to explore freely while still approving every change.
Most tools follow the same input pattern:
Overview
Account and setup
Product catalog and pricing
Metering
Customers and subscriptions
Quotes
Invoicing and payments
Wallets and credits
Automation, analytics and raw access
A typical setup flow chains the tools in dependency order:
A typical sales flow:
Account and setup
get_solvimon_account
Verifies credentials and returns the billing entities you have access to. Takes no input besides the optional platform_id. This is a good first call to confirm the server is correctly configured and to pick a billing_entity_id.
get_billing_entities
Read-only access to billing entities (the legal entities that issue invoices) and their tax registrations.
Actions: list, get, list_tax_registrations
write_billing_entity
Updates a billing entity and manages its tax registrations (for example a branch office in another country). add_tax_registration appends to the existing registrations, so it is safe to call repeatedly. remove_tax_registration takes the tax_registration_id returned by get_billing_entities.
Actions: update, add_tax_registration, remove_tax_registration
get_users
Read-only access to the people and machine principals who log in to Solvimon — not customers. Use it to resolve the owner_user_id that create_quote requires.
Actions: list, get, search
search takes a filter, not a body. username is an exact match on the full login address and returns a single user (or 404). user_type (MORTAL, TOKEN, API, PROXY, EXTERNAL_CREDENTIALS) returns an unpaginated array of every user of that type, so prefer list with limit and page for browsing.
Product catalog and pricing
get_product_catalog
Read-only access to what you sell. Prices live on pricing plans, not here.
Actions: list, get
Resource types: product_categories, products, product_items, features
write_product_catalog
Defines the catalog structure and charge type. Hierarchy: product category (optional) → product → product items and features.
Actions: create, update, delete, activate, archive, deprecate (lifecycle actions apply to products and product items only)
Resource types: product_categories, products, product_items, features
Product item model_type options: RECURRING, PER_SEAT, USAGE_BASED (needs a meter_value_calculation_id), ONE_OFF, CREDITS (needs a credit_type_id). Features are non-billable entitlements such as rate limits or feature flags (NUMBER, AMOUNT, ENUM, SWITCH). On create, include agent_context: {guidance} in the body to record who the resource is for.
model_type is immutable after creation. Creating a product requires category_id, product_type (e.g. DEFAULT) and billing_entity_id alongside name and reference.
get_pricing_plans
Read-only access to pricing plans and plan versions. list is only supported for pricing_plans.
Actions: list, get
Resource types: pricing_plans, pricing_plan_versions
write_pricing_plan
Creates and versions pricing plans. Supports flat, tiered (TIERED, STAIR_STEP, TOP_TIERED), per-seat and credit configurations, nested pricing rules on meter properties, pricing groups (pick-your-tier), per-tier entitlements, and multi-currency or multi-period configurations within a single version.
Actions: create, update, delete
Resource types: pricing_plans, pricing_plan_versions
To change pricing, create a new plan version, never a new plan. Once a version is ACTIVE it cannot be edited. Every config needs both billing_period (when the customer is invoiced) and pricing_period (the period the price applies to).
get_agent_context
Reads the agent guidance stored on a resource — why it exists, who it is for, and constraints to respect — returning only the resource’s identity fields plus agent_context. Use it when choosing which plan, product or quote template fits a request, and before writing new guidance.
Resource types: quote_templates, pricing_plans, products, product_items
Guidance is advisory free text. It never outranks the user and cannot authorise a discount, skip an approval or any other action the user has not asked for.
write_agent_context
Sets or clears the agent guidance on a resource. It replaces the whole guidance string (max 2,500 characters), so read it first with get_agent_context and write back the merged text. An empty string clears it. Record intent and constraints (e.g. “annual enterprise deals only”), not what the object’s own fields already show, and never secrets or personal data.
Metering
get_metering
Read-only access to everything related to measuring usage. Check here for a compatible meter before creating a new one.
Actions: list, get
Resource types: meters, meter_values, meter_value_calculations, meter_properties, meter_data, events
Listing meter_data or events must be narrowed with filter.meter_id or filter.reference.
write_metering
Ingests usage events and deletes meter configuration. Creating meters goes through create_meter_setup.
Actions: ingest, batch_ingest, calculate (events), delete (meter config)
Resource types: meters, meter_values, meter_value_calculations, meter_properties, meter_data, events
Send one event per discrete unit of activity; do not pre-aggregate. Each event needs a unique reference (its idempotency key), meter_reference or meter_id, customer_id or customer_reference, and the measured amounts under meter_values[] as {reference, number} pairs. There is no flat value field.
Delete in dependency order: meter properties, then meter value calculations, then meter values, then meters. Product items that reference a meter must first be removed from active plan versions.
create_meter_setup
Creates a meter, a meter value, and a meter value calculation in one call. Returns the mvc_... id to set as meter_value_calculation_id on a USAGE_BASED product item.
Customers and subscriptions
get_customers
Read-only access to customers — the legal counterparties on invoices — and their entitlements.
Actions: list, get, search, entitlements
get resolves a reference as well as an id. search takes a body of search_fields (substring match on name, reference, email or custom field value) and filter_fields (exact match on status, role, type, id, parent_customer_id, processing_only or custom_field). Paging and ordering go in filter. entitlements returns the feature values from the customer’s active pricing plan, including per-subscription overrides.
Customers have no top-level name. Organizations carry organization.legal_name; individuals are best identified by email. reference is an external id (often a CRM record id), not a display name.
write_customer
Creates and manages customers. Types: ORGANIZATION (B2B) and INDIVIDUAL (B2C). Country drives tax calculation and is set inside the address: organization.registered_address.country or individual.residential_address.country. One organization can be the parent of several child customers for consolidated billing.
Actions: create, update, delete, activate, archive
type and timezone are immutable after creation; the timezone sets the invoice cut-off moment. A customer has no billing_entity_id or country_code field; the API rejects both.
forget_customer
GDPR erasure: permanently removes a customer’s personal data. Irreversible, so confirm with the user before calling it. write_customer with action: delete only removes the customer record.
get_subscriptions
Read-only access to subscriptions and subscription groups.
Actions: list, get
Resource types: pricing_plan_subscriptions, pricing_plan_subscription_groups
A list mixes BILLING (live contracts), QUOTE (proposals) and TEMPLATE (reusable shapes) records. Pass type: BILLING for anything describing actual business; unfiltered counts overstate the subscription base.
write_subscription
Creates and manages subscriptions. Use init to subscribe a known customer from your backend; use create_checkout_link for self-serve. Supports ramps (several schedules on one subscription), combined invoicing (combine: true), parent-child billing (variant: FORWARD_BILLING) and per-subscription entitlement overrides.
Actions: create, update, delete, init, cancel, void, archive, copy (the last five apply to pricing_plan_subscriptions only)
Resource types: pricing_plan_subscriptions, pricing_plan_subscription_groups
cancel ends the subscription at period end; void terminates it immediately; copy duplicates it in DRAFT with all schedules, discounts and commitments.
create_checkout_link
Returns a hosted checkout URL. The customer and subscription are created automatically when the end-customer completes checkout. Returns checkout_url, pricing_plan_subscription_id and expires_at.
Quotes
get_quotes
Read-only access to everything quote-related, including approvals.
Actions: list, get (quote_versions supports get only)
Resource types: quotes, quote_versions, quote_schedules, quote_templates, approval_policies, approval_requests, custom_fields
A quote (quot_) holds versions (quve_), each backed by a subscription of type QUOTE. The commercial terms — discounts, commitments, enabled add-ons — live on the schedules, so read quote_schedules with filter.pricing_plan_subscription_id to see what a quote offers. Filter quotes by customer_id, owner_user_id (the rep) or status.
To check whether a quote needs sign-off before finalizing, read approval_policies with source_type: QUOTE_VERSION and compare the active rules against the quote. After finalizing, read approval_requests with source_id set to the quote version.
create_quote
Builds a DRAFT quote in one call: the quote, its first version, the quote subscription and its schedule, plus discounts, commitments and add-ons.
Run it with mode: validate (the default) first: it resolves the owner and checks the customer, plan version, contact and dates with zero writes. Call mode: apply once the rep has agreed the summary. Pass quote_id to finish a quote that failed or timed out part-way.
create_quote stops at DRAFT on purpose. Finalizing, accepting, rejecting and converting to a subscription are separate, irreversible steps for a human to decide, done with write_quote.
write_quote
Edits quotes and moves them through their lifecycle.
Actions: create, update, delete, finalize, accept, reject, create_subscription (the last four apply to quote_versions only)
Resource types: quotes, quote_versions, quote_schedules, custom_fields
Lifecycle, in order: finalize (locks the version and triggers any approval policy) → accept or reject → create_subscription (turns an accepted quote into a live, charging subscription). A version is editable only while DRAFT; after a rejection, create a new version with action: create, resource_type: quote_versions, body: {quote_id}. Patch discounts and commitments on quote_schedules. Ramp steps are extra schedules and must be contiguous.
Each lifecycle step is irreversible. Confirm with the user before every one, and especially before create_subscription, which starts billing the customer.
Invoicing and payments
get_invoices
Read-only access to invoices, payments and payment schedules. Invoice status flow: DRAFT → OPEN → FINAL → PAID / CREDIT. preview estimates an invoice without finalising or creating anything.
Actions: list, get, preview (invoices only)
Resource types: invoices, payments, payment_schedules
write_invoice
Creates and manages invoices, payments and payment schedules. Invoices are generated automatically at the end of each billing period; use create for one-off manual invoices.
Actions by resource type:
invoices:create,update,pay,refund,credit,archive,send_by_emailpayments:authorize,refundpayment_schedules:create,update,activate,cancel,pause
pay and refund need a PSP integration; send_by_email needs a Mailgun or SendGrid integration; credit issues a credit note against a finalised invoice.
Wallets and credits
get_wallets_credits
Read-only access to prepaid credit models.
Actions: list, get
Resource types: wallets, wallet_types, credit_types
write_wallets_credit
Creates and manages credit types (the named unit, e.g. “API Credits”), wallet types (container configuration and expiry rules) and wallets (per-customer balances). For usage that needs invoice lines, use wallets and credits rather than NUMBER or AMOUNT features.
Actions: create, update (not for wallets), activate, deactivate, archive
Resource types: wallets, wallet_types, credit_types
Automation, analytics and raw access
get_workflows
Read-only access to workflows: automation rules that watch for an event (for example an invoice becoming overdue) and run actions in response (for example emailing the customer or pushing to an ERP). The trigger lives on the workflow (work_...); what it does lives in workflow_actions (wact_...), linked by workflow_id.
Actions: list, get
Resource types: workflows, workflow_actions
Only ACTIVE workflows and actions run. DRAFT configuration never fires.
analytics
Read-only queries over dashboard data: revenue (by product, plan, currency, month), MRR/ARR, churn and customer movement, usage, deferred and recognised revenue, and growth. Use the three actions in sequence:
list_datasetsreturns available datasets and theirdatasetIdlist_fieldsreturns each model’s dimensions and measures inmodel.fieldformqueryruns the query:{datasetId, measures[], dimensions[], filters[], timeDimensions[], order[][], limit}
The optional customer_id parameter scopes results to one or more customers (comma-separated).
solvimon_api_call
Read-only raw API request for anything no dedicated read tool covers. Returns {status, body}; a non-2xx response comes back in status rather than as an error.
All other methods are refused. Writes go through the dedicated tool for the resource, which enforces its validation and lifecycle rules.