> 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.

# 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.

> **Note**
>
> Looking to use Claude as a billing copilot rather than build an integration? See the [Claude integration](/integrations/ai-assistants/claude) instead.

---

## Using the documentation with LLMs

### llms.txt

The [llms.txt standard](https://llmstxt.org) helps LLMs index documentation efficiently, similar to how a sitemap helps search engines. We host two files:

* [docs.solvimon.com/llms.txt](https://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](https://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`):

**`Agent instructions`**

```markdown Agent instructions
When working on Solvimon billing code, consult https://docs.solvimon.com/llms.txt
to find the relevant documentation pages.
```

### The Solvimon agent skill

[Agent Skills](https://agentskills.io) 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](https://www.skills.sh):

```bash
npx skills add https://docs.solvimon.com
```

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](https://modelcontextprotocol.io) (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 your test API key (Desk → **Settings → API keys**).

> **Warning**
>
> **Test environment.** The `test.mcp.solvimon.com` endpoint connects to your test sandbox, so agents can experiment freely without touching live billing data. Use your test API key; live keys will not work against this endpoint. Production access is enabled per account; [contact us](https://www.solvimon.com/contact) to get set up.

### Connect your coding agent

#### Claude Code

Run the following command, replacing `<your-api-key>` with your test API key:

**`Add Solvimon's MCP to Claude Code`**

```bash title="Add Solvimon's MCP to Claude Code"
claude mcp add solvimon-test -- npx mcp-remote https://test.mcp.solvimon.com --header "X-API-KEY:<your API key>"
```

CodeGroup>

#### Cursor

1. Open the command palette (<kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>, or <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd> on Windows)
2. Search for "Open MCP settings" and select **Add custom MCP**
3. Configure the server:

**`mcp.json`**

```json mcp.json
{
  "mcpServers": {
    "solvimon-test": {
      "url": "https://test.mcp.solvimon.com",
      "headers": {
        "X-API-KEY": "<your-api-key>"
      }
    }
  }
}
```

#### VS Code

Create a `.vscode/mcp.json` file in your project:

**`.vscode/mcp.json`**

```json .vscode/mcp.json
{
  "servers": {
    "solvimon-test": {
      "type": "http",
      "url": "https://test.mcp.solvimon.com",
      "headers": {
        "X-API-KEY": "<your-api-key>"
      }
    }
  }
}
```

For Claude Desktop setup, see the [Claude integration](/integrations/ai-assistants/claude).

---

## Tool reference

The MCP server exposes 13 tools. Most follow the same input pattern:

| Field           | Meaning                                                                      |
| --------------- | ---------------------------------------------------------------------------- |
| `action`        | What to do: `list`, `get`, `create`, `update`, and tool-specific actions     |
| `resource_type` | Which resource, for tools that cover more than one                           |
| `id`            | Resource id or reference, for single-resource actions                        |
| `body`          | Request body for create/update, same shape as the [REST API](/api-reference) |
| `filter`        | Query params for list actions, e.g. `{"limit": "20"}`                        |

### Overview

| Tool                                                  | What it does                                                     |
| ----------------------------------------------------- | ---------------------------------------------------------------- |
| [`get_solvimon_account`](#get_solvimon_account)       | Verify the API key and list billing entities. Call first.        |
| [`manage_billing_entities`](#manage_billing_entities) | Billing entities and tax registrations                           |
| [`manage_product_catalog`](#manage_product_catalog)   | Product categories, products, product items, features            |
| [`create_meter_setup`](#create_meter_setup)           | Shortcut: meter, meter value, and calculation in one call        |
| [`manage_metering`](#manage_metering)                 | Meters, event ingestion, meter data                              |
| [`manage_pricing_plans`](#manage_pricing_plans)       | Pricing plans and plan versions                                  |
| [`manage_customers`](#manage_customers)               | Customers, including search, GDPR forget, entitlements           |
| [`manage_subscriptions`](#manage_subscriptions)       | Subscriptions and subscription groups                            |
| [`create_checkout_link`](#create_checkout_link)       | Hosted checkout URL for self-serve signup                        |
| [`manage_invoices`](#manage_invoices)                 | Invoices, payments, payment schedules                            |
| [`manage_wallets_credits`](#manage_wallets_credits)   | Credit types, wallet types, wallets                              |
| [`analytics`](#analytics)                             | Read-only queries on dashboard data (revenue, MRR, churn, usage) |
| [`solvimon_api_call`](#solvimon_api_call)             | Raw API passthrough for anything not covered above               |

A typical setup flow chains the tools in dependency order:

```
get_solvimon_account → manage_product_catalog → create_meter_setup (if usage-based)
→ manage_pricing_plans → create_checkout_link or manage_subscriptions (init)
```

### `get_solvimon_account`

Verifies credentials and returns the billing entities available to the API key. Takes no input. This is a good first call to confirm the server is correctly configured.

### `manage_billing_entities`

**Actions:** `list`, `get`, `update`, `list_tax_registrations`, `add_tax_registration`, `remove_tax_registration`

**`Get a billing entity`**

```json Get a billing entity
{"action": "get", "id": "bile_Kq2mVx8RnT4uLpWe9AhZ3"}
```

### `manage_product_catalog`

**Actions:** `list`, `get`, `create`, `update`, `delete`, `activate`, `archive`, `deprecate`

**Resource types:** `product_categories`, `products`, `product_items`, `features`

**`Create a usage-based product item`**

```json Create a usage-based product item
{
  "action": "create",
  "resource_type": "product_items",
  "body": {
    "name": "API calls",
    "reference": "api-calls",
    "product_id": "prod_Xw3nQr7KmY2vBs8TfLc41",
    "model_type": "USAGE_BASED",
    "meter_value_calculation_id": "mvc_Jh5tRw9PnX3kMq7VbYd28"
  }
}
```

> **Note**
>
> `model_type` is immutable after creation.

### `create_meter_setup`

Creates a meter, a meter value, and a meter value calculation in one call. Returns the `mvc_...` id to use in usage-based pricing configurations and product items.

| Parameter          | Required | Description                                                               |
| ------------------ | -------- | ------------------------------------------------------------------------- |
| `meter_name`       | Yes      | Display name for the meter (e.g. `"API requests"`)                        |
| `meter_reference`  | Yes      | Unique reference slug (e.g. `"api-requests"`)                             |
| `value_name`       | Yes      | Display name for the meter value (e.g. `"count"`)                         |
| `value_reference`  | Yes      | Unique reference for the meter value                                      |
| `calculation_type` | No       | Aggregation method: `SUM` (default), `MAX`, `MIN`, `AVERAGE`, or `UNIQUE` |
| `value_type`       | No       | Data type of the meter value. Default `NUMBER`.                           |
| `persist`          | No       | Whether to persist the calculation output. Default `false`.               |

**`Create a meter setup`**

```json Create a meter setup
{
  "meter_name": "API requests",
  "meter_reference": "api-requests",
  "value_name": "count",
  "value_reference": "api-requests-count"
}
```

### `manage_metering`

**Actions:** `list`, `get`, `delete`, `ingest`, `batch_ingest`, `calculate`

**Resource types:** `meters`, `meter_values`, `meter_value_calculations`, `meter_properties`, `meter_data`, `events`

Creating meters goes through [`create_meter_setup`](#create_meter_setup); this tool covers everything else, including sending test usage events.

**`Ingest a usage event`**

```json Ingest a usage event
{
  "action": "ingest",
  "resource_type": "events",
  "body": {
    "meter_reference": "api-calls",
    "value": 1,
    "customer_id": "cust_AbD3DqausjOYiMNDZY11F"
  }
}
```

### `manage_pricing_plans`

**Actions:** `list`, `get`, `create`, `update`, `delete`

**Resource types:** `pricing_plans`, `pricing_plan_versions`

**`Get a plan version`**

```json Get a plan version
{"action": "get", "resource_type": "pricing_plan_versions", "id": "ppve_Zt6yUw2QmK9nXr4VcHb37"}
```

> **Note**
>
> To change pricing, create a new plan **version**, never a new plan.

### `manage_customers`

**Actions:** `list`, `get`, `create`, `update`, `delete`, `search`, `activate`, `archive`, `forget`, `entitlements`

**`Create a customer`**

```json Create a customer
{
  "action": "create",
  "body": {
    "type": "ORGANIZATION",
    "reference": "acme-001",
    "billing_entity_id": "bile_Kq2mVx8RnT4uLpWe9AhZ3",
    "country_code": "NL",
    "timezone": "Europe/Amsterdam",
    "organization": {"legal_name": "Acme Corp"}
  }
}
```

> **Note**
>
> `type`, `country_code`, and `timezone` are immutable after creation.

### `manage_subscriptions`

**Actions:** `list`, `get`, `create`, `update`, `delete`, `cancel`, `archive`, `void`, `copy`, `init`

**Resource types:** `pricing_plan_subscriptions`, `pricing_plan_subscription_groups`

The `init` action subscribes an existing customer directly, without a checkout:

**`Subscribe an existing customer`**

```json Subscribe an existing customer
{
  "action": "init",
  "resource_type": "pricing_plan_subscriptions",
  "body": {
    "pricing_plan_version_id": "ppve_Zt6yUw2QmK9nXr4VcHb37",
    "customer_id": "cust_AbD3DqausjOYiMNDZY11F",
    "billing_period": {"type": "MONTH", "value": 1}
  }
}
```

### `create_checkout_link`

Returns a hosted checkout URL. The customer and subscription are created automatically when the end-customer completes checkout.

| Parameter                 | Required | Description                                           |
| ------------------------- | -------- | ----------------------------------------------------- |
| `pricing_plan_version_id` | Yes      | `ppve_...` id of the plan version to activate         |
| `billing_entity_id`       | No       | `bile_...` id. Defaults to your first billing entity. |
| `billing_period`          | No       | e.g. `{"type": "MONTH", "value": 1}`                  |
| `billing_time`            | No       | `EXACT` (default) or `END_OF_PERIOD`                  |
| `expiry_days`             | No       | Link lifetime in days. Default `30`.                  |
| `success_url`             | No       | HTTPS URL to redirect the customer to after checkout  |

**`Create a checkout link`**

```json Create a checkout link
{
  "pricing_plan_version_id": "ppve_Zt6yUw2QmK9nXr4VcHb37",
  "billing_period": {"type": "MONTH", "value": 1},
  "success_url": "https://acme.com/billing/done"
}
```

### `manage_invoices`

**Actions:** `list`, `get`, `create`, `update`, `preview`, `pay`, `refund`, `credit`, `archive`, `send_by_email`, `authorize`, `activate`, `cancel`, `pause`

**Resource types:** `invoices`, `payments`, `payment_schedules`

**`Preview an invoice`**

```json Preview an invoice
{
  "action": "preview",
  "resource_type": "invoices",
  "body": {
    "customer_id": "cust_AbD3DqausjOYiMNDZY11F",
    "billing_currency": "EUR"
  }
}
```

### `manage_wallets_credits`

**Actions:** `list`, `get`, `create`, `update`, `activate`, `deactivate`, `archive`

**Resource types:** `wallets`, `wallet_types`, `credit_types`

**`Create a credit type`**

```json Create a credit type
{
  "action": "create",
  "resource_type": "credit_types",
  "body": {"name": "API Credits", "reference": "api-credits"}
}
```

### `analytics`

Read-only queries over dashboard data (revenue, MRR, churn, usage). Use the three actions in sequence:

1. `list_datasets` returns available datasets and their `datasetId`
2. `list_fields` returns exact field names in `model.field` form
3. `query` runs the query

The optional `customer_id` parameter scopes results to one or more customers.

**`Query invoiced revenue by product`**

```json Query invoiced revenue by product
{
  "action": "query",
  "query": {
    "datasetId": "dast_Vc7wPx3TnR8mKq5YbJd92",
    "measures": ["invoice_v2.invoice_line_base_rep_amount_sum"],
    "dimensions": ["invoice_v2.product_names"]
  }
}
```

### `solvimon_api_call`

Raw API request. Use when no other tool fits.

| Parameter | Required | Description                                                                         |
| --------- | -------- | ----------------------------------------------------------------------------------- |
| `method`  | Yes      | HTTP method: `GET`, `POST`, `PATCH`, `PUT`, or `DELETE`                             |
| `path`    | Yes      | API path starting with `/v1/...` (e.g. `/v1/customers`)                             |
| `target`  | No       | Solvimon service to call: `CONFIG` (default), `TRANSACTION`, `EVENT`, or `IDENTITY` |
| `body`    | No       | Request body                                                                        |
| `query`   | No       | Query parameters as a map of `string → string`                                      |

**`List products via the raw API`**

```json List products via the raw API
{"method": "GET", "path": "/v1/products", "query": {"limit": "10"}}
```

---

## Related

#### [Claude integration](/integrations/ai-assistants/claude)

Use the same MCP server with Claude Desktop as a billing copilot: set up pricing and answer revenue questions in plain language.

#### [API quickstart](/platform-guides/getting-started/onboarding-and-tutorials/api-quickstart)

Make your first request against the test environment.