MCP App Store
by KeenEthics
Developer Tools
RevenueCat icon

RevenueCat

by RevenueCat

Overview

Set up RevenueCat, integrate it in your apps, and access and analyze data about your customers, revenue, purchases.

Tools

apply-product-store-state-plan

ChatGPT
Queues asynchronous apply for a planned or retryable product store state plan. Do not call this until you have shown the user the diffs and warnings from get-product-store-state-plan and they confirmed they want the changes applied. Never apply if any plan_items[*].warnings has severity: blocker. Before calling this, confirm the plan has an apply action. Applying may create products, update App Store metadata, availability, pricing, localizations, screenshots, and fill every App Store subscription territory not listed in territory_prices from base_territory when common.pricing.equalize_missing_subscription_prices was included. Listed territory_prices are kept. That directive is subscription-only. App Store one-time products are equalized by Apple from the schedule base territory. After queueing apply, poll get-product-store-state-plan until status is applied or apply_errored; if a 423 lock occurs, inspect the referenced object ids and retry after the conflicting operation finishes.

archive-entitlement

ChatGPT
Archives an entitlement, making it inactive, and returns the updated entitlement. Fails with 422 while active products are still attached — detach or archive those first. Idempotent and reversible via unarchive-entitlement.

archive-offering

ChatGPT
Archives an offering, making it inactive so it is no longer returned by the SDK, and returns the updated offering. Reversible: use unarchive-offering to make it active again. Archived offerings cannot be updated with update-offering.

archive-product

ChatGPT
Archives a product, making it inactive in RevenueCat without touching the store. Idempotent and reversible via unarchive-product. Fails with 422 while the product is attached to a package of a non-archived offering (the blocking offering ids come back in referenced_object_ids).

archive-virtual-currency

ChatGPT
Archives an in-app currency (virtual currency), making it inactive, and returns the updated currency. This is reversible: unarchive-virtual-currency restores the currency with its code, name, and product_grants intact.

assign-customer-offering

ChatGPT
Sets a per-customer offering override, so this customer's app is served the given offering as its current offering instead of the one it would otherwise display. Pass offering_id: null to clear an existing override. Reversible and safe to repeat; no response body.

attach-offering-to-paywall

ChatGPT
Attaches an offering to a paywall so the paywall is served for that offering, and returns the updated paywall. Idempotent when the offering is already attached to this paywall. Fails with 409 if the paywall already has a different offering or the offering is attached to another paywall, and with 422 if the offering is archived.

attach-products-to-entitlement

ChatGPT
Attaches products to an entitlement so purchasing any of them unlocks it, and returns the updated entitlement. Existing purchases are recalculated asynchronously, so access changes may take a moment to propagate. Idempotent (already-attached products are skipped) and reversible via detach-products-from-entitlement. Fails with 422 if the entitlement or any product is archived.

attach-products-to-package

ChatGPT
Attaches products to a package and returns the updated package. Packages group equivalent products across stores/platforms, so you typically attach one product per store (with eligibility_criteria to target Google Play SDK versions). Attaching does not remove existing associations; use detach-products-from-package to undo.

create-app

ChatGPT
Creates a new app inside a project and returns it. Alongside name and type, send the matching store-specific object with the platform's identifiers. For App Store apps, reuse a sibling app's credentials in this project with app_store.copy_app_store_connect_api_key_from_app_id or app_store.copy_subscription_key_from_app_id. Configure new credentials in the app's settings in the RevenueCat dashboard. Fails if the name is already used for that type or the bundle ID / package name is already registered in the project.

create-audience

ChatGPT
Creates a new audience (a saved customer segment) from a name and membership rules, and returns it. Call get-audience-filter-options first to discover valid values for data-derived rule fields. Not idempotent: repeated calls create duplicate audiences.

create-entitlement

ChatGPT
Creates a new entitlement. See RevenueCat's Entitlements docs for more details. In conversations, refer to lookup_key as "identifier".

create-experiment

ChatGPT
Creates a draft experiment. Use list-offerings to find existing offering IDs for its variants. This does not start the experiment. Experiment types Set experiment_type to whatever best matches what the variants change, and prefer its recommended metrics unless the user asks for something else: - introductory_offer — discounts the first period to test the impact on lifetime value. - Recommended primary metric: realized_ltv_per_customer - Recommended secondary metrics: conversion_to_paying, trials_started, active_subscribers - free_trial_offer — changes or removes free trials to measure the impact on sign-ups and retention. - Recommended primary metric: realized_ltv_per_customer - Recommended secondary metrics: active_subscribers - paywall_design — tests paywall layouts, visuals, or copy to boost conversions. - Recommended primary metric: initial_conversion_rate - Recommended secondary metrics: realized_ltv_per_customer, exposed_customers - price_point — tries different prices to maximize revenue. - Recommended primary metric: realized_ltv_per_customer - Recommended secondary metrics: conversion_to_paying, realized_ltv_per_paying_customer - subscription_duration — compares subscription durations (e.g. monthly vs. annual) to identify the healthiest business outcome. - Recommended primary metric: realized_ltv_per_customer - Recommended secondary metrics: conversion_to_paying - subscription_ordering — reorders or changes the presented options to improve plan selection. - Recommended primary metric: realized_ltv_per_customer - Recommended secondary metrics: conversion_to_paying - other — anything that doesn't fit the presets; choose the metrics that best match what is being tested.

create-offering

ChatGPT
Creates a new offering. See RevenueCat's Offerings docs for more details. In conversations, refer to lookup_key as "identifier".

create-packages

ChatGPT
Creates a new package for an offering. The convention for package identifiers in RevenueCat are: $rc_{product_duration} for durations: monthly, annual, three_month, two_month, lifetime, six_month, weekly. Try to use those if possible. If you need to create a custom package, use the provided lookup_key (refer to it as "identifier" in conversations) or create one that starts with $rc_custom_ and make sure it's unique and uses the display name provided.

create-paywall-ai

ChatGPT
Starts an async Paywall AI Editor task to create an unpublished RevenueCat paywall from a blank canvas, then returns a task ID. Image-heavy creation can take 5-10 minutes; do not call this tool again for the same request unless the task fails. Call get-paywall-ai-task with the returned task ID about every 30 seconds until it succeeds or fails. Pass a prompt describing what paywall to create. Pass an offering ID when available, otherwise the paywall is created as an unattached draft. Paywall AI Editor can also generate or replace paywall hero/background images when requested. Always send context: a call with neither app_context nor codebase_context usually comes back with a question instead of a paywall. Inspect the app/codebase first, fill every app_context field you can determine, and use codebase_context for anything app_context has no field for.

create-product

ChatGPT
the created product — this only registers a product with RevenueCat; it does not create anything in the underlying store. Not idempotent: retrying with the same identifier fails with a conflict. For Stripe, RevenueCat selects a usable web price when possible. Provide price_identifier to require importing a specific existing price. Without it, the product is still created when Stripe cannot be queried or no price can be selected.

create-product-prices

ChatGPT
Deprecated. Prefer product-store-state-plan tools (create, plan, apply) for previewable store changes. Configure prices for a product. This tool only works with products configured in an app type test_store. Calling this tool on products belonging to any other app type will cause an error.

create-product-store-state-plan

ChatGPT
Creates a draft plan to create or update products in RevenueCat and the app stores from one or more desired product store states. Prefer this over set-product-store-state when the user wants to preview changes, modify multiple products, create missing RevenueCat products, or safely review store metadata before applying it. Provide product_id when the RevenueCat product ID is known. Alternatively, provide create_revenuecat_product with the app, store identifier, and product metadata; if a RevenueCat product already exists for that app and store identifier, the plan will target the existing product, otherwise the plan keeps it as a new RevenueCat product to create when applied. Set store to app_store, play_store, rc_billing, or test_store and populate the matching store_state payload. Ask the user if they want all territories or a specific set before setting common.availability.territories. For RC Billing (rc_billing) and Test Store (test_store), pricing is currency-keyed under common.pricing.currency_prices (create-only; updating an existing currency is rejected). For App Store auto-renewing subscriptions, send the prices to keep in territory_prices (at least base_territory, plus any custom regional overrides) and include common.pricing.equalize_missing_subscription_prices with that base_territory (e.g. US) so every other Apple territory is filled from that base at apply time. Those filled territories will not appear as individual plan diffs — only a summary line. Do not send that field for App Store one-time products (consumable, non-consumable, non-renewing): omit it, set common.availability to the territories the user wants, and send the source price in territory_prices (US becomes the schedule base when present; otherwise the first listed territory). Extra territory_prices entries are custom manual overrides; Apple fills remaining available territories from that base. For App Store subscription creation, provide common.duration using canonical ISO-like values such as P1M. App Store free trial (store_state.trial_offer): one trial applies to every territory where the product is priced and available. Set it to create or replace the trial everywhere, set it to null to remove it everywhere, or omit it to keep the current trial. An existing trial is extended automatically to territories added later through prices, equalize or availability. Never send trial_offer.territories; it is read-only. Play Store currently supports subscriptions only (no consumables or non-consumables). For Play Store subscriptions: (1) provide at least one localization in common.localizations (keyed by locale, e.g. en-US) with a name (and optional description); (2) populate store_state.play_store.base_plans with an entry keyed by base_plan_id — typically a single entry for the targeted plan — and set state to ACTIVE by default (use DRAFT only when the user explicitly wants the base plan held back; INACTIVE is not yet supported on apply); (3) include a billing plan type on the base plan — exactly one of auto_renewing_base_plan_type, prepaid_base_plan_type, or installments_base_plan_type. This is required when creating a new subscription. On modify, if the caller omits the billing plan type it is carried forward from the live Play Store state, but always ask the user for the billing period upfront. The most common is auto_renewing_base_plan_type, e.g. { "billing_period_duration": "P1M", "grace_period_duration": "P3D", "account_hold_duration": "P30D", "proration_mode": "SUBSCRIPTION_PRORATION_MODE_CHARGE_ON_NEXT_BILLING_DATE", "resubscribe_state": "RESUBSCRIBE_STATE_ACTIVE", "legacy_compatible": false, "legacy_compatible_subscription_offer_id": null }. Only billing_period_duration (ISO-8601, e.g. P1M) is required; the rest are optional and default to Google's defaults when omitted. prepaid_base_plan_type requires billing_period_duration (optional time_extension). installments_base_plan_type additionally requires committed_payments_count and renewal_type (one …

create-project

ChatGPT
Creates a new RevenueCat project — the top-level container that apps, products, entitlements, and offerings live under — and returns it; use the returned id with create-app to add apps. Not idempotent — repeated calls create duplicate projects with the same name.

create-targeting-rule

ChatGPT
Creates a targeting rule for a project. The rule can be created as active or inactive and can target by conditions, audience, schedule, and placement overrides.

create-virtual-currency

ChatGPT
Creates an in-app currency (virtual currency) in the project and returns the created currency. The code permanently identifies the currency in all other in-app currency endpoints and cannot be changed later. This defines the project-level currency only; customer balances are read via the customer in-app currency endpoints.

create-webhook-integration

ChatGPT
Creates a webhook integration that starts delivering RevenueCat events to the given url; omitted/null filters mean all events, environments, and apps. name and url are unique per project, so re-posting either fails with 409 resource_already_exists. Use update-webhook-integration to change an existing one. The Authorization header sent with deliveries cannot be set through this tool: configure it in the webhook's settings in the RevenueCat dashboard.

delete-iam-authentication-method

ChatGPT
Permanently deletes an authentication method. Customers can no longer sign in with it. Destructive and not reversible. Always ask the user to confirm before you call this tool. Fails with 409 while a published funnel uses the method; remove it from those funnels first. Returns 404 when IAM management is not enabled for the project.

delete-package-from-offering

ChatGPT
Permanently deletes a package from its offering. Destructive and not reversible — the package and its product associations are removed, though the attached products themselves are not deleted. To change which products a package sells without deleting it, use attach-products-to-package / detach-products-from-package instead.

delete-targeting-rule

ChatGPT
Deletes one targeting rule from a project.

delete-webhook-integration

ChatGPT
Permanently deletes a webhook integration and stops all event deliveries to its URL. Destructive and not reversible — the configuration and its signing secret cannot be recovered. If you only want to pause or narrow deliveries, use update-webhook-integration instead.

detach-offering-from-paywall

ChatGPT
Detaches the offering from a paywall and returns the updated paywall. Idempotent when the paywall has no offering. Fails with 409 if the paywall is published; unpublish it first.

detach-products-from-entitlement

ChatGPT
Detaches products from an entitlement so purchasing them no longer unlocks it, and returns the updated entitlement. Existing purchases are recalculated asynchronously and customers can lose access — treat this as a customer-impacting change. Idempotent (ids not currently attached are ignored) and reversible via attach-products-to-entitlement.

detach-products-from-package

ChatGPT
Detaches products from a package and returns the updated package. Only the package-product associations are removed — the products themselves are not deleted and can be re-attached later with attach-products-to-package. Use delete-package-from-offering instead to remove the whole package.

discard-product-store-state-plan

ChatGPT
Discards a product store state plan that is no longer needed and is in a discardable state. Use this to clean up drafts, in-flight, planned, expired, or errored plans that the user does not want to apply. Discarding does not apply any store changes and does not undo a plan that has already been applied.

duplicate-offering

ChatGPT
Duplicates an offering and its related entities into a new, non-current offering in the same project: - Packages (attaching the same existing products, not creating new products). - The attached paywall, copied as a new unpublished draft (unless include_paywall is false, in which case the new offering won't be attached to any paywall). By default the paywall's current draft is copied; set source_paywall_version to published to copy its currently published version instead. Workflow-generated paywalls are never copied. - RC Billing Checkout Configuration, if the source offering has one (unless include_paywall is false).

duplicate-paywall

ChatGPT
Duplicates an existing paywall into a new, unpublished paywall in the same project. By default the current draft is duplicated; set source_version to published to duplicate the currently published version instead. By default the duplicate is not attached to an offering; provide offering to also duplicate the source paywall's offering (packages only) and attach the new paywall to it.

edit-paywall-ai

ChatGPT
Starts an async Paywall AI Editor task to update an existing RevenueCat paywall, then returns a task ID. If the paywall is published, the published components are edited and saved as a draft. Image-generation edits can take several minutes; do not call this tool again for the same request unless the task fails. Call get-paywall-ai-task with the returned task ID about every 10-15 seconds until it succeeds or fails. Paywall AI Editor can generate, replace, or update paywall hero/background images when the prompt asks for it. Always send context alongside the requested edit, since it preserves product, brand, audience, and visual fit. Fill every app_context field you can determine, and use codebase_context for anything app_context has no field for.

equalize-subscription-prices

ChatGPT
Deprecated. Prefer product-store-state-plan tools (create, plan, apply) for previewable store changes. Fills missing App Store auto-renewing subscription territory prices by applying Apple equalizations from the current price configured in base_territory. An existing App Store free trial is extended to the newly priced territories. Do not use this for one-time products (consumable, non-consumable, non-renewing); Apple already fills those from the IAP price schedule base territory. Set availability and send the source price in territory_prices instead (US becomes the schedule base when present). Recommended flow: 1) Call get-product-store-state and inspect warnings. 2) If warnings indicate missing subscription territory pricing coverage, call this endpoint. 3) Poll get-product-store-state-operation until status is 'succeeded' or 'failed'.

get-account-billing

ChatGPT
Returns the developer's own RevenueCat billing details — current plan, billing period, and tracked revenue. Not app customer data; use the customer/subscription tools for those. Requires the account:billing:read scope, which project-scoped keys may lack.

get-app

ChatGPT
Returns the configuration of a single app. The response is polymorphic on type with a store-specific object named after it. Credentials are never returned in plaintext — look for booleans like app_store.app_store_connect_api_key_configured and app_store.subscription_key_configured. Use list-apps to discover app ids first. To reuse a sibling app's App Store Connect key, pass that app's id as app_store.copy_app_store_connect_api_key_from_app_id on create-app or update-app.

get-audience

ChatGPT
Returns a single audience with its name and membership rules. Pass expand to add stats (size and revenue metrics), customer_sample (matching customers), or used_by (what references the audience — useful before editing or deleting it).

get-audience-filter-options

ChatGPT
Returns the known values for audience rule fields whose options are derived from the project's data, such as attribution fields and custom attributes. Use it before preview-audience, create-audience, or update-audience to discover valid values for those fields. Fields with a fixed set of values (e.g. country, platform) are not served here; cardinality_exceeded: true means more values exist than were returned.

get-benchmarks

ChatGPT
Returns RevenueCat benchmark comparisons for every app in a project (or a single app when app_id is supplied), across the supported monetization metrics (realized LTV, trial conversion, initial conversion, conversion to paying, monthly churn, refund rate). For each metric the response includes the app's own metric_value, a human-readable percentile_bucket range (e.g. "60-70") derived from the p10–p90 thresholds of the app's store + category peer group, and metadata that lets the caller reason about the comparison without re-deriving logic. Some metrics are "reverse" (lower is better, e.g. churn, refund rate); is_reverse_metric: true marks those — do not recommend reducing them when the app already scores highly. The percentile bucket already reflects the fact that lower values are better for these metrics, higher percentiles for reverse metrics mean better performance (ie. lower metric values compared to peers). Benchmarks cover roughly the last 12 months. No country, time-window, or price-band filters are supported yet. Apps with very small sample sizes have is_eligible_for_benchmarking: false; treat those rows as low-confidence.

get-chart-data

ChatGPT
Returns time-series data for a specific chart. Response Structure The response includes: - Chart metadata (category, display_name, description) - Time boundaries (start_date, end_date, last_computed_at) - Data values (array of data points) - Summary statistics - Segment information (when segmented) - Date-based annotations that the user made Chart Types Different charts may return data in slightly different formats: - Standard charts: values as arrays of data points with timestamps - Segmented charts: include segment information in the response - Cohort charts: see below Cohort charts Cohort-shaped charts (cohort_explorer, prediction_explorer, subscription_retention, ...) return values as {cohort, period, value} objects, where period is the index into the `periods` array, not a month number. Two things follow from that: - periods[0] describes the cohort size — a count of customers or subscriptions, with unit #. It is not the measure at month 0. On cohort_explorer its display_name is named after the cohorting_date selector (e.g. New customers). - The measure starts at period: 1, labelled by periods[1].display_name (typically Month 0). So Month N is at period: N + 1. Always read periods[period].display_name, .unit and .scale to interpret a data point rather than assuming period is the month number. On non-realtime charts (realtime=false) the same metadata is returned in segments instead of periods. Filtering and Segmentation Use the get-chart-options-schema tool to discover available filters and segments for a specific chart before making requests. Segments and filters vary per chart and are separate lists — a dimension can be available as a filter but not as a segment. Requesting an unsupported segment or filter (or segmenting/filtering a chart that does not allow it) returns a 400 parameter_error that lists the supported segments. Check get-chart-options-schema first when unsure. Filter parameters vary by chart and can be passed as additional query parameters. Aggregation Use aggregate to request summary-only output for supported charts. When aggregate is provided, values is returned as an empty array and summary includes only the requested aggregate operations. Incomplete data For the most recent periods, data may be flagged as incomplete, and may not be appropriate to use for analysis.

get-chart-options-schema

ChatGPT
Get LLM-friendly option schema for a chart. Returns compact metadata for filters and segments without enumerating large value lists.

get-customer

ChatGPT
Returns detailed customer information customer (attributes, entitlements, metadata)

get-customer-center-config

ChatGPT
Returns the Customer Center configuration for a customer. Provide platform to get the processed config that customer would see on that platform; omit for the full unprocessed configuration.

get-entitlement

ChatGPT
Returns a single entitlement by id. Refer to its lookup_key as "identifier" in conversations. Use list-entitlements when you don't know the id, and get-products-from-entitlement to see which products unlock this entitlement.

get-experiment

ChatGPT
Returns the full configuration of a single experiment: status, variant offerings (offering_a = control), metrics, enrollment settings, and targeting. Pass expand to embed each offering's packages, products, and paywall. Configuration only — use get-experiment-results for per-variant performance data. A null paywall_id does not mean the offering has no RevenueCat paywall: it is also null when the offering has a legacy paywall (built with the original paywall templates, before Paywalls V2), which this API does not expose. Treat a null paywall_id as an unknown screen, and never describe what it shows.

get-experiment-results

ChatGPT
Returns per-variant performance data for an experiment, optionally filtered by platform, country, or paywall view status. Results are tabular sections: each section lists its metrics, the segments it is broken down by (one total plus one per product), and a flat values array holding one entry per metric/segment/variant combination, with the metric and segment given as indexes into those arrays. Rate metrics also carry credible intervals, and statistics reports chance to win per variant. Monetary values use the currency query parameter when provided, otherwise the account's dashboard display currency (USD when unset). The response uses the legacy metric name Exposed customers; refer to this metric as Paywall viewers in user-facing responses.

get-iam-authentication-method

ChatGPT
Returns one authentication method by id, with its type-specific configuration. Secrets are never returned: has_client_secret and has_app_secret only tell whether one is set. Use list-iam-authentication-methods when you do not know the id. Returns 404 when IAM management is not enabled for the project.

get-iam-settings

ChatGPT
Returns the IAM migration mode of the project. migration_mode is the stored value (null when it was never set) and effective_migration_mode is the mode in effect (dual when none was set). dual: legacy API-key authentication and IAM both work. protected: requests made with a public API key are rejected for customers linked to an IAM user. authenticat_only: requests made with a public API key are rejected for all customers. Returns 404 when IAM management is not enabled for the project.

get-offering

ChatGPT
Returns a single offering by id. Refer to lookup_key as "identifier" in conversations; a state of inactive means archived and not returned by the SDK. Use list-offerings when you only know the offering's lookup_key, not its id. A null paywall_id does not mean the offering has no RevenueCat paywall: it is also null when the offering has a legacy paywall (built with the original paywall templates, before Paywalls V2), which this API does not expose. Treat a null paywall_id as an unknown screen, and never describe what it shows.

get-offering-prices

ChatGPT
Get the prices of all packages in an offering, grouped by package, for a given currency and country (defaults: USD / US).

get-overview-metrics

ChatGPT
Provides a summary of key project metrics for the last 28 days without needing to query individual charts.

get-paywall

ChatGPT
Returns a single paywall by id — the UI configuration built in the RevenueCat dashboard's paywall editor. Pass expand: ["components"] to include the component configuration — the source of truth for exact values such as the default-selected package, component bindings, and offer-conditional content. Read-only; published_at is null when the paywall has never been published.

get-paywall-ai-task

ChatGPT
Checks a Paywall AI Editor task returned by create-paywall-ai or edit-paywall-ai. If the task is still running, wait for poll_after_ms/the suggested retry delay and call this tool again; keep polling until the task succeeds or fails, even if it takes several minutes. If it succeeded, this returns the saved paywall draft details and screenshots.

get-product

ChatGPT
Returns a single product from the project's catalog by its RevenueCat product id (prod...), not by its store SKU. Use list-products when you only know the store identifier or want to browse the catalog.

get-product-store-state

ChatGPT
Returns live ProductStoreState data from the target store (App Store Connect, Google Play Store, RC Billing, or Test Store). Subscription pricing note: App Store subscriptions typically require territory-level pricing coverage; partial pricing can leave metadata incomplete until remaining territories are configured. Response shape — read directly from the returned JSON. - store (app_store | play_store | rc_billing | test_store) and store_status.status (e.g. ok, needs_action, not_found) tell you which store this came from and the overall product health. - Pricing is keyed by store: App Store / Play Store return common.pricing.territory_prices[<region>]; RC Billing / Test Store return common.pricing.currency_prices[<currency>]. - common.availability.territories[<region>] — boolean: whether the product is available in that region (e.g. common.availability.territories.US). App Store / Play Store only. - common.pricing.territory_prices[<region>] — { amount_micros, currency } for that region. For App Store this is the current price. A pending scheduled price is returned separately under store_state.scheduled_territory_prices. - common.pricing.currency_prices[<currency>] — { amount_micros } for that ISO currency code. Returned for rc_billing and test_store. - common.localizations[<locale>] — { name, description } per locale (e.g. en-US). - App Store-specific (store_state when store == app_store): subscription_group_localizations, trial_offer, privacy_policy_url, review_information.screenshot, review_information.notes, scheduled_territory_prices[<region>] ({ amount_micros, currency, start_date } for a pending App Store price change; omitted when none). - App Store store_state.trial_offer is { duration, start_date, territories }. territories maps each priced and available region to whether the free trial is live there; false means the trial is missing in that region. Check for false values before telling the user a trial is configured. It is read-only: never send territories in writes or plans. - Play Store-specific (store_state when store == play_store): base_plans[<base_plan_id>] is keyed by base plan id and contains state (ACTIVE | DRAFT | INACTIVE), exactly one of auto_renewing_base_plan_type (fields: billing_period_duration (e.g. P1M), grace_period_duration, account_hold_duration, proration_mode, resubscribe_state, legacy_compatible, legacy_compatible_subscription_offer_id), prepaid_base_plan_type, or installments_base_plan_type, regional_configs[<region>].new_subscriber_availability and regional_configs[<region>].price, offers, and offer_tags. - RC Billing / Test Store (store_state when store is rc_billing or test_store): optional offer.eligibility (everyone | never_purchased | never_subscribed | never_subscribed_to_the_same_product), offer.trial.duration, and offer.intro_price (duration, billing_interval, currency_prices[<currency>].amount_micros). Intro currencies must also exist in common.pricing.currency_prices. - store_fetched_at — UTC when RevenueCat last read this product from the store. Interactive GETs are cached for about 60 seconds; ASC/Play console edits are not push-invalidated. Poll again (or wait for cache expiry) when you need a fresher read.

get-product-store-state-operation

ChatGPT
Deprecated. Prefer product-store-state-plan tools (create, plan, apply) for previewable store changes. Polls the async operation created by set-product-store-state. Keep polling until terminal status: - succeeded: operation completed - failed: inspect error_message, adjust input, and retry the set call

get-product-store-state-plan

ChatGPT
Returns the full product store state plan. Use this to poll asynchronous planning or apply work, inspect actions before choosing the next step, and review plan_items for per-product create/modify/unchanged actions, diffs, warnings, and apply status. After planning, summarize plan_items[*].diff in plain language before offering apply. You may also share https://app.revenuecat.com/projects/{project_id}/product-catalog/product-editor/review-changes?plan_id={plan_id} so the user can review in the dashboard. Review warnings and blocker messages before applying. After applying, poll this tool until the plan reaches applied or apply_errored; if planning errored, inspect error_message and per-item error_message; if applying errored, inspect per-item apply_error_message. Response shape — read directly from the returned JSON. - status is the plan-level lifecycle state (draft, plan_queued, planning, planned, planned_and_finished, plan_errored, apply_queued, applying, applied, apply_errored, discarded, cancelled, expired). Use this when polling. - actions lists the next valid actions (edit, plan, apply, discard) — pick the next step from this list. - summary has products_added, products_modified, products_unchanged for a quick rollup. - plan_items[*] is the per-product detail. For each item: - action is create | modify | unchanged. - diff[*] lists { field, from_value, to_value } where field is a dotted path into the desired state (e.g. common.pricing.territory_prices.US, store_state.base_plans.monthly.state). common.pricing.equalize_missing_subscription_prices is a summary line only: territories listed in territory_prices appear as territory_prices.<code> diffs; other territories are filled at apply and will not appear here. Absence from the diff does not mean they stay unchanged. A store_state.trial_offer diff with the same duration whose territories go from false to true means apply will extend the existing App Store free trial to the territories that lack it. - warnings[*] is { severity, field, message } where severity is info | warning | blocker. Treat any blocker as something the user must fix before applying. - error_message is the per-item planning error (if planning failed for that item). - apply_status is pending | running | applied | failed | skipped, and apply_error_message is set when apply_status == failed. - Plan-level error_message is set when the whole plan failed planning. - timestamps has created_at, planning_at, planned_at, applied_at, discarded_at, cancelled_at, expired_at (ms since epoch). - When a desired state's App Store screenshot uses asset_id, store_state.review_information.screenshot.preview_url is a short-lived URL for rendering that staged image. It is omitted if storage is down or the object is gone. Do not persist it or send it on create/update.

get-products-from-entitlement

ChatGPT
Lists the products attached to an entitlement — the purchases that unlock it. Use this to audit an entitlement's coverage before attaching or detaching products; use list-products for all products in the project regardless of entitlement.

get-project-ui-config

ChatGPT
Returns the paywall UI configuration for a project: fonts, colors, saved color and gradient presets, and custom variables.

get-refund-request-preferences

ChatGPT
Returns the Refund Control preferences configured for a project, including the default handling preference and any audience-specific policies in priority order. Use this to answer questions about how RevenueCat handles App Store and Play Store refund requests for the project.

get-revenue-metric

ChatGPT
Returns the total revenue for the project across all of its apps for the given inclusive date range. Use this instead of summing individual transactions when the app needs the same revenue figure shown in the RevenueCat dashboard.

get-subscription

ChatGPT
Returns a single subscription by its RevenueCat subscription id — no customer id needed. gives_access is the authoritative flag for entitlement access. Use this when you already have a subscription id; use list-subscriptions to enumerate a customer's subscriptions.

get-targeting-rule

ChatGPT
Returns one targeting rule in a project by targeting_rule_id, including its state, display name, offering, conditions, audience, schedule, and placement overrides when present. Returns resource_missing if the ID is not associated with the project.

get-virtual-currency

ChatGPT
Returns information about an in-app currency (virtual currency): name, description, and product grants

get-webhook-integration

ChatGPT
Returns a single webhook integration by id: its destination URL and delivery filters (null values mean no filtering). The HMAC signing_secret is not returned; it is only exposed by a rotate request. Use list-webhook-integrations if you don't know the id yet.

grant-customer-entitlement

ChatGPT
Grants a customer promotional access to an entitlement until expires_at, without a store purchase; as a side effect a promotional subscription is created. Repeating the call stacks another grant, unless an existing grant for the same entitlement expires within two hours of the requested expires_at. Returns the updated customer. Reversible via the revoke granted entitlement endpoint.

list-account-billing-invoices

ChatGPT
Lists the invoices RevenueCat has charged this account — the developer's own RevenueCat bill, with amounts and payment status. Not app customer transactions; use the purchases/subscriptions tools for those.

list-app-public-api-keys

ChatGPT
Returns the public (SDK) API keys of an app — the keys embedded in client apps to initialize the RevenueCat SDK, not secret server-side keys. Some keys are omitted (RC Checkout keys always; production keys for Stripe/Web Billing apps on sandbox-only Stripe accounts).

list-app-subscription-groups

ChatGPT
Lists the subscription groups configured in App Store Connect for an App Store app, each with its subscription products (store_identifier, name, ISO 8601 duration, status). Read live from Apple, so it includes products not yet imported into RevenueCat. Only works for App Store apps with an App Store Connect API key configured. Not paginated.

list-apps

ChatGPT
Lists the apps in a project. Each app is polymorphic on type, with store-specific details nested under a field named after the type (e.g. app_store.bundle_id). Use it to discover app_id values and which apps already have an App Store Connect key (app_store.app_store_connect_api_key_configured). Prefer get-app when you already know the id.

list-audiences

ChatGPT
Returns all audiences in the project — saved customer segments defined by filter rules. Not paginated. Use this to find segments; to look up individual customers by email or app user ID, use list-customers instead.

list-audit-logs

ChatGPT
Lists a project's audit logs — records of configuration changes made through the dashboard or API (who changed what and when), not customer purchase activity. occurred_at is milliseconds since epoch.

list-collaborators

ChatGPT
Lists the people with access to a project, including the project owner, with each collaborator's email and role. accepted_at is null while the invitation is still pending.

list-customer-events

ChatGPT
Returns the customer's event history. Each event has a type and an untyped body payload whose fields vary by event type. Use this to reconstruct what happened to a customer over time; for current state prefer get-customer, list-subscriptions, or list-purchases.

list-customers

ChatGPT
Search for individual customers in the project by email, app user ID, or transaction / order identifiers. To build segments of customers by applying filters, use the audience tools.

list-entitlements

ChatGPT
Lists all entitlements in a project — the levels of access customers unlock by purchasing the products attached to them. Refer to each entitlement's lookup_key as "identifier" in conversations. Use get-entitlement instead when you already know the entitlement id.

list-experiments

ChatGPT
Returns the project's experiments (A/B tests of offerings, prices, and paywalls), optionally filtered by status. Each item includes the variant offerings (offering_a = control) and targeting. Configuration only — use get-experiment-results for per-variant performance data.

list-iam-authentication-methods

ChatGPT
Lists the authentication methods configured for the project (email OTP, magic link, OIDC, Google, Apple, Facebook, Firebase). Use get-iam-authentication-method for one method. Returns 404 when IAM management is not enabled for the project.

list-offerings

ChatGPT
Returns the list of offerings in a project. Offerings group the packages that can be shown on a paywall; is_current marks the default offering served to apps. Refer to lookup_key as "identifier" in conversations. Use get-offering when you already know the offering id. A null paywall_id does not mean the offering has no RevenueCat paywall: it is also null when the offering has a legacy paywall (built with the original paywall templates, before Paywalls V2), which this API does not expose. Treat a null paywall_id as an unknown screen, and never describe what it shows.

list-packages

ChatGPT
Returns the list of packages in an offering. Packages group the equivalent products sold across stores/platforms; position is the package's order within the offering. Refer to lookup_key as "identifier" in conversations.

list-paywalls

ChatGPT
Returns the list of paywalls in a project — the UI configurations built in the RevenueCat dashboard's paywall editor. Read-only; published_at is null if the paywall was never published. Use get-paywall to inspect a specific paywall's component configuration. Legacy paywalls (built with the original paywall templates, before Paywalls V2) are not listed, so an empty list does not mean the project has no RevenueCat paywalls.

list-product-store-state-plans

ChatGPT
Lists product store state plans for a project. Use this to find an existing draft, planned, errored, applied, or discarded plan before creating a new one, or to resume a previous plan workflow. Filter by status when the user is looking for a specific stage, then call get-product-store-state-plan with the returned id to inspect available actions, desired states, diffs, warnings, and apply results.

list-products

ChatGPT
Returns the in-app purchase and subscription products registered in a project's app catalog (store SKUs) — not to be confused with list-projects, which lists the projects on the account. Optionally filter by app_id to scope results to a single app.

list-projects

ChatGPT
Lists all RevenueCat projects accessible with the provided API key. Returns an array of projects with their IDs, names, and metadata. The API key's scope determines which projects are returned.

list-purchases

ChatGPT
Returns the customer's one-time (non-subscription) purchases: what was bought, its refund status, and the entitlements it unlocks. Subscriptions are not included — use list-subscriptions for those.

list-sdk-feature-gates

ChatGPT
Lists SDK feature gates for a project, including minimum SDK requirements and whether each gate should be shown in the project's SDK compatibility table.

list-sdk-versions

ChatGPT
Lists SDK version distribution data for a project. Supports grouping by SDK type, platform, or platform flavor; each entry includes subscriber counts and percentage of project subscribers seen in the last 30 days.

list-subscriptions

ChatGPT
Returns the customer's subscriptions across all stores; gives_access is the authoritative flag for whether the customer should have access to the associated entitlements. One-time purchases are not included — use list-purchases for those; to fetch a single subscription by its id without a customer id, use get-subscription.

list-targeting-rules

ChatGPT
Lists targeting rules for a project, returning active rules before inactive rules. Supports filtering by state and forward pagination with starting_after and limit; each item includes rule metadata, offering, conditions, audience, schedule, and placement overrides when present.

list-virtual-currencies

ChatGPT
Lists the in-app currencies (virtual currencies) available for the project.

list-virtual-currencies-balances

ChatGPT
Returns the customer's in-app currency (virtual currency) balances. Currencies with a zero balance are omitted unless include_empty_balances=true. For the project's in-app currency definitions (rather than a customer's balances) use list-virtual-currencies.

list-webhook-integrations

ChatGPT
Lists the webhook integrations configured for a project, each with its destination URL and delivery filters (null filter values mean no filtering). The HMAC signing_secret is never included; it is only returned by a rotate request. Use get-webhook-integration when you already know the id.

pause-experiment

ChatGPT
Pauses a running experiment and returns the updated experiment. Pausing is reversible: use resume-experiment to continue it later, or stop-experiment to end it permanently. Only a running experiment can be paused.

plan-product-store-state-plan

ChatGPT
Queues asynchronous planning for a draft or replannable product store state plan. Planning validates the desired states, compares them to the current store state, computes per-product diffs and warnings, and records common.pricing.equalize_missing_subscription_prices as a summary diff for App Store auto-renewing subscriptions when that directive is present. Planning does not enumerate the filled territories; they are applied later. That field is invalid for one-time products; Apple equalizes those from the schedule base territory. Call this after creating or updating a plan, then poll get-product-store-state-plan until status is planned, planned_and_finished, or plan_errored. If planning fails or returns blocker warnings, update the plan and run this action again.

preview-audience

ChatGPT
Returns matching customers without creating an audience. Pass body.rules for an ad-hoc filter or body.audience_uuid for a saved audience. Optional sort_by (status, latest_auto_renew_intent, first_seen_at, last_seen_at, total_spent) and sort_direction (asc/desc) order customer_sample (top or bottom 50; total_spent + desc is highest spenders first). Read-only: stats (counts and revenue; treat as approximate when is_approximate) plus customer_sample (not the full set). A dashboard URL is appended only for the rules path. Prefer this over create-audience to inspect a segment.

publish-paywall

ChatGPT
Publishes the current draft of a paywall, making it live for production users immediately. Use only when the user explicitly asks to publish; never publish proactively after creating or editing a paywall. The draft is validated first, like the dashboard's Publish button: if it has errors, nothing is published and the result lists them with how to fix them.

render-paywall-screenshot

ChatGPT
Render a PNG screenshot of a RevenueCat paywall. Fetches the paywall's component configuration by ID and renders it with the RevenueCat paywall viewer using the project's paywall UI configuration (fonts and custom variables), returning an image. Use version to pick draft or published, color_scheme for light or dark, and offer for the no-offer screen (none) or the trial/intro screen (introductory). Package prices are the offering's real prices in USD (US) when available, falling back to representative sample values; offer/discount text always uses sample values, so the preview may differ slightly from the dashboard.

resume-experiment

ChatGPT
Resumes a paused experiment and returns the updated experiment. Only an experiment paused with pause-experiment can be resumed; a stopped experiment cannot. Resuming fails if the experiment's targeting conflicts with another experiment that is running.

set-product-store-state

ChatGPT
Deprecated. Prefer product-store-state-plan tools (create, plan, apply) for previewable store changes. Creates or updates desired store metadata for a product and returns an async operation_id. Recommended flow: 1) Call get-product-store-state first. 2) Optional (App Store only): if user provides a review screenshot, call upload-product-store-state-screenshot and upload bytes to Apple. 3) Call this tool with the target store and the fields to change. 4) Poll get-product-store-state-operation until status is 'succeeded' or 'failed'. This endpoint uses patch semantics: omitted fields are not changed. Availability: ask the user if they want all territories or a specific set before setting common.availability.territories. Pricing guidance: - App Store / Play Store: territory-keyed common.pricing.territory_prices. - App Store scheduled prices: GET returns them on store_state.scheduled_territory_prices (GET-only; do not send on set). To schedule a change, set common.pricing.territory_prices[<region>].start_date. - RC Billing / Test Store: currency-keyed common.pricing.currency_prices (create-only; updating an existing currency is rejected). - App Store one-time products: send the source price in territory_prices (US becomes the schedule base when present; otherwise the first listed territory), add extra entries only for custom regional overrides, and set availability; Apple fills other available territories automatically. Do not call equalize-subscription-prices for one-time products. - App Store subscriptions may require territory-by-territory pricing coverage, otherwise validation/missing-metadata issues can remain. - Inspect warnings from get-product-store-state; if it indicates incomplete subscription territory pricing, call equalize-subscription-prices to fill missing territories. Offer guidance (RC Billing / Test Store): - Set store_state.offer.trial and/or store_state.offer.intro_price. - Optional store_state.offer.eligibility on create (everyone | never_purchased | never_subscribed | never_subscribed_to_the_same_product; defaults to everyone). - Create-only: updating or removing an existing offer is rejected. - Every intro currency must also have a base price in common.pricing.currency_prices. Subscription-group guidance for App Store subscription products: - Prefer reusing an existing subscription group when available. - If no subscription group exists, create a new one. - If the user explicitly asks for a different group, use that group instead (set store_state.subscription_group_name accordingly). If available, include review_information.notes, privacy_policy_url (especially for App Store subscriptions), and trial_offer for App Store subscription products.

start-experiment

ChatGPT
Starts a draft experiment and returns the updated experiment. An experiment can only be started once; after it is stopped, it cannot be restarted.

stop-experiment

ChatGPT
Permanently stops a running or paused experiment and returns the updated experiment. A stopped experiment cannot be restarted; use pause-experiment when the experiment may need to resume later.

submit-products-to-store

ChatGPT
Submits App Store products for review when each product is ready for submission. Apple requires the first In-App Purchase or subscription for an app to be submitted with a new app version, so this endpoint first checks whether the app already has at least one approved In-App Purchase or subscription. If not, products are skipped and the response message explains that the first product must be submitted in App Store Connect with a new app version. Returns per-product submission outcomes.

unarchive-entitlement

ChatGPT
Unarchives a previously archived entitlement, making it active again, and returns the updated entitlement. Idempotent; required before updating an archived entitlement or attaching products to it.

unarchive-offering

ChatGPT
Unarchives a previously archived offering so the SDK serves it again, and returns the updated offering. Reversible mirror of archive-offering. Fails with 422 when the offering's packages reference archived products — unarchive those products first, or retry with unarchive_referenced_entities: true to unarchive them in the same call.

unarchive-product

ChatGPT
Unarchives a previously archived product, making it active again, and returns the updated product. The reversible mirror of archive-product; idempotent, and the underlying store SKU is untouched.

unarchive-virtual-currency

ChatGPT
Unarchives a previously archived in-app currency (virtual currency), making it active again, and returns the updated currency. Reversible mirror of archive-virtual-currency; the currency keeps its original code, name, and product_grants.

unpublish-paywall

ChatGPT
Unpublishes a paywall, taking it out of production so it is no longer served to users. Use only when the user explicitly asks to unpublish.

update-app

ChatGPT
Partially updates an app's name and/or store-specific details and returns the updated app. The store-specific object must match the app's existing type — you cannot change an app's platform. To reuse a sibling App Store app's credentials in this project, pass app_store.copy_app_store_connect_api_key_from_app_id or app_store.copy_subscription_key_from_app_id. To add, replace, or remove credentials directly, use the app's settings in the RevenueCat dashboard.

update-audience

ChatGPT
Updates an audience's name and/or membership rules (partial update: only the fields provided change) and returns the updated audience. Rule changes affect everything that targets the audience — consider checking used_by via get-audience first.

update-entitlement

ChatGPT
Updates an entitlement's display_name — the only editable field — and returns the updated entitlement. The lookup_key ("identifier" in conversations) cannot be changed after creation. Fails if the entitlement is archived; unarchive it first. A pure rename: attached products and customer access are unaffected.

update-experiment

ChatGPT
Partially updates an experiment: omitted fields remain unchanged. Use get-experiment first to inspect its current configuration. This does not start, pause, or stop the experiment.

update-iam-settings

ChatGPT
Sets the IAM migration mode of the project and returns the settings. dual: legacy API-key authentication and IAM both work. protected: requests made with a public API key are rejected for customers linked to an IAM user. authenticat_only: requests made with a public API key are rejected for all customers. A stricter mode can stop app versions that do not use IAM from working for customers, so always explain the effect and ask the user to confirm before you call this tool. Use get-iam-settings to read the current mode first. Returns 404 when IAM management is not enabled for the project.

update-offering

ChatGPT
Updates an offering and returns it; only the provided fields change. Setting is_current: true makes this the default offering served to apps, replacing the previous current offering. Fails with 422 if the offering is archived — unarchive it first with unarchive-offering.

update-product

ChatGPT
Update a product in the project's catalog. Changing the type only affects how RevenueCat treats the product, it does not update the store. Make sure the new type matches how the product is configured in the store, otherwise RevenueCat will handle purchases in a way the store does not expect.

update-product-store-state-plan

ChatGPT
Replaces all desired states in an editable product store state plan and moves it back to draft status. This is a full replacement, not a patch: include the complete desired_states array that should remain in the plan. Use this to fix warnings, add or remove products, adjust metadata, or add common.pricing.equalize_missing_subscription_prices for App Store auto-renewing subscriptions before re-planning. Send prices to keep in territory_prices; the directive fills every other Apple territory from base_territory at apply time and will not list those territories as individual diffs. Do not add that field for App Store one-time products; Apple equalizes them from the schedule base territory (US in territory_prices when present, otherwise the first listed territory) when availability is set. After updating, call plan-product-store-state-plan again and poll get-product-store-state-plan.

update-project-ui-config

ChatGPT
Updates the paywall UI configuration for a project. Only the provided top-level fields (fonts, colors, presets, custom_variables) are replaced; omitted fields are left unchanged.

update-targeting-rule

ChatGPT
Updates a targeting rule. Send only the fields to change; use state to move a rule between active and inactive.

update-virtual-currency

ChatGPT
Updates an existing in-app currency (virtual currency) identified by virtual_currency_code and returns the updated currency. The code itself cannot be changed; to deactivate or restore a currency use archive-virtual-currency / unarchive-virtual-currency instead. Does not touch customer balances.

update-webhook-integration

ChatGPT
Partially updates a webhook integration and returns it: only the fields you send change, and sending null on a nullable field clears its filter. Changes apply to subsequent deliveries; repeating the same call is idempotent. The Authorization header sent with deliveries cannot be set, changed, or removed through this tool: manage it in the webhook's settings in the RevenueCat dashboard.

upload-product-store-state-screenshot

ChatGPT
Deprecated. Prefer product-store-state-plan tools (create, plan, apply) for previewable store changes. Reserves an App Store Connect review screenshot slot and returns upload_operations. Important: this tool does not upload bytes. Use each returned upload operation to upload the file (including chunked uploads when multiple operations are returned). After upload completes, pass screenshot_id and source_file_checksum to set-product-store-state under store_state.review_information.screenshot.

validate-app-credentials

ChatGPT
Checks one saved App Store or Google Play credential set for an app and returns each validation check. This does not change or reveal credentials.

Capabilities

Writes

Example Prompts

Click any prompt to copy it.

App Stats

122

Tools

3

Prompts

ChatGPT

Platforms

Works with

ChatGPT

Data refreshed daily