stripe
stripe.
Search Stripe with its own query language. One verb, no `op` — the
setup & usage
crée une clé restreinte dans Stripe (Dashboard → Developers → API keys → « Create restricted key » — voir la doc des clés), puis colle-la dans oto.
rk_…) est préférable à une clé secrète (sk_…) : elle limite ce que la clé peut atteindre même si elle fuite, et Stripe la recommande explicitement pour les agents IApk_…) est refusée : c'est le jeton du navigateur, il ne peut lire ni client ni facturerk_test_… / sk_test_… = mode test, rk_live_… / sk_live_… = mode réel. Les deux mondes sont séparés — un client de test n'existe pas en réel, et inversementdeux champs facultatifs à côté de la clé :
acct_…, Stripe Connect) — si vous le renseignez, toutes les lectures portent sur ce compte et non sur le vôtrestripe_invoice(op="totals", created_after=…, created_before=…) (somme par devise, avec un drapeau complete)stripe_balance(op="transactions", …) — chaque ligne porte ses frais et son net, ce que les factures ne savent passtripe_balance(op="get")stripe_balance(op="payouts")stripe_search(resource="customers", query='email~"acme.com"')stripe_invoice(op="list", customer_id="cus_…")stripe_subscription(op="list", status="all") puis filtrer sur cancel_at_period_end, past_due, unpaid — Stripe n'a pas d'état « en train de partir »stripe_payment(op="get_intent", payment_intent_id="pi_…") et lire last_payment_error ; ou op="get_charge" et lire outcome.seller_messagestripe_customer(op="payment_methods", customer_id="cus_…")stripe_payment(op="list_disputes") — attention à evidence_details.due_by, l'argent est déjà retiré du solde pendant ce tempsstripe_catalog(op="list_prices") puis stripe_checkout(op="create_link", price_id="price_…")stripe_invoice(op="add_item", customer_id="cus_…", amount=20000, currency="eur")stripe_catalog(op="create_coupon", percent_off=20, duration="once", name="LAUNCH20") (rend un coupon_id) puis stripe_catalog(op="create_promotion_code", coupon_id="cp_…", code="LAUNCH20") — le coupon est la RÈGLE de remise, la promotion code est le TEXTE que le client tapestripe_catalog(op="update_promotion_code", promotion_code_id="promo_…", active=false) — les redemptions déjà faites ne sont pas touchées, seuls les usages futurs sont bloquésstripe_catalog(op="list_promotion_codes", active=true)rembourser, résilier un abonnement, finaliser/envoyer/encaisser une facture, virer de l'argent, clore un litige, supprimer un client : aucune de ces opérations n'est atteignable, et pas seulement par choix de configuration — les méthodes correspondantes n'existent pas dans la librairie sous-jacente. faites-les depuis votre dashboard Stripe, où elles sont tracées et confirmées.
ce qui reste possible en écriture est délibérément sans conséquence financière directe : créer/modifier un client, poser une ligne sur une prochaine facture, créer une facture au brouillon, gérer le catalogue produits/prix/coupons/codes promo, créer un lien de paiement (page hébergée par Stripe — aucun numéro de carte ne passe par oto, et personne n'est débité tant qu'un humain n'a pas payé). un coupon/code promo ne fait rien tout seul : il ne s'applique qu'au moment où un client paie via un lien/checkout qui l'accepte, ou qu'on l'attache soi-même à un abonnement depuis le dashboard.
total=0 et zéro ligne, le montant restant en suspens — un « facture créée » parfaitement faux. stripe_invoice(op="create_draft") passe donc pending_items="include" par défaut ; mettez "exclude" si vous voulez vraiment un brouillon vide400 « the product tax code is missing ». correctif → stripe_catalog(op="update_product", product_id=…, tax_code="txcd_10000000") (services génériques), puis recréer le lienop="update_price", active=false) ; update_price refuse explicitement un unit_amount2026-07-29.dahlia, la version par défaut d'un compte neuf) : Stripe a retiré le champ à plat coupon au profit d'un objet promotion imbriqué. C'est géré en interne (coupon_id reste le paramètre côté stripe_catalog), rien à changer côté usage — mais si vous lisez la réponse brute d'un code promo, le coupon appliqué est sous promotion.coupon, plus sous couponop="totals", pas une addition à la mainop="totals" balaie jusqu'à 2 000 factures et le dit (complete: false) au-delà, au lieu de rendre une somme partielle qui passerait pour le chiffre d'affairesstripe_search) ne couvre que sept ressources et est en cohérence à terme : un objet créé à l'instant peut n'apparaître qu'au bout d'une minutestripe_event ne remonte que 30 jours (rétention Stripe) — pour un trimestre, passer par les factures et les paiementsoutils
utilisation
claude plugin marketplace add otomata-tech/oto-plugin — mcp + skill configurés.pipx install oto-cli puis oto stripe …