Install
openclaw skills install stripe-apiStripe API integration with managed OAuth. This is a write-capable financial integration for customers, subscriptions, invoices, products, prices, and payments. Install only if you need Stripe administration. Connect with the least-privileged Stripe account and OAuth scopes available, verify the intended connection ID before each request, and revoke unused connections promptly. All write operations require explicit user approval showing the exact endpoint, target resource, object IDs, amounts, and test/live mode before execution. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). Requires network access and valid Maton API key.
openclaw skills install stripe-apiAccess the Stripe API with managed OAuth authentication. Manage customers, subscriptions, invoices, products, prices, and process payments.
CLI:
maton stripe customer list -L 5
maton api '/stripe/v1/customers?limit=5'
Python:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/stripe/v1/customers?limit=10')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
https://api.maton.ai/stripe/{endpoint-path}
The gateway proxies requests to api.stripe.com and automatically injects your OAuth token. Only the endpoints documented in the API Reference section below are supported — always use specific endpoint paths from that section rather than constructing arbitrary paths.
NPM:
npm install -g @maton-ai/cli
Homebrew:
brew install maton-ai/cli/maton
CLI:
maton login # Opens browser for API key
maton login --interactive # Skip browser, paste API key directly
maton whoami # Show current auth state
Manual:
MATON_API_KEY:export MATON_API_KEY="YOUR_API_KEY"
Manage your Stripe OAuth connections at https://api.maton.ai.
CLI:
maton connection list stripe --status ACTIVE
maton api -X GET /connections -f app=stripe -f status=ACTIVE
Python:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=stripe&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
CLI:
maton connection create stripe
maton api /connections -f app=stripe
Python:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'stripe'}).encode()
req = urllib.request.Request('https://api.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"connection": {
"connection_id": "{connection_id}",
"status": "ACTIVE",
"creation_time": "2026-02-01T06:04:02.431819Z",
"last_updated_time": "2026-02-10T22:40:01.061825Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "stripe",
"metadata": {}
}
}
Open the returned url in a browser to complete OAuth authorization.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple Stripe connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/stripe/v1/customers')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Always include the Maton-Connection header to ensure requests go to the intended Stripe account. If you have multiple connections and omit this header, the gateway uses a default connection, which may not be the intended account. Confirm the connected Stripe account before any write or payment action.
All Stripe API endpoints follow this pattern:
/stripe/v1/{resource}
GET /stripe/v1/balance
Example:
maton stripe balance
Response:
{
"object": "balance",
"available": [
{
"amount": 0,
"currency": "usd",
"source_types": {"card": 0}
}
],
"pending": [
{
"amount": 5000,
"currency": "usd",
"source_types": {"card": 5000}
}
]
}
GET /stripe/v1/balance_transactions?limit=10
Example:
maton stripe balance-transaction list -L 10
GET /stripe/v1/customers?limit=10
Example:
maton stripe customer list -L 10
Query Parameters:
| Parameter | Description |
|---|---|
limit | Number of results (1-100, default: 10) |
starting_after | Cursor for pagination |
ending_before | Cursor for reverse pagination |
email | Filter by email |
created | Filter by creation date |
Response:
{
"object": "list",
"data": [
{
"id": "cus_TxKtN8Irvzx9BQ",
"object": "customer",
"email": "customer@example.com",
"name": null,
"balance": 0,
"currency": "usd",
"created": 1770765579,
"metadata": {}
}
],
"has_more": true,
"url": "/v1/customers"
}
GET /stripe/v1/customers/{customer_id}
Example:
maton stripe customer view {customer_id}
POST /stripe/v1/customers
Content-Type: application/x-www-form-urlencoded
email=customer@example.com&name=John%20Doe&metadata[user_id]=123
Example:
maton stripe customer create --email customer@example.com --name 'John Doe' --metadata user_id=123
POST /stripe/v1/customers/{customer_id}
Content-Type: application/x-www-form-urlencoded
name=Jane%20Doe&email=jane@example.com
Example:
maton stripe customer update {customer_id} --name 'Jane Doe' --email jane@example.com
DELETE /stripe/v1/customers/{customer_id}
Example:
maton stripe customer delete {customer_id}
GET /stripe/v1/products?limit=10
Example:
maton stripe product list -L 10
Query Parameters:
| Parameter | Description |
|---|---|
active | Filter by active status |
type | Filter by type: good or service |
Response:
{
"object": "list",
"data": [
{
"id": "prod_TthCLBwTIXuzEw",
"object": "product",
"active": true,
"name": "Premium Plan",
"description": "Premium subscription",
"type": "service",
"created": 1769926024,
"metadata": {}
}
],
"has_more": true
}
GET /stripe/v1/products/{product_id}
Example:
maton stripe product view {product_id}
POST /stripe/v1/products
Content-Type: application/x-www-form-urlencoded
name=Premium%20Plan&description=Premium%20subscription
Example:
maton stripe product create --name 'Premium Plan' --description 'Premium subscription'
POST /stripe/v1/products/{product_id}
Content-Type: application/x-www-form-urlencoded
name=Updated%20Plan&active=true
Example:
maton stripe product update {product_id} --name 'Updated Plan' --active true
DELETE /stripe/v1/products/{product_id}
Example:
maton stripe product delete {product_id}
GET /stripe/v1/prices?limit=10
Example:
maton stripe price list -L 10
Query Parameters:
| Parameter | Description |
|---|---|
active | Filter by active status |
product | Filter by product ID |
type | Filter: one_time or recurring |
currency | Filter by currency |
Response:
{
"object": "list",
"data": [
{
"id": "price_1SvtoVDfFKJhF88gKJv2eSmO",
"object": "price",
"active": true,
"currency": "usd",
"product": "prod_TthCLBwTIXuzEw",
"unit_amount": 1999,
"recurring": {
"interval": "month",
"interval_count": 1
},
"type": "recurring"
}
],
"has_more": true
}
GET /stripe/v1/prices/{price_id}
Example:
maton stripe price view {price_id}
POST /stripe/v1/prices
Content-Type: application/x-www-form-urlencoded
product=prod_XXX&unit_amount=1999¤cy=usd&recurring[interval]=month
Example:
maton stripe price create --product prod_XXX --unit-amount 1999 --currency usd --recurring-interval month
POST /stripe/v1/prices/{price_id}
Content-Type: application/x-www-form-urlencoded
active=false
Example:
maton stripe price update {price_id} --active false
GET /stripe/v1/subscriptions?limit=10
Example:
maton stripe subscription list -L 10
Query Parameters:
| Parameter | Description |
|---|---|
customer | Filter by customer ID |
price | Filter by price ID |
status | Filter: active, canceled, past_due, etc. |
Response:
{
"object": "list",
"data": [
{
"id": "sub_1SzQDXDfFKJhF88gf72x6tDh",
"object": "subscription",
"customer": "cus_TxKtN8Irvzx9BQ",
"status": "active",
"current_period_start": 1770765579,
"current_period_end": 1773184779,
"items": {
"data": [
{
"id": "si_TxKtFWxlUW50cR",
"price": {
"id": "price_1RGbXsDfFKJhF88gMIShAq9m",
"unit_amount": 0
},
"quantity": 1
}
]
}
}
],
"has_more": true
}
GET /stripe/v1/subscriptions/{subscription_id}
Example:
maton stripe subscription view {subscription_id}
POST /stripe/v1/subscriptions
Content-Type: application/x-www-form-urlencoded
customer=cus_XXX&items[0][price]=price_XXX
Example:
maton stripe subscription create --customer cus_XXX --price price_XXX
POST /stripe/v1/subscriptions/{subscription_id}
Content-Type: application/x-www-form-urlencoded
items[0][id]=si_XXX&items[0][price]=price_YYY
Example:
maton stripe subscription update {subscription_id} --items 'id=si_XXX,price=price_YYY'
DELETE /stripe/v1/subscriptions/{subscription_id}
Example:
maton stripe subscription cancel {subscription_id}
GET /stripe/v1/invoices?limit=10
Example:
maton stripe invoice list -L 10
Query Parameters:
| Parameter | Description |
|---|---|
customer | Filter by customer ID |
subscription | Filter by subscription ID |
status | Filter: draft, open, paid, void, uncollectible |
Response:
{
"object": "list",
"data": [
{
"id": "in_1SzQDXDfFKJhF88g3nh4u2GS",
"object": "invoice",
"customer": "cus_TxKtN8Irvzx9BQ",
"amount_due": 0,
"amount_paid": 0,
"currency": "usd",
"status": "paid",
"subscription": "sub_1SzQDXDfFKJhF88gf72x6tDh",
"hosted_invoice_url": "https://invoice.stripe.com/...",
"invoice_pdf": "https://pay.stripe.com/invoice/.../pdf"
}
],
"has_more": true
}
GET /stripe/v1/invoices/{invoice_id}
Example:
maton stripe invoice view {invoice_id}
POST /stripe/v1/invoices
Content-Type: application/x-www-form-urlencoded
customer=cus_XXX
Example:
maton stripe invoice create --customer cus_XXX
POST /stripe/v1/invoices/{invoice_id}/finalize
Example:
maton stripe invoice finalize {invoice_id}
POST /stripe/v1/invoices/{invoice_id}/pay
Example:
maton stripe invoice pay {invoice_id}
POST /stripe/v1/invoices/{invoice_id}/void
Example:
maton stripe invoice void {invoice_id}
GET /stripe/v1/charges?limit=10
Example:
maton stripe charge list -L 10
Query Parameters:
| Parameter | Description |
|---|---|
customer | Filter by customer ID |
payment_intent | Filter by payment intent |
Response:
{
"object": "list",
"data": [
{
"id": "ch_3SyXBvDfFKJhF88g1MHtT45f",
"object": "charge",
"amount": 5000,
"currency": "usd",
"customer": "cus_TuZ7GIjeZQOQ2m",
"paid": true,
"status": "succeeded",
"payment_method_details": {
"card": {
"brand": "mastercard",
"last4": "0833"
},
"type": "card"
}
}
],
"has_more": true
}
GET /stripe/v1/charges/{charge_id}
Example:
maton stripe charge view {charge_id}
POST /stripe/v1/charges
Content-Type: application/x-www-form-urlencoded
amount=2000¤cy=usd&source=tok_XXX
Example:
maton stripe charge create --amount 2000 --currency usd --source tok_XXX
GET /stripe/v1/payment_intents?limit=10
Example:
maton stripe payment list -L 10
Response:
{
"object": "list",
"data": [
{
"id": "pi_3SyXBvDfFKJhF88g17PeHdpE",
"object": "payment_intent",
"amount": 5000,
"currency": "usd",
"customer": "cus_TuZ7GIjeZQOQ2m",
"status": "succeeded",
"payment_method": "pm_1SyXBpDfFKJhF88gmP3IjC8C"
}
],
"has_more": true
}
GET /stripe/v1/payment_intents/{payment_intent_id}
Example:
maton stripe payment view {payment_intent_id}
POST /stripe/v1/payment_intents
Content-Type: application/x-www-form-urlencoded
amount=2000¤cy=usd&customer=cus_XXX&payment_method_types[]=card
Example:
maton stripe payment create --amount 2000 --currency usd --customer cus_XXX --payment-method-types card
POST /stripe/v1/payment_intents/{payment_intent_id}/confirm
Example:
maton stripe payment confirm {payment_intent_id}
POST /stripe/v1/payment_intents/{payment_intent_id}/cancel
Example:
maton stripe payment cancel {payment_intent_id}
GET /stripe/v1/payment_methods?customer=cus_XXX&type=card
Example:
maton stripe payment-method list --customer cus_XXX --type card
GET /stripe/v1/payment_methods/{payment_method_id}
Example:
maton stripe payment-method view {payment_method_id}
POST /stripe/v1/payment_methods/{payment_method_id}/attach
Content-Type: application/x-www-form-urlencoded
customer=cus_XXX
Example:
maton stripe payment-method attach {payment_method_id} --customer cus_XXX
POST /stripe/v1/payment_methods/{payment_method_id}/detach
Example:
maton stripe payment-method detach {payment_method_id}
GET /stripe/v1/coupons?limit=10
Example:
maton stripe coupon list -L 10
GET /stripe/v1/coupons/{coupon_id}
Example:
maton stripe coupon view {coupon_id}
POST /stripe/v1/coupons
Content-Type: application/x-www-form-urlencoded
percent_off=25&duration=once
Example:
maton stripe coupon create --percent-off 25 --duration once
DELETE /stripe/v1/coupons/{coupon_id}
Example:
maton stripe coupon delete {coupon_id}
GET /stripe/v1/refunds?limit=10
Example:
maton stripe refund list -L 10
GET /stripe/v1/refunds/{refund_id}
Example:
maton stripe refund view {refund_id}
POST /stripe/v1/refunds
Content-Type: application/x-www-form-urlencoded
charge=ch_XXX&amount=1000
Example:
maton stripe refund create --charge ch_XXX --amount 1000
Stripe uses cursor-based pagination with starting_after and ending_before:
GET /stripe/v1/customers?limit=10&starting_after=cus_XXX
Example:
maton stripe customer list -L 10 --starting-after cus_XXX
Response includes:
{
"object": "list",
"data": [...],
"has_more": true,
"url": "/v1/customers"
}
Use the last item's ID as starting_after for the next page.
const response = await fetch(
'https://api.maton.ai/stripe/v1/customers?limit=10',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
const data = await response.json();
console.log(data.data);
import os
import requests
response = requests.get(
'https://api.maton.ai/stripe/v1/customers',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
params={'limit': 10}
)
data = response.json()
for customer in data['data']:
print(f"{customer['id']}: {customer['email']}")
application/x-www-form-urlencoded for POST requests (not JSON)cus_ (customers), prod_ (products), price_ (prices), sub_ (subscriptions), in_ (invoices), ch_ (charges), pi_ (payment intents)curl -g when URLs contain brackets to disable glob parsingjq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments| Status | Meaning |
|---|---|
| 400 | Bad request or invalid parameters |
| 401 | Invalid or missing Maton API key |
| 402 | Card declined or payment required |
| 404 | Resource not found |
| 429 | Rate limited |
| 500 | Stripe internal error |
MATON_API_KEY environment variable is set:echo $MATON_API_KEY
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
stripe. For example:https://api.maton.ai/stripe/v1/customershttps://api.maton.ai/v1/customers