Developers
One tag. Or no tag, and an API.
Tenure is meant to be installed in an afternoon by whoever owns the billing page, and to be invisible in your bundle and your error budget. The cancel path always completes, including when we do not.
The path
From the click to the charge
Install
One tag, one attribute
Drop the tag on the page that already has your cancel button, and mark the button. Tenure takes over the click, runs the flow, and hands the original action back if the subscriber still wants to leave.
<script
src="https://cdn.trytenure.ai/widget.js"
data-key="pk_live_..."
></script>
<button data-tenure-cancel
data-tenure-customer="sub_8421">
Cancel subscription
</button>If the script fails to load, times out, or errors, the button does exactly what it did before it was marked.
REST
Or render nothing at all
The same decisions are available over HTTP, with scoped keys and idempotency. Ask what to offer this subscriber, then tell Tenure what they said.
POST /api/v1/recommend
X-Session-Id: ses_a1b2
Authorization: Bearer tk_live_...
{ "customer_id": "sub_8421",
"reason": "too_expensive" }
→ 200
{ "offer": { "id": "off_pause60",
"type": "PAUSE",
"label": "Pause for 60 days" },
"arm": "TREATMENT" }Sending the same request twice does the same thing once. Every applied offer lands in the audit log.
Agents
Give a model the tools, and the limits
An agent connection exposes the same operations as tools a model can call directly. Budget caps, eligibility and guardrails are enforced on the server, not requested in a prompt.
tools: tenure.recommend_offer tenure.apply_offer tenure.cancel_subscription tenure.lookup_customer # Caps, eligibility and discount depth are # enforced server-side. An agent cannot # negotiate past them.
Works with any agent platform that can call an HTTP tool. Vendor guides exist; certified integrations are not claimed.
Events
Signed events to your backend
When something is applied, Tenure tells your system. Signed over the timestamp and body, retried with backoff, and safe to receive twice.
POST https://yourapp.com/tenure/events
x-tenure-signature: t=1758…,v1=9f2c…
idempotency-key: op_7c31
{ "type": "offer.applied",
"sessionId": "ses_a1b2",
"appliedBy": "tenure",
"offer": { "type": "DISCOUNT" } }Verify the signature before you trust the body. The same delivery may arrive more than once; the key tells you.
Reference
The full documentation lives in the app.
API reference, webhook payloads, widget styling variables, the mobile clients and a machine-readable index for your own agents.
Try it against your own account first.
Test mode runs the whole flow end to end without touching a real subscriber or a real charge.