stripe-apiStripe API integration with managed OAuth. Manage customers, subscriptions, invoices, products, prices, and payments. Use this skill when users want to process payments, manage billing, or handle subscriptions with Stripe. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). Requires network access and valid Maton API key.
Install via ClawdBot CLI:
clawdbot install byungkyu/stripe-apiAccess the Stripe API with managed OAuth authentication. Manage customers, subscriptions, invoices, products, prices, and process payments.
# List customers
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.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://gateway.maton.ai/stripe/{native-api-path}
Replace {native-api-path} with the actual Stripe API endpoint path. The gateway proxies requests to api.stripe.com and automatically injects your OAuth token.
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Manage your Stripe OAuth connections at https://ctrl.maton.ai.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.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
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'stripe'}).encode()
req = urllib.request.Request('https://ctrl.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://ctrl.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": "c3c82a73-4c86-4c73-8ebd-1f325212fde6",
"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://ctrl.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://gateway.maton.ai/stripe/v1/customers')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', 'c3c82a73-4c86-4c73-8ebd-1f325212fde6')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If omitted, the gateway uses the default (oldest) active connection.
All Stripe API endpoints follow this pattern:
/stripe/v1/{resource}
GET /stripe/v1/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
GET /stripe/v1/customers?limit=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}
POST /stripe/v1/customers
Content-Type: application/x-www-form-urlencoded
email=customer@example.com&name=John%20Doe&metadata[user_id]=123
POST /stripe/v1/customers/{customer_id}
Content-Type: application/x-www-form-urlencoded
name=Jane%20Doe&email=jane@example.com
DELETE /stripe/v1/customers/{customer_id}
GET /stripe/v1/products?limit=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}
POST /stripe/v1/products
Content-Type: application/x-www-form-urlencoded
name=Premium%20Plan&description=Premium%20subscription&type=service
POST /stripe/v1/products/{product_id}
Content-Type: application/x-www-form-urlencoded
name=Updated%20Plan&active=true
DELETE /stripe/v1/products/{product_id}
GET /stripe/v1/prices?limit=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}
POST /stripe/v1/prices
Content-Type: application/x-www-form-urlencoded
product=prod_XXX&unit_amount=1999¤cy=usd&recurring[interval]=month
POST /stripe/v1/prices/{price_id}
Content-Type: application/x-www-form-urlencoded
active=false
GET /stripe/v1/subscriptions?limit=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}
POST /stripe/v1/subscriptions
Content-Type: application/x-www-form-urlencoded
customer=cus_XXX&items[0][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
DELETE /stripe/v1/subscriptions/{subscription_id}
GET /stripe/v1/invoices?limit=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}
POST /stripe/v1/invoices
Content-Type: application/x-www-form-urlencoded
customer=cus_XXX
POST /stripe/v1/invoices/{invoice_id}/finalize
POST /stripe/v1/invoices/{invoice_id}/pay
POST /stripe/v1/invoices/{invoice_id}/void
GET /stripe/v1/charges?limit=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}
POST /stripe/v1/charges
Content-Type: application/x-www-form-urlencoded
amount=2000¤cy=usd&source=tok_XXX
GET /stripe/v1/payment_intents?limit=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}
POST /stripe/v1/payment_intents
Content-Type: application/x-www-form-urlencoded
amount=2000¤cy=usd&customer=cus_XXX&payment_method_types[]=card
POST /stripe/v1/payment_intents/{payment_intent_id}/confirm
POST /stripe/v1/payment_intents/{payment_intent_id}/cancel
GET /stripe/v1/payment_methods?customer=cus_XXX&type=card
GET /stripe/v1/payment_methods/{payment_method_id}
POST /stripe/v1/payment_methods/{payment_method_id}/attach
Content-Type: application/x-www-form-urlencoded
customer=cus_XXX
POST /stripe/v1/payment_methods/{payment_method_id}/detach
GET /stripe/v1/coupons?limit=10
GET /stripe/v1/coupons/{coupon_id}
POST /stripe/v1/coupons
Content-Type: application/x-www-form-urlencoded
percent_off=25&duration=once
DELETE /stripe/v1/coupons/{coupon_id}
GET /stripe/v1/refunds?limit=10
GET /stripe/v1/refunds/{refund_id}
POST /stripe/v1/refunds
Content-Type: application/x-www-form-urlencoded
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
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://gateway.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://gateway.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://ctrl.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://gateway.maton.ai/stripe/v1/customershttps://gateway.maton.ai/v1/customersGenerated Mar 1, 2026
A software-as-a-service company uses this skill to automate customer billing, manage recurring subscriptions, and handle upgrades or downgrades. It integrates with their user database to sync customer data and generate invoices, reducing manual effort and ensuring accurate billing cycles.
An online retail store leverages the skill to process payments securely, manage customer payment methods, and handle refunds or disputes. It connects to their shopping cart system to automate checkout flows, improving transaction success rates and reducing fraud risks.
A freelance professional or small agency uses this skill to create and send invoices automatically based on project milestones or hours worked. It tracks payments, sends reminders for overdue invoices, and integrates with accounting software for streamlined financial reporting.
A membership-based platform, such as a gym or online community, employs the skill to manage member subscriptions, process recurring payments, and handle cancellations or renewals. It syncs with member profiles to provide real-time billing status and reduce churn through automated notifications.
A nonprofit organization uses this skill to accept and manage donations, issue receipts for tax purposes, and track donor information. It integrates with their fundraising campaigns to automate payment collection and provide analytics on donation trends.
Businesses charge recurring fees for access to products or services, using this skill to automate billing cycles, manage customer subscriptions, and handle prorations or discounts. It supports scalable revenue streams with minimal manual intervention.
Companies earn revenue per transaction, such as e-commerce sales or service fees, leveraging the skill to process payments securely, handle refunds, and manage customer data. It ensures reliable payment processing and reduces operational costs.
Businesses offer free basic services with paid upgrades, using this skill to manage tiered pricing, process upgrade payments, and track customer conversions. It integrates with user accounts to automate billing for premium features.
💬 Integration Tip
Ensure the MATON_API_KEY is securely stored as an environment variable and test connection management via the control panel before deploying to production.
Query Copilot Money personal finance data (accounts, transactions, net worth, holdings, asset allocation) and refresh bank connections. Use when the user asks about finances, account balances, recent transactions, net worth, investment allocation, or wants to sync/refresh bank data.
QuickBooks API integration with managed OAuth. Manage customers, invoices, payments, bills, and run financial reports. Use this skill when users want to interact with QuickBooks accounting data. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
Advanced financial calculator with future value tables, present value, discount calculations, markup pricing, and compound interest. Use when calculating investment growth, pricing strategies, loan values, discounts, or comparing financial scenarios across different rates and time periods. Includes both CLI and interactive web UI.
Track expenses via natural language, get spending summaries, set budgets
Query and manage personal finances via the official Actual Budget Node.js API. Use for budget queries, transaction imports/exports, account management, categorization, rules, schedules, and bank sync with self-hosted Actual Budget instances.
Track business income and expenses in structured CSV format. Categorize transactions, monitor cash flow, generate P&L summaries, and spot spending trends.