Skip to content

Get one of your subscriptions

The portal.subscriptions.get operation: GET /api/v1/portal/me/subscriptions/{subscriptionId} in the REST API and the portal_subscriptions_get tool in the MCP server.

GET/api/v1/portal/me/subscriptions/{subscriptionId}

Returns one of the signed-in customer's subscriptions as portal.subscriptions.list shows it, plus the plans each item may switch to under the brand's plan-change matrix (planOptions) and the upcoming invoice as it stands now (upcomingInvoice: the next renewal's lines, tax and amount due; null when nothing is billed next). Customer portal only (portal:read).

At a glance

  • REST: GET /api/v1/portal/me/subscriptions/{subscriptionId}
  • MCP tool: portal_subscriptions_get
  • Operation ID: portal.subscriptions.get
  • Scope: Brand
  • Permission: portal:read
  • Risk tier: read
  • Dry run: Not supported
  • Idempotency: Not needed (read only)
  • Modes: Test and live
  • Authentication: A customer signed in to the customer portal (API keys can't call it)
  • Since: M9

Request

Path parameters

FieldTypeDescription
subscriptionIdsub_… IDOne of your subscriptions (sub_…).

Query parameters

This operation takes no query parameters.

Response

200 OK with a JSON object:

FieldTypeDescription
idsub_… ID
object"portal_subscription"
statusone of incomplete, incomplete_expired, trialing, active, past_due, unpaid, paused, canceled
currencystring
itemsarray of object
items[].priceIdprice_… ID
items[].productIdprod_… ID
items[].productNamestring
items[].priceNamestring or nullThe price's nickname, e.g. “Pro, monthly”.
items[].intervalobject
items[].interval.intervalone of day, week, month, year
items[].interval.intervalCountinteger
items[].usageTypeone of licensed, metered
items[].unitAmountmoney or nullA per-unit price's amount per unit and period (null for tiered and metered prices).
items[].taxBehaviorone of inclusive, exclusiveexclusive: tax is added on the invoice.
items[].idsi_… ID
items[].quantityinteger
items[].amountmoney or nullThe item's full-period amount at its quantity, before discounts (null for metered items).
collectionMethodone of charge_automatically, send_invoicecharge_automatically (your card is charged) or send_invoice (paid by bank transfer).
paymentMethodIdpm_… ID or nullThe card this subscription charges (null: your default card).
currentPeriodStartdate-time
currentPeriodEnddate-time
trialEnddate-time or null
cancelAtPeriodEndboolean
cancelAtdate-time or null
canceledAtdate-time or null
endedAtdate-time or null
cancellationobject or null
discountsarray of object
discounts[].iddisc_… ID
discounts[].namestringThe coupon's name.
discounts[].percentOffPpmstring or nullParts per million as a string (20% = "200000").
discounts[].amountOffmoney or null
discounts[].startdate-time
discounts[].enddate-time or nullWhen it stops applying (null: for as long as the subscription runs).
scheduledChangeobject or nullA change that applies at effectiveAt (a downgrade waits for the period end).
actionsobjectWhat you can do with this subscription now, as the brand's portal settings allow.
actions.switch_planboolean
actions.change_quantityboolean
actions.apply_promotion_codeboolean
actions.cancelboolean
actions.reactivateboolean
actions.change_payment_methodboolean
cancelBehaviorone of period_end, immediateHow cancelling here ends the subscription.
collectCancelReasonbooleanCancelling asks why (optional answers).
versionintegerSend it back as expectedVersion to change what you saw.
createdAtdate-time
planOptionsarray of objectPer item, the plans you can switch to (empty unless actions.switch_plan).
planOptions[].itemIdsi_… ID
planOptions[].targetsarray of object
planOptions[].targets[].priceIdprice_… ID
planOptions[].targets[].productIdprod_… ID
planOptions[].targets[].productNamestring
planOptions[].targets[].priceNamestring or nullThe price's nickname, e.g. “Pro, monthly”.
planOptions[].targets[].intervalobject
planOptions[].targets[].interval.intervalone of day, week, month, year
planOptions[].targets[].interval.intervalCountinteger
planOptions[].targets[].usageTypeone of licensed, metered
planOptions[].targets[].unitAmountmoney or nullA per-unit price's amount per unit and period (null for tiered and metered prices).
planOptions[].targets[].taxBehaviorone of inclusive, exclusiveexclusive: tax is added on the invoice.
upcomingInvoiceobject or nullThe next invoice as it stands now (null when nothing is billed next).

Examples

A monthly plan that can move up to Pro

HTTP
GET /api/v1/portal/me/subscriptions/sub_01m4tx5nj8emwbyf7y9vcf48c0
Authorization: Bearer or_test_…

Response (200):

JSON
{
  "id": "sub_01m4tx5nj8emwbyf7y9vcf48c0",
  "object": "portal_subscription",
  "status": "active",
  "currency": "EUR",
  "items": [
    {
      "priceId": "price_01m4tx5nj8emwbyf7y9vcf48c2",
      "productId": "prod_01m4tx5nj8emwbyf7y9vcf48c4",
      "productName": "Genno Plus",
      "priceName": "Plus, monthly",
      "interval": {
        "interval": "month",
        "intervalCount": 1
      },
      "usageType": "licensed",
      "unitAmount": {
        "amount": "9000000",
        "currency": "EUR"
      },
      "taxBehavior": "inclusive",
      "id": "si_01m4tx5nj8emwbyf7y9vcf48c1",
      "quantity": 1,
      "amount": {
        "amount": "9000000",
        "currency": "EUR"
      }
    }
  ],
  "collectionMethod": "charge_automatically",
  "paymentMethodId": null,
  "currentPeriodStart": "2026-10-20T09:00:00.000Z",
  "currentPeriodEnd": "2026-11-20T10:00:00.000Z",
  "trialEnd": null,
  "cancelAtPeriodEnd": false,
  "cancelAt": null,
  "canceledAt": null,
  "endedAt": null,
  "cancellation": null,
  "discounts": [],
  "scheduledChange": null,
  "actions": {
    "switch_plan": true,
    "change_quantity": false,
    "apply_promotion_code": true,
    "cancel": true,
    "reactivate": false,
    "change_payment_method": true
  },
  "cancelBehavior": "period_end",
  "collectCancelReason": true,
  "version": 4,
  "createdAt": "2026-09-20T09:00:00.000Z",
  "planOptions": [
    {
      "itemId": "si_01m4tx5nj8emwbyf7y9vcf48c1",
      "targets": [
        {
          "priceId": "price_01m4tx5nj8emwbyf7y9vcf48c3",
          "productId": "prod_01m4tx5nj8emwbyf7y9vcf48c5",
          "productName": "Genno Pro",
          "priceName": "Pro, monthly",
          "interval": {
            "interval": "month",
            "intervalCount": 1
          },
          "usageType": "licensed",
          "unitAmount": {
            "amount": "29000000",
            "currency": "EUR"
          },
          "taxBehavior": "inclusive"
        }
      ]
    }
  ],
  "upcomingInvoice": {
    "currency": "EUR",
    "lines": [
      {
        "description": "Genno Plus (Plus, monthly)",
        "quantity": 1,
        "amount": {
          "amount": "9000000",
          "currency": "EUR"
        },
        "proration": false,
        "periodStart": "2026-11-20T10:00:00.000Z",
        "periodEnd": "2026-12-20T10:00:00.000Z"
      }
    ],
    "subtotal": {
      "amount": "7377049",
      "currency": "EUR"
    },
    "tax": {
      "amount": "1622951",
      "currency": "EUR"
    },
    "total": {
      "amount": "9000000",
      "currency": "EUR"
    },
    "creditApplied": null,
    "amountDue": {
      "amount": "9000000",
      "currency": "EUR"
    }
  }
}

Errors

CodeHTTP statusWhenWhat to do
validation_failed400The subscription's ID or a pagination value is malformed.Fix the fields listed in details.issues and send the request again.
resource_not_found404You have no such subscription (another customer's reads the same).Check the ID and that your credentials are scoped to the right organization, entity, brand and mode.
livemode_not_allowed403The portal session is in the other mode than the request.Use test mode, or credentials for the target's mode. Developers need live access granted by an organization owner or admin.
permission_denied403The caller isn't a customer signed in to this brand's portal (operators and API keys use the subscription and wallet operations).Ask an organization owner or admin for a role or scope that allows this action.

It can also return these common errors: api_version_unsupported, authentication_required, api_key_invalid, scope_required, dry_run_not_supported, rate_limited, internal_error.