Products, customers, orders, subscriptions, benefits, revenue metrics and refunds.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Cancel a subscription at the end of its current period. The customer keeps access until then. Polar: PATCH /v1/subscriptions/{id}.
The subscription to cancel.
Why the customer is leaving, for your churn reporting.
The customer's own words.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
Cancel a subscription at the end of its current period. The customer keeps access until then. Polar: PATCH /v1/subscriptions/{id}.
| Argument | Type | Description |
|---|---|---|
| subscription_id* | string | The subscription to cancel. |
| customer_cancellation_reason | string | Why the customer is leaving, for your churn reporting. |
| customer_cancellation_comment | string | The customer's own words. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"subscription_id"
],
"properties": {
"subscription_id": {
"type": "string",
"description": "The subscription to cancel."
},
"customer_cancellation_reason": {
"type": "string",
"description": "Why the customer is leaving, for your churn reporting."
},
"customer_cancellation_comment": {
"type": "string",
"description": "The customer's own words."
}
}
}Create a reusable checkout URL for one or more products — the link you put in a page or an email. Polar: POST /v1/checkout-links/.
| Argument | Type | Description |
|---|---|---|
| label | string | An internal label for the link. |
| products* | array | Product ids the link sells. |
| discount_id | string | Apply this discount automatically. |
| success_url | string | Where to send the buyer after payment. |
| allow_discount_codes | boolean | Let the buyer enter a discount code. Defaults to true. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"products"
],
"properties": {
"label": {
"type": "string",
"description": "An internal label for the link."
},
"products": {
"type": "array",
"items": {
"type": "string"
},
"description": "Product ids the link sells."
},
"discount_id": {
"type": "string",
"description": "Apply this discount automatically."
},
"success_url": {
"type": "string",
"description": "Where to send the buyer after payment."
},
"allow_discount_codes": {
"type": "boolean",
"description": "Let the buyer enter a discount code. Defaults to true."
}
}
}Refund an order, in full or in part. This moves real money back to the customer. Polar: POST /v1/refunds/.
| Argument | Type | Description |
|---|---|---|
| amount | integer | Amount in the currency's minor unit (cents). Omit to refund the full order. |
| reason* | string | Why the refund is being issued. |
| comment | string | An internal note about the refund. |
| order_id* | string | The order to refund. |
| revoke_benefits | boolean | Also revoke the benefits the order granted. Defaults to false. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"order_id",
"reason"
],
"properties": {
"amount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Amount in the currency's minor unit (cents). Omit to refund the full order."
},
"reason": {
"enum": [
"duplicate",
"fraudulent",
"customer_request",
"service_disruption",
"satisfaction_guarantee",
"other"
],
"type": "string",
"description": "Why the refund is being issued."
},
"comment": {
"type": "string",
"description": "An internal note about the refund."
},
"order_id": {
"type": "string",
"description": "The order to refund."
},
"revoke_benefits": {
"type": "boolean",
"description": "Also revoke the benefits the order granted. Defaults to false."
}
}
}Fetch a single customer by Polar id. Polar: GET /v1/customers/{id}.
| Argument | Type | Description |
|---|---|---|
| customer_id* | string | The customer's Polar id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"customer_id"
],
"properties": {
"customer_id": {
"type": "string",
"description": "The customer's Polar id."
}
}
}Fetch everything about one customer in a single call — active subscriptions, granted benefits and entitlements. The best answer to 'what does this customer currently have?'. Polar: GET /v1/customers/{id}/state.
| Argument | Type | Description |
|---|---|---|
| customer_id* | string | The customer's Polar id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"customer_id"
],
"properties": {
"customer_id": {
"type": "string",
"description": "The customer's Polar id."
}
}
}Same as polar_get_customer_state, but looked up by YOUR external id rather than Polar's — the usual path when you hold your own user id. Polar: GET /v1/customers/external/{external_id}/state.
| Argument | Type | Description |
|---|---|---|
| external_id* | string | Your own id for this customer. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"external_id"
],
"properties": {
"external_id": {
"type": "string",
"description": "Your own id for this customer."
}
}
}Fetch the aggregated quantities a meter has recorded over a window — what usage-based billing will charge for. Polar: GET /v1/meters/{id}/quantities.
| Argument | Type | Description |
|---|---|---|
| interval* | string | Bucket size for the series. |
| meter_id* | string | The meter's id. |
| customer_id | string | Only this customer's usage. |
| end_timestamp* | string | ISO-8601 end of the window. |
| start_timestamp* | string | ISO-8601 start of the window. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"meter_id",
"start_timestamp",
"end_timestamp",
"interval"
],
"properties": {
"interval": {
"enum": [
"hour",
"day",
"week",
"month",
"year"
],
"type": "string",
"description": "Bucket size for the series."
},
"meter_id": {
"type": "string",
"description": "The meter's id."
},
"customer_id": {
"type": "string",
"description": "Only this customer's usage."
},
"end_timestamp": {
"type": "string",
"description": "ISO-8601 end of the window."
},
"start_timestamp": {
"type": "string",
"description": "ISO-8601 start of the window."
}
}
}Fetch revenue and subscription metrics over a date range, bucketed by interval — orders, revenue, MRR, active subscriptions. Polar: GET /v1/metrics/.
| Argument | Type | Description |
|---|---|---|
| end_date* | string | End of the window, YYYY-MM-DD. |
| interval* | string | Bucket size for the series. |
| product_id | string | Only this product's metrics. |
| start_date* | string | Start of the window, YYYY-MM-DD. |
| customer_id | string | Only this customer's metrics. |
| organization_id | string | Restrict to this organisation id. Needed when the token spans several organisations. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"start_date",
"end_date",
"interval"
],
"properties": {
"end_date": {
"type": "string",
"description": "End of the window, YYYY-MM-DD."
},
"interval": {
"enum": [
"hour",
"day",
"week",
"month",
"year"
],
"type": "string",
"description": "Bucket size for the series."
},
"product_id": {
"type": "string",
"description": "Only this product's metrics."
},
"start_date": {
"type": "string",
"description": "Start of the window, YYYY-MM-DD."
},
"customer_id": {
"type": "string",
"description": "Only this customer's metrics."
},
"organization_id": {
"type": "string",
"description": "Restrict to this organisation id. Needed when the token spans several organisations."
}
}
}Fetch a single order with its line items, discount and tax. Polar: GET /v1/orders/{id}.
| Argument | Type | Description |
|---|---|---|
| order_id* | string | The order's id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"order_id"
],
"properties": {
"order_id": {
"type": "string",
"description": "The order's id."
}
}
}Fetch a single product with its prices and attached benefits. Polar: GET /v1/products/{id}.
| Argument | Type | Description |
|---|---|---|
| product_id* | string | The product's id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"product_id"
],
"properties": {
"product_id": {
"type": "string",
"description": "The product's id."
}
}
}Fetch a single subscription with its product, price and period. Polar: GET /v1/subscriptions/{id}.
| Argument | Type | Description |
|---|---|---|
| subscription_id* | string | The subscription's id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"subscription_id"
],
"properties": {
"subscription_id": {
"type": "string",
"description": "The subscription's id."
}
}
}List who has been granted one benefit, and whether the grant is still active. Polar: GET /v1/benefits/{id}/grants.
| Argument | Type | Description |
|---|---|---|
| page | integer | 1-based page number. |
| limit | integer | Page size, 1-100. |
| benefit_id* | string | The benefit's id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"benefit_id"
],
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "1-based page number."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100."
},
"benefit_id": {
"type": "string",
"description": "The benefit's id."
}
}
}List benefits — the things a product grants, such as licence keys, file downloads or Discord roles. Polar: GET /v1/benefits/.
| Argument | Type | Description |
|---|---|---|
| page | integer | 1-based page number. |
| type | string | Only benefits of this type. |
| limit | integer | Page size, 1-100. |
| query | string | Free-text search. |
| organization_id | string | Restrict to this organisation id. Needed when the token spans several organisations. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "1-based page number."
},
"type": {
"type": "string",
"description": "Only benefits of this type."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100."
},
"query": {
"type": "string",
"description": "Free-text search."
},
"organization_id": {
"type": "string",
"description": "Restrict to this organisation id. Needed when the token spans several organisations."
}
}
}List customers, optionally by email or a text query. Polar: GET /v1/customers/.
| Argument | Type | Description |
|---|---|---|
| page | integer | 1-based page number. |
| string | Only the customer with this email. | |
| limit | integer | Page size, 1-100. |
| query | string | Free-text search over name and email. |
| organization_id | string | Restrict to this organisation id. Needed when the token spans several organisations. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "1-based page number."
},
"email": {
"type": "string",
"description": "Only the customer with this email."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100."
},
"query": {
"type": "string",
"description": "Free-text search over name and email."
},
"organization_id": {
"type": "string",
"description": "Restrict to this organisation id. Needed when the token spans several organisations."
}
}
}List discount codes and their redemption limits. Polar: GET /v1/discounts/.
| Argument | Type | Description |
|---|---|---|
| page | integer | 1-based page number. |
| limit | integer | Page size, 1-100. |
| query | string | Free-text search over discount names and codes. |
| organization_id | string | Restrict to this organisation id. Needed when the token spans several organisations. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "1-based page number."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100."
},
"query": {
"type": "string",
"description": "Free-text search over discount names and codes."
},
"organization_id": {
"type": "string",
"description": "Restrict to this organisation id. Needed when the token spans several organisations."
}
}
}List the raw usage events ingested for metering, filtered by customer, meter, name or time. Polar: GET /v1/events/.
| Argument | Type | Description |
|---|---|---|
| name | string | Only events with this name. |
| page | integer | 1-based page number. |
| limit | integer | Page size, 1-100. |
| meter_id | string | Only events matching this meter. |
| customer_id | string | Only this customer's events. |
| end_timestamp | string | ISO-8601 upper bound. |
| organization_id | string | Restrict to this organisation id. Needed when the token spans several organisations. |
| start_timestamp | string | ISO-8601 lower bound. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"name": {
"type": "string",
"description": "Only events with this name."
},
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "1-based page number."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100."
},
"meter_id": {
"type": "string",
"description": "Only events matching this meter."
},
"customer_id": {
"type": "string",
"description": "Only this customer's events."
},
"end_timestamp": {
"type": "string",
"description": "ISO-8601 upper bound."
},
"organization_id": {
"type": "string",
"description": "Restrict to this organisation id. Needed when the token spans several organisations."
},
"start_timestamp": {
"type": "string",
"description": "ISO-8601 lower bound."
}
}
}List issued licence keys and their status. Polar: GET /v1/license-keys/.
| Argument | Type | Description |
|---|---|---|
| page | integer | 1-based page number. |
| limit | integer | Page size, 1-100. |
| status | string | Only keys in this state, e.g. granted, revoked, disabled. |
| benefit_id | string | Only keys from this benefit. |
| organization_id | string | Restrict to this organisation id. Needed when the token spans several organisations. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "1-based page number."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100."
},
"status": {
"type": "string",
"description": "Only keys in this state, e.g. granted, revoked, disabled."
},
"benefit_id": {
"type": "string",
"description": "Only keys from this benefit."
},
"organization_id": {
"type": "string",
"description": "Restrict to this organisation id. Needed when the token spans several organisations."
}
}
}List the usage meters that aggregate events into billable quantities. Polar: GET /v1/meters/.
| Argument | Type | Description |
|---|---|---|
| page | integer | 1-based page number. |
| limit | integer | Page size, 1-100. |
| organization_id | string | Restrict to this organisation id. Needed when the token spans several organisations. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "1-based page number."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100."
},
"organization_id": {
"type": "string",
"description": "Restrict to this organisation id. Needed when the token spans several organisations."
}
}
}List orders, filtered by customer, product, subscription, status or a date window. Polar: GET /v1/orders/.
| Argument | Type | Description |
|---|---|---|
| page | integer | 1-based page number. |
| limit | integer | Page size, 1-100. |
| status | string | Only orders in this state, e.g. paid, pending, refunded. |
| product_id | string | Only orders for this product. |
| customer_id | string | Only this customer's orders. |
| created_after | string | ISO-8601 lower bound on creation time. |
| created_before | string | ISO-8601 upper bound on creation time. |
| organization_id | string | Restrict to this organisation id. Needed when the token spans several organisations. |
| subscription_id | string | Only orders from this subscription. |
List the organisations the token can act for. Start here — most other tools take an organization_id. Polar: GET /v1/organizations/.
| Argument | Type | Description |
|---|---|---|
| page | integer | 1-based page number. |
| limit | integer | Page size, 1-100. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "1-based page number."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100."
}
}
}List products, optionally filtered by archived state, recurrence or a text query. Polar: GET /v1/products/.
| Argument | Type | Description |
|---|---|---|
| page | integer | 1-based page number. |
| limit | integer | Page size, 1-100. |
| query | string | Free-text search over product names. |
| is_archived | boolean | Only archived, or only live, products. |
| is_recurring | boolean | Only subscriptions, or only one-off products. |
| organization_id | string | Restrict to this organisation id. Needed when the token spans several organisations. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "1-based page number."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100."
},
"query": {
"type": "string",
"description": "Free-text search over product names."
},
"is_archived": {
"type": "boolean",
"description": "Only archived, or only live, products."
},
"is_recurring": {
"type": "boolean",
"description": "Only subscriptions, or only one-off products."
},
"organization_id": {
"type": "string",
"description": "Restrict to this organisation id. Needed when the token spans several organisations."
}
}
}List refunds, filtered by order, subscription, customer or success. Polar: GET /v1/refunds/.
| Argument | Type | Description |
|---|---|---|
| page | integer | 1-based page number. |
| limit | integer | Page size, 1-100. |
| order_id | string | Only refunds against this order. |
| succeeded | boolean | Only successful, or only failed, refunds. |
| customer_id | string | Only this customer's refunds. |
| organization_id | string | Restrict to this organisation id. Needed when the token spans several organisations. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "1-based page number."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100."
},
"order_id": {
"type": "string",
"description": "Only refunds against this order."
},
"succeeded": {
"type": "boolean",
"description": "Only successful, or only failed, refunds."
},
"customer_id": {
"type": "string",
"description": "Only this customer's refunds."
},
"organization_id": {
"type": "string",
"description": "Restrict to this organisation id. Needed when the token spans several organisations."
}
}
}List subscriptions, filtered by customer, product, status, active state or cancellation window. Polar: GET /v1/subscriptions/.
| Argument | Type | Description |
|---|---|---|
| page | integer | 1-based page number. |
| limit | integer | Page size, 1-100. |
| active | boolean | Only active, or only inactive, subscriptions. |
| status | string | Only subscriptions in this state. |
| product_id | string | Only subscriptions to this product. |
| customer_id | string | Only this customer's subscriptions. |
| organization_id | string | Restrict to this organisation id. Needed when the token spans several organisations. |
| cancel_at_period_end | boolean | Only those already set to cancel — your churn pipeline. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "1-based page number."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100."
},
"active": {
"type": "boolean",
"description": "Only active, or only inactive, subscriptions."
},
"status": {
"type": "string",
"description": "Only subscriptions in this state."
},
"product_id": {
"type": "string",
"description": "Only subscriptions to this product."
},
"customer_id": {
"type": "string",
"description": "Only this customer's subscriptions."
},
"organization_id": {
"type": "string",
"description": "Restrict to this organisation id. Needed when the token spans several organisations."
},
"cancel_at_period_end": {
"type": "boolean",
"description": "Only those already set to cancel — your churn pipeline."
}
}
}List webhook delivery attempts with their HTTP results — the tool for 'why did my webhook not arrive?'. Polar: GET /v1/webhooks/deliveries.
| Argument | Type | Description |
|---|---|---|
| page | integer | 1-based page number. |
| limit | integer | Page size, 1-100. |
| succeeded | boolean | Only failures, or only successes. |
| event_type | string | Only deliveries of this event type. |
| endpoint_id | string | Only deliveries to this endpoint. |
| end_timestamp | string | ISO-8601 upper bound. |
| start_timestamp | string | ISO-8601 lower bound. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "1-based page number."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100."
},
"succeeded": {
"type": "boolean",
"description": "Only failures, or only successes."
},
"event_type": {
"type": "string",
"description": "Only deliveries of this event type."
},
"endpoint_id": {
"type": "string",
"description": "Only deliveries to this endpoint."
},
"end_timestamp": {
"type": "string",
"description": "ISO-8601 upper bound."
},
"start_timestamp": {
"type": "string",
"description": "ISO-8601 lower bound."
}
}
}List the configured webhook endpoints and their subscribed events. Polar: GET /v1/webhooks/endpoints.
| Argument | Type | Description |
|---|---|---|
| page | integer | 1-based page number. |
| limit | integer | Page size, 1-100. |
| organization_id | string | Restrict to this organisation id. Needed when the token spans several organisations. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "1-based page number."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100."
},
"organization_id": {
"type": "string",
"description": "Restrict to this organisation id. Needed when the token spans several organisations."
}
}
}Queue one webhook event for redelivery after your endpoint recovered. Polar: POST /v1/webhooks/events/{id}/redeliver.
| Argument | Type | Description |
|---|---|---|
| event_id* | string | The webhook event to resend. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"event_id"
],
"properties": {
"event_id": {
"type": "string",
"description": "The webhook event to resend."
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "1-based page number."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100."
},
"status": {
"type": "string",
"description": "Only orders in this state, e.g. paid, pending, refunded."
},
"product_id": {
"type": "string",
"description": "Only orders for this product."
},
"customer_id": {
"type": "string",
"description": "Only this customer's orders."
},
"created_after": {
"type": "string",
"description": "ISO-8601 lower bound on creation time."
},
"created_before": {
"type": "string",
"description": "ISO-8601 upper bound on creation time."
},
"organization_id": {
"type": "string",
"description": "Restrict to this organisation id. Needed when the token spans several organisations."
},
"subscription_id": {
"type": "string",
"description": "Only orders from this subscription."
}
}
}