Subscriptions
Subscriptions — methods, parameters, and examples for easy-sdk (gem).
The Easy-native subscription engine. Covers the full lifecycle: create / list / retrieve, cancel / pause / resume, item CRUD, discount application, one-time charges, metered usage reporting, and proration preview.
Accessed via client.subscriptions. The largest resource in the SDK
(~14 endpoints).
Top-level methods
list(limit: nil, offset: nil, ids: nil)
GET /subscriptions.
client.subscriptions.list(limit: 50)retrieve(id)
GET /subscriptions/:id.
create(**body)
POST /subscriptions. Minimum required fields: identity_id:,
items:, instrument_id:.
sub = client.subscriptions.create(
identity_id: customer[:id],
items: [{ price_id: "price_…" }],
instrument_id: card[:id]
)update(id, **body)
PATCH /subscriptions/:id. Update top-level fields like
cancel_at_period_end: or default payment method.
client.subscriptions.update("sub_…", cancel_at_period_end: true)cancel(id, at_period_end: nil)
DELETE /subscriptions/:id?at_period_end=…. With no argument the
server's default applies; pass true / false explicitly to override.
client.subscriptions.cancel("sub_…") # server default
client.subscriptions.cancel("sub_…", at_period_end: true) # cancel at end of period
client.subscriptions.cancel("sub_…", at_period_end: false) # cancel immediatelyPause / resume
pause(id, behavior:, resumes_at: nil)
POST /subscriptions/:id/pause. behavior controls how the API treats
unpaid invoices during the pause ("void", "keep_as_draft", …).
client.subscriptions.pause("sub_…", behavior: "void", resumes_at: "2026-06-01T00:00:00Z")resume(id)
POST /subscriptions/:id/resume.
Items
add_item(id, price_id:, quantity: nil)
POST /subscriptions/:id/items.
client.subscriptions.add_item("sub_…", price_id: "price_addon", quantity: 2)update_item(id, item_id, quantity:)
PATCH /subscriptions/:id/items/:item_id.
client.subscriptions.update_item("sub_…", "si_…", quantity: 5)remove_item(id, item_id)
DELETE /subscriptions/:id/items/:item_id.
Discounts
apply_discount(id, **body)
POST /subscriptions/:id/discounts. Pass exactly one of coupon_id:
or promotion_code:; optionally scope to a single item with
subscription_item_id:. The XOR is enforced server-side.
client.subscriptions.apply_discount("sub_…", promotion_code: "SUMMER25")list_discounts(id)
GET /subscriptions/:id/discounts.
remove_discount(id, discount_id)
DELETE /subscriptions/:id/discounts/:discount_id.
One-time charges
create_one_time_charge(id, **body)
POST /subscriptions/:id/one-time-charges. Adds a non-recurring line to
the next invoice — useful for usage overages, setup fees, etc.
client.subscriptions.create_one_time_charge(
"sub_…", price_id: "price_setup_fee", quantity: 1
)Metered usage
report_usage(id, **body)
POST /subscriptions/:id/usage. Report a usage delta against a metered
subscription item.
client.subscriptions.report_usage("sub_…", subscription_item_id: "si_…", quantity: 100)usage_summary(id, **query)
GET /subscriptions/:id/usage/summary.
usage_reconciliation(id, **query)
GET /subscriptions/:id/usage/reconciliation.
Proration preview
proration_preview(id, items: nil, remove_items: nil, proration_date: nil)
GET /subscriptions/:id/proration-preview. Preview the charge that
would result from a planned change before applying it.
items: accepts the same shape as add_item — array of
{ price_id:, quantity: } hashes. The SDK encodes them as the
comma-joined price_id:quantity shape the API expects.
preview = client.subscriptions.proration_preview(
"sub_…",
items: [{ price_id: "price_addon", quantity: 2 }],
remove_items: ["si_old_addon"]
)Object shape
:id, :identity_id, :status (active, paused, canceled,
trialing, …), :items, :current_period_start,
:current_period_end, :cancel_at_period_end, :default_payment_method,
:metadata, …
Examples
Create, add an item, then preview the proration
sub = client.subscriptions.create(
identity_id: customer[:id],
items: [{ price_id: "price_base" }],
instrument_id: card[:id]
)
preview = client.subscriptions.proration_preview(
sub[:id],
items: [{ price_id: "price_addon", quantity: 2 }]
)
if preview[:total] <= max_acceptable_charge
client.subscriptions.add_item(sub[:id], price_id: "price_addon", quantity: 2)
endCancel at the end of the current period
client.subscriptions.cancel("sub_…", at_period_end: true)Apply a coupon, then remove it
discount = client.subscriptions.apply_discount("sub_…", coupon_id: "cpn_holiday")
client.subscriptions.remove_discount("sub_…", discount[:id])