# Plans and prices

> get_plans: Returns the plans of MyDataHub by Emailmovers, the UK B2B count engine: credit packs, credit rules, licence terms, the bounce warranty and the free trial, in GBP excluding VAT.

Source: https://emailmovers.com/mydatahub/docs/reference/mcp/get_plans

Returns the plans of MyDataHub by Emailmovers, the UK B2B count engine: credit packs, credit rules, licence terms, the bounce warranty and the free trial, in GBP excluding VAT. Use it when the user asks what a list costs or which plan fits; it is free and needs no account. One credit buys one complete UK record at the same price in the app, the API and here. Call get_account for the caller's own balance, or count_audience to size a list. Lawful basis is UK GDPR Article 6(1)(f) legitimate interests; email audiences include corporate subscribers only by default (PECR), so sole traders and ordinary partnerships are left out unless the toggle is changed.

| Property | Value |
| --- | --- |
| Tool name | `get_plans` |
| Position in tools/list | 1 of 22 |
| Cost | Free |
| Scope | None. Works without an account. |
| Annotations | readOnlyHint true, destructiveHint false, idempotentHint true, openWorldHint false |
| Kind | Read only; idempotent, not destructive, closed world |
| REST equivalent | [`GET /v1/plans`](https://emailmovers.com/mydatahub/docs/reference/rest/get-plans.md) |

> **Not yet live.** MyDataHub v2 is built and tested locally and is not yet live. The v2 hosts open at launch, date to confirm. This is what `tools/list` returns from https://mydatahub.emailmovers.com/mcp once v2 launches.

## Input

This tool takes no arguments. The schema sets `additionalProperties` to false, so any member is refused.

## Example call

The `params` of a `tools/call` request:

```json
{
  "name": "get_plans",
  "arguments": {}
}
```

## Output

The result carries `structuredContent` that matches this schema, and one line of text that leads with the number.

| Member | Type | Always present | Description |
| --- | --- | --- | --- |
| `version` | string | yes |  |
| `valid_from` | string (date) | yes |  |
| `currency` | `GBP` | yes |  |
| `vat_treatment` | string | yes |  |
| `credit_definition` | string | yes |  |
| `price_scale` | `PriceScale` | yes | The per-contact scale: 1 credit buys 1 record at the rate of the band the purchase falls in. A quote's purchase options compare it with the credit pack and lead with the cheapest. |
| `price_scale.id` | `per_contact_scale` | yes |  |
| `price_scale.name` | string | yes |  |
| `price_scale.status` | enum: `confirmed`, `proposed`, `to_confirm` | yes | confirmed is in force; proposed awaits a decision; to_confirm is a figure still being checked. |
| `price_scale.available_to` | enum: `everyone`, `new_customers`, `existing_customers` | yes | everyone; new_customers only (the subscription); existing_customers only, who keep their prices (pay as you go and the 12-month plan). |
| `price_scale.minimum_order_records` | integer (0 or more) | yes |  |
| `price_scale.rule` | string | yes | How a purchase is priced, in words. |
| `price_scale.bands` | array of `PriceBand` | yes |  |
| `plans` | array of `Plan` | yes |  |
| `plans[].id` | string | yes | Such as free, pay_as_you_go or plan_12_month. |
| `plans[].name` | string | yes |  |
| `plans[].kind` | enum: `free`, `subscription`, `pack` | yes |  |
| `plans[].status` | enum: `confirmed`, `proposed`, `to_confirm` | yes | confirmed is in force; proposed awaits a decision; to_confirm is a figure still being checked. |
| `plans[].available_to` | enum: `everyone`, `new_customers`, `existing_customers` | yes | everyone; new_customers only (the subscription); existing_customers only, who keep their prices (pay as you go and the 12-month plan). |
| `plans[].price_gbp_ex_vat` | number (0 or more) | yes | Pounds sterling excluding VAT, to two decimal places. |
| `plans[].billing_period` | enum: `once`, `month`, `year` | yes |  |
| `plans[].contract_months` | integer (0 or more) or null | no | The contract's length in months, such as 12; absent when there is none. |
| `plans[].annual_price_gbp_ex_vat` | number (0 or more) or null | no |  |
| `plans[].credits` | integer (0 or more) | yes | Credits per billing period, or once. |
| `plans[].per_record_gbp` | number (0 or more) or null | yes | Price per record at full use of the allowance; null for the free plan. |
| `plans[].rollover_cap_credits` | integer (0 or more) or null | no | Subscription credits roll over while subscribed, up to this many; 0 when each period's credits are used or lost. |
| `plans[].credits_expire` | boolean | yes |  |
| `plans[].for_whom` | string | yes |  |
| `plans[].notes` | string | no |  |
| `credit_packs` | array of `CreditPack` | yes |  |
| `credit_packs[].id` | string | yes | Such as free, pay_as_you_go or plan_12_month. |
| `credit_packs[].name` | string | yes |  |
| `credit_packs[].kind` | `pack` | yes |  |
| `credit_packs[].status` | enum: `confirmed`, `proposed`, `to_confirm` | yes | confirmed is in force; proposed awaits a decision; to_confirm is a figure still being checked. |
| `credit_packs[].available_to` | enum: `everyone`, `new_customers`, `existing_customers` | yes | everyone; new_customers only (the subscription); existing_customers only, who keep their prices (pay as you go and the 12-month plan). |
| `credit_packs[].price_gbp_ex_vat` | number (0 or more) | yes | Pounds sterling excluding VAT, to two decimal places. |
| `credit_packs[].billing_period` | `once` | yes |  |
| `credit_packs[].contract_months` | integer (0 or more) or null | no | The contract's length in months, such as 12; absent when there is none. |
| `credit_packs[].annual_price_gbp_ex_vat` | number (0 or more) or null | no |  |
| `credit_packs[].credits` | integer (0 or more) | yes | Credits per billing period, or once. |
| `credit_packs[].per_record_gbp` | number (0 or more) or null | yes | Price per record at full use of the allowance; null for the free plan. |
| `credit_packs[].rollover_cap_credits` | integer (0 or more) or null | no | Subscription credits roll over while subscribed, up to this many; 0 when each period's credits are used or lost. |
| `credit_packs[].credits_expire` | boolean | yes |  |
| `credit_packs[].for_whom` | string | yes |  |
| `credit_packs[].notes` | string | no |  |
| `credit_rules` | array of `CreditRule` | yes |  |
| `credit_rules[].action` | string | yes |  |
| `credit_rules[].label` | string | yes |  |
| `credit_rules[].credits` | number (0 or more) | yes | Credits, to one decimal place: whole at 1 credit a record, fractional only where a rule is (0.1 company-only, 1.8 outright, both proposed). |
| `credit_rules[].unit` | enum: `call`, `record`, `match` | yes |  |
| `credit_rules[].status` | enum: `confirmed`, `proposed`, `to_confirm` | yes | confirmed is in force; proposed awaits a decision; to_confirm is a figure still being checked. |
| `credit_rules[].note` | string | no |  |
| `licence` | array of `LicenceTerms` | yes |  |
| `licence[].licence_type` | enum: `multi_use_12m`, `outright` | yes | multi_use_12m (12 month multi-use, every plan) or outright (1.8 credits a record, proposed). |
| `licence[].status` | enum: `confirmed`, `proposed` | yes |  |
| `licence[].credits_per_record` | number | yes |  |
| `licence[].permitted_channels` | array of enum: `email`, `telephone`, `post` | yes |  |
| `licence[].reuse_months` | integer or null | yes | 12 for multi_use_12m; null for outright. |
| `licence[].resale_prohibited` | boolean | yes |  |
| `licence[].warranty_url` | string (uri) | yes |  |
| `licence[].terms_version` | string | yes |  |
| `guarantee` | object | yes |  |
| `guarantee.current` | `Warranty` | yes | The bounce warranty that covers delivered records, with the threshold it was issued under. |
| `guarantee.proposed` | `Warranty` or null | yes |  |
| `guarantee.refunds` | array of string | yes |  |
| `trial` | object | yes |  |
| `trial.credits` | integer (0 or more) | yes |  |
| `trial.card_required` | boolean | yes |  |
| `trial.expires` | boolean | yes |  |
| `promises` | array of `PricingPromise` | yes |  |
| `promises[].key` | string | yes |  |
| `promises[].statement` | string | yes |  |
| `promises[].in_practice` | string | yes |  |
| `meters` | array of `Meter` | yes | What agents and code are metered on, in credits, the same on every surface. |
| `meters[].action` | string | yes | What is metered, such as record or enrich_contact. |
| `meters[].unit` | enum: `record`, `match`, `call` | yes |  |
| `meters[].credits` | number (0 or more) | yes | Credits per unit. |
| `meters[].status` | enum: `confirmed`, `proposed`, `to_confirm` | yes | confirmed is in force; proposed awaits a decision; to_confirm is a figure still being checked. |
| `action_path` | array of `ActionPathStep` | yes | How to buy: quote_order for a machine quote, create_order with a confirmation, and the top-up page when the balance is short. |
| `action_path[].step` | integer (1 or more) | yes |  |

Showing the first 80 of 83 members. The OpenAPI document and the MCP tool list hold the full schema.

## Errors

A failed call returns `isError` true. The text content leads with the sentence a person acts on, then the whole problem as JSON, with `code`, `detail`, `next_step` and `did_you_mean`. A 401 and a step-up 403 are answered at HTTP level so the client can start authorisation. See [Errors](https://emailmovers.com/mydatahub/docs/errors.md).
