Skip to main content
GET
/
api
/
v1
/
subscriptions
/
{subscription_id}
/
v2
/
entitlements-summary
Python SDK
from metrifox_sdk import MetrifoxClient

client = MetrifoxClient(api_key="your_api_key")

# Get entitlements summary for a subscription
subscription_id = "625f5cee-259b-4994-b7eb-416b9e551f2c"
response = client.subscriptions.get_entitlements_summary(subscription_id)

for entitlement in response['data']:
    print(f"Feature: {entitlement['feature_name']} ({entitlement['feature_key']})")
    print(f"  Usage model: {entitlement['usage_model']}")
    print(f"  Purchased qty: {entitlement['purchased_qty']}")
    print(f"  Billing: {entitlement['billing_interval']}")
    print(f"  Active: {entitlement['active']}")

    # Check if this entitlement resulted from a plan transition
    if entitlement.get('metadata', {}).get('policy'):
        policy = entitlement['metadata']['policy']
        print(f"  Transition: {policy['change_type']} ({policy['timing']})")
import { init } from "metrifox-js";

const metrifoxClient = init({
apiKey: process.env.METRIFOX_API_KEY
});

// Get entitlements summary for a subscription
const subscriptionId = "625f5cee-259b-4994-b7eb-416b9e551f2c";
const response = await metrifoxClient.subscriptions.getEntitlementsSummary(subscriptionId);

response.data.forEach(entitlement => {
console.log(`Feature: ${entitlement.feature_name} (${entitlement.feature_key})`);
console.log(` Usage model: ${entitlement.usage_model}`);
console.log(` Purchased qty: ${entitlement.purchased_qty}`);
console.log(` Billing: ${entitlement.billing_interval}`);
console.log(` Active: ${entitlement.active}`);

// Check if this entitlement resulted from a plan transition
if (entitlement.metadata?.policy) {
const policy = entitlement.metadata.policy;
console.log(` Transition: ${policy.change_type} (${policy.timing})`);
}
});
require 'metrifox-sdk'

# Initialize with configuration
METRIFOX_SDK = MetrifoxSDK.init({ api_key: "your-api-key" })

# Get entitlements summary for a subscription
subscription_id = "625f5cee-259b-4994-b7eb-416b9e551f2c"
response = METRIFOX_SDK.subscriptions.get_entitlements_summary(subscription_id)

response['data'].each do |entitlement|
puts "Feature: #{entitlement['feature_name']} (#{entitlement['feature_key']})"
puts " Usage model: #{entitlement['usage_model']}"
puts " Purchased qty: #{entitlement['purchased_qty']}"
puts " Billing: #{entitlement['billing_interval']}"
puts " Active: #{entitlement['active']}"

# Check if this entitlement resulted from a plan transition
if entitlement.dig('metadata', 'policy')
policy = entitlement['metadata']['policy']
puts " Transition: #{policy['change_type']} (#{policy['timing']})"
end
end
curl --request GET \
--url https://{defaultHost}/api/v1/subscriptions/{subscription_id}/v2/entitlements-summary \
--header 'x-api-key: <api-key>'
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://{defaultHost}/api/v1/subscriptions/{subscription_id}/v2/entitlements-summary",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"net/http"
"io"
)

func main() {

url := "https://{defaultHost}/api/v1/subscriptions/{subscription_id}/v2/entitlements-summary"

req, _ := http.NewRequest("GET", url, nil)

req.Header.Add("x-api-key", "<api-key>")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.get("https://{defaultHost}/api/v1/subscriptions/{subscription_id}/v2/entitlements-summary")
.header("x-api-key", "<api-key>")
.asString();
{
  "statusCode": 200,
  "message": "Entitlements summary fetched successfully",
  "meta": {},
  "data": [
    {
      "id": "120007eb-c6f7-4439-b7a9-75f09d60079e",
      "subscription_id": "625f5cee-259b-4994-b7eb-416b9e551f2c",
      "customer_id": "fa545755-be20-4d1b-85d0-a2265dd52c56",
      "tenant_id": "90321ce5-5d33-4f6d-a4eb-11660e2b6a46",
      "customer_key": "cust-mljp3ra6ffjm",
      "active": true,
      "subscription_item_id": "b1d50e4f-85db-49d0-9d86-3b02e5f69414",
      "purchased_qty": 2,
      "billing_interval": "monthly",
      "feature_key": "feature_skills_audit",
      "soft_limit_enabled": false,
      "included_allowance": null,
      "included_allowance_reset_interval": "none",
      "included_allowance_reset_anchor": "subscription_start",
      "usage_limit": null,
      "usage_limit_reset_interval": "none",
      "usage_limit_reset_anchor": "subscription_start",
      "max_carryover_amount": null,
      "carryover_action": "does_not_expire",
      "carryover_enabled": false,
      "event_names": null,
      "aggregation_method": "sum",
      "feature_type": "metered",
      "price_type": "in_advance",
      "entitlement_id": "20910dfa-4a88-451c-9b85-2ed8ba937e97",
      "prepaid": false,
      "prepaid_credit_system_id": null,
      "usage_model": "per_use",
      "credit_cost": null,
      "created_at": "2026-02-13T13:01:29.875Z",
      "updated_at": "2026-02-13T13:01:29.875Z",
      "billing_interval_value": 1,
      "credit_source_id": null,
      "carryover_expiry_interval": null,
      "carryover_expiry_value": null,
      "metadata": {
        "policy": {
          "id": null,
          "name": "Metrifox Default Same Interval Plan Downgrade Policy",
          "timing": "immediate",
          "tenant_id": null,
          "created_at": null,
          "updated_at": null,
          "change_type": "downgrade",
          "time_policy": {
            "charge_strategy": "partial_charge",
            "unused_time_strategy": "partial_credit"
          },
          "cycle_strategy": "keep_existing_cycle",
          "consumable_policy": {
            "charge_strategy": "issue_zero_credit_apply_full_charge",
            "provision_strategy": "allocate_full_quantity",
            "unused_quantity_handling": "roll_over",
            "unprovisioned_quantity_handling": "do_nothing"
          },
          "interval_strategy": "same_interval"
        },
        "billing_end_date": "2026-03-12T16:55:21.847Z",
        "transitioning_subscription_id": "c541c94a-6a02-4bc0-bf8b-1a5a4245e1d8"
      },
      "feature_name": "Skills Audit"
    },
    {
      "id": "2e7f7fd8-c723-4d7c-98e5-b8239ab5226e",
      "subscription_id": "625f5cee-259b-4994-b7eb-416b9e551f2c",
      "customer_id": "fa545755-be20-4d1b-85d0-a2265dd52c56",
      "tenant_id": "90321ce5-5d33-4f6d-a4eb-11660e2b6a46",
      "customer_key": "cust-mljp3ra6ffjm",
      "active": true,
      "subscription_item_id": "7ab84a13-f11d-4f03-9936-c5ece50bf40a",
      "purchased_qty": 3,
      "billing_interval": "monthly",
      "feature_key": "feature_seats",
      "soft_limit_enabled": false,
      "included_allowance": null,
      "included_allowance_reset_interval": "none",
      "included_allowance_reset_anchor": "subscription_start",
      "usage_limit": null,
      "usage_limit_reset_interval": "none",
      "usage_limit_reset_anchor": "subscription_start",
      "max_carryover_amount": null,
      "carryover_action": "does_not_expire",
      "carryover_enabled": false,
      "event_names": null,
      "aggregation_method": "sum",
      "feature_type": "metered",
      "price_type": "in_advance",
      "entitlement_id": "262bd36c-eef8-4981-8c58-52c952d3f42e",
      "prepaid": false,
      "prepaid_credit_system_id": null,
      "usage_model": "persistent_use",
      "credit_cost": null,
      "created_at": "2026-02-13T13:01:29.715Z",
      "updated_at": "2026-02-13T13:01:29.715Z",
      "billing_interval_value": 1,
      "credit_source_id": null,
      "carryover_expiry_interval": null,
      "carryover_expiry_value": null,
      "metadata": {
        "policy": {
          "id": null,
          "name": "Metrifox Default Same Interval Plan Downgrade Policy",
          "timing": "immediate",
          "tenant_id": null,
          "created_at": null,
          "updated_at": null,
          "change_type": "downgrade",
          "time_policy": {
            "charge_strategy": "partial_charge",
            "unused_time_strategy": "partial_credit"
          },
          "cycle_strategy": "keep_existing_cycle",
          "consumable_policy": {
            "charge_strategy": "issue_zero_credit_apply_full_charge",
            "provision_strategy": "allocate_full_quantity",
            "unused_quantity_handling": "roll_over",
            "unprovisioned_quantity_handling": "do_nothing"
          },
          "interval_strategy": "same_interval"
        },
        "billing_end_date": "2026-03-12T16:55:21.847Z",
        "transitioning_subscription_id": "c541c94a-6a02-4bc0-bf8b-1a5a4245e1d8"
      },
      "feature_name": "Seats"
    }
  ],
  "errors": {}
}
{
"message": "<string>",
"errors": {}
}
{
"statusCode": 404,
"message": "Subscription not found",
"errors": {
"subscription_id": [
"Subscription with ID '625f5cee-259b-4994-b7eb-416b9e551f2c' does not exist"
]
}
}
The metadata.policy field is only present when the entitlement resulted from a plan transition (upgrade or downgrade). For entitlements that were part of the original subscription, this field will not be included.

Authorizations

x-api-key
string
header
required

Path Parameters

subscription_id
string<uuid>
required

The unique subscription identifier (UUID)

Response

Entitlements summary fetched successfully

statusCode
integer
Example:

200

message
string
Example:

"Entitlements summary fetched successfully"

meta
object

Additional metadata

data
object[]

Array of entitlement summary records

errors
object

Any errors that occurred