[{"data":1,"prerenderedAt":1504},["ShallowReactive",2],{"navigation_docs":3,"-packages-fluent-python-testing":465,"-packages-fluent-python-testing-surround":1499},[4,8,62,115,450],{"title":5,"path":6,"stem":7},"Introduction","\u002Fintroduction","0.introduction",{"title":9,"path":10,"stem":11,"children":12,"page":61},"Guides","\u002Fguides","1.guides",[13,17,21,25,29,33,37,41,45,49,53,57],{"title":14,"path":15,"stem":16},"Quickstart","\u002Fguides\u002Fquickstart","1.guides\u002F1.quickstart",{"title":18,"path":19,"stem":20},"Payouts & Settlement","\u002Fguides\u002Fpayouts","1.guides\u002F10.payouts",{"title":22,"path":23,"stem":24},"Customer Emails","\u002Fguides\u002Fcustomer-emails","1.guides\u002F11.customer-emails",{"title":26,"path":27,"stem":28},"Build your own integration","\u002Fguides\u002Fbuild-your-own-integration","1.guides\u002F2.build-your-own-integration",{"title":30,"path":31,"stem":32},"Selling Workflow","\u002Fguides\u002Fselling-workflow","1.guides\u002F2.selling-workflow",{"title":34,"path":35,"stem":36},"Vatly SDKs","\u002Fguides\u002Fsdks","1.guides\u002F3.sdks",{"title":38,"path":39,"stem":40},"Authentication","\u002Fguides\u002Fauthentication","1.guides\u002F4.authentication",{"title":42,"path":43,"stem":44},"Pagination","\u002Fguides\u002Fpagination","1.guides\u002F5.pagination",{"title":46,"path":47,"stem":48},"Errors","\u002Fguides\u002Ferrors","1.guides\u002F6.errors",{"title":50,"path":51,"stem":52},"Webhooks","\u002Fguides\u002Fwebhooks","1.guides\u002F7.webhooks",{"title":54,"path":55,"stem":56},"Idempotency","\u002Fguides\u002Fidempotency","1.guides\u002F8.idempotency",{"title":58,"path":59,"stem":60},"Testing","\u002Fguides\u002Ftesting","1.guides\u002F9.testing",false,{"title":63,"path":64,"stem":65,"children":66,"page":61},"Api Reference","\u002Fapi-reference","2.api-reference",[67,71,75,79,83,87,91,95,99,103,107,111],{"title":68,"path":69,"stem":70},"Customers","\u002Fapi-reference\u002Fcustomers","2.api-reference\u002F1.customers",{"title":72,"path":73,"stem":74},"Webhook Endpoints","\u002Fapi-reference\u002Fwebhook-endpoints","2.api-reference\u002F10.webhook-endpoints",{"title":76,"path":77,"stem":78},"Test helpers","\u002Fapi-reference\u002Ftest-helpers","2.api-reference\u002F11.test-helpers",{"title":80,"path":81,"stem":82},"Checkouts","\u002Fapi-reference\u002Fcheckouts","2.api-reference\u002F2.checkouts",{"title":84,"path":85,"stem":86},"One-off Products","\u002Fapi-reference\u002Fone-off-products","2.api-reference\u002F3.one-off-products",{"title":88,"path":89,"stem":90},"Subscriptions","\u002Fapi-reference\u002Fsubscriptions","2.api-reference\u002F4.subscriptions",{"title":92,"path":93,"stem":94},"Subscription Plans","\u002Fapi-reference\u002Fsubscription-plans","2.api-reference\u002F5.subscription-plans",{"title":96,"path":97,"stem":98},"Orders","\u002Fapi-reference\u002Forders","2.api-reference\u002F6.orders",{"title":100,"path":101,"stem":102},"Order Refunds","\u002Fapi-reference\u002Frefunds","2.api-reference\u002F7.refunds",{"title":104,"path":105,"stem":106},"Refunds","\u002Fapi-reference\u002Fglobal-refunds","2.api-reference\u002F8.global-refunds",{"title":108,"path":109,"stem":110},"Chargebacks","\u002Fapi-reference\u002Fchargebacks","2.api-reference\u002F9.chargebacks",{"title":112,"path":113,"stem":114},"Webhook Events","\u002Fapi-reference\u002Fwebhook-events","2.api-reference\u002F99.webhook-events",{"title":116,"path":117,"stem":118,"children":119},"Packages","\u002Fpackages","3.packages",[120,122,164,210,244,283,318,366,408],{"title":116,"path":117,"stem":121},"3.packages\u002Findex",{"title":123,"path":124,"stem":125,"children":126,"page":61},"PHP SDK","\u002Fpackages\u002Fphp","3.packages\u002F1.php",[127,131,134,137,140,144,147,151,154,157,160],{"title":128,"path":129,"stem":130},"Getting started","\u002Fpackages\u002Fphp\u002Freadme","3.packages\u002F1.php\u002F00.readme",{"title":68,"path":132,"stem":133},"\u002Fpackages\u002Fphp\u002Fcustomers","3.packages\u002F1.php\u002F02.customers",{"title":80,"path":135,"stem":136},"\u002Fpackages\u002Fphp\u002Fcheckouts","3.packages\u002F1.php\u002F03.checkouts",{"title":88,"path":138,"stem":139},"\u002Fpackages\u002Fphp\u002Fsubscriptions","3.packages\u002F1.php\u002F04.subscriptions",{"title":141,"path":142,"stem":143},"Subscription plans","\u002Fpackages\u002Fphp\u002Fsubscriptionplans","3.packages\u002F1.php\u002F05.subscriptionplans",{"title":96,"path":145,"stem":146},"\u002Fpackages\u002Fphp\u002Forders","3.packages\u002F1.php\u002F06.orders",{"title":148,"path":149,"stem":150},"One-off products","\u002Fpackages\u002Fphp\u002Foneoffproducts","3.packages\u002F1.php\u002F07.oneoffproducts",{"title":104,"path":152,"stem":153},"\u002Fpackages\u002Fphp\u002Frefunds","3.packages\u002F1.php\u002F08.refunds",{"title":108,"path":155,"stem":156},"\u002Fpackages\u002Fphp\u002Fchargebacks","3.packages\u002F1.php\u002F09.chargebacks",{"title":50,"path":158,"stem":159},"\u002Fpackages\u002Fphp\u002Fwebhooks","3.packages\u002F1.php\u002F10.webhooks",{"title":161,"path":162,"stem":163},"Webhook URLs","\u002Fpackages\u002Fphp\u002Fwebhookendpoints","3.packages\u002F1.php\u002F11.webhookendpoints",{"title":165,"path":166,"stem":167,"children":168,"page":61},"PHP Fluent","\u002Fpackages\u002Ffluent-php","3.packages\u002F2.fluent-php",[169,172,176,180,183,186,189,192,196,199,203,207],{"title":128,"path":170,"stem":171},"\u002Fpackages\u002Ffluent-php\u002Freadme","3.packages\u002F2.fluent-php\u002F00.readme",{"title":173,"path":174,"stem":175},"Configuration","\u002Fpackages\u002Ffluent-php\u002Fconfiguration","3.packages\u002F2.fluent-php\u002F01.configuration",{"title":177,"path":178,"stem":179},"Core concepts","\u002Fpackages\u002Ffluent-php\u002Fcoreconcepts","3.packages\u002F2.fluent-php\u002F02.coreconcepts",{"title":68,"path":181,"stem":182},"\u002Fpackages\u002Ffluent-php\u002Fcustomers","3.packages\u002F2.fluent-php\u002F03.customers",{"title":80,"path":184,"stem":185},"\u002Fpackages\u002Ffluent-php\u002Fcheckouts","3.packages\u002F2.fluent-php\u002F04.checkouts",{"title":88,"path":187,"stem":188},"\u002Fpackages\u002Ffluent-php\u002Fsubscriptions","3.packages\u002F2.fluent-php\u002F05.subscriptions",{"title":96,"path":190,"stem":191},"\u002Fpackages\u002Ffluent-php\u002Forders","3.packages\u002F2.fluent-php\u002F06.orders",{"title":193,"path":194,"stem":195},"Customer portal","\u002Fpackages\u002Ffluent-php\u002Fcustomerportal","3.packages\u002F2.fluent-php\u002F07.customerportal",{"title":50,"path":197,"stem":198},"\u002Fpackages\u002Ffluent-php\u002Fwebhooks","3.packages\u002F2.fluent-php\u002F08.webhooks",{"title":200,"path":201,"stem":202},"Webhook event flow","\u002Fpackages\u002Ffluent-php\u002Fwebhook-flow","3.packages\u002F2.fluent-php\u002F09.webhook-flow",{"title":204,"path":205,"stem":206},"Existing tables","\u002Fpackages\u002Ffluent-php\u002Fhost-owns-its-tables","3.packages\u002F2.fluent-php\u002F10.host-owns-its-tables",{"title":58,"path":208,"stem":209},"\u002Fpackages\u002Ffluent-php\u002Ftesting","3.packages\u002F2.fluent-php\u002F11.testing",{"title":211,"path":212,"stem":213,"children":214,"page":61},"Laravel","\u002Fpackages\u002Flaravel","3.packages\u002F3.laravel",[215,218,221,224,227,230,233,236,240],{"title":128,"path":216,"stem":217},"\u002Fpackages\u002Flaravel\u002Freadme","3.packages\u002F3.laravel\u002F00.readme",{"title":173,"path":219,"stem":220},"\u002Fpackages\u002Flaravel\u002Fconfiguration","3.packages\u002F3.laravel\u002F01.configuration",{"title":68,"path":222,"stem":223},"\u002Fpackages\u002Flaravel\u002Fcustomers","3.packages\u002F3.laravel\u002F02.customers",{"title":80,"path":225,"stem":226},"\u002Fpackages\u002Flaravel\u002Fcheckouts","3.packages\u002F3.laravel\u002F03.checkouts",{"title":88,"path":228,"stem":229},"\u002Fpackages\u002Flaravel\u002Fsubscriptions","3.packages\u002F3.laravel\u002F04.subscriptions",{"title":96,"path":231,"stem":232},"\u002Fpackages\u002Flaravel\u002Forders","3.packages\u002F3.laravel\u002F05.orders",{"title":50,"path":234,"stem":235},"\u002Fpackages\u002Flaravel\u002Fwebhooks","3.packages\u002F3.laravel\u002F06.webhooks",{"title":237,"path":238,"stem":239},"Comparison","\u002Fpackages\u002Flaravel\u002Fcomparison","3.packages\u002F3.laravel\u002F07.comparison",{"title":241,"path":242,"stem":243},"Migrating from Cashier","\u002Fpackages\u002Flaravel\u002Fmigrating-to-vatly","3.packages\u002F3.laravel\u002F08.migrating-to-vatly",{"title":245,"path":246,"stem":247,"children":248,"page":61},"JavaScript SDK","\u002Fpackages\u002Fjavascript","3.packages\u002F4.javascript",[249,252,255,258,261,264,267,270,273,276,279],{"title":128,"path":250,"stem":251},"\u002Fpackages\u002Fjavascript\u002Freadme","3.packages\u002F4.javascript\u002F00.readme",{"title":68,"path":253,"stem":254},"\u002Fpackages\u002Fjavascript\u002Fcustomers","3.packages\u002F4.javascript\u002F02.customers",{"title":80,"path":256,"stem":257},"\u002Fpackages\u002Fjavascript\u002Fcheckouts","3.packages\u002F4.javascript\u002F03.checkouts",{"title":88,"path":259,"stem":260},"\u002Fpackages\u002Fjavascript\u002Fsubscriptions","3.packages\u002F4.javascript\u002F04.subscriptions",{"title":141,"path":262,"stem":263},"\u002Fpackages\u002Fjavascript\u002Fsubscriptionplans","3.packages\u002F4.javascript\u002F05.subscriptionplans",{"title":96,"path":265,"stem":266},"\u002Fpackages\u002Fjavascript\u002Forders","3.packages\u002F4.javascript\u002F06.orders",{"title":148,"path":268,"stem":269},"\u002Fpackages\u002Fjavascript\u002Foneoffproducts","3.packages\u002F4.javascript\u002F07.oneoffproducts",{"title":104,"path":271,"stem":272},"\u002Fpackages\u002Fjavascript\u002Frefunds","3.packages\u002F4.javascript\u002F08.refunds",{"title":108,"path":274,"stem":275},"\u002Fpackages\u002Fjavascript\u002Fchargebacks","3.packages\u002F4.javascript\u002F09.chargebacks",{"title":50,"path":277,"stem":278},"\u002Fpackages\u002Fjavascript\u002Fwebhooks","3.packages\u002F4.javascript\u002F10.webhooks",{"title":280,"path":281,"stem":282},"API reference","\u002Fpackages\u002Fjavascript\u002Fapi","3.packages\u002F4.javascript\u002F12.api",{"title":284,"path":285,"stem":286,"children":287,"page":61},"JavaScript Fluent","\u002Fpackages\u002Ffluent-js","3.packages\u002F5.fluent-js",[288,291,294,297,300,303,306,309,312,315],{"title":128,"path":289,"stem":290},"\u002Fpackages\u002Ffluent-js\u002Freadme","3.packages\u002F5.fluent-js\u002F00.readme",{"title":173,"path":292,"stem":293},"\u002Fpackages\u002Ffluent-js\u002Fconfiguration","3.packages\u002F5.fluent-js\u002F01.configuration",{"title":177,"path":295,"stem":296},"\u002Fpackages\u002Ffluent-js\u002Fcoreconcepts","3.packages\u002F5.fluent-js\u002F02.coreconcepts",{"title":68,"path":298,"stem":299},"\u002Fpackages\u002Ffluent-js\u002Fcustomers","3.packages\u002F5.fluent-js\u002F03.customers",{"title":80,"path":301,"stem":302},"\u002Fpackages\u002Ffluent-js\u002Fcheckouts","3.packages\u002F5.fluent-js\u002F04.checkouts",{"title":88,"path":304,"stem":305},"\u002Fpackages\u002Ffluent-js\u002Fsubscriptions","3.packages\u002F5.fluent-js\u002F05.subscriptions",{"title":96,"path":307,"stem":308},"\u002Fpackages\u002Ffluent-js\u002Forders","3.packages\u002F5.fluent-js\u002F06.orders",{"title":193,"path":310,"stem":311},"\u002Fpackages\u002Ffluent-js\u002Fcustomerportal","3.packages\u002F5.fluent-js\u002F07.customerportal",{"title":50,"path":313,"stem":314},"\u002Fpackages\u002Ffluent-js\u002Fwebhooks","3.packages\u002F5.fluent-js\u002F08.webhooks",{"title":58,"path":316,"stem":317},"\u002Fpackages\u002Ffluent-js\u002Ftesting","3.packages\u002F5.fluent-js\u002F11.testing",{"title":319,"path":320,"stem":321,"children":322,"page":61},"Python SDK","\u002Fpackages\u002Fpython","3.packages\u002F6.python",[323,326,329,332,335,338,341,344,347,350,353,356,359,362],{"title":128,"path":324,"stem":325},"\u002Fpackages\u002Fpython\u002Freadme","3.packages\u002F6.python\u002F00.readme",{"title":173,"path":327,"stem":328},"\u002Fpackages\u002Fpython\u002Fconfiguration","3.packages\u002F6.python\u002F01.configuration",{"title":68,"path":330,"stem":331},"\u002Fpackages\u002Fpython\u002Fcustomers","3.packages\u002F6.python\u002F02.customers",{"title":80,"path":333,"stem":334},"\u002Fpackages\u002Fpython\u002Fcheckouts","3.packages\u002F6.python\u002F03.checkouts",{"title":88,"path":336,"stem":337},"\u002Fpackages\u002Fpython\u002Fsubscriptions","3.packages\u002F6.python\u002F04.subscriptions",{"title":141,"path":339,"stem":340},"\u002Fpackages\u002Fpython\u002Fsubscriptionplans","3.packages\u002F6.python\u002F05.subscriptionplans",{"title":96,"path":342,"stem":343},"\u002Fpackages\u002Fpython\u002Forders","3.packages\u002F6.python\u002F06.orders",{"title":148,"path":345,"stem":346},"\u002Fpackages\u002Fpython\u002Foneoffproducts","3.packages\u002F6.python\u002F07.oneoffproducts",{"title":104,"path":348,"stem":349},"\u002Fpackages\u002Fpython\u002Frefunds","3.packages\u002F6.python\u002F08.refunds",{"title":108,"path":351,"stem":352},"\u002Fpackages\u002Fpython\u002Fchargebacks","3.packages\u002F6.python\u002F09.chargebacks",{"title":50,"path":354,"stem":355},"\u002Fpackages\u002Fpython\u002Fwebhooks","3.packages\u002F6.python\u002F10.webhooks",{"title":161,"path":357,"stem":358},"\u002Fpackages\u002Fpython\u002Fwebhookendpoints","3.packages\u002F6.python\u002F11.webhookendpoints",{"title":280,"path":360,"stem":361},"\u002Fpackages\u002Fpython\u002Fapi","3.packages\u002F6.python\u002F12.api",{"title":363,"path":364,"stem":365},"Development","\u002Fpackages\u002Fpython\u002Fdevelopment","3.packages\u002F6.python\u002F13.development",{"title":367,"path":368,"stem":369,"children":370,"page":61},"Python Fluent","\u002Fpackages\u002Ffluent-python","3.packages\u002F7.fluent-python",[371,374,377,380,383,386,389,392,395,398,401,405],{"title":128,"path":372,"stem":373},"\u002Fpackages\u002Ffluent-python\u002Freadme","3.packages\u002F7.fluent-python\u002F00.readme",{"title":173,"path":375,"stem":376},"\u002Fpackages\u002Ffluent-python\u002Fconfiguration","3.packages\u002F7.fluent-python\u002F01.configuration",{"title":177,"path":378,"stem":379},"\u002Fpackages\u002Ffluent-python\u002Fcoreconcepts","3.packages\u002F7.fluent-python\u002F02.coreconcepts",{"title":68,"path":381,"stem":382},"\u002Fpackages\u002Ffluent-python\u002Fcustomers","3.packages\u002F7.fluent-python\u002F03.customers",{"title":80,"path":384,"stem":385},"\u002Fpackages\u002Ffluent-python\u002Fcheckouts","3.packages\u002F7.fluent-python\u002F04.checkouts",{"title":88,"path":387,"stem":388},"\u002Fpackages\u002Ffluent-python\u002Fsubscriptions","3.packages\u002F7.fluent-python\u002F05.subscriptions",{"title":96,"path":390,"stem":391},"\u002Fpackages\u002Ffluent-python\u002Forders","3.packages\u002F7.fluent-python\u002F06.orders",{"title":193,"path":393,"stem":394},"\u002Fpackages\u002Ffluent-python\u002Fcustomerportal","3.packages\u002F7.fluent-python\u002F07.customerportal",{"title":50,"path":396,"stem":397},"\u002Fpackages\u002Ffluent-python\u002Fwebhooks","3.packages\u002F7.fluent-python\u002F08.webhooks",{"title":58,"path":399,"stem":400},"\u002Fpackages\u002Ffluent-python\u002Ftesting","3.packages\u002F7.fluent-python\u002F11.testing",{"title":402,"path":403,"stem":404},"Porting","\u002Fpackages\u002Ffluent-python\u002Fporting","3.packages\u002F7.fluent-python\u002F12.porting",{"title":363,"path":406,"stem":407},"\u002Fpackages\u002Ffluent-python\u002Fdevelopment","3.packages\u002F7.fluent-python\u002F13.development",{"title":409,"path":410,"stem":411,"children":412,"page":61},"Django","\u002Fpackages\u002Fdjango","3.packages\u002F8.django",[413,416,420,423,427,431,434,437,440,444,447],{"title":128,"path":414,"stem":415},"\u002Fpackages\u002Fdjango\u002Freadme","3.packages\u002F8.django\u002F00.readme",{"title":417,"path":418,"stem":419},"Installation","\u002Fpackages\u002Fdjango\u002Finstallation","3.packages\u002F8.django\u002F01.installation",{"title":173,"path":421,"stem":422},"\u002Fpackages\u002Fdjango\u002Fconfiguration","3.packages\u002F8.django\u002F02.configuration",{"title":424,"path":425,"stem":426},"Billable models","\u002Fpackages\u002Fdjango\u002Fbillablemodels","3.packages\u002F8.django\u002F03.billablemodels",{"title":428,"path":429,"stem":430},"Checkout","\u002Fpackages\u002Fdjango\u002Fcheckout","3.packages\u002F8.django\u002F04.checkout",{"title":88,"path":432,"stem":433},"\u002Fpackages\u002Fdjango\u002Fbilling","3.packages\u002F8.django\u002F05.billing",{"title":193,"path":435,"stem":436},"\u002Fpackages\u002Fdjango\u002Fcustomerportal","3.packages\u002F8.django\u002F06.customerportal",{"title":50,"path":438,"stem":439},"\u002Fpackages\u002Fdjango\u002Fwebhooks","3.packages\u002F8.django\u002F07.webhooks",{"title":441,"path":442,"stem":443},"Admin","\u002Fpackages\u002Fdjango\u002Fadmin","3.packages\u002F8.django\u002F08.admin",{"title":58,"path":445,"stem":446},"\u002Fpackages\u002Fdjango\u002Ftesting","3.packages\u002F8.django\u002F09.testing",{"title":363,"path":448,"stem":449},"\u002Fpackages\u002Fdjango\u002Fdevelopment","3.packages\u002F8.django\u002F10.development",{"title":451,"path":452,"stem":453,"children":454},"Integrations","\u002Fintegrations","4.integrations",[455,457,461],{"title":451,"path":452,"stem":456},"4.integrations\u002Findex",{"title":458,"path":459,"stem":460},"Lovable payments with Vatly","\u002Fintegrations\u002Flovable","4.integrations\u002F1.lovable",{"title":462,"path":463,"stem":464},"Bolt payments with Vatly","\u002Fintegrations\u002Fbolt","4.integrations\u002F2.bolt",{"id":466,"title":467,"body":468,"description":1492,"extension":1493,"links":1494,"meta":1495,"navigation":1496,"path":399,"seo":1497,"stem":400,"__hash__":1498},"docs\u002F3.packages\u002F7.fluent-python\u002F11.testing.md","Test without real payments",{"type":469,"value":470,"toc":1490},"minimark",[471,475,1406,1409,1466,1478,1486],[472,473,474],"p",{},"Use httpx's MockTransport with the real published SDK and Fluent. The following\nexample needs no API key or network connection and validates the outgoing cart.",[476,477,482],"pre",{"className":478,"code":479,"language":480,"meta":481,"style":481},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import json\nimport httpx\nfrom vatly import AsyncVatlyClient\nfrom vatly_fluent import Vatly, Wiring\n\n\nasync def example():\n    def respond(request):\n        assert request.method == \"POST\"\n        assert request.url.path == \"\u002Fv1\u002Fcheckouts\"\n        assert json.loads(request.content)[\"products\"] == [\n            {\"id\": \"one_off_product_example\", \"quantity\": 2}\n        ]\n        return httpx.Response(\n            200,\n            json={\n                \"id\": \"checkout_example\",\n                \"resource\": \"checkout\",\n                \"testmode\": True,\n                \"status\": \"created\",\n                \"customerId\": None,\n                \"orderId\": None,\n                \"redirectUrlSuccess\": \"https:\u002F\u002Fapp.example.com\u002Fok\",\n                \"redirectUrlCanceled\": \"https:\u002F\u002Fapp.example.com\u002Fno\",\n                \"billingAddress\": None,\n                \"metadata\": {},\n                \"locale\": None,\n                \"createdAt\": \"2026-01-01T00:00:00Z\",\n                \"expiresAt\": None,\n                \"links\": {\n                    \"self\": {\n                        \"href\": \"https:\u002F\u002Fapi.vatly.com\u002Fv1\u002Fcheckouts\u002Fcheckout_example\",\n                        \"type\": \"application\u002Fjson\",\n                    },\n                    \"checkoutUrl\": {\n                        \"href\": \"https:\u002F\u002Fcheckout.example.com\u002Fexample\",\n                        \"type\": \"text\u002Fhtml\",\n                    },\n                },\n            },\n        )\n\n    async with AsyncVatlyClient(\"test_\" + \"x\" * 20, transport=httpx.MockTransport(respond)) as api:\n        vatly = Vatly(Wiring(api, \"https:\u002F\u002Fapp.example.com\u002Fok\", \"https:\u002F\u002Fapp.example.com\u002Fno\"))\n        checkout = (\n            await vatly.checkout_builder()\n            .with_items(\n                [\n                    {\"id\": \"one_off_product_example\", \"quantity\": 2},\n                ]\n            )\n            .create()\n        )\n        assert checkout.get_url() == \"https:\u002F\u002Fcheckout.example.com\u002Fexample\"\n        return checkout.id\n","python","",[483,484,485,498,506,520,540,547,552,569,588,617,643,684,725,731,748,757,766,787,808,823,844,859,873,894,915,929,944,958,979,993,1008,1023,1045,1066,1072,1086,1106,1126,1131,1137,1143,1149,1154,1224,1263,1274,1291,1302,1308,1343,1349,1355,1365,1370,1394],"code",{"__ignoreMap":481},[486,487,490,494],"span",{"class":488,"line":489},"line",1,[486,491,493],{"class":492},"s7zQu","import",[486,495,497],{"class":496},"sTEyZ"," json\n",[486,499,501,503],{"class":488,"line":500},2,[486,502,493],{"class":492},[486,504,505],{"class":496}," httpx\n",[486,507,509,512,515,517],{"class":488,"line":508},3,[486,510,511],{"class":492},"from",[486,513,514],{"class":496}," vatly ",[486,516,493],{"class":492},[486,518,519],{"class":496}," AsyncVatlyClient\n",[486,521,523,525,528,530,533,537],{"class":488,"line":522},4,[486,524,511],{"class":492},[486,526,527],{"class":496}," vatly_fluent ",[486,529,493],{"class":492},[486,531,532],{"class":496}," Vatly",[486,534,536],{"class":535},"sMK4o",",",[486,538,539],{"class":496}," Wiring\n",[486,541,543],{"class":488,"line":542},5,[486,544,546],{"emptyLinePlaceholder":545},true,"\n",[486,548,550],{"class":488,"line":549},6,[486,551,546],{"emptyLinePlaceholder":545},[486,553,555,559,562,566],{"class":488,"line":554},7,[486,556,558],{"class":557},"spNyl","async",[486,560,561],{"class":557}," def",[486,563,565],{"class":564},"s2Zo4"," example",[486,567,568],{"class":535},"():\n",[486,570,572,575,578,581,585],{"class":488,"line":571},8,[486,573,574],{"class":557},"    def",[486,576,577],{"class":564}," respond",[486,579,580],{"class":535},"(",[486,582,584],{"class":583},"sHdIc","request",[486,586,587],{"class":535},"):\n",[486,589,591,594,597,600,604,607,610,614],{"class":488,"line":590},9,[486,592,593],{"class":492},"        assert",[486,595,596],{"class":496}," request",[486,598,599],{"class":535},".",[486,601,603],{"class":602},"swJcz","method",[486,605,606],{"class":535}," ==",[486,608,609],{"class":535}," \"",[486,611,613],{"class":612},"sfazB","POST",[486,615,616],{"class":535},"\"\n",[486,618,620,622,624,626,629,631,634,636,638,641],{"class":488,"line":619},10,[486,621,593],{"class":492},[486,623,596],{"class":496},[486,625,599],{"class":535},[486,627,628],{"class":602},"url",[486,630,599],{"class":535},[486,632,633],{"class":602},"path",[486,635,606],{"class":535},[486,637,609],{"class":535},[486,639,640],{"class":612},"\u002Fv1\u002Fcheckouts",[486,642,616],{"class":535},[486,644,646,648,651,653,656,658,660,662,665,668,671,674,676,679,681],{"class":488,"line":645},11,[486,647,593],{"class":492},[486,649,650],{"class":496}," json",[486,652,599],{"class":535},[486,654,655],{"class":564},"loads",[486,657,580],{"class":535},[486,659,584],{"class":564},[486,661,599],{"class":535},[486,663,664],{"class":602},"content",[486,666,667],{"class":535},")[",[486,669,670],{"class":535},"\"",[486,672,673],{"class":612},"products",[486,675,670],{"class":535},[486,677,678],{"class":535},"]",[486,680,606],{"class":535},[486,682,683],{"class":535}," [\n",[486,685,687,690,692,695,697,700,702,705,707,709,711,714,716,718,722],{"class":488,"line":686},12,[486,688,689],{"class":535},"            {",[486,691,670],{"class":535},[486,693,694],{"class":612},"id",[486,696,670],{"class":535},[486,698,699],{"class":535},":",[486,701,609],{"class":535},[486,703,704],{"class":612},"one_off_product_example",[486,706,670],{"class":535},[486,708,536],{"class":535},[486,710,609],{"class":535},[486,712,713],{"class":612},"quantity",[486,715,670],{"class":535},[486,717,699],{"class":535},[486,719,721],{"class":720},"sbssI"," 2",[486,723,724],{"class":535},"}\n",[486,726,728],{"class":488,"line":727},13,[486,729,730],{"class":535},"        ]\n",[486,732,734,737,740,742,745],{"class":488,"line":733},14,[486,735,736],{"class":492},"        return",[486,738,739],{"class":496}," httpx",[486,741,599],{"class":535},[486,743,744],{"class":564},"Response",[486,746,747],{"class":535},"(\n",[486,749,751,754],{"class":488,"line":750},15,[486,752,753],{"class":720},"            200",[486,755,756],{"class":535},",\n",[486,758,760,763],{"class":488,"line":759},16,[486,761,762],{"class":583},"            json",[486,764,765],{"class":535},"={\n",[486,767,769,772,774,776,778,780,783,785],{"class":488,"line":768},17,[486,770,771],{"class":535},"                \"",[486,773,694],{"class":612},[486,775,670],{"class":535},[486,777,699],{"class":535},[486,779,609],{"class":535},[486,781,782],{"class":612},"checkout_example",[486,784,670],{"class":535},[486,786,756],{"class":535},[486,788,790,792,795,797,799,801,804,806],{"class":488,"line":789},18,[486,791,771],{"class":535},[486,793,794],{"class":612},"resource",[486,796,670],{"class":535},[486,798,699],{"class":535},[486,800,609],{"class":535},[486,802,803],{"class":612},"checkout",[486,805,670],{"class":535},[486,807,756],{"class":535},[486,809,811,813,816,818,820],{"class":488,"line":810},19,[486,812,771],{"class":535},[486,814,815],{"class":612},"testmode",[486,817,670],{"class":535},[486,819,699],{"class":535},[486,821,822],{"class":535}," True,\n",[486,824,826,828,831,833,835,837,840,842],{"class":488,"line":825},20,[486,827,771],{"class":535},[486,829,830],{"class":612},"status",[486,832,670],{"class":535},[486,834,699],{"class":535},[486,836,609],{"class":535},[486,838,839],{"class":612},"created",[486,841,670],{"class":535},[486,843,756],{"class":535},[486,845,847,849,852,854,856],{"class":488,"line":846},21,[486,848,771],{"class":535},[486,850,851],{"class":612},"customerId",[486,853,670],{"class":535},[486,855,699],{"class":535},[486,857,858],{"class":535}," None,\n",[486,860,862,864,867,869,871],{"class":488,"line":861},22,[486,863,771],{"class":535},[486,865,866],{"class":612},"orderId",[486,868,670],{"class":535},[486,870,699],{"class":535},[486,872,858],{"class":535},[486,874,876,878,881,883,885,887,890,892],{"class":488,"line":875},23,[486,877,771],{"class":535},[486,879,880],{"class":612},"redirectUrlSuccess",[486,882,670],{"class":535},[486,884,699],{"class":535},[486,886,609],{"class":535},[486,888,889],{"class":612},"https:\u002F\u002Fapp.example.com\u002Fok",[486,891,670],{"class":535},[486,893,756],{"class":535},[486,895,897,899,902,904,906,908,911,913],{"class":488,"line":896},24,[486,898,771],{"class":535},[486,900,901],{"class":612},"redirectUrlCanceled",[486,903,670],{"class":535},[486,905,699],{"class":535},[486,907,609],{"class":535},[486,909,910],{"class":612},"https:\u002F\u002Fapp.example.com\u002Fno",[486,912,670],{"class":535},[486,914,756],{"class":535},[486,916,918,920,923,925,927],{"class":488,"line":917},25,[486,919,771],{"class":535},[486,921,922],{"class":612},"billingAddress",[486,924,670],{"class":535},[486,926,699],{"class":535},[486,928,858],{"class":535},[486,930,932,934,937,939,941],{"class":488,"line":931},26,[486,933,771],{"class":535},[486,935,936],{"class":612},"metadata",[486,938,670],{"class":535},[486,940,699],{"class":535},[486,942,943],{"class":535}," {},\n",[486,945,947,949,952,954,956],{"class":488,"line":946},27,[486,948,771],{"class":535},[486,950,951],{"class":612},"locale",[486,953,670],{"class":535},[486,955,699],{"class":535},[486,957,858],{"class":535},[486,959,961,963,966,968,970,972,975,977],{"class":488,"line":960},28,[486,962,771],{"class":535},[486,964,965],{"class":612},"createdAt",[486,967,670],{"class":535},[486,969,699],{"class":535},[486,971,609],{"class":535},[486,973,974],{"class":612},"2026-01-01T00:00:00Z",[486,976,670],{"class":535},[486,978,756],{"class":535},[486,980,982,984,987,989,991],{"class":488,"line":981},29,[486,983,771],{"class":535},[486,985,986],{"class":612},"expiresAt",[486,988,670],{"class":535},[486,990,699],{"class":535},[486,992,858],{"class":535},[486,994,996,998,1001,1003,1005],{"class":488,"line":995},30,[486,997,771],{"class":535},[486,999,1000],{"class":612},"links",[486,1002,670],{"class":535},[486,1004,699],{"class":535},[486,1006,1007],{"class":535}," {\n",[486,1009,1011,1014,1017,1019,1021],{"class":488,"line":1010},31,[486,1012,1013],{"class":535},"                    \"",[486,1015,1016],{"class":612},"self",[486,1018,670],{"class":535},[486,1020,699],{"class":535},[486,1022,1007],{"class":535},[486,1024,1026,1029,1032,1034,1036,1038,1041,1043],{"class":488,"line":1025},32,[486,1027,1028],{"class":535},"                        \"",[486,1030,1031],{"class":612},"href",[486,1033,670],{"class":535},[486,1035,699],{"class":535},[486,1037,609],{"class":535},[486,1039,1040],{"class":612},"https:\u002F\u002Fapi.vatly.com\u002Fv1\u002Fcheckouts\u002Fcheckout_example",[486,1042,670],{"class":535},[486,1044,756],{"class":535},[486,1046,1048,1050,1053,1055,1057,1059,1062,1064],{"class":488,"line":1047},33,[486,1049,1028],{"class":535},[486,1051,1052],{"class":612},"type",[486,1054,670],{"class":535},[486,1056,699],{"class":535},[486,1058,609],{"class":535},[486,1060,1061],{"class":612},"application\u002Fjson",[486,1063,670],{"class":535},[486,1065,756],{"class":535},[486,1067,1069],{"class":488,"line":1068},34,[486,1070,1071],{"class":535},"                    },\n",[486,1073,1075,1077,1080,1082,1084],{"class":488,"line":1074},35,[486,1076,1013],{"class":535},[486,1078,1079],{"class":612},"checkoutUrl",[486,1081,670],{"class":535},[486,1083,699],{"class":535},[486,1085,1007],{"class":535},[486,1087,1089,1091,1093,1095,1097,1099,1102,1104],{"class":488,"line":1088},36,[486,1090,1028],{"class":535},[486,1092,1031],{"class":612},[486,1094,670],{"class":535},[486,1096,699],{"class":535},[486,1098,609],{"class":535},[486,1100,1101],{"class":612},"https:\u002F\u002Fcheckout.example.com\u002Fexample",[486,1103,670],{"class":535},[486,1105,756],{"class":535},[486,1107,1109,1111,1113,1115,1117,1119,1122,1124],{"class":488,"line":1108},37,[486,1110,1028],{"class":535},[486,1112,1052],{"class":612},[486,1114,670],{"class":535},[486,1116,699],{"class":535},[486,1118,609],{"class":535},[486,1120,1121],{"class":612},"text\u002Fhtml",[486,1123,670],{"class":535},[486,1125,756],{"class":535},[486,1127,1129],{"class":488,"line":1128},38,[486,1130,1071],{"class":535},[486,1132,1134],{"class":488,"line":1133},39,[486,1135,1136],{"class":535},"                },\n",[486,1138,1140],{"class":488,"line":1139},40,[486,1141,1142],{"class":535},"            },\n",[486,1144,1146],{"class":488,"line":1145},41,[486,1147,1148],{"class":535},"        )\n",[486,1150,1152],{"class":488,"line":1151},42,[486,1153,546],{"emptyLinePlaceholder":545},[486,1155,1157,1160,1163,1166,1168,1170,1173,1175,1178,1180,1183,1185,1188,1191,1193,1196,1199,1202,1204,1207,1209,1212,1215,1218,1221],{"class":488,"line":1156},43,[486,1158,1159],{"class":492},"    async",[486,1161,1162],{"class":492}," with",[486,1164,1165],{"class":564}," AsyncVatlyClient",[486,1167,580],{"class":535},[486,1169,670],{"class":535},[486,1171,1172],{"class":612},"test_",[486,1174,670],{"class":535},[486,1176,1177],{"class":535}," +",[486,1179,609],{"class":535},[486,1181,1182],{"class":612},"x",[486,1184,670],{"class":535},[486,1186,1187],{"class":535}," *",[486,1189,1190],{"class":720}," 20",[486,1192,536],{"class":535},[486,1194,1195],{"class":583}," transport",[486,1197,1198],{"class":535},"=",[486,1200,1201],{"class":564},"httpx",[486,1203,599],{"class":535},[486,1205,1206],{"class":564},"MockTransport",[486,1208,580],{"class":535},[486,1210,1211],{"class":564},"respond",[486,1213,1214],{"class":535},"))",[486,1216,1217],{"class":492}," as",[486,1219,1220],{"class":496}," api",[486,1222,1223],{"class":535},":\n",[486,1225,1227,1230,1232,1234,1236,1239,1241,1244,1246,1248,1250,1252,1254,1256,1258,1260],{"class":488,"line":1226},44,[486,1228,1229],{"class":496},"        vatly ",[486,1231,1198],{"class":535},[486,1233,532],{"class":564},[486,1235,580],{"class":535},[486,1237,1238],{"class":564},"Wiring",[486,1240,580],{"class":535},[486,1242,1243],{"class":564},"api",[486,1245,536],{"class":535},[486,1247,609],{"class":535},[486,1249,889],{"class":612},[486,1251,670],{"class":535},[486,1253,536],{"class":535},[486,1255,609],{"class":535},[486,1257,910],{"class":612},[486,1259,670],{"class":535},[486,1261,1262],{"class":535},"))\n",[486,1264,1266,1269,1271],{"class":488,"line":1265},45,[486,1267,1268],{"class":496},"        checkout ",[486,1270,1198],{"class":535},[486,1272,1273],{"class":535}," (\n",[486,1275,1277,1280,1283,1285,1288],{"class":488,"line":1276},46,[486,1278,1279],{"class":492},"            await",[486,1281,1282],{"class":496}," vatly",[486,1284,599],{"class":535},[486,1286,1287],{"class":564},"checkout_builder",[486,1289,1290],{"class":535},"()\n",[486,1292,1294,1297,1300],{"class":488,"line":1293},47,[486,1295,1296],{"class":535},"            .",[486,1298,1299],{"class":564},"with_items",[486,1301,747],{"class":535},[486,1303,1305],{"class":488,"line":1304},48,[486,1306,1307],{"class":535},"                [\n",[486,1309,1311,1314,1316,1318,1320,1322,1324,1326,1328,1330,1332,1334,1336,1338,1340],{"class":488,"line":1310},49,[486,1312,1313],{"class":535},"                    {",[486,1315,670],{"class":535},[486,1317,694],{"class":612},[486,1319,670],{"class":535},[486,1321,699],{"class":535},[486,1323,609],{"class":535},[486,1325,704],{"class":612},[486,1327,670],{"class":535},[486,1329,536],{"class":535},[486,1331,609],{"class":535},[486,1333,713],{"class":612},[486,1335,670],{"class":535},[486,1337,699],{"class":535},[486,1339,721],{"class":720},[486,1341,1342],{"class":535},"},\n",[486,1344,1346],{"class":488,"line":1345},50,[486,1347,1348],{"class":535},"                ]\n",[486,1350,1352],{"class":488,"line":1351},51,[486,1353,1354],{"class":535},"            )\n",[486,1356,1358,1360,1363],{"class":488,"line":1357},52,[486,1359,1296],{"class":535},[486,1361,1362],{"class":564},"create",[486,1364,1290],{"class":535},[486,1366,1368],{"class":488,"line":1367},53,[486,1369,1148],{"class":535},[486,1371,1373,1375,1378,1380,1383,1386,1388,1390,1392],{"class":488,"line":1372},54,[486,1374,593],{"class":492},[486,1376,1377],{"class":496}," checkout",[486,1379,599],{"class":535},[486,1381,1382],{"class":564},"get_url",[486,1384,1385],{"class":535},"()",[486,1387,606],{"class":535},[486,1389,609],{"class":535},[486,1391,1101],{"class":612},[486,1393,616],{"class":535},[486,1395,1397,1399,1401,1403],{"class":488,"line":1396},55,[486,1398,736],{"class":492},[486,1400,1377],{"class":496},[486,1402,599],{"class":535},[486,1404,1405],{"class":602},"id\n",[472,1407,1408],{},"For storage tests, exercise duplicate signed deliveries, rollback after a reaction\nfails, conflicting checkout ownership and tenant\u002Fmode isolation. The source\nrepository's SQLite example demonstrates those contracts; production concurrency\nneeds your database's own integration tests.",[1410,1411,1412,1425],"table",{},[1413,1414,1415],"thead",{},[1416,1417,1418,1422],"tr",{},[1419,1420,1421],"th",{},"Test mode helper",[1419,1423,1424],{},"Remote effect",[1426,1427,1428,1439,1453],"tbody",{},[1416,1429,1430,1436],{},[1431,1432,1433],"td",{},[483,1434,1435],{},"advance_renewal",[1431,1437,1438],{},"Fast-forward a subscription renewal",[1416,1440,1441,1450],{},[1431,1442,1443,1446,1447],{},[483,1444,1445],{},"force_renewal_paid",", ",[483,1448,1449],{},"force_renewal_failed",[1431,1451,1452],{},"Simulate renewal outcome",[1416,1454,1455,1463],{},[1431,1456,1457,1446,1460],{},[483,1458,1459],{},"force_order_payment_paid",[483,1461,1462],{},"force_order_payment_failed",[1431,1464,1465],{},"Simulate payment outcome",[472,1467,1468,1469,1472,1473,1477],{},"These helpers live under ",[483,1470,1471],{},"vatly.test_helpers()"," and ",[1474,1475,1476],"strong",{},"mutate"," the test account.\nThey are not mocks. Use only with an intentional test key; never call them in\nordinary unit tests or setup. The offline example above creates no Vatly data.",[472,1479,1480],{},[1481,1482,280],"a",{"href":1483,"rel":1484},"https:\u002F\u002Fdocs.vatly.com\u002Fapi-reference",[1485],"nofollow",[1487,1488,1489],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":481,"searchDepth":500,"depth":500,"links":1491},[],"Use httpx's MockTransport with the real published SDK and Fluent.","md",null,{},{"title":58},{"title":467,"description":1492},"nOTNvvW6ceNPbZod2w_EnA7nsmc1Gj7Q7k3t68-TPuU",[1500,1502],{"title":50,"path":396,"stem":397,"description":1501,"children":-1},"Fluent verifies a delivery, updates local snapshots and dispatches events through your storage driver.",{"title":402,"path":403,"stem":404,"description":1503,"children":-1},"Python Fluent keeps the same billing concepts, with snake_case methods and async I\u002FO.",1794594933455]