Stripe
Stripe 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 subs
Stripe 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 subs
Real data. Real impact.
Emerging
Developers
Per week
Open source
Skills give you superpowers. Install in 30 seconds.
Access 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 |
|---|---|
| Number of results (1-100, default: 10) |
| Cursor for pagination |
| Cursor for reverse pagination |
| Filter by email |
| 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-urlencodedemail=customer@example.com&name=John%20Doe&metadata[user_id]=123
POST /stripe/v1/customers/{customer_id} Content-Type: application/x-www-form-urlencodedname=Jane%20Doe&email=jane@example.com
DELETE /stripe/v1/customers/{customer_id}
GET /stripe/v1/products?limit=10
Query Parameters:
| Parameter | Description |
|---|---|
| Filter by active status |
| Filter by type: or |
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-urlencodedname=Premium%20Plan&description=Premium%20subscription&type=service
POST /stripe/v1/products/{product_id} Content-Type: application/x-www-form-urlencodedname=Updated%20Plan&active=true
DELETE /stripe/v1/products/{product_id}
GET /stripe/v1/prices?limit=10
Query Parameters:
| Parameter | Description |
|---|---|
| Filter by active status |
| Filter by product ID |
| Filter: or |
| 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-urlencodedproduct=prod_XXX&unit_amount=1999¤cy=usd&recurring[interval]=month
POST /stripe/v1/prices/{price_id} Content-Type: application/x-www-form-urlencodedactive=false
GET /stripe/v1/subscriptions?limit=10
Query Parameters:
| Parameter | Description |
|---|---|
| Filter by customer ID |
| Filter by price ID |
| Filter: , , , 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-urlencodedcustomer=cus_XXX&items[0][price]=price_XXX
POST /stripe/v1/subscriptions/{subscription_id} Content-Type: application/x-www-form-urlencodeditems[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 |
|---|---|
| Filter by customer ID |
| Filter by subscription ID |
| Filter: , , , , |
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-urlencodedcustomer=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 |
|---|---|
| Filter by customer ID |
| 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-urlencodedamount=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-urlencodedamount=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-urlencodedcustomer=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-urlencodedpercent_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-urlencodedcharge=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 requestsresponse = 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/customersNo automatic installation available. Please visit the source repository for installation instructions.
View Installation Instructions1,500+ AI skills, agents & workflows. Install in 30 seconds. Part of the Torly.ai family.
© 2026 Torly.ai. All rights reserved.