[{"data":1,"prerenderedAt":924},["ShallowReactive",2],{"navigation_docs":3,"-packages-python-development":465,"-packages-python-development-surround":919},[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":912,"extension":913,"links":914,"meta":915,"navigation":916,"path":364,"seo":917,"stem":365,"__hash__":918},"docs\u002F3.packages\u002F6.python\u002F13.development.md","Development and release",{"type":469,"value":470,"toc":901},"minimark",[471,476,480,498,501,505,541,544,548,594,598,639,646,650,665,681,688,707,712,756,759,767,770,774,785,804,808,825,875,882,888,897],[472,473,475],"h2",{"id":474},"set-up-the-repository","Set up the repository",[477,478,479],"p",{},"Run commands from the repository root. On Linux or in an Amp orb:",[481,482,487],"pre",{"className":483,"code":484,"language":485,"meta":486,"style":486},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight",".agents\u002Fsetup\n","bash","",[488,489,490],"code",{"__ignoreMap":486},[491,492,495],"span",{"class":493,"line":494},"line",1,[491,496,484],{"class":497},"sBMFI",[477,499,500],{},"Setup installs uv 0.12.9 and Python 3.12, restores locked dependencies and checks\nimports. It needs no API credentials and makes no Vatly calls.",[472,502,504],{"id":503},"run-tests","Run tests",[481,506,508],{"className":483,"code":507,"language":485,"meta":486,"style":486},"uv run pytest --cov\nuv run python scripts\u002Fgenerate.py --check\n",[488,509,510,525],{"__ignoreMap":486},[491,511,512,515,519,522],{"class":493,"line":494},[491,513,514],{"class":497},"uv",[491,516,518],{"class":517},"sfazB"," run",[491,520,521],{"class":517}," pytest",[491,523,524],{"class":517}," --cov\n",[491,526,528,530,532,535,538],{"class":493,"line":527},2,[491,529,514],{"class":497},[491,531,518],{"class":517},[491,533,534],{"class":517}," python",[491,536,537],{"class":517}," scripts\u002Fgenerate.py",[491,539,540],{"class":517}," --check\n",[477,542,543],{},"Tests use local HTTP and signed webhook fixtures, not a Vatly account. The second\ncommand checks that generated models, resources, clients and the API inventory\nmatch the pinned specification. CI runs these checks on Python 3.10–3.14.",[472,545,547],{"id":546},"check-formatting-and-types","Check formatting and types",[481,549,551],{"className":483,"code":550,"language":485,"meta":486,"style":486},"uv run ruff check .\nuv run ruff format --check .\nuv run mypy\n",[488,552,553,568,584],{"__ignoreMap":486},[491,554,555,557,559,562,565],{"class":493,"line":494},[491,556,514],{"class":497},[491,558,518],{"class":517},[491,560,561],{"class":517}," ruff",[491,563,564],{"class":517}," check",[491,566,567],{"class":517}," .\n",[491,569,570,572,574,576,579,582],{"class":493,"line":527},[491,571,514],{"class":497},[491,573,518],{"class":517},[491,575,561],{"class":517},[491,577,578],{"class":517}," format",[491,580,581],{"class":517}," --check",[491,583,567],{"class":517},[491,585,587,589,591],{"class":493,"line":586},3,[491,588,514],{"class":497},[491,590,518],{"class":517},[491,592,593],{"class":517}," mypy\n",[472,595,597],{"id":596},"build-and-check-the-package","Build and check the package",[481,599,601],{"className":483,"code":600,"language":485,"meta":486,"style":486},"uv build\nuv run twine check dist\u002F*\nuv run python scripts\u002Fcheck_package.py\n",[488,602,603,610,628],{"__ignoreMap":486},[491,604,605,607],{"class":493,"line":494},[491,606,514],{"class":497},[491,608,609],{"class":517}," build\n",[491,611,612,614,616,619,621,624],{"class":493,"line":527},[491,613,514],{"class":497},[491,615,518],{"class":517},[491,617,618],{"class":517}," twine",[491,620,564],{"class":517},[491,622,623],{"class":517}," dist\u002F",[491,625,627],{"class":626},"sTEyZ","*\n",[491,629,630,632,634,636],{"class":493,"line":586},[491,631,514],{"class":497},[491,633,518],{"class":517},[491,635,534],{"class":517},[491,637,638],{"class":517}," scripts\u002Fcheck_package.py\n",[477,640,641,642,645],{},"The last command installs the built wheel in a fresh environment and checks\nimports and ",[488,643,644],{},"py.typed",". These commands build and validate; they do not publish.",[472,647,649],{"id":648},"update-the-api-specification","Update the API specification",[477,651,652,653,656,657,664],{},"Replace ",[488,654,655],{},"openapi.yaml"," deliberately from the ",[658,659,663],"a",{"href":660,"rel":661},"https:\u002F\u002Fdocs.vatly.com\u002Fopenapi.yaml",[662],"nofollow","production specification",",\nupdate its provenance below, then regenerate:",[481,666,668],{"className":483,"code":667,"language":485,"meta":486,"style":486},"uv run python scripts\u002Fgenerate.py\n",[488,669,670],{"__ignoreMap":486},[491,671,672,674,676,678],{"class":493,"line":494},[491,673,514],{"class":497},[491,675,518],{"class":517},[491,677,534],{"class":517},[491,679,680],{"class":517}," scripts\u002Fgenerate.py\n",[477,682,683,684,687],{},"Review the generated diff and rerun the checks above. Do not hand-edit generated\nmodels, resources, clients or ",[488,685,686],{},"docs\u002FAPI.md",".",[477,689,690,691,694,695,698,699,702,703,706],{},"Output models preserve extra fields and keep URLs and emails as strings. The\ngenerator handles two observed API differences: metadata ",[488,692,693],{},"[]"," becomes ",[488,696,697],{},"{}",", and\nresponse product types accept values such as ",[488,700,701],{},"digital_download",". Request validation\nstill follows the pinned schema. Invalid responses raise ",[488,704,705],{},"VatlyApiError","; avoid\nlogging response bodies that may contain personal data.",[708,709,711],"h3",{"id":710},"pinned-source","Pinned source",[713,714,715,728],"table",{},[716,717,718],"thead",{},[719,720,721,725],"tr",{},[722,723,724],"th",{},"Source",[722,726,727],{},"Revision",[729,730,731,744],"tbody",{},[719,732,733,737],{},[734,735,736],"td",{},"Production OpenAPI, retrieved 2026-11-13",[734,738,739],{},[658,740,743],{"href":741,"rel":742},"https:\u002F\u002Fgithub.com\u002Fvatly\u002Fvatly-docs\u002Fblob\u002F66c8205ea886e4cb48e8e3b2e988de3839c6d4d8\u002Fpublic\u002Fopenapi.yaml",[662],"vatly-docs specification",[719,745,746,749],{},[734,747,748],{},"Original JS design reference",[734,750,751],{},[658,752,755],{"href":753,"rel":754},"https:\u002F\u002Fgithub.com\u002Fvatly\u002Fvatly-api-js\u002Fcommit\u002F8b0b920c29f7e7b30bf71b9e379ec0a8a1a22028",[662],"SDK revision",[477,757,758],{},"The checked-in specification is byte-identical to that source and to the bundle\npublished by Vatly's production release. Its SHA-256 is:",[481,760,765],{"className":761,"code":763,"language":764,"meta":486},[762],"language-text","5e648169e101edc8b3e088dc0e28d0f0a293e8a0ed057014c7336057d986def9\n","text",[488,766,763],{"__ignoreMap":486},[477,768,769],{},"The specification's generated-at date is not its retrieval date.",[472,771,773],{"id":772},"documentation-sync","Documentation sync",[477,775,776,777,780,781,784],{},"Edit the flat Markdown guides in ",[488,778,779],{},"docs\u002F","; keep relative links portable. The API\ninventory is generated from ",[488,782,783],{},"scripts\u002Fgenerate.py",", including its description.",[477,786,787,788,791,792,795,796,799,800,803],{},"Pushes to ",[488,789,790],{},"main"," affecting ",[488,793,794],{},"docs\u002F**"," notify ",[488,797,798],{},"vatly\u002Fvatly-docs",". The notifier needs\nthe Actions secret ",[488,801,802],{},"VATLY_DOCS_DISPATCH_TOKEN"," with Contents: write access to that\nrepository. The sync uses an explicit frontmatter description when present,\notherwise the page's introductory sentence.",[472,805,807],{"id":806},"prepare-a-release","Prepare a release",[477,809,810,811,816,817,820,821,824],{},"The published package is ",[658,812,815],{"href":813,"rel":814},"https:\u002F\u002Fpypi.org\u002Fproject\u002Fvatly-api-python\u002F",[662],"vatly-api-python",";\nthe import name is ",[488,818,819],{},"vatly",". Update the package version, ",[488,822,823],{},"src\u002Fvatly\u002F_version.py","\nand changelog, then run all checks. Publish the SDK before matching Fluent and\nDjango versions, only after review and approval.",[713,826,827,837],{},[716,828,829],{},[719,830,831,834],{},[722,832,833],{},"PyPI trusted publisher field",[722,835,836],{},"Value",[729,838,839,848,857,867],{},[719,840,841,844],{},[734,842,843],{},"Owner",[734,845,846],{},[488,847,819],{},[719,849,850,853],{},[734,851,852],{},"Repository",[734,854,855],{},[488,856,815],{},[719,858,859,862],{},[734,860,861],{},"Workflow",[734,863,864],{},[488,865,866],{},"release.yml",[719,868,869,872],{},[734,870,871],{},"Environment",[734,873,874],{},"Leave blank",[477,876,877,878,881],{},"Publication starts only from a published GitHub release whose tag matches ",[488,879,880],{},"v","\nplus the package version. Mark alphas as pre-releases. Never reuse a published\nversion or move a release tag.",[477,883,884,885,887],{},"Pushing ",[488,886,790],{}," does not publish. Restrict release access: trusted publishing uses\nGitHub OIDC, with no environment approval gate or PyPI token. PyPI artifacts,\nincluding packaged source and docs, are public even if the GitHub repo is private.",[477,889,890,893,894],{},[658,891,892],{"href":324},"Resource guides"," · ",[658,895,896],{"href":360},"API inventory",[898,899,900],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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);}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":486,"searchDepth":527,"depth":527,"links":902},[903,904,905,906,907,910,911],{"id":474,"depth":527,"text":475},{"id":503,"depth":527,"text":504},{"id":546,"depth":527,"text":547},{"id":596,"depth":527,"text":597},{"id":648,"depth":527,"text":649,"children":908},[909],{"id":710,"depth":586,"text":711},{"id":772,"depth":527,"text":773},{"id":806,"depth":527,"text":807},"Maintain the SDK, update its API specification, sync documentation and prepare releases.","md",null,{},{"title":363},{"title":467,"description":912},"lECND_SCfjx2sD8zFAp_INUxn18q5zMJOCfxpx1WnqI",[920,922],{"title":280,"path":360,"stem":361,"description":921,"children":-1},"Look up SDK methods, HTTP endpoints and return types for synchronous and asynchronous clients.",{"title":128,"path":372,"stem":373,"description":923,"children":-1},"Build checkout, customer and subscription flows without tying billing to a web framework.",1794594932521]