merged from dev

This commit is contained in:
John Yeo
2026-04-30 15:05:12 +01:00
142 changed files with 10747 additions and 2609 deletions

3
.gitignore vendored
View File

@@ -16,6 +16,7 @@ supabase.sh
**/dist/
**/.next/
**/.vercel/
**/.turbo/
**/.DS_Store
**/.env*
tests/
@@ -141,4 +142,4 @@ TAKEHOME.md
.agents/
.mcp.json
.opencode/skills/
AGENTS.md
AGENTS.md

View File

@@ -1,14 +1,13 @@
set -e
bun knip
(cd server && bun ts)
changed_files="$(git diff --cached --name-only)"
bun knip
if printf '%s\n' "$changed_files" | grep -q '^server/'; then
(cd server && bun test tests/unit)
bunx turbo run ts --filter=@autumn/server
fi
if printf '%s\n' "$changed_files" | grep -q '^vite/'; then
(cd vite && bun test tests/)
bunx turbo run ts --filter=@autumn/vite
fi

26
.husky/pre-push Normal file
View File

@@ -0,0 +1,26 @@
set -e
zero_sha="0000000000000000000000000000000000000000"
changed_files="$(
while read local_ref local_sha remote_ref remote_sha; do
if [ "$local_sha" = "$zero_sha" ]; then
continue
fi
if [ "$remote_sha" = "$zero_sha" ]; then
base="$(git merge-base "$local_sha" origin/dev)"
else
base="$remote_sha"
fi
git diff --name-only "$base" "$local_sha"
done | sort -u
)"
if printf '%s\n' "$changed_files" | grep -q '^server/'; then
bunx turbo run test:unit --filter=@autumn/server
fi
if printf '%s\n' "$changed_files" | grep -q '^vite/'; then
bunx turbo run test:unit --filter=@autumn/vite
fi

View File

@@ -8,7 +8,7 @@ import { DynamicResponseField } from "/components/dynamic-response-field.jsx";
import { DynamicResponseExample } from "/components/dynamic-response-example.jsx";
<Note>
The update endpoint modifies an existing subscription. Use this to change prepaid quantities, cancel subscriptions, or modify plan configuration. For subscribing to a new plan, use [attach](/api-reference/billing/attach) instead.
The update endpoint modifies an existing subscription. Use this to change prepaid quantities, cancel subscriptions, or modify plan configuration. For subscribing to a new plan, use [attach](/api-reference/billing/billingAttach) instead.
</Note>
### Common Use Cases

View File

@@ -769,6 +769,16 @@ import { DynamicResponseExample } from "/components/dynamic-response-example.jsx
If this is a variant, the ID of the base plan it was created from.
</DynamicResponseField>
<DynamicResponseField name="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicResponseField name="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicResponseField>
</Expandable>
</DynamicResponseField>
<DynamicResponseField name="customer_eligibility" type="object">
<Expandable title="properties">
<DynamicResponseField name="trial_available" type="boolean">
@@ -1084,6 +1094,16 @@ import { DynamicResponseExample } from "/components/dynamic-response-example.jsx
If this is a variant, the ID of the base plan it was created from.
</DynamicResponseField>
<DynamicResponseField name="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicResponseField name="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicResponseField>
</Expandable>
</DynamicResponseField>
<DynamicResponseField name="customer_eligibility" type="object">
<Expandable title="properties">
<DynamicResponseField name="trial_available" type="boolean">

View File

@@ -942,6 +942,16 @@ import { DynamicResponseExample } from "/components/dynamic-response-example.jsx
If this is a variant, the ID of the base plan it was created from.
</DynamicResponseField>
<DynamicResponseField name="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicResponseField name="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicResponseField>
</Expandable>
</DynamicResponseField>
<DynamicResponseField name="customer_eligibility" type="object">
<Expandable title="properties">
<DynamicResponseField name="trial_available" type="boolean">
@@ -1257,6 +1267,16 @@ import { DynamicResponseExample } from "/components/dynamic-response-example.jsx
If this is a variant, the ID of the base plan it was created from.
</DynamicResponseField>
<DynamicResponseField name="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicResponseField name="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicResponseField>
</Expandable>
</DynamicResponseField>
<DynamicResponseField name="customer_eligibility" type="object">
<Expandable title="properties">
<DynamicResponseField name="trial_available" type="boolean">

View File

@@ -718,6 +718,16 @@ import { DynamicResponseExample } from "/components/dynamic-response-example.jsx
If this is a variant, the ID of the base plan it was created from.
</DynamicResponseField>
<DynamicResponseField name="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicResponseField name="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicResponseField>
</Expandable>
</DynamicResponseField>
<DynamicResponseField name="customer_eligibility" type="object">
<Expandable title="properties">
<DynamicResponseField name="trial_available" type="boolean">
@@ -1033,6 +1043,16 @@ import { DynamicResponseExample } from "/components/dynamic-response-example.jsx
If this is a variant, the ID of the base plan it was created from.
</DynamicResponseField>
<DynamicResponseField name="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicResponseField name="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicResponseField>
</Expandable>
</DynamicResponseField>
<DynamicResponseField name="customer_eligibility" type="object">
<Expandable title="properties">
<DynamicResponseField name="trial_available" type="boolean">

View File

@@ -576,6 +576,16 @@ import { DynamicResponseExample } from "/components/dynamic-response-example.jsx
If this is a variant, the ID of the base plan it was created from.
</DynamicResponseField>
<DynamicResponseField name="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicResponseField name="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicResponseField>
</Expandable>
</DynamicResponseField>
<DynamicResponseField name="customer_eligibility" type="object">
<Expandable title="properties">
<DynamicResponseField name="trial_available" type="boolean">
@@ -909,6 +919,16 @@ import { DynamicResponseExample } from "/components/dynamic-response-example.jsx
If this is a variant, the ID of the base plan it was created from.
</DynamicResponseField>
<DynamicResponseField name="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicResponseField name="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicResponseField>
</Expandable>
</DynamicResponseField>
<DynamicResponseField name="customer_eligibility" type="object">
<Expandable title="properties">
<DynamicResponseField name="trial_available" type="boolean">

View File

@@ -447,6 +447,16 @@ import { DynamicResponseExample } from "/components/dynamic-response-example.jsx
If this is a variant, the ID of the base plan it was created from.
</DynamicResponseField>
<DynamicResponseField name="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicResponseField name="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicResponseField>
</Expandable>
</DynamicResponseField>
<DynamicResponseField name="customer_eligibility" type="object">
<Expandable title="properties">
<DynamicResponseField name="trial_available" type="boolean">
@@ -780,6 +790,16 @@ import { DynamicResponseExample } from "/components/dynamic-response-example.jsx
If this is a variant, the ID of the base plan it was created from.
</DynamicResponseField>
<DynamicResponseField name="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicResponseField name="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicResponseField>
</Expandable>
</DynamicResponseField>
<DynamicResponseField name="customer_eligibility" type="object">
<Expandable title="properties">
<DynamicResponseField name="trial_available" type="boolean">

View File

@@ -564,6 +564,16 @@ import { DynamicResponseExample } from "/components/dynamic-response-example.jsx
If this is a variant, the ID of the base plan it was created from.
</DynamicResponseField>
<DynamicResponseField name="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicResponseField name="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicResponseField>
</Expandable>
</DynamicResponseField>
<DynamicResponseField name="customer_eligibility" type="object">
<Expandable title="properties">
<DynamicResponseField name="trial_available" type="boolean">
@@ -897,6 +907,16 @@ import { DynamicResponseExample } from "/components/dynamic-response-example.jsx
If this is a variant, the ID of the base plan it was created from.
</DynamicResponseField>
<DynamicResponseField name="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicResponseField name="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicResponseField>
</Expandable>
</DynamicResponseField>
<DynamicResponseField name="customer_eligibility" type="object">
<Expandable title="properties">
<DynamicResponseField name="trial_available" type="boolean">

View File

@@ -529,6 +529,16 @@ import { DynamicResponseExample } from "/components/dynamic-response-example.jsx
If this is a variant, the ID of the base plan it was created from.
</DynamicResponseField>
<DynamicResponseField name="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicResponseField name="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicResponseField>
</Expandable>
</DynamicResponseField>
<DynamicResponseField name="customer_eligibility" type="object">
<Expandable title="properties">
<DynamicResponseField name="trial_available" type="boolean">
@@ -861,6 +871,16 @@ import { DynamicResponseExample } from "/components/dynamic-response-example.jsx
If this is a variant, the ID of the base plan it was created from.
</DynamicResponseField>
<DynamicResponseField name="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicResponseField name="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicResponseField>
</Expandable>
</DynamicResponseField>
<DynamicResponseField name="customer_eligibility" type="object">
<Expandable title="properties">
<DynamicResponseField name="trial_available" type="boolean">

View File

@@ -301,6 +301,16 @@ import { DynamicResponseExample } from "/components/dynamic-response-example.jsx
If this is a variant, the ID of the base plan it was created from.
</DynamicResponseField>
<DynamicResponseField name="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicResponseField name="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicResponseField>
</Expandable>
</DynamicResponseField>
<DynamicResponseField name="customer_eligibility" type="object">
<Expandable title="properties">
<DynamicResponseField name="trial_available" type="boolean">
@@ -633,6 +643,16 @@ import { DynamicResponseExample } from "/components/dynamic-response-example.jsx
If this is a variant, the ID of the base plan it was created from.
</DynamicResponseField>
<DynamicResponseField name="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicResponseField name="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicResponseField>
</Expandable>
</DynamicResponseField>
<DynamicResponseField name="customer_eligibility" type="object">
<Expandable title="properties">
<DynamicResponseField name="trial_available" type="boolean">

View File

@@ -365,6 +365,16 @@ import { DynamicResponseExample } from "/components/dynamic-response-example.jsx
If this is a variant, the ID of the base plan it was created from.
</DynamicResponseField>
<DynamicResponseField name="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicResponseField name="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicResponseField>
</Expandable>
</DynamicResponseField>
<DynamicResponseField name="customer_eligibility" type="object">
<Expandable title="properties">
<DynamicResponseField name="trial_available" type="boolean">
@@ -697,6 +707,16 @@ import { DynamicResponseExample } from "/components/dynamic-response-example.jsx
If this is a variant, the ID of the base plan it was created from.
</DynamicResponseField>
<DynamicResponseField name="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicResponseField name="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicResponseField>
</Expandable>
</DynamicResponseField>
<DynamicResponseField name="customer_eligibility" type="object">
<Expandable title="properties">
<DynamicResponseField name="trial_available" type="boolean">

View File

@@ -7,7 +7,7 @@ import { DynamicParamField } from "/components/dynamic-param-field.jsx";
import { DynamicResponseField } from "/components/dynamic-response-field.jsx";
import { DynamicResponseExample } from "/components/dynamic-response-example.jsx";
Creates a new plan with optional base price and feature configurations. See [How plans work](/documentation/concepts/plans) for concepts and [Adding features to plans](/documentation/concepts/plan-items) for item configuration.
Creates a new plan with optional base price and feature configurations. See [How plans work](/documentation/pricing/plans) for concepts and [Adding features to plans](/documentation/pricing/plan-features) for item configuration.
### Plan Configuration
@@ -312,6 +312,16 @@ await autumn.plans.create({
</Expandable>
</DynamicParamField>
<DynamicParamField body="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicParamField body="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicParamField>
</Expandable>
</DynamicParamField>
### Response
@@ -563,6 +573,16 @@ await autumn.plans.create({
If this is a variant, the ID of the base plan it was created from.
</DynamicResponseField>
<DynamicResponseField name="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicResponseField name="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicResponseField>
</Expandable>
</DynamicResponseField>
<DynamicResponseField name="customer_eligibility" type="object">
<Expandable title="properties">
<DynamicResponseField name="trial_available" type="boolean">
@@ -647,7 +667,10 @@ await autumn.plans.create({
"createdAt": 1771513979217,
"env": "sandbox",
"archived": false,
"baseVariantId": null
"baseVariantId": null,
"config": {
"ignore_past_due": false
}
}
```
</ResponseExample>

View File

@@ -289,6 +289,16 @@ const plan = await autumn.plans.get({
If this is a variant, the ID of the base plan it was created from.
</DynamicResponseField>
<DynamicResponseField name="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicResponseField name="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicResponseField>
</Expandable>
</DynamicResponseField>
<DynamicResponseField name="customer_eligibility" type="object">
<Expandable title="properties">
<DynamicResponseField name="trial_available" type="boolean">
@@ -373,7 +383,10 @@ const plan = await autumn.plans.get({
"createdAt": 1771513979217,
"env": "sandbox",
"archived": false,
"baseVariantId": null
"baseVariantId": null,
"config": {
"ignore_past_due": false
}
}
```
</ResponseExample>

View File

@@ -306,6 +306,16 @@ const plans = await autumn.plans.list({
If this is a variant, the ID of the base plan it was created from.
</DynamicResponseField>
<DynamicResponseField name="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicResponseField name="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicResponseField>
</Expandable>
</DynamicResponseField>
<DynamicResponseField name="customer_eligibility" type="object">
<Expandable title="properties">
<DynamicResponseField name="trial_available" type="boolean">
@@ -395,7 +405,10 @@ const plans = await autumn.plans.list({
"createdAt": 1771513979217,
"env": "sandbox",
"archived": false,
"baseVariantId": null
"baseVariantId": null,
"config": {
"ignore_past_due": false
}
}
]
}

View File

@@ -7,7 +7,7 @@ import { DynamicParamField } from "/components/dynamic-param-field.jsx";
import { DynamicResponseField } from "/components/dynamic-response-field.jsx";
import { DynamicResponseExample } from "/components/dynamic-response-example.jsx";
Updates an existing plan. By default, creates a new version of the plan. See [Adding features to plans](/documentation/concepts/plan-items) for item configuration.
Updates an existing plan. By default, creates a new version of the plan. See [Adding features to plans](/documentation/pricing/plan-features) for item configuration.
<Note>
Updates create a new plan version by default. Existing customers remain on their current version until their subscription renews or they explicitly upgrade.
@@ -239,6 +239,16 @@ await autumn.plans.update({
</Expandable>
</DynamicParamField>
<DynamicParamField body="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicParamField body="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicParamField>
</Expandable>
</DynamicParamField>
<DynamicParamField body="version" type="number" />
<DynamicParamField body="archived" type="boolean" />
@@ -498,6 +508,16 @@ await autumn.plans.update({
If this is a variant, the ID of the base plan it was created from.
</DynamicResponseField>
<DynamicResponseField name="config" type="object">
Miscellaneous plan-level configuration flags.
<Expandable title="properties">
<DynamicResponseField name="ignore_past_due" type="boolean">
If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
</DynamicResponseField>
</Expandable>
</DynamicResponseField>
<DynamicResponseField name="customer_eligibility" type="object">
<Expandable title="properties">
<DynamicResponseField name="trial_available" type="boolean">
@@ -582,7 +602,10 @@ await autumn.plans.update({
"createdAt": 1771513979217,
"env": "sandbox",
"archived": false,
"baseVariantId": null
"baseVariantId": null,
"config": {
"ignore_past_due": false
}
}
```
</ResponseExample>

File diff suppressed because it is too large Load Diff

View File

@@ -4,7 +4,7 @@
"private": true,
"scripts": {
"atmn": "bunx atmn",
"dev": "infisical run --env=dev -- next dev -p 3002",
"dev": "infisical run --recursive --env=dev -- next dev -p 3002",
"build": "next build",
"start": "next start",
"lint": "biome check",

View File

@@ -332,3 +332,10 @@ body {
color: #b08aff;
text-decoration-color: #b08aff;
}
/* ==========================================================================
HERO REVEAL — desktop only (lg+), driven by GSAP
On mobile, GSAP is skipped and hero elements are immediately visible.
The lg:opacity-0 utility class on .hero-reveal / .hero-cta elements
ensures they start hidden on desktop where GSAP animates them in.
========================================================================== */

View File

@@ -7,11 +7,13 @@ import "./globals.css";
const geistSans = Geist({
variable: "--font-geist-sans",
subsets: ["latin"],
display: "swap",
});
const geistMono = Geist_Mono({
variable: "--font-geist-mono",
subsets: ["latin"],
display: "swap",
});
const url = "https://useautumn.com";

View File

@@ -1,25 +1,27 @@
{
"lockfileVersion": 1,
"configVersion": 0,
"workspaces": {
"": {
"name": "@autumn/website",
"dependencies": {
"@gsap/react": "^2.1.2",
"@mdx-js/loader": "^3.1.1",
"@mdx-js/mdx": "^3.1.1",
"@mdx-js/react": "^3.1.1",
"@next/mdx": "^16.2.4",
"@types/react": "^19.2.14",
"@vercel/analytics": "^2.0.1",
"framer-motion": "^12.38.0",
"gray-matter": "^4.0.3",
"gsap": "^3.15.0",
"lottie-react": "^2.4.1",
"lottie-web": "^5.13.0",
"matter-js": "^0.20.0",
"motion": "^12.38.0",
"next": "16.2.4",
"next-mdx-remote": "^6.0.0",
"ngrok": "^5.0.0-beta.2",
"react": "19.2.4",
"react-dom": "19.2.4",
"react-syntax-highlighter": "^16.1.1",
"remark-frontmatter": "^5.0.0",
},
"devDependencies": {
"@tailwindcss/postcss": "^4.2.2",
@@ -159,6 +161,8 @@
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
"@mdx-js/loader": ["@mdx-js/loader@3.1.1", "", { "dependencies": { "@mdx-js/mdx": "^3.0.0", "source-map": "^0.7.0" }, "peerDependencies": { "webpack": ">=5" }, "optionalPeers": ["webpack"] }, "sha512-0TTacJyZ9mDmY+VefuthVshaNIyCGZHJG2fMnGaDttCt8HmjUF7SizlHJpaCDoGnN635nK1wpzfpx/Xx5S4WnQ=="],
"@mdx-js/mdx": ["@mdx-js/mdx@3.1.1", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "acorn": "^8.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ=="],
"@mdx-js/react": ["@mdx-js/react@3.1.1", "", { "dependencies": { "@types/mdx": "^2.0.0" }, "peerDependencies": { "@types/react": ">=16", "react": ">=16" } }, "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw=="],
@@ -169,6 +173,8 @@
"@next/eslint-plugin-next": ["@next/eslint-plugin-next@16.2.1", "", { "dependencies": { "fast-glob": "3.3.1" } }, "sha512-r0epZGo24eT4g08jJlg2OEryBphXqO8aL18oajoTKLzHJ6jVr6P6FI58DLMug04MwD3j8Fj0YK0slyzneKVyzA=="],
"@next/mdx": ["@next/mdx@16.2.4", "", { "dependencies": { "source-map": "^0.7.0" }, "peerDependencies": { "@mdx-js/loader": ">=0.15.0", "@mdx-js/react": ">=0.15.0" }, "optionalPeers": ["@mdx-js/loader", "@mdx-js/react"] }, "sha512-e/3bgla+/oF3vDlndI0eFPa0bnP47HPVA0InsAJi7Jr3DwV8WpEGuOcm/3PdI5/93FfNiBhMVeVHZpm1sFlmJw=="],
"@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@16.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-OXTFFox5EKN1Ym08vfrz+OXxmCcEjT4SFMbNRsWZE99dMqt2Kcusl5MqPXcW232RYkMLQTy0hqgAMEsfEd/l2A=="],
"@next/swc-darwin-x64": ["@next/swc-darwin-x64@16.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-XhpVnUfmYWvD3YrXu55XdcAkQtOnvaI6wtQa8fuF5fGoKoxIUZ0kWPtcOfqJEWngFF/lOS9l3+O9CcownhiQxQ=="],
@@ -805,10 +811,10 @@
"math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
"matter-js": ["matter-js@0.20.0", "", {}, "sha512-iC9fYR7zVT3HppNnsFsp9XOoQdQN2tUyfaKg4CHLH8bN+j6GT4Gw7IH2rP0tflAebrHFw730RR3DkVSZRX8hwA=="],
"mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.3", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q=="],
"mdast-util-frontmatter": ["mdast-util-frontmatter@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "escape-string-regexp": "^5.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-extension-frontmatter": "^2.0.0" } }, "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA=="],
"mdast-util-mdx": ["mdast-util-mdx@3.0.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w=="],
"mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="],
@@ -831,6 +837,8 @@
"micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="],
"micromark-extension-frontmatter": ["micromark-extension-frontmatter@2.0.0", "", { "dependencies": { "fault": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg=="],
"micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@3.0.1", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q=="],
"micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.2", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ=="],
@@ -907,8 +915,6 @@
"next": ["next@16.2.4", "", { "dependencies": { "@next/env": "16.2.4", "@swc/helpers": "0.5.15", "baseline-browser-mapping": "^2.9.19", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.2.4", "@next/swc-darwin-x64": "16.2.4", "@next/swc-linux-arm64-gnu": "16.2.4", "@next/swc-linux-arm64-musl": "16.2.4", "@next/swc-linux-x64-gnu": "16.2.4", "@next/swc-linux-x64-musl": "16.2.4", "@next/swc-win32-arm64-msvc": "16.2.4", "@next/swc-win32-x64-msvc": "16.2.4", "sharp": "^0.34.5" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": "dist/bin/next" }, "sha512-kPvz56wF5frc+FxlHI5qnklCzbq53HTwORaWBGdT0vNoKh1Aya9XC8aPauH4NJxqtzbWsS5mAbctm4cr+EkQ2Q=="],
"next-mdx-remote": ["next-mdx-remote@6.0.0", "", { "dependencies": { "@babel/code-frame": "^7.23.5", "@mdx-js/mdx": "^3.0.1", "@mdx-js/react": "^3.0.1", "unist-util-remove": "^4.0.0", "unist-util-visit": "^5.1.0", "vfile": "^6.0.1", "vfile-matter": "^5.0.0" }, "peerDependencies": { "react": ">=16" } }, "sha512-cJEpEZlgD6xGjB4jL8BnI8FaYdN9BzZM4NwadPe1YQr7pqoWjg9EBCMv3nXBkuHqMRfv2y33SzUsuyNh9LFAQQ=="],
"ngrok": ["ngrok@5.0.0-beta.2", "", { "dependencies": { "extract-zip": "^2.0.1", "got": "^11.8.5", "lodash.clonedeep": "^4.5.0", "uuid": "^7.0.0 || ^8.0.0", "yaml": "^2.2.2" }, "optionalDependencies": { "hpagent": "^0.1.2" }, "bin": "bin/ngrok" }, "sha512-UzsyGiJ4yTTQLCQD11k1DQaMwq2/SsztBg2b34zAqcyjS25qjDpogMKPaCKHwe/APRTHeel3iDXcVctk5CNaCQ=="],
"node-exports-info": ["node-exports-info@1.6.0", "", { "dependencies": { "array.prototype.flatmap": "^1.3.3", "es-errors": "^1.3.0", "object.entries": "^1.1.9", "semver": "^6.3.1" } }, "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw=="],
@@ -1005,6 +1011,8 @@
"rehype-recma": ["rehype-recma@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "hast-util-to-estree": "^3.0.0" } }, "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw=="],
"remark-frontmatter": ["remark-frontmatter@5.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-frontmatter": "^2.0.0", "micromark-extension-frontmatter": "^2.0.0", "unified": "^11.0.0" } }, "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ=="],
"remark-mdx": ["remark-mdx@3.1.1", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg=="],
"remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="],
@@ -1137,8 +1145,6 @@
"unist-util-position-from-estree": ["unist-util-position-from-estree@2.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ=="],
"unist-util-remove": ["unist-util-remove@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg=="],
"unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="],
"unist-util-visit": ["unist-util-visit@5.1.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="],
@@ -1157,8 +1163,6 @@
"vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
"vfile-matter": ["vfile-matter@5.0.1", "", { "dependencies": { "vfile": "^6.0.0", "yaml": "^2.0.0" } }, "sha512-o6roP82AiX0XfkyTHyRCMXgHfltUNlXSEqCIS80f+mbAyiQBE2fxtDVMtseyytGx75sihiJFo/zR6r/4LTs2Cw=="],
"vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="],
"which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
@@ -1217,6 +1221,10 @@
"is-bun-module/semver": ["semver@7.7.4", "", { "bin": "bin/semver.js" }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
"mdast-util-frontmatter/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],
"micromark-extension-frontmatter/fault": ["fault@2.0.1", "", { "dependencies": { "format": "^0.2.0" } }, "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ=="],
"micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
"next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="],

View File

@@ -1,14 +1,22 @@
"use client";
import gsap from "gsap";
import { forwardRef, useEffect, useImperativeHandle, useRef } from "react";
import type { PixelHoverHandle, PixelIconComponent } from "@/lib/types";
import { getGsap } from "@/lib/lazyGsap";
type GSAPTimeline = {
play: () => GSAPTimeline;
reverse: () => GSAPTimeline;
kill: () => void;
// biome-ignore lint/suspicious/noExplicitAny: structural shim for GSAP's overloaded .to() signature
to: (...args: any[]) => GSAPTimeline;
};
export const DashboardIconPixel = forwardRef<
PixelHoverHandle,
{ Icon: PixelIconComponent }
>(function DashboardIconPixel({ Icon }, ref) {
const iconRef = useRef<SVGSVGElement | null>(null);
const tlRef = useRef<gsap.core.Timeline | null>(null);
const tlRef = useRef<GSAPTimeline | null>(null);
useImperativeHandle(ref, () => ({
restart: () => tlRef.current?.play(),
@@ -16,47 +24,40 @@ export const DashboardIconPixel = forwardRef<
}));
useEffect(() => {
const pixelEls =
iconRef.current?.querySelectorAll<SVGGraphicsElement>(".icon-pixel-path");
if (!pixelEls?.length) return;
const el = iconRef.current;
if (!el) return;
let cancelled = false;
// Sort pixels by visual position: bottom-left → top-right diagonal
const pixels = Array.from(pixelEls).sort((a, b) => {
const aBox = a.getBBox();
const bBox = b.getBBox();
return (
aBox.x +
aBox.width / 2 -
(aBox.y + aBox.height / 2) -
(bBox.x + bBox.width / 2 - (bBox.y + bBox.height / 2))
);
});
getGsap().then((gsap) => {
if (cancelled) return;
const pixelEls = el.querySelectorAll<SVGGraphicsElement>(".icon-pixel-path");
if (!pixelEls.length) return;
gsap.set(pixels, {
opacity: 0.15,
scale: 0.8,
transformOrigin: "left bottom",
fill: "currentColor",
});
tlRef.current = gsap.timeline({ paused: true });
tlRef.current
.to(pixels, {
opacity: 1,
scale: 1.15,
fill: "#FFFFFF",
duration: 0.2,
stagger: 0.01,
ease: "power2.out",
})
.to(pixels, {
scale: 1,
duration: 0.01,
ease: "back.out(3)",
// Sort pixels by visual position: bottom-left → top-right diagonal
const pixels = Array.from(pixelEls).sort((a, b) => {
const aBox = a.getBBox();
const bBox = b.getBBox();
return (
aBox.x + aBox.width / 2 - (aBox.y + aBox.height / 2) -
(bBox.x + bBox.width / 2 - (bBox.y + bBox.height / 2))
);
});
gsap.set(pixels, {
opacity: 0.15,
scale: 0.8,
transformOrigin: "left bottom",
fill: "currentColor",
});
tlRef.current = gsap.timeline({ paused: true });
tlRef.current!
.to(pixels, { opacity: 1, scale: 1.15, fill: "#FFFFFF", duration: 0.2, stagger: 0.01, ease: "power2.out" })
.to(pixels, { scale: 1, duration: 0.01, ease: "back.out(3)" });
});
return () => {
cancelled = true;
tlRef.current?.kill();
};
}, []);

View File

@@ -1,5 +1,5 @@
"use client";
import { motion, useMotionValue, useSpring, useTransform } from "framer-motion";
import { motion, useMotionValue, useSpring, useTransform } from "motion/react";
import { useEffect, useRef, useState } from "react";
import type { LayoutProps } from "@/lib/types";
import AnimatedFooterImage from "./animated-footer-image";

View File

@@ -1,5 +1,5 @@
"use client";
import { AnimatePresence, motion } from "framer-motion";
import { AnimatePresence, motion } from "motion/react";
import { useState } from "react";
import { AnimatedPlusMinus, faqData } from "@/app/constant";
import { cn } from "@/lib/utils";

View File

@@ -1,13 +1,12 @@
"use client";
import { useGSAP } from "@gsap/react";
import gsap from "gsap";
import { motion } from "motion/react";
import dynamic from "next/dynamic";
import Image from "next/image";
import Link from "next/link";
import { useEffect, useRef, useState } from "react";
import { CTALines, IconCTADocs, IconCTAStart } from "@/app/constant";
import { getGsap } from "@/lib/lazyGsap";
// `AutumnConfig` pulls in `react-syntax-highlighter` + `highlight.js` (~100KB
// gzipped + meaningful parse cost on mobile). It only renders on `xl+`
@@ -88,88 +87,51 @@ export default function Hero() {
};
}, []);
useGSAP(
() => {
gsap.set(".hero-root", { opacity: 0 });
useEffect(() => {
const container = containerRef.current;
if (!container) return;
gsap.set(".hero-bg", {
opacity: 0,
filter: "blur(6px) brightness(1)",
scale: 0.97,
transformOrigin: "center top",
});
let ctx: { revert: () => void } | null = null;
let cancelled = false;
gsap.set(".hero-reveal", {
opacity: 0,
y: 25,
filter: "blur(12px)",
scale: 0.96,
transformOrigin: "center bottom",
});
// Mobile: CSS animations in globals.css handle the hero reveal.
// Guard here so mobile never initiates the ~60KB GSAP dynamic import.
if (window.innerWidth < 1024) return;
gsap.set(".hero-cta", { opacity: 0, scale: 0.95 });
getGsap().then((gsap) => {
if (cancelled) return;
ctx = gsap.context(() => {
gsap.set(".hero-reveal", {
opacity: 0,
y: 25,
scale: 0.96,
transformOrigin: "center bottom",
});
gsap.set(".hero-cta", { opacity: 0, scale: 0.95 });
const tl = gsap.timeline({
defaults: { overwrite: "auto" },
});
const tl = gsap.timeline({ defaults: { overwrite: "auto" } });
tl.to(".hero-root", { opacity: 1, duration: 0.3, ease: "none" })
// hero-bg is intentionally NOT hidden — it is the LCP element and
// must be visible from first paint. The brightness flash still runs.
tl.to(".hero-bg", { filter: "brightness(1.6)", duration: 0.125, ease: "power2.in" })
.to(".hero-bg", { filter: "brightness(1)", duration: 0.125, ease: "power2.out" })
.to(".hero-reveal", { opacity: 1, y: 0, scale: 1, duration: 1.1, stagger: 0.1, ease: "power3.out" }, "-=0.2")
.to(".hero-cta", { opacity: 1, scale: 1, duration: 0.3, stagger: 0.06, ease: "back.out(1.5)" }, "-=0.1");
}, container);
});
.to(".hero-bg", {
opacity: 1,
filter: "blur(0px) brightness(1)",
scale: 1,
duration: 0.4,
ease: "power2.out",
})
.to(".hero-bg", {
filter: "blur(0px) brightness(1.6)",
duration: 0.125,
ease: "power2.in",
})
.to(".hero-bg", {
filter: "blur(0px) brightness(1)",
duration: 0.125,
ease: "power2.out",
})
.to(
".hero-reveal",
{
opacity: 1,
y: 0,
filter: "blur(0px)",
scale: 1,
duration: 1.1,
stagger: 0.1,
ease: "power3.out",
},
"-=0.2",
)
.to(
".hero-cta",
{
opacity: 1,
scale: 1,
duration: 0.3,
stagger: 0.06,
ease: "back.out(1.5)",
},
"-=0.1",
);
},
{ scope: containerRef },
);
return () => {
cancelled = true;
ctx?.revert();
};
}, []);
return (
<div ref={containerRef}>
<div className="relative hero-root opacity-0 flex flex-col items-stretch pb-0 md:pb-12 mb-0 bg-[#0F0F0F]">
<div className="relative hero-root flex flex-col items-stretch pb-0 mb-0 bg-[#0F0F0F]">
<div className="flex justify-between">
<div className="flex flex-col gap-6 px-4 xl:px-22.75 py-8 bg-[#0F0F0F] mt-26">
<h4 className="hero-reveal relative uppercase font-mono tracking-[-2%] text-[12px] md:text-sm leading-sm text-white md:text-[#FFFFFF99] bg-[#2c2c2d] w-fit p-2 min-h-[30px] md:min-h-[36px] flex items-center">
<h4 className="hero-reveal lg:opacity-0 relative uppercase font-mono tracking-[-2%] text-[12px] md:text-sm leading-sm text-white md:text-[#FFFFFF99] bg-[#2c2c2d] w-fit p-2 min-h-[30px] md:min-h-[36px] flex items-center">
<span className="invisible select-none" aria-hidden="true">
{BADGE_TEXT}
</span>
@@ -178,13 +140,13 @@ export default function Hero() {
</span>
</h4>
<div className="flex flex-col gap-6 w-full px-0 lg:px-0">
<h1 className="hero-reveal text-[44px] md:text-[56px] w-full max-w-sm sm:max-w-[480px] md:max-w-xl leading-[44px] tracking-[-5%] md:leading-14 font-sans">
<h1 className="hero-reveal lg:opacity-0 text-[44px] md:text-[56px] w-full max-w-sm sm:max-w-[480px] md:max-w-xl leading-[44px] tracking-[-5%] md:leading-14 font-sans">
<span className="text-[#FFFFFF99] font-normal">
Drop-in credits and billing for
</span>{" "}
<span className="text-white block md:inline">AI agents</span>
</h1>
<p className="hero-reveal tracking-[-2%] w-full max-w-xs sm:max-w-[480px] md:max-w-xl text-[#FFFFFF99] md:text-[16px] text-[14px] font-light leading-5 font-sans">
<p className="hero-reveal lg:opacity-0 tracking-[-2%] w-full max-w-xs sm:max-w-[480px] md:max-w-xl text-[#FFFFFF99] md:text-[16px] text-[14px] font-light leading-5 font-sans">
Stop rebuilding usage limits, credit ledgers and payment logic.{" "}
<span className="text-white font-light">
Autumn is the customer database
@@ -201,7 +163,7 @@ export default function Hero() {
so mobile never downloads them, and desktop fills the
already-reserved space once it hydrates.
*/}
<div className="hero-reveal relative w-[50vw] max-w-[720px] min-h-[525px] p-16 py-0 mx-auto hidden xl:block">
<div className="hero-reveal lg:opacity-0 relative w-[50vw] max-w-[720px] min-h-[525px] p-16 py-0 mx-auto hidden xl:block">
{isXl && (
<>
<div className="absolute inset-0 z-0 pointer-events-none">
@@ -224,7 +186,7 @@ export default function Hero() {
<div className="border-t border-[#292929]" />
<div className="flex flex-nowrap items-center xl:px-22.75 px-4 bg-[#0F0F0F] w-full overflow-hidden">
{/* Primary CTA */}
<div className="hero-cta w-full md:w-fit md:flex-shrink-0">
<div className="hero-cta lg:opacity-0 w-full md:w-fit md:flex-shrink-0">
<Link
href={
isLoggedIn
@@ -253,7 +215,7 @@ export default function Hero() {
</div>
{/* Secondary CTA */}
<div className="hero-cta w-full md:w-fit md:flex-shrink-0">
<div className="hero-cta lg:opacity-0 w-full md:w-fit md:flex-shrink-0">
<Link href={"https://cal.com/ayrod"}>
<motion.div
initial="initial"
@@ -274,7 +236,7 @@ export default function Hero() {
</Link>
</div>
<div className="hero-cta hidden md:flex flex-nowrap gap-2 md:gap-3 ml-2 md:ml-3 h-10.5 md:h-12.5 flex-1">
<div className="hero-cta lg:opacity-0 hidden md:flex flex-nowrap gap-2 md:gap-3 ml-2 md:ml-3 h-10.5 md:h-12.5 flex-1">
<div className="border-r border-[#292929] h-full hidden md:block" />
<div className="border-r border-[#292929] h-full hidden md:block" />
<div className="border-r border-[#292929] h-full hidden md:block" />
@@ -305,11 +267,12 @@ export default function Hero() {
aria-hidden="true"
fill
priority
fetchPriority="high"
sizes="100vw"
className="hero-bg absolute inset-0 w-full h-full object-cover mix-blend-screen opacity-100 pointer-events-none select-none"
/>
<div className="hero-reveal relative z-10 w-[96%] sm:w-[90%] max-w-[520px] flex justify-center items-center">
<div className="hero-reveal lg:opacity-0 relative z-10 w-[96%] sm:w-[90%] max-w-[520px] flex justify-center items-center">
{/* <AutumnConfig lines={16} initialDelay={1000} awaitEvent="preloader:complete" /> */}
<Image
src={"/images/hero/autumn_mobile.svg"}

View File

@@ -3,11 +3,15 @@
import dynamic from "next/dynamic";
import { useEffect } from "react";
import Hero from "./hero";
import LazySection from "./lazy-section";
import SectionDivider from "./section-divider";
// All below-fold sections are code-split into separate lazy chunks so the
// initial JS bundle only contains the hero. Framer-motion, GSAP ScrollTrigger,
// and lottie-web are pulled into these chunks rather than the main bundle.
// LazySection gates each component behind an IntersectionObserver so chunks
// and their heavy assets (Lottie JSON, ScrollTrigger) only download as the
// user scrolls toward them rather than all at once on page load.
const LogoWall = dynamic(() => import("./logo-wall"));
const Problem = dynamic(() => import("./problem"));
const Solution = dynamic(() => import("./solution"));
@@ -42,32 +46,25 @@ export default function HomeSections() {
return (
<>
<Hero />
{/*
<div className="flex flex-col gap-2.5 bg-[#000000]">
<div className="border-t border-[#292929] w-full" />
<div className="border-t border-[#292929] w-full" />
<div className="border-t border-[#292929] w-full" />
<div className="border-t border-[#292929] w-full" />
<div className="border-t border-[#292929] w-full" />
</div>
<LogoWall /> */}
<LogoWall />
<SectionDivider title="THE PROBLEM" />
<Problem />
<LazySection><Problem /></LazySection>
<SectionDivider title="THE SOLUTION" />
<Solution />
<LazySection><Solution /></LazySection>
<SectionDivider title="PRICING MODELS" />
<PricingModels />
<LazySection><PricingModels /></LazySection>
<SectionDivider title="FEATURES" />
<Features />
<LazySection><Features /></LazySection>
<SectionDivider title="TESTIMONIALS" />
<Testimonials />
<LazySection><Testimonials /></LazySection>
<SectionDivider title="PRODUCTION SCALE" />
<ProductionScale />
<LazySection><ProductionScale /></LazySection>
<SectionDivider title="PRICING" />
<Pricing />
<LazySection><Pricing /></LazySection>
<SectionDivider title="FAQ" />
<FAQ />
<Footer />
<LazySection><FAQ /></LazySection>
<LazySection><Footer /></LazySection>
</>
);
}

View File

@@ -0,0 +1,37 @@
"use client";
import { useEffect, useRef, useState, type ReactNode } from "react";
export default function LazySection({ children }: { children: ReactNode }) {
const ref = useRef<HTMLDivElement>(null);
const [mounted, setMounted] = useState(false);
useEffect(() => {
const el = ref.current;
if (!el) return;
// iOS < 12.2 has no IntersectionObserver — mount everything immediately.
if (!("IntersectionObserver" in window)) {
setMounted(true);
return;
}
const observer = new IntersectionObserver(
([entry]) => {
// intersectionRatio > 0 guards against a Safari bug where
// isIntersecting fires as false on the initial sync callback.
if (entry.isIntersecting || entry.intersectionRatio > 0) {
setMounted(true);
observer.disconnect();
}
},
{ rootMargin: "1000px 0px" },
);
observer.observe(el);
return () => observer.disconnect();
}, []);
// min-height: 1px prevents the wrapper collapsing to zero height before
// content mounts, which would cause iOS to jump scroll position on mount.
return <div ref={ref} style={{ minHeight: "1px" }}>{mounted ? children : null}</div>;
}

View File

@@ -3,70 +3,52 @@
import { cn } from "@/lib/utils";
const LOGOS = [
{ id: 1, name: "Mintlify", src: "/images/logos/mintlify_logo.svg.svg" },
{ id: 2, name: "Browser Use", src: "/images/logos/Browser use.svg" },
{ id: 3, name: "Firecrawl", src: "/images/logos/Firecrawl.svg.svg" },
{ id: 4, name: "Mastra", src: "/images/logos/Mastra.svg.svg" },
{ id: 5, name: "T3.chat", src: "/images/logos/T3_svg.svg" },
{ id: 6, name: "", src: null },
{ id: 1, name: "Mintlify", src: "/images/logos/mintlify_logo.svg.svg", className: "scale-90 md:scale-70" },
{ id: 3, name: "Firecrawl", src: "/images/logos/Firecrawl.svg.svg", className: "scale-95 md:scale-75 -translate-y-0.5" },
{ id: 4, name: "Mastra", src: "/images/logos/Mastra.svg.svg", className: "scale-105 md:scale-95" },
{ id: 2, name: "Browser Use", src: "/images/logos/Browser use.svg", className: "scale-85 md:scale-65" },
{ id: 5, name: "T3.chat", src: "/images/logos/T3_svg.svg", className: "scale-65 md:scale-55" },
];
const NUM_MOBILE_COLS = 2;
const NUM_DESKTOP_COLS = 3;
const NUM_MOBILE_COLS = 3;
const NUM_DESKTOP_COLS = 5;
export default function LogoWall() {
return (
<section className="w-full bg-[#000000]">
<div className="flex flex-col md:flex-row">
{/* Left heading — full width on mobile, 42% on desktop */}
<div className="md:w-[42%] px-4 xl:px-22.75 py-8 md:py-0 flex items-center border-b md:border-b-0 md:border-r border-[#292929]">
<div>
<p className="font-sans text-[28px] md:text-[36px] xl:text-[40px] font-normal leading-[1.1] tracking-[-0.03em]">
<span className="text-[#FFFFFF66]">Trusted by </span>
<span className="text-white">AI teams</span>
</p>
<p className="font-sans text-[28px] md:text-[36px] xl:text-[40px] font-normal leading-[1.1] tracking-[-0.03em] text-white">
shipping fast
</p>
</div>
<section className="w-full bg-[#0F0F0F]"
style={{
backgroundImage:
"radial-gradient(circle, rgba(255,255,255,0.06) 1px, transparent 1px)",
backgroundSize: "14px 14px",
}}>
<div className="flex flex-col">
<div className="px-4 xl:px-22.75 pt-10.5 flex items-center justify-center">
<span className="font-sans text-[14px] font-light text-[#FFFFFF99] tracking-[-2%] leading-5">
Powering millions of customers for growing startups
</span>
</div>
{/* Logo grid — 2 cols on mobile, 3 cols on desktop */}
<div className="flex-1 grid grid-cols-2 md:grid-cols-3">
{LOGOS.map((logo, i) => {
const isLastMobileCol = (i + 1) % NUM_MOBILE_COLS === 0;
const isLastDesktopCol = (i + 1) % NUM_DESKTOP_COLS === 0;
const isLastMobileRow = i >= LOGOS.length - NUM_MOBILE_COLS;
const isLastDesktopRow = i >= LOGOS.length - NUM_DESKTOP_COLS;
return (
<div
key={logo.id}
<div className="flex-1 flex flex-wrap justify-center md:grid md:grid-cols-5 px-4 py-4 md:py-0">
{LOGOS.map((logo) => (
<div
key={logo.id}
className="flex items-center justify-center min-h-[50px] md:min-h-[100px] border-[#292929] w-1/3 md:w-auto"
>
{logo.src && (
<img
src={logo.src}
alt={logo.name}
className={cn(
"flex items-center justify-center min-h-[90px] md:min-h-[166px] border-[#292929]",
!isLastMobileCol && "border-r",
!isLastMobileRow && "border-b",
isLastDesktopCol ? "md:border-r-0" : "md:border-r",
isLastDesktopRow ? "md:border-b-0" : "md:border-b",
"h-5 md:h-7 w-auto max-w-full object-contain",
logo.className
)}
style={{
backgroundImage:
"radial-gradient(circle, rgba(255,255,255,0.06) 1px, transparent 1px)",
backgroundSize: "14px 14px",
}}
>
{logo.src && (
<img
src={logo.src}
alt={logo.name}
className="h-5 md:h-7 w-auto max-w-[110px] md:max-w-[150px] object-contain"
loading="lazy"
/>
)}
</div>
);
})}
</div>
loading="lazy"
/>
)}
</div>
))}
</div>
</div>
</section>
);

View File

@@ -1,7 +1,5 @@
"use client";
import { useGSAP } from "@gsap/react";
import gsap from "gsap";
import { motion } from "motion/react";
import Image from "next/image";
import Link from "next/link";
@@ -29,6 +27,7 @@ import type {
PixelIconComponent,
} from "@/lib/types";
import { cn } from "@/lib/utils";
import { getGsap } from "@/lib/lazyGsap";
import { DashboardIconPixel } from "./dashboard-icon-pixel";
const NAV_LINKS = [
@@ -42,10 +41,18 @@ const NAV_LINKS = [
},
];
type GSAPTimeline = {
play: () => GSAPTimeline;
reverse: () => GSAPTimeline;
kill: () => void;
// biome-ignore lint/suspicious/noExplicitAny: structural shim for GSAP's overloaded .to() signature
to: (...args: any[]) => GSAPTimeline;
};
const NavIconPixel = forwardRef<PixelHoverHandle, { Icon: PixelIconComponent }>(
function NavIconPixel({ Icon }, ref) {
const iconRef = useRef<SVGSVGElement | null>(null);
const tlRef = useRef<gsap.core.Timeline | null>(null);
const tlRef = useRef<GSAPTimeline | null>(null);
useImperativeHandle(ref, () => ({
restart: () => tlRef.current?.play(),
@@ -53,46 +60,39 @@ const NavIconPixel = forwardRef<PixelHoverHandle, { Icon: PixelIconComponent }>(
}));
useEffect(() => {
const pixelEls =
iconRef.current?.querySelectorAll<SVGPathElement>(".icon-pixel-path");
if (!pixelEls?.length) return;
const el = iconRef.current;
if (!el) return;
let cancelled = false;
const pixels = Array.from(pixelEls).sort((a, b) => {
const aBox = a.getBBox();
const bBox = b.getBBox();
return (
aBox.x +
aBox.width / 2 -
(aBox.y + aBox.height / 2) -
(bBox.x + bBox.width / 2 - (bBox.y + bBox.height / 2))
);
});
getGsap().then((gsap) => {
if (cancelled) return;
const pixelEls = el.querySelectorAll<SVGPathElement>(".icon-pixel-path");
if (!pixelEls.length) return;
gsap.set(pixels, {
opacity: 0.15,
scale: 0.8,
transformOrigin: "left bottom",
fill: "currentColor",
});
tlRef.current = gsap.timeline({ paused: true });
tlRef.current
.to(pixels, {
opacity: 1,
scale: 1.15,
fill: "#FFFFFF",
duration: 0.01,
stagger: 0.025,
ease: "power2.out",
})
.to(pixels, {
scale: 1,
duration: 0.01,
ease: "back.out(3)",
const pixels = Array.from(pixelEls).sort((a, b) => {
const aBox = a.getBBox();
const bBox = b.getBBox();
return (
aBox.x + aBox.width / 2 - (aBox.y + aBox.height / 2) -
(bBox.x + bBox.width / 2 - (bBox.y + bBox.height / 2))
);
});
gsap.set(pixels, {
opacity: 0.15,
scale: 0.8,
transformOrigin: "left bottom",
fill: "currentColor",
});
tlRef.current = gsap.timeline({ paused: true });
tlRef.current!
.to(pixels, { opacity: 1, scale: 1.15, fill: "#FFFFFF", duration: 0.01, stagger: 0.025, ease: "power2.out" })
.to(pixels, { scale: 1, duration: 0.01, ease: "back.out(3)" });
});
return () => {
cancelled = true;
tlRef.current?.kill();
};
}, []);
@@ -189,137 +189,21 @@ export default function Navbar({
};
}, [menuOpen]);
useGSAP(
() => {
if (!animateIntro) return;
// Skip the entrance animation on non-desktop viewports, or when
// hydration landed well after first paint. On mobile the GSAP chunk
// can arrive many seconds after the server-rendered navbar has
// already painted; hiding it with `gsap.set({ opacity: 0 })` at
// that point and re-animating it in is a visible flash that's much
// worse than no animation.
if (
window.matchMedia("(max-width: 1023px)").matches ||
performance.now() > 300
) {
return;
}
gsap.set(".nav-root", { opacity: 0 });
gsap.set(".nav-logo", {
opacity: 0,
filter: "blur(6px) brightness(1)",
scale: 0.92,
transformOrigin: "left center",
});
gsap.set(".nav-link", { opacity: 0, y: -8 });
gsap.set(".nav-dashboard", { opacity: 0, scale: 0.95 });
const navMobileRef = useRef<HTMLDivElement | null>(null);
const tl = gsap.timeline({ defaults: { overwrite: "auto" } });
tl.to(".nav-root", { opacity: 1, duration: 0.3, ease: "none" })
.to(".nav-logo", {
opacity: 1,
filter: "blur(0px) brightness(1)",
scale: 1,
duration: 0.7,
ease: "power2.out",
})
.to(".nav-logo", {
filter: "blur(0px) brightness(1.6)",
duration: 0.225,
ease: "power2.in",
})
.to(".nav-logo", {
filter: "blur(0px) brightness(1)",
duration: 0.125,
ease: "power2.out",
})
.to(
".nav-link",
{
opacity: 1,
y: 0,
duration: 0.25,
stagger: 0.06,
ease: "power2.out",
},
"-=0.05",
)
.to(
".nav-dashboard",
{
opacity: 1,
scale: 1,
duration: 0.3,
ease: "back.out(1.5)",
},
"-=0.1",
);
},
{ scope: containerRef, dependencies: [animateIntro] },
);
const mobileTl = useRef<gsap.core.Timeline | null>(null);
useGSAP(
() => {
gsap.set(".nav-mobile", {
opacity: 0,
clipPath: "inset(0% 0 100% 0)",
pointerEvents: "none",
});
gsap.set(
".nav-mobile a, .nav-mobile img, .nav-mobile button, .nav-mobile .border-b",
{
opacity: 0,
filter: "blur(8px)",
scale: 0.95,
},
);
mobileTl.current = gsap.timeline({
paused: true,
defaults: { overwrite: "auto" },
});
mobileTl.current
.to(".nav-mobile", {
opacity: 1,
y: 0,
pointerEvents: "auto",
clipPath: "inset(0% 0 0% 0)",
duration: 0.2,
ease: "power3.inOut",
})
.to(
".nav-mobile a, .nav-mobile img, .nav-mobile button, .nav-mobile .border-b",
{
opacity: 1,
filter: "blur(0px)",
scale: 1,
duration: 0.15,
stagger: 0.01,
ease: "power2.out",
},
"-=0.1",
);
},
{ scope: containerRef },
);
useGSAP(
() => {
if (mobileTl.current) {
if (menuOpen) {
mobileTl.current.timeScale(1).play();
} else {
mobileTl.current.timeScale(1.8).reverse();
}
}
},
{ scope: containerRef, dependencies: [menuOpen] },
);
useEffect(() => {
const el = navMobileRef.current;
if (!el) return;
if (menuOpen) {
el.style.opacity = "1";
el.style.pointerEvents = "auto";
el.style.clipPath = "inset(0% 0 0% 0)";
} else {
el.style.opacity = "0";
el.style.pointerEvents = "none";
el.style.clipPath = "inset(0% 0 100% 0)";
}
}, [menuOpen]);
return (
<div
@@ -404,8 +288,9 @@ export default function Navbar({
</nav>
</div>
<div
ref={navMobileRef}
className={cn(
"fixed nav-mobile inset-x-0 z-40 flex h-[calc(100dvh-58px)] flex-col overflow-x-hidden overflow-y-auto bg-[#000000] px-4 pb-8 font-mono uppercase transition-all duration-300 md:px-(--page-pad) lg:top-5",
"fixed inset-x-0 z-40 flex h-[calc(100dvh-58px)] flex-col overflow-x-hidden overflow-y-auto bg-[#000000] px-4 pb-8 font-mono uppercase md:px-(--page-pad) lg:top-5",
scrolled && !recoilHidden
? "top-[58px] sm:top-[60px]"
: "top-[66px] sm:top-[62px]",
@@ -414,6 +299,7 @@ export default function Navbar({
opacity: 0,
pointerEvents: "none",
clipPath: "inset(0% 0 100% 0)",
transition: "opacity 0.2s ease, clip-path 0.2s cubic-bezier(0.87, 0, 0.13, 1)",
}}
>
{/* Nav items */}

View File

@@ -66,9 +66,16 @@ export default function SolutionAnimation() {
// Defer the 1.42.1 MB Lottie JSON fetch until the element is close to
// the viewport. Without this the browser fetches it during initial load
// and blocks the main thread while parsing the large JSON blob.
if (!("IntersectionObserver" in window)) {
initAnimation();
return;
}
const observer = new IntersectionObserver(
(entries) => {
if (entries[0].isIntersecting) {
// intersectionRatio > 0 guards against a Safari bug where
// isIntersecting fires as false on the initial sync callback.
if (entries[0].isIntersecting || entries[0].intersectionRatio > 0) {
observer.disconnect();
initAnimation();
}

View File

@@ -0,0 +1,10 @@
// Loads GSAP exactly once — first call triggers the dynamic import,
// subsequent calls reuse the same promise.
type Gsap = (typeof import("gsap"))["default"];
let promise: Promise<Gsap> | null = null;
export const getGsap = (): Promise<Gsap> => {
if (!promise) promise = import("gsap").then((m) => m.default);
return promise;
};

View File

@@ -7,13 +7,13 @@ const nextConfig = {
pageExtensions: ["ts", "tsx", "md", "mdx"],
allowedDevOrigins: ["*.ngrok-free.dev"],
experimental: {
optimizePackageImports: ["framer-motion", "motion", "gsap", "@gsap/react"],
optimizePackageImports: ["motion", "gsap", "@gsap/react"],
optimizeCss: true,
},
images: {
// Serve AVIF to supporting browsers (better compression than WebP),
// falling back to WebP. Next.js negotiates via Accept header automatically.
// formats: ["image/avif", "image/webp"],
formats: ["image/avif", "image/webp"],
},
async headers() {
if (!isProd) return [];

View File

@@ -16,12 +16,9 @@
"@next/mdx": "^16.2.4",
"@types/react": "^19.2.14",
"@vercel/analytics": "^2.0.1",
"framer-motion": "^12.38.0",
"gray-matter": "^4.0.3",
"gsap": "^3.15.0",
"lottie-react": "^2.4.1",
"lottie-web": "^5.13.0",
"matter-js": "^0.20.0",
"motion": "^12.38.0",
"next": "16.2.4",
"ngrok": "^5.0.0-beta.2",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 884 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 22 MiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 226 KiB

After

Width:  |  Height:  |  Size: 98 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 21 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 1.7 MiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 996 KiB

View File

@@ -26,6 +26,7 @@
"inquirer": "^12.10.0",
"knip": "^6.7.0",
"ts-to-zod": "^5.1.0",
"turbo": "^2.9.6",
},
},
"apps/checkout": {
@@ -115,12 +116,9 @@
"@next/mdx": "^16.2.4",
"@types/react": "^19.2.14",
"@vercel/analytics": "^2.0.1",
"framer-motion": "^12.38.0",
"gray-matter": "^4.0.3",
"gsap": "^3.15.0",
"lottie-react": "^2.4.1",
"lottie-web": "^5.13.0",
"matter-js": "^0.20.0",
"motion": "^12.38.0",
"next": "16.2.4",
"ngrok": "^5.0.0-beta.2",
@@ -2174,6 +2172,18 @@
"@tsconfig/node16": ["@tsconfig/node16@1.0.4", "", {}, "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA=="],
"@turbo/darwin-64": ["@turbo/darwin-64@2.9.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-X/56SnVXIQZBLKwniGTwEQTGmtE5brSACnKMBWpY3YafuxVYefrC2acamfjgxP7BG5w3I+6jf0UrLoSzgPcSJg=="],
"@turbo/darwin-arm64": ["@turbo/darwin-arm64@2.9.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-aalBeSl4agT/QtYGDyf/XLajedWzUC9Vg/pm/YO6QQ93vkQ91Vz5uK1ta5RbVRDozQSz4njxUNqRNmOXDzW+qw=="],
"@turbo/linux-64": ["@turbo/linux-64@2.9.6", "", { "os": "linux", "cpu": "x64" }, "sha512-YKi05jnNHaD7vevgYwahpzGwbsNNTwzU2c7VZdmdFm7+cGDP4oREUWSsainiMfRqjRuolQxBwRn8wf1jmu+YZA=="],
"@turbo/linux-arm64": ["@turbo/linux-arm64@2.9.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-02o/ZS69cOYEDczXvOB2xmyrtzjQ2hVFtWZK1iqxXUfzMmTjZK4UumrfNnjckSg+gqeBfnPRHa0NstA173Ik3g=="],
"@turbo/windows-64": ["@turbo/windows-64@2.9.6", "", { "os": "win32", "cpu": "x64" }, "sha512-wVdQjvnBI15wB6JrA+43CtUtagjIMmX6XYO758oZHAsCNSxqRlJtdyujih0D8OCnwCRWiGWGI63zAxR0hO6s9g=="],
"@turbo/windows-arm64": ["@turbo/windows-arm64@2.9.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-1XUUyWW0W6FTSqGEhU8RHVqb2wP1SPkr7hIvBlMEwH9jr+sJQK5kqeosLJ/QaUv4ecSAd1ZhIrLoW7qslAzT4A=="],
"@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
"@types/acorn": ["@types/acorn@4.0.6", "", { "dependencies": { "@types/estree": "*" } }, "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ=="],
@@ -4228,8 +4238,6 @@
"math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
"matter-js": ["matter-js@0.20.0", "", {}, "sha512-iC9fYR7zVT3HppNnsFsp9XOoQdQN2tUyfaKg4CHLH8bN+j6GT4Gw7IH2rP0tflAebrHFw730RR3DkVSZRX8hwA=="],
"md-to-react-email": ["md-to-react-email@5.0.6", "", { "dependencies": { "marked": "7.0.4" }, "peerDependencies": { "react": "^18.0 || ^19.0" } }, "sha512-lKaTJqpmO88JdE3FnE7V1dtS+ta0ORyKTRhk/YoCRmeE9LozyfR2ashnUW0p0hK13VnF2TqZURXtSwgyh0zZkA=="],
"md5-hex": ["md5-hex@3.0.1", "", { "dependencies": { "blueimp-md5": "^2.10.0" } }, "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw=="],
@@ -5446,6 +5454,8 @@
"tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="],
"turbo": ["turbo@2.9.6", "", { "optionalDependencies": { "@turbo/darwin-64": "2.9.6", "@turbo/darwin-arm64": "2.9.6", "@turbo/linux-64": "2.9.6", "@turbo/linux-arm64": "2.9.6", "@turbo/windows-64": "2.9.6", "@turbo/windows-arm64": "2.9.6" }, "bin": { "turbo": "bin/turbo" } }, "sha512-+v2QJey7ZUeUiuigkU+uFfklvNUyPI2VO2vBpMYJA+a1hKFLFiKtUYlRHdb3P9CrAvMzi0upbjI4WT+zKtqkBg=="],
"tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="],
"twoslash": ["twoslash@0.3.8", "", { "dependencies": { "@typescript/vfs": "^1.6.4", "twoslash-protocol": "0.3.8" }, "peerDependencies": { "typescript": "^5.5.0 || ^6.0.0" } }, "sha512-OeDz0kDl8sqPUN3nr7gqcvOs70f5lZsdhKYTX3/SgB9OvdadzzoYJI/4SBXhXV1HG8E9fLc+e17itoRYTxmoig=="],

View File

@@ -11,7 +11,7 @@
"enumMembers",
"duplicates"
],
"ignore": ["ai/**"],
"ignore": ["ai/**", "others/**"],
"ignoreWorkspaces": [
"packages/atmn",
"packages/autumn-js",

View File

@@ -1,16 +1,16 @@
lockVersion: 2.0.0
id: 05940b80-1ef8-40f4-9878-822fb2792070
management:
docChecksum: ec1344f20539184af7cb9d96f15a66d3
docChecksum: 3b0105075304498181ec21487da5dde1
docVersion: 2.2.0
speakeasyVersion: 1.759.3
generationVersion: 2.869.25
releaseVersion: 0.4.18
configChecksum: 2263d20254e354a1792248274002f650
persistentEdits:
generation_id: 5e96af15-644d-4acf-959d-2ab7ff0f92b0
pristine_commit_hash: 0e9011855bbd03f2ee96638a01a28be2449aa80c
pristine_tree_hash: b0c3bff428e26c8ed285218ad04b422cc7f5c974
generation_id: d3d22cf1-5f75-49b1-9fcd-a284c460c35d
pristine_commit_hash: 4982fbe5aa8f0a47cbad71e7d2b8827b0a28c650
pristine_tree_hash: a04d19defc16cb69b5a90cc65de5a93d31bf6b66
features:
python:
additionalDependencies: 1.0.0
@@ -387,70 +387,126 @@ trackedFiles:
id: 786823ab8ff0
last_write_checksum: sha1:8d7542dc9cdab711fa44b08449f023cf51d0bf2e
pristine_git_object: efb3d1c5cde44cefea7c57680732ee41369d3929
docs/models/checkconfig.md:
id: 4b8ba30bfd95
last_write_checksum: sha1:ffab912aee898f9de390060c4ca401c842ffdbf1
pristine_git_object: aa3557115ce72623ad03ec41061e0043f329bd07
docs/models/checkcreditschema.md:
id: b573d5ff9854
last_write_checksum: sha1:e111bba83ecf51974789882def6f418806704bcd
pristine_git_object: 569f641aa37bd931f49d93ecc912d48d01ced164
docs/models/checkenv.md:
id: badd8ba846d9
last_write_checksum: sha1:cc58aa52d618d5718048c72c1d832c22f4fa4d44
pristine_git_object: 2ecd490b20e9ddec41e2de895dc878bfe1e735f5
docs/models/checkfeature.md:
id: 578a088d181f
last_write_checksum: sha1:79c138d673342ee61ffdbb8befdf15d35ef9a6da
pristine_git_object: fa7790f68f21941ebb44f775f59fad065363ff0d
docs/models/checkfreetrial.md:
id: 2620d97dc581
last_write_checksum: sha1:c3c60a1a4e09486eb8b9a09efce7a665c1c9f60c
pristine_git_object: 90a109f36f6f38ddcc91151e8f090e28504160eb
docs/models/checkconfig1.md:
id: f0806fd84f46
last_write_checksum: sha1:e68d5f65bb3a81fbcc71f74e62ccc3b72c0ec264
pristine_git_object: 14cf8e8fe58151d64c6e2289c905f9498bd910b0
docs/models/checkconfig2.md:
id: fff0819a7348
last_write_checksum: sha1:700260dd53a9f558d6321452f4bc71fb8542d811
pristine_git_object: ceef4af077de0f504a1a147e6c531fe07671e2d8
docs/models/checkcreditschema1.md:
id: e0cd569c10aa
last_write_checksum: sha1:484a7b932b9688c8e06eaad4d347810010ea1876
pristine_git_object: 3141ddb0f3621854118a881f447d31fd89177a26
docs/models/checkcreditschema2.md:
id: 9e5073f2f76b
last_write_checksum: sha1:3edf2daa2a87b89d126419c94ce3e823d55869d6
pristine_git_object: 481a1118cb790f1958fb3e104d1a8966d3bc9e70
docs/models/checkenv1.md:
id: ee138eedef3f
last_write_checksum: sha1:aae65b9f5a4b78f205506108d408754ceb8b7738
pristine_git_object: 2ef98e05101327669e74012d7c628be39fcaf61c
docs/models/checkenv2.md:
id: 8eb584a3507a
last_write_checksum: sha1:da8b828aad99fc30b7878a7aca495ec4ca9032ab
pristine_git_object: 177d1e4f800e22191658a9c7870fada3616f5101
docs/models/checkfeature1.md:
id: 4c3370c023d0
last_write_checksum: sha1:3027b27ea338cbaf22d7d3a5fc44fca25e196ff5
pristine_git_object: 45c044f1385f2eaf100a06a79232f56d1031ee1a
docs/models/checkfeature2.md:
id: ea0c32d843fa
last_write_checksum: sha1:00091321a41162e269bf77fb3ae1a0b192d17731
pristine_git_object: ac1ad6e14d356c9b618c9ae81333a031f34f81e1
docs/models/checkfreetrial1.md:
id: 6feb912cba84
last_write_checksum: sha1:ea943d15fad64692212e1808e1b5827ba9913148
pristine_git_object: 5a40ffdb64e18372dd3372980cc427b5442bf930
docs/models/checkfreetrial2.md:
id: b93159aca437
last_write_checksum: sha1:b4fa2bfb3c1365cdf68d80420d1992f83829feda
pristine_git_object: 7f64bb70ee40720b9c04ae104ab42cb6437ad207
docs/models/checkglobals.md:
id: e7912e7cd264
last_write_checksum: sha1:799fadc8c10dcbf7d7ae72df4593789491e46da8
pristine_git_object: db1b11678847be436d8d702b1dfe38fbadfc0b8c
docs/models/checkinterval.md:
id: 8d4fa19b99cf
last_write_checksum: sha1:1de9a5b6c8246013c331c029eff593c7d9107a0e
pristine_git_object: 7ab99824ba2b1ea51adcc3e6e1f8ed71b9a41f41
docs/models/checkitem.md:
id: 17b1916ed078
last_write_checksum: sha1:37bef2ae48994d69ed252eae5a69596bd730f8c6
pristine_git_object: 90ff81caa8defcc27823c553d9a525401b8ea7c4
docs/models/checkinterval1.md:
id: 9858adfe444b
last_write_checksum: sha1:f03f23c21416034aaaabaf863f9731c9e6f52c21
pristine_git_object: ecc66ac03d705d63fddc9e1e8cc52578f389dcf0
docs/models/checkinterval2.md:
id: 0a8aeed61910
last_write_checksum: sha1:f455a6279d1a29a102a043bbc18262ce1994984e
pristine_git_object: 6fcb44b9c949d8be315f63b2c6d6cc4808208e99
docs/models/checkitem1.md:
id: 02d458d06abf
last_write_checksum: sha1:e380d27d95e54b37b6753ae4124a5b83cb156853
pristine_git_object: 2863c8e87e5b3430e46b9a17a566fe8729a85888
docs/models/checkitem2.md:
id: 4b248e1cc186
last_write_checksum: sha1:1162569a062fe94e2a5a9c578418e1a10e41d438
pristine_git_object: 7eb93ca79bfb06387380e2081209793ee3d51c98
docs/models/checklock.md:
id: 5f638752293b
last_write_checksum: sha1:03f54dc8923833000ae382c045467a5b72d1ea0d
pristine_git_object: 6a029c8c5367cce65667868341d1026f540f416b
docs/models/checkondecrease.md:
id: 2c49735aaa4e
last_write_checksum: sha1:fbc0d73b600c664d71588db64a01f63ae9730c6f
pristine_git_object: cdbd3eee0b4829c3574a58eaee0919e3456de0c4
docs/models/checkonincrease.md:
id: 72e23013a321
last_write_checksum: sha1:285a9c0f5eedf50bf8345017cb5281054394fbf3
pristine_git_object: 9e7cf1470360e6e191df1c53f875ddc2efce56b0
docs/models/checkondecrease1.md:
id: b399a28fcf6a
last_write_checksum: sha1:58a534282c58ca0ded69f5185476f363be922d5b
pristine_git_object: db7554a82f9085cb2e4df03cf454d3f7c69f0d94
docs/models/checkondecrease2.md:
id: 86849f247e74
last_write_checksum: sha1:e6a7c55fb345a6653adf8e023213d6f8acb94578
pristine_git_object: 4130b65cea4f17d82e36f729afba6540b1519e17
docs/models/checkonincrease1.md:
id: 40ab0b3b884d
last_write_checksum: sha1:7a094594bdb88076d15b91ec36105d5ec4d63c03
pristine_git_object: 2ff9fe7f4134032db32098fbbc041edcfdeb2227
docs/models/checkonincrease2.md:
id: 66cd88e77032
last_write_checksum: sha1:6f9eb419bedd55d0354d8fe05649a342aa5a8bcf
pristine_git_object: 27c9973e8ff4b84e37a28a89eb10bdb1856a9fe2
docs/models/checkparams.md:
id: 41de438d57cd
last_write_checksum: sha1:ab7c54bfe0c657851a59fedd447c99bb3acdb4c2
pristine_git_object: 7848c33fdbffc71c09fadd8ad859214182f00e0a
docs/models/checkresponse.md:
id: b988b0f4b781
last_write_checksum: sha1:92555ddd5ee75227496ee661969ecc3b70ff2b22
pristine_git_object: 538b5da093741e96e84628a1e462606976dc9a47
docs/models/checkrollover.md:
id: 7dd074787f0f
last_write_checksum: sha1:056444557237da10a81fe7ada4c84693c15e9333
pristine_git_object: b43700402cc1a46e9e5948e0c1ed3633535a263c
docs/models/checktierbehavior.md:
id: 9617428cc802
last_write_checksum: sha1:50402db6b459dee47f0d1286dac1a86ca3608824
pristine_git_object: 269d3333807ff7d70963551a083aa7ea5f8f397a
docs/models/configduration.md:
id: 71a76925451f
last_write_checksum: sha1:0720378e9c471d694d5a851171f3abc2be4379a4
pristine_git_object: e3c8e2bf7c4c806a31ab13effee6a07fd19abf4e
last_write_checksum: sha1:9522d4ecea7631ce3ae3d80b341a068ccb2dcca4
pristine_git_object: 960794ceac855696a459ff7faeed3ae0c2f845f2
docs/models/checkresponsebody1.md:
id: 6f9c994d9bb0
last_write_checksum: sha1:910ecdad4ea6c2e9064a482a826953dc09008022
pristine_git_object: 23178d30fa514b139910d65db17abf3d192ccbd4
docs/models/checkresponsebody2.md:
id: 0d79166415e4
last_write_checksum: sha1:9f4ee6b517bb2933b39a91aea8b9ccba515ae505
pristine_git_object: 089c68dfd0d7483cb8e7deb3058936f094c1e4a7
docs/models/checkrollover1.md:
id: 69582ff84901
last_write_checksum: sha1:357b43f31ba66b5f4ac39a2517492bb9eb0d1233
pristine_git_object: 436d725f99b017ceca6de1e2b8f69761e4aa93c4
docs/models/checkrollover2.md:
id: 6c56d12759b2
last_write_checksum: sha1:e34dd4aca3a9622fcb3a5b4df1cc5fd67604d6d2
pristine_git_object: 886ade07442a4df7195d79448a888b7ba4e523a2
docs/models/checktierbehavior1.md:
id: 4629a3f35b48
last_write_checksum: sha1:4dadffec47827017f417c2114075318306960ddb
pristine_git_object: 9d4f53ac28153c0cb5fb8cf484ff8bcd26ba2637
docs/models/checktierbehavior2.md:
id: 8f0d3f87e43b
last_write_checksum: sha1:e22af7bb4b28ba6706d87fea28dbe5cea47e669a
pristine_git_object: a99b6a18d629ebf476576386bf9b993d69745eb9
docs/models/configduration1.md:
id: b86dc4a9c4b2
last_write_checksum: sha1:b83f06bf7e03a1dcf5d57b7fe5576c98d2ef8ff8
pristine_git_object: 70ba64933045eeeb6a46d2ecc76946446c3b4adc
docs/models/configduration2.md:
id: 2a5fc83f865e
last_write_checksum: sha1:09f3857cc198665dfb68e2fb8be6f0ba0450f607
pristine_git_object: 7386884b68f5b856543f1568433532aa1b26541d
docs/models/createbalanceduration.md:
id: 826a29597974
last_write_checksum: sha1:9b78f21633e80e576df535748685b12bb9ee9949
@@ -619,6 +675,14 @@ trackedFiles:
id: b307da22d211
last_write_checksum: sha1:cb2e4a736b4ecc159767a293453ff87f9ed0c9eb
pristine_git_object: 4a0d24cd6c7d3f100ff059751be33862a199c471
docs/models/createplanconfigrequest.md:
id: c2899bc14a62
last_write_checksum: sha1:b9f2caa7a0ee425ae3eb236f8392d015ba5ce28b
pristine_git_object: 314f7ef83181300c03210d01eb55426ee65e8699
docs/models/createplanconfigresponse.md:
id: 5927c084ee1a
last_write_checksum: sha1:4ad50054407dae02bfbcc99ec810f4cb4cf61804
pristine_git_object: e2b8498965f851260cbe6e786ed1f614a0ed05bc
docs/models/createplancreditschema.md:
id: bda39f39fac9
last_write_checksum: sha1:8d3bf3dfd849ce3112674c8108d75e77bbf40d92
@@ -693,8 +757,8 @@ trackedFiles:
pristine_git_object: a7cbec89d5e586f2e506b7fac6a14d299e227ee2
docs/models/createplanparams.md:
id: 83565eddc151
last_write_checksum: sha1:a585f44a9afc78624bda890e35c8fa50668c4248
pristine_git_object: 542711d69f2a8236c3ffb8e0122f3b1bfa160483
last_write_checksum: sha1:32603835b7730966dad5189cd23095c577505998
pristine_git_object: e6b30b835d8afbc411969a4d50558518c90d6569
docs/models/createplanplanitem.md:
id: 1b9012d7afb1
last_write_checksum: sha1:0671625d4e92d02eba01ee9b1a9e49effcd3fc96
@@ -745,8 +809,8 @@ trackedFiles:
pristine_git_object: a2f64fdb4fadf6e25741034efbaa74019f88d566
docs/models/createplanresponse.md:
id: 72de4e2745bb
last_write_checksum: sha1:2cbb509b694c60f50163717015a2701b0a6da1ae
pristine_git_object: 7048caf952b0860b68dbc3922353483c63e718d5
last_write_checksum: sha1:311f175443401a8cea68bad160d54e8bcc5806d5
pristine_git_object: 54f358896ee1c0a751881590b3fc5aad59ae49d6
docs/models/createplanrolloverrequest.md:
id: 01b2ca1d23fb
last_write_checksum: sha1:455e7de95238ad1b496d10159c83a40c4bb0fd8d
@@ -991,10 +1055,14 @@ trackedFiles:
id: 7ba992bf53cc
last_write_checksum: sha1:368f1d47012462b1ce9bd136fd0aa4a88cf419fb
pristine_git_object: 675c956152029541c6bfe8a49519e6ba21a95712
docs/models/featuretype.md:
id: 9fd6a7ea7659
last_write_checksum: sha1:a21f7ba709ab7f1cd5a2d83755064445d8b2c85a
pristine_git_object: 05ff42a520e8804d3d219809d835a13f5ed78bf5
docs/models/featuretype1.md:
id: a061fb4a873d
last_write_checksum: sha1:15d6b678f2ce4fe14d207404a82d3cc676ea7a63
pristine_git_object: b829f3b0d74d48d383766781db8be87957253385
docs/models/featuretype2.md:
id: 92e1ceeeaa10
last_write_checksum: sha1:a3023e348af77f2f393c2a5d90887af16f26ae46
pristine_git_object: 9c0128850f8805a81bf4f631c12b19c31fc893f7
docs/models/finalizebalanceparams.md:
id: 610af9b4049c
last_write_checksum: sha1:9f6c1e1ac2c7c0670ee998fe33e2f633edfe5c0b
@@ -1005,32 +1073,56 @@ trackedFiles:
pristine_git_object: ca4aaf9dd339a4c939bc50a3f5d48eb3642061b0
docs/models/finalizelockresponse.md:
id: 6c912a11f195
last_write_checksum: sha1:24fad6be1b587d550d69d76547bd6647616ce7be
pristine_git_object: 08a61e80ffd6f6c17caade17602049e3492420eb
docs/models/flag.md:
id: f7a84826e2db
last_write_checksum: sha1:374db54cba506299ac1b9f70310130e28a9ff64b
pristine_git_object: d871c7ff87ecd5a7037dd52370db656823f3cea1
docs/models/flagdisplay.md:
id: 5a9126a67446
last_write_checksum: sha1:c6dba4635498c5faf9326749ba93096ea241ec28
pristine_git_object: 5fe1bedf0b5fd5f2ddcffe73c1ca02542a4d4a95
last_write_checksum: sha1:0b7e0d997d02ee7200708c953534b3895f8b2439
pristine_git_object: f8139e4adf9f926941c5fe7a29289bc2a212006b
docs/models/finalizelockresponsebody1.md:
id: 9fc51a4a7450
last_write_checksum: sha1:8b14246caf7e8a71b26f1eeccb92d3a7b6f98f41
pristine_git_object: 55ef5595a50468b3e804572de617b4f1841f63df
docs/models/finalizelockresponsebody2.md:
id: 1f63ce3c16b7
last_write_checksum: sha1:50a966546322be9fe9ff69501475ab5bcf3a8fd5
pristine_git_object: d9f353139f906484151b640e47bad5ea8ecf9973
docs/models/flag1.md:
id: 56f975d669ad
last_write_checksum: sha1:ca496d470e0acdd8df83f3fcee95eca2837ad30c
pristine_git_object: c695258fdedb1181c861c76b1b700256500d9f51
docs/models/flag2.md:
id: aa1218c7a1e0
last_write_checksum: sha1:0636b6870523b9a845600bb151bee2d8e4cf2e0b
pristine_git_object: e450159e86d7b6a8e2237cd18e773e15e938926a
docs/models/flagdisplay1.md:
id: 32b9b0aa35f9
last_write_checksum: sha1:50d2db1f789681afb6da45daca2ab82a3deb1031
pristine_git_object: 932879cd451bb43360fc15ab44ae70a155c796bc
docs/models/flagdisplay2.md:
id: 65cd0bc1efa0
last_write_checksum: sha1:f8f426b3ce0d4f6b5ce26c0db04161f01ba387a2
pristine_git_object: ab22b6bd78834478298fd6817dd52753dc8a7ca3
docs/models/flags.md:
id: cb7c8de0dda0
last_write_checksum: sha1:d0860152f748b33f0bcef36c3287e6826ccc4a30
pristine_git_object: 7da619a9e958f42269a6a8c54394f6eb6fa390c3
docs/models/flagtype.md:
id: aa8e2212e678
last_write_checksum: sha1:5938613e76e9a428845bae6670d23526ffdb6245
pristine_git_object: b4825143b8c900e99b90deb32551f61502cf3b5d
docs/models/flagtype1.md:
id: a28ecd1eaf04
last_write_checksum: sha1:6aea05cd73ef262ecf70a9ad76dce9259469c7bf
pristine_git_object: 6761a49bd75238535ecf53685c7122ec36118918
docs/models/flagtype2.md:
id: 5beac8bbc73a
last_write_checksum: sha1:996772277138ae0ef807cc6544ce0918cf0c4329
pristine_git_object: b59a4c86a1798536ce63d6f5c7c8479270c63221
docs/models/freetrial.md:
id: dc73eb37daef
last_write_checksum: sha1:0f8ee227ca42edfb64780b836e99518a340e3d82
pristine_git_object: 589d1bb1e1cd47c62a789a8cff85528280df7e94
docs/models/freetrialduration.md:
id: afd918f70308
last_write_checksum: sha1:858ad3ce1678634743a1c702062787acadcda18b
pristine_git_object: b98731904496a288b0e3b0ac3574b5d26863f374
docs/models/freetrialduration1.md:
id: 9535ffba9b82
last_write_checksum: sha1:982589e0fab2e00c48ecdbdd9ee584742732320d
pristine_git_object: 2bd123723ee87d92397c0d622ab52f2feb38d3fc
docs/models/freetrialduration2.md:
id: 5ec9640d57e6
last_write_checksum: sha1:79f1f1081db068eba5dba5d0f4523943f1d2dc20
pristine_git_object: bfc739646438fdfc801bd823d6e31cc045dfff09
docs/models/freetrialrequest.md:
id: b3ecac09ef21
last_write_checksum: sha1:169d32a309bd509f208a93cbd32c494a5fb86040
@@ -1183,6 +1275,10 @@ trackedFiles:
id: 5899381c0e82
last_write_checksum: sha1:9762f5d1ab3cbd4d570c1b403171d3b7f3df6128
pristine_git_object: 444e142954037161bd4aa63e788a71f75067a871
docs/models/getplanconfig.md:
id: 30c08be31079
last_write_checksum: sha1:96ded56d99919ee6a9525337e4424553b753f7aa
pristine_git_object: 7679cabf52f85c8d628d24d3c0cfecf6b63cf4e1
docs/models/getplancreditschema.md:
id: f70b7a9fd404
last_write_checksum: sha1:1ad49c99400c9f9c735bf18686e2c7f3a0715803
@@ -1261,8 +1357,8 @@ trackedFiles:
pristine_git_object: 893f1399489630534ab838e9507aa9ee95d98633
docs/models/getplanresponse.md:
id: 2b0a620fdbb6
last_write_checksum: sha1:b3bc1ce22f83a8b78e3bcbd75e364c5615974584
pristine_git_object: fa70cd1a06598e2ae686a0b00c23021085cf8157
last_write_checksum: sha1:55015bb4574d27aec244a3a3dc274e097d605df9
pristine_git_object: 3b6780549094958e2712f9ffbf3222a6346e8acd
docs/models/getplanrollover.md:
id: aa86ef4ae999
last_write_checksum: sha1:c05cca9b8a8529911ec695f60c02d96f397f7be7
@@ -1279,10 +1375,14 @@ trackedFiles:
id: afbdf26f0f4b
last_write_checksum: sha1:6d5dfd04c5d95c235f56eb23e31f497c9ed91247
pristine_git_object: 7390b496108568e19aba42d36c5c3b508e3d42b3
docs/models/includedusage.md:
id: e844c6f90fe1
last_write_checksum: sha1:f45eadc2eb0f9f2543fcfd3b0d671c8fc9e1c5a8
pristine_git_object: 6af710e8393ec0d5bd29b7bc2969174b69548d55
docs/models/includedusage1.md:
id: 7ceb62e48016
last_write_checksum: sha1:9a7a940ec67dc041a2fb2064f8e5b433c9cb12ed
pristine_git_object: 08cab19c3c6d0a860e2fc170d623f3f41887fdb7
docs/models/includedusage2.md:
id: a866162d4224
last_write_checksum: sha1:6e8b4bdfa39d20c43de5bfe3f4d40c2e4e63405f
pristine_git_object: d113b4a74c800629028857f59b3367aefb73dfee
docs/models/intent.md:
id: a4a6fa8818f7
last_write_checksum: sha1:9079fedc03e6b5c3469c752774a972f27bdab857
@@ -1451,6 +1551,10 @@ trackedFiles:
id: e3bc081b1871
last_write_checksum: sha1:fe30367f3d3dc7caa417ffb1cb7eb41a233892be
pristine_git_object: 0a311a1a9fbd103a9796c9c96b056b48a17f593b
docs/models/listplansconfig.md:
id: 57d9a861571a
last_write_checksum: sha1:062922ae98ad6e9715911f3c38885e04618dd2c2
pristine_git_object: eccd70f762a16d10a9986cfc90370ae9f4e0639e
docs/models/listplanscreditschema.md:
id: 8f4524699ea8
last_write_checksum: sha1:8264d803e53a657b5077baf27f79e86b9aca6c1d
@@ -1501,8 +1605,8 @@ trackedFiles:
pristine_git_object: 714e47a457c8f29a67c4d007b9fd0aafd6627f86
docs/models/listplanslist.md:
id: 6e9f463afde9
last_write_checksum: sha1:3ab59a7b8cfe0aefce5990df247f1ec9b13611aa
pristine_git_object: 5fb65f58778c5a3604b3a88e7d1a0fe59650d903
last_write_checksum: sha1:12a22f7a98b85bcf87cde5768864e70027d376ad
pristine_git_object: bc25a2bb9d3368ca435fa8687e1cf323491b3340
docs/models/listplansparams.md:
id: 585ca32cddb9
last_write_checksum: sha1:ea218ec174d08b0a4ce981e60dbc40f311e0fc43
@@ -1709,12 +1813,16 @@ trackedFiles:
pristine_git_object: e837aa4e197e0d89a5af163eb58863349124e4de
docs/models/plan.md:
id: 900c4149ef4b
last_write_checksum: sha1:6098a0a6bb1c128694303fe27ad5b93dd9cab08a
pristine_git_object: daea8b231352c8ae8fc3d23ab739ed3ce60df632
last_write_checksum: sha1:7748f60aa0c9b0420a08de7b5eafaa4ccb10a5d2
pristine_git_object: b14254b081612e7aad15c005b639f0889b1839f8
docs/models/planbillingmethod.md:
id: ac90cee4f6c5
last_write_checksum: sha1:1a7f86d46499a4f95ed7de36d79c3ff227baf98f
pristine_git_object: 8e4f8a8d96a6a110275c7b80ab0b93dfc9cd3ebf
docs/models/planconfig.md:
id: 430c99cf9921
last_write_checksum: sha1:34c52c0e8a788e4c2f2e3aafa139c66c93c0c2ba
pristine_git_object: b26fb109f6682d43492a10becfddc3d831d0ec9d
docs/models/plancreditschema.md:
id: 510cd9d4f287
last_write_checksum: sha1:3929c72df37848348916c755926dd1de7c252b3e
@@ -1783,10 +1891,14 @@ trackedFiles:
id: 4c86df78e60a
last_write_checksum: sha1:5246ebf75c009119cbfcd501cdeb659e9f3c6786
pristine_git_object: 5add1a3cab3d01077452a4df8d9037c6279da319
docs/models/preview.md:
id: ca71b601ef12
last_write_checksum: sha1:40aa929c88e329add6e7ca46d7a8a2035a292320
pristine_git_object: 30f2fde544d6369ffb95e242d86285de93ba6877
docs/models/preview1.md:
id: 203e34d3c393
last_write_checksum: sha1:b9b1ce18639c5e83d9eb6bd83e1d99bd683291cd
pristine_git_object: ac258d817302c6d7f841b006ff7a7931cfe13df7
docs/models/preview2.md:
id: 96d6fae57a72
last_write_checksum: sha1:4839487a437486dbc9567dec57a136234230ddc9
pristine_git_object: 9ad954e94d0ec60a5def86f162fe804fad115518
docs/models/previewattachattachdiscount.md:
id: a1bb4d726785
last_write_checksum: sha1:09171167e4f41a512c1ddeea51aaa4a8209f9b15
@@ -2327,26 +2439,46 @@ trackedFiles:
id: e77acb454265
last_write_checksum: sha1:d202a60f54527df1cb36f42c82ae3bc09b62709c
pristine_git_object: be1d53bff0a2f0e14f63dea5b4fd07fefba1fd1e
docs/models/product.md:
id: c91436bbe13a
last_write_checksum: sha1:fd290664e9d7488f6a9fe84f5770a4d052811bd6
pristine_git_object: b2b4090528d8f4f0dbeabeef7b6de34023014b3b
docs/models/productdisplay.md:
id: b771ae8c7ea7
last_write_checksum: sha1:1c08ac7aff28d817c0a0f62a581c3d2de0d5f63e
pristine_git_object: 22e14f97a475eec1b273ba6e10063f0e777aa6b2
docs/models/productscenario.md:
id: ab3587084a21
last_write_checksum: sha1:4090a2b39d577ba7ecd10ed04db44bdac397c084
pristine_git_object: 841951cf130f1c9888da04071cb3242024ed21ca
docs/models/producttype.md:
id: 2c019befb41d
last_write_checksum: sha1:978c5475fae093e6622a67c300c4caa3ca4f5323
pristine_git_object: 9bdbe295958794c930d6056b4ecc8f1c448323cf
docs/models/properties.md:
id: 78b1b1d1b631
last_write_checksum: sha1:05f671c654e750d3433fd757475bb830b2dcf0e8
pristine_git_object: e0cb2a68e82dc623b85a3c61b3cc6e00d219512e
docs/models/product1.md:
id: 880ca8ae9886
last_write_checksum: sha1:d6c959243c6b293682d7faed288627aca8b42712
pristine_git_object: 555d0ec5c226b413aebb505ac316c7a14cf1fc4b
docs/models/product2.md:
id: 6262b044d234
last_write_checksum: sha1:d650f24a1fee7d7b93f1f3d1f0c3a9b727b5f111
pristine_git_object: c1b81dedf250c04788acef9878b406b03b3747cc
docs/models/productdisplay1.md:
id: b5bdefcde7af
last_write_checksum: sha1:4cbda567685f39d23b4a83d5a9bc20c4bf2fa21b
pristine_git_object: f3444e78655c30e33da40a161e1c49d7c521091d
docs/models/productdisplay2.md:
id: e26b9d85efee
last_write_checksum: sha1:5098930c9f68698ce3d5fe3908933adff97fb26e
pristine_git_object: 63f96b99a45a79096ba98ea391d53dfd0f024714
docs/models/productscenario1.md:
id: be02b2824767
last_write_checksum: sha1:e7e5a8d90f9842e0b4bb8fbc1add7d45fd3dbe9a
pristine_git_object: 05b283366f3ca4378d1064614d5ad4ffd05f84cf
docs/models/productscenario2.md:
id: cd2037004071
last_write_checksum: sha1:f92baa56055e04b83769e10436164272d2de1475
pristine_git_object: 40b2cd7a3388dc58bc4d66417a2e73818a6f7dbd
docs/models/producttype1.md:
id: e0dd53b19892
last_write_checksum: sha1:9dfa73f469c85cbad98052ba0316832420087a62
pristine_git_object: 9aaccc6d7bcc0f25063f0a3bc6fca373a608e038
docs/models/producttype2.md:
id: ae894ce9a5a8
last_write_checksum: sha1:283f530bb62921ffc13dc1d6b5fa2ead3ac45d1b
pristine_git_object: e275127be2daabf150cb8cd0b30d91e12560d8b9
docs/models/properties1.md:
id: d1dd750f2ed3
last_write_checksum: sha1:04ff6f4e08b9ab062ee696c12932926e3902a916
pristine_git_object: 6cb155bd48cd5f90a256b7526fa4ce23425b241d
docs/models/properties2.md:
id: 3ada091965bd
last_write_checksum: sha1:e0d1d6b0cbf5c6eb202a0e3fcb2a197cca500388
pristine_git_object: 6b0ee07d823098c850632ebaae8f35fa23980d12
docs/models/purchase.md:
id: f872769b6939
last_write_checksum: sha1:b250603c69b08d953b6f2dde179eec8606d27ef9
@@ -2383,10 +2515,14 @@ trackedFiles:
id: 338992fe95d5
last_write_checksum: sha1:224b80dbd92ef68bd770b3a80bf937ac43733556
pristine_git_object: 8b34bbb0cd357bcc79eb45b0e7f4ce9b6399f846
docs/models/scenario.md:
id: e3aad8ab5efa
last_write_checksum: sha1:6ce9a6e38f0a02622ae273bef4c8a6daa91794fc
pristine_git_object: b1f3a49d0d84ad314bb2103a706454e1314edc06
docs/models/scenario1.md:
id: 46a671d6aaa0
last_write_checksum: sha1:b12d6dabe5eb22a82e63c72f97b268a6f9516e8f
pristine_git_object: 0871c0cf209022c2a17de861b7948353b0ef0954
docs/models/scenario2.md:
id: c2fda7f528b7
last_write_checksum: sha1:3db048ac30765f87c795aa59011ee93c2fbd2497
pristine_git_object: e0b4637eb68430769deed470af4e6e509c338df1
docs/models/security.md:
id: 452e4d4eb67a
last_write_checksum: sha1:64787360e0bddbe1d2d2ede91992fa1a27c15a0e
@@ -2529,8 +2665,16 @@ trackedFiles:
pristine_git_object: 55d736bf4922089b3156933234268f3bfacb3b78
docs/models/trackresponse.md:
id: 0b465752b71b
last_write_checksum: sha1:37b7e626597751d93bde3c9e2047bd018bcce2d5
pristine_git_object: 6d87707e85629d47a486076ba978d5b8dcbf9191
last_write_checksum: sha1:bf22d01dbadd9dfab8870a13ab4106d7b4b6ff6c
pristine_git_object: b548eba246cbd9768b27415845b1fe14bd83a53e
docs/models/trackresponsebody1.md:
id: 5433fe0529e2
last_write_checksum: sha1:3d680a6c081035885fbfa2918a0537559e5cd505
pristine_git_object: 6f82fbbeb2dbe8c0deedb234fc8b122640060338
docs/models/trackresponsebody2.md:
id: 9687c70be905
last_write_checksum: sha1:9cb78d68a63641993bd50334d4bc464cbb38b777
pristine_git_object: 6dfb1e108b35f12c773cb4091d0c561c13596d13
docs/models/trialsused.md:
id: d3a87e402a87
last_write_checksum: sha1:e94b335fde33fa867d83a085af54e56e003b468d
@@ -2815,6 +2959,14 @@ trackedFiles:
id: 1f6a0cc6dd9d
last_write_checksum: sha1:1daaa2ce4ac4ec4dee50322a96f784fb93c7bb55
pristine_git_object: b374ca2fe3d81b9837259cbd754be60742de24e9
docs/models/updateplanconfigrequest.md:
id: 80ba7d5168b1
last_write_checksum: sha1:315b7bddd1a8af9348cf8677143676ba503b2c1a
pristine_git_object: 32ef9bc0ff5834a9fc7ffce5593a4bcc6c07be46
docs/models/updateplanconfigresponse.md:
id: 5304569a9222
last_write_checksum: sha1:f368827d2c9a5b3afe9de5c09b6b1d346bae594d
pristine_git_object: da957864b3e8eceeb730374d39df9d651dfe4106
docs/models/updateplancreditschema.md:
id: 00c090e1bf26
last_write_checksum: sha1:38829677cb91237900845a612c71c5341cecb59a
@@ -2889,8 +3041,8 @@ trackedFiles:
pristine_git_object: 0c2d7187551a45b5d678265295d3521f5286c11c
docs/models/updateplanparams.md:
id: ca9b432d1066
last_write_checksum: sha1:3626993a9b2e8d98b67aeb5b39ae321e6bb90f3a
pristine_git_object: 2e372097207c11b918831be0892feada7c3431c7
last_write_checksum: sha1:225a0b5951be0fb79bfb5d879f42e26d22be4130
pristine_git_object: 5d8f7d9d4c420b32d2b18d9268ab80e07fed78eb
docs/models/updateplanplanitem.md:
id: c4cfe67e1766
last_write_checksum: sha1:b7569bd3091d19bb02b4c231ee1d09d7a704fe0c
@@ -2941,8 +3093,8 @@ trackedFiles:
pristine_git_object: 2b4c66a3228472b73baa794aa68198ac5ecd0195
docs/models/updateplanresponse.md:
id: 1e9b63fce660
last_write_checksum: sha1:834d9eb74081052e10a1eb48f97bdc9179c4b1aa
pristine_git_object: 15046100d10460c95660651bbad3d87dea398ca5
last_write_checksum: sha1:c8598b6f5fe339f3a869367989ad65226fe0cde5
pristine_git_object: 5242964c1ffda11766a01a9519eb006b7fe02029
docs/models/updateplanrolloverrequest.md:
id: 9b30d0aaa790
last_write_checksum: sha1:d1f31d01c74db299c9ddae8c32acf06557264694
@@ -2979,10 +3131,14 @@ trackedFiles:
id: df1b06618f8b
last_write_checksum: sha1:634719e86ea2e447c7941ab3f97e73085fec5a9c
pristine_git_object: 33df96928b93214a0b58a3e2f8ef16b918814385
docs/models/usagemodel.md:
id: 1e12a2a8fc52
last_write_checksum: sha1:0aae39e704f2d84d1ca66c0ff3e0bbdd5dba61cf
pristine_git_object: 1c478ab31dc35e34bc4fc7eee7c0078f31ceb35b
docs/models/usagemodel1.md:
id: 864df93491f4
last_write_checksum: sha1:827dcdb8d779f182baee1f360a876b65a9117c87
pristine_git_object: 41ae4e03289340978b7065c4ff614595e51ae3a0
docs/models/usagemodel2.md:
id: 65400fe8ee98
last_write_checksum: sha1:414d12034e1f85247a15bda7059851677f7e7d93
pristine_git_object: fd7013f50fb7fb379249d9675fb4430be17734a6
docs/models/utils/retryconfig.md:
id: 4343ac43161c
last_write_checksum: sha1:562c0f21e308ad10c27f85f75704c15592c6929d
@@ -3017,8 +3173,8 @@ trackedFiles:
pristine_git_object: f15f599301140e1f7af1a6e1c9462464b71a4437
docs/sdks/plans/README.md:
id: 2d8c741fff57
last_write_checksum: sha1:0f0af70299bc12978b582541b95142bb4f803a51
pristine_git_object: 6c88f9eaa6d0307429509dbac6b2cc27fe0a70b9
last_write_checksum: sha1:96bf852186e6fd82813455c497f14c930aa8e82d
pristine_git_object: fecddf6bbc7ff66c74a2165dfca7d86ddba4a9de
docs/sdks/referrals/README.md:
id: 50b71f597f20
last_write_checksum: sha1:583c44cd70208e8ea9e286b54a5b82f837c8a4be
@@ -3061,8 +3217,8 @@ trackedFiles:
pristine_git_object: 0628b046b07d0182a12d174657e7cd10b0afbee1
src/autumn_sdk/balances.py:
id: 0a15be654dad
last_write_checksum: sha1:edc265ccebf34f6505a500dc0bdf19369d934367
pristine_git_object: d78893a6866c975556c16fd01e348c9f423109c6
last_write_checksum: sha1:a80cd6dff1eb264c51674962c6d459cf7d692211
pristine_git_object: 930c70fbcf914339d9357542673c070deb45655c
src/autumn_sdk/basesdk.py:
id: 8c9c35fe744d
last_write_checksum: sha1:f0ea7a4f9bd2261c88a1a5e20e7e734eb2e2e289
@@ -3113,8 +3269,8 @@ trackedFiles:
pristine_git_object: 89560b566073785535643e694c112bedbd3db13d
src/autumn_sdk/models/__init__.py:
id: bcf3802243ff
last_write_checksum: sha1:629eca8bca35625d3ce2dc8807c7e13ed927db22
pristine_git_object: 7477478dd4fd5db160cb6cbd0cfbe065d9a8c27c
last_write_checksum: sha1:beabf5b885ffc26f4f81a5d43c4797c4972d59ee
pristine_git_object: ec229380082a82f82fdff81097ceb1a933656623
src/autumn_sdk/models/aggregateeventsop.py:
id: 01321099f2a5
last_write_checksum: sha1:b3f1de2b9cf9a0365863f0e6cf9c10e793f52a42
@@ -3133,8 +3289,8 @@ trackedFiles:
pristine_git_object: 816c3b74b33b1e0fccd291d0f5ab65cee0a9c09c
src/autumn_sdk/models/checkop.py:
id: 31c2f84723c6
last_write_checksum: sha1:9302e9dec9331bb7d5b119391193ca05846f53eb
pristine_git_object: 0dc0e1759aa5ffaaf41922594943de1c29a7461c
last_write_checksum: sha1:461aa8fedefd23fa54a80e8acc8ce738725289c5
pristine_git_object: 034c82bab85f15d36d5b97854a79338cdffe3dbb
src/autumn_sdk/models/createbalanceop.py:
id: 27daf4da75bf
last_write_checksum: sha1:b6da2d7778cd4b98f0e6612810726512203eb1de
@@ -3149,8 +3305,8 @@ trackedFiles:
pristine_git_object: 35a43e4dd6ea06d0ffbbde5ffaead959ce207632
src/autumn_sdk/models/createplanop.py:
id: 077e6c7db2ad
last_write_checksum: sha1:dc2fe307f4fbe3eaccf27f9786e8cdc7eb9acb74
pristine_git_object: 08653b450ec57b802c989823a8015aacc77d360e
last_write_checksum: sha1:2a61e45a84d8095c6ae72ac3c892d75e1ed0c492
pristine_git_object: 7f856826555d47d71d0400dac57a812343e9aba4
src/autumn_sdk/models/createreferralcodeop.py:
id: 2f5f7b136c39
last_write_checksum: sha1:aee36f911153fc0dab9fd096dbb82d1083a61d28
@@ -3185,8 +3341,8 @@ trackedFiles:
pristine_git_object: 8399927609dfaba9ca603a77e3f85ada3861d2f2
src/autumn_sdk/models/finalizelockop.py:
id: 8ae2484b0916
last_write_checksum: sha1:e8db3e126ea7a98e56c992067ad838474aaaea90
pristine_git_object: 5ca71e3f0ae7d38ab7d8c37d6a1dc3e4a6b04ef5
last_write_checksum: sha1:50898394734e6e9a366363ef64dd6ac917d61ad2
pristine_git_object: d7744bc3f223baddeed24f3e14315d9f6da0b84d
src/autumn_sdk/models/getentityop.py:
id: 6a624594b41f
last_write_checksum: sha1:2cc7bfc4ad25eb82d3563ee469e08f336e0af982
@@ -3201,8 +3357,8 @@ trackedFiles:
pristine_git_object: 94a67732b0583b0df4e48ff6a4e3a28965ecfcd5
src/autumn_sdk/models/getplanop.py:
id: 590fb77ac88d
last_write_checksum: sha1:9cb5b3c375a197f728dc809297fceba318b4acc8
pristine_git_object: 8a670ec1dd591fdfc8ffe19fe54a402466391996
last_write_checksum: sha1:383238b15583a631ec9331155c42fb334c40be27
pristine_git_object: 9a97dbea6cfce097ee20542b6d49891c99d4f1ac
src/autumn_sdk/models/internal/__init__.py:
id: 2906fe7f2cde
last_write_checksum: sha1:1905b58b74ecc52346d8f5c24ded2b6d6e1dad4a
@@ -3225,8 +3381,8 @@ trackedFiles:
pristine_git_object: 710a3e36719b112a82fa98903073bb090f72c2ec
src/autumn_sdk/models/listplansop.py:
id: fdf892c403f4
last_write_checksum: sha1:4b317d6b7e465724b66783785d412f75a2c70f80
pristine_git_object: f2e08e6d24a51cabf49246d139479e6f460936f4
last_write_checksum: sha1:0db43cdf89226124955a5101a9425c95e5deeeaa
pristine_git_object: 4cd6eec90079ce568fbdca3ac9667812be1c536f
src/autumn_sdk/models/multiattachop.py:
id: dfdf7952c870
last_write_checksum: sha1:46e43ce9cd5924cc6a32651c28328050cca539ce
@@ -3237,8 +3393,8 @@ trackedFiles:
pristine_git_object: 8383509aa89e0c11988baef8e424f5ae682d5c8e
src/autumn_sdk/models/plan.py:
id: f85c4e07540d
last_write_checksum: sha1:a3fc4bdfc6dd8ca185287df5e2e664f9cbee2d9c
pristine_git_object: 4fc3992c96cf04ab1b6c41350ba662e371a2d5be
last_write_checksum: sha1:2894e5beecd256471bb46db0b50aa1381f6e54df
pristine_git_object: d8fe9290927c4d94e23fc4311f72e94b90e4e296
src/autumn_sdk/models/previewattachop.py:
id: 2b361be4bfa8
last_write_checksum: sha1:07547a8e750f8b392f1bb733afc330c799f36931
@@ -3265,8 +3421,8 @@ trackedFiles:
pristine_git_object: 4d9cef97f042a02fc1ca351768dbfe04587d97fd
src/autumn_sdk/models/trackop.py:
id: 2a744315e781
last_write_checksum: sha1:e9f1d9c4bbfc47eb5c942f8cfca4a760818bf79d
pristine_git_object: e3581f4139bb985c5c5c058754288bc340d022d1
last_write_checksum: sha1:14a3673c9d5840cc222309d54e398e31929dcbca
pristine_git_object: ae07cc3bff7029034f684d33e556ff3264958608
src/autumn_sdk/models/updatebalanceop.py:
id: cd80d90d4cae
last_write_checksum: sha1:7b6b881cc82b937e93cfd58f17d7f3d83bdb39f1
@@ -3285,12 +3441,12 @@ trackedFiles:
pristine_git_object: 9507c8601dca2cefbc0b8b7d423a38a8272fe580
src/autumn_sdk/models/updateplanop.py:
id: 753ddf45ca40
last_write_checksum: sha1:f094e05c9b9d43c4602ca6ab74f752313681fd4c
pristine_git_object: bcbc6f6d46f9058a33ccd0262c81109d34762fe6
last_write_checksum: sha1:a0f57e9ed1f28faff5debaa8aa1b60768aa68ee0
pristine_git_object: 7afbc58a0709f37570f94ad4ee2831f3e99b6750
src/autumn_sdk/plans.py:
id: cf1ebabb687c
last_write_checksum: sha1:44a5f21bcc8df9df4590ec75c3296e7c0b726323
pristine_git_object: 2a4f4a66177a280259f1dd5c794f2684155781ef
last_write_checksum: sha1:1baa525a65489921c371dede0cd70a3dd5fda07e
pristine_git_object: 5942adc74d36e37c8fe69cd47a66ff05b9f3eb1a
src/autumn_sdk/py.typed:
id: 9b75cee1c007
last_write_checksum: sha1:8efc425ffe830805ffcc0f3055871bdcdc542c60
@@ -3301,8 +3457,8 @@ trackedFiles:
pristine_git_object: 4fde94822b61d8a600b721fcbda99116c0e7a6ad
src/autumn_sdk/sdk.py:
id: 9e733b372628
last_write_checksum: sha1:5521b091986e3507f9dc990c9333412cb05e58c6
pristine_git_object: 9b935d005c18378046c9209d5982fd4a8234fbcb
last_write_checksum: sha1:539d7a68e17d782aaa17185c27d43322f572d4d2
pristine_git_object: d1078f8612cc9f9a0dbb25eed621ba8974a22a7a
src/autumn_sdk/sdkconfiguration.py:
id: e65df2e44fc0
last_write_checksum: sha1:233b710dff940202f00e389e0c8fa6a33f6ae7b4
@@ -3555,7 +3711,7 @@ examples:
application/json: {}
responses:
"200":
application/json: {"list": [{"id": "pro", "name": "Pro Plan", "description": null, "group": null, "version": 1, "add_on": true, "auto_enable": false, "price": {"amount": 10, "interval": "month", "display": {"primary_text": "<value>"}}, "items": [{"feature_id": "<id>", "included": 100, "unlimited": false, "reset": {"interval": "month"}, "price": {"amount": 0.5, "interval": "month", "billing_units": 4969.56, "billing_method": "usage_based", "max_purchase": 5540.05}, "display": {"primary_text": "<value>"}}, {"feature_id": "<id>", "included": 0, "unlimited": false, "reset": null, "price": {"amount": 10, "interval": "month", "billing_units": 7445.4, "billing_method": "usage_based", "max_purchase": 66.27}, "display": {"primary_text": "<value>"}}], "created_at": 3936.86, "env": "sandbox", "archived": false, "base_variant_id": "<id>"}]}
application/json: {"list": [{"id": "pro", "name": "Pro Plan", "description": null, "group": null, "version": 1, "add_on": true, "auto_enable": false, "price": {"amount": 10, "interval": "month", "display": {"primary_text": "<value>"}}, "items": [{"feature_id": "<id>", "included": 100, "unlimited": false, "reset": {"interval": "month"}, "price": {"amount": 0.5, "interval": "month", "billing_units": 4969.56, "billing_method": "usage_based", "max_purchase": 5540.05}, "display": {"primary_text": "<value>"}}, {"feature_id": "<id>", "included": 0, "unlimited": false, "reset": null, "price": {"amount": 10, "interval": "month", "billing_units": 7445.4, "billing_method": "usage_based", "max_purchase": 66.27}, "display": {"primary_text": "<value>"}}], "created_at": 3936.86, "env": "sandbox", "archived": false, "base_variant_id": "<id>", "config": {"ignore_past_due": false}}]}
previewAttach:
speakeasy-default-preview-attach:
parameters:
@@ -3666,6 +3822,8 @@ examples:
responses:
"200":
application/json: {"allowed": true, "customer_id": "cus_123", "entity_id": null, "required_balance": 1, "balance": {"feature_id": "messages", "granted": 100, "remaining": 72, "usage": 28, "unlimited": false, "overage_allowed": false, "max_purchase": null, "next_reset_at": 1773851121437, "breakdown": [{"id": "cus_ent_39qmLooixXLAqMywgXywjAz96rV", "plan_id": "pro_plan", "included_grant": 100, "prepaid_grant": 0, "remaining": 72, "usage": 28, "unlimited": false, "reset": {"interval": "month", "resets_at": 1773851121437}, "price": null, "expires_at": null}]}, "flag": {"id": "cus_ent_39qmLooixXLAqMywgXywjAz96rV", "plan_id": "pro_plan", "expires_at": null, "feature_id": "dashboard"}}
"202":
application/json: {"allowed": true, "customer_id": "cus_123", "entity_id": null, "required_balance": 1, "balance": {"feature_id": "messages", "granted": 100, "remaining": 72, "usage": 28, "unlimited": false, "overage_allowed": false, "max_purchase": null, "next_reset_at": 1773851121437, "breakdown": [{"id": "cus_ent_39qmLooixXLAqMywgXywjAz96rV", "plan_id": "pro_plan", "included_grant": 100, "prepaid_grant": 0, "remaining": 72, "usage": 28, "unlimited": false, "reset": {"interval": "month", "resets_at": 1773851121437}, "price": null, "expires_at": null}]}, "flag": {"id": "cus_ent_39qmLooixXLAqMywgXywjAz96rV", "plan_id": "pro_plan", "expires_at": null, "feature_id": "dashboard"}}
track:
speakeasy-default-track:
parameters:
@@ -3676,6 +3834,8 @@ examples:
responses:
"200":
application/json: {"customer_id": "cus_123", "value": 1, "balance": {"feature_id": "messages", "granted": 100, "remaining": 72, "usage": 28, "unlimited": false, "overage_allowed": false, "max_purchase": null, "next_reset_at": 1773851121437, "breakdown": [{"id": "cus_ent_39qmLooixXLAqMywgXywjAz96rV", "plan_id": "pro_plan", "included_grant": 100, "prepaid_grant": 0, "remaining": 72, "usage": 28, "unlimited": false, "reset": {"interval": "month", "resets_at": 1773851121437}, "price": null, "expires_at": null}]}}
"202":
application/json: {"customer_id": "cus_123", "value": 1, "balance": {"feature_id": "messages", "granted": 100, "remaining": 72, "usage": 28, "unlimited": false, "overage_allowed": false, "max_purchase": null, "next_reset_at": 1773851121437, "breakdown": [{"id": "cus_ent_39qmLooixXLAqMywgXywjAz96rV", "plan_id": "pro_plan", "included_grant": 100, "prepaid_grant": 0, "remaining": 72, "usage": 28, "unlimited": false, "reset": {"interval": "month", "resets_at": 1773851121437}, "price": null, "expires_at": null}]}}
eventsList:
speakeasy-default-events-list:
parameters:
@@ -3823,7 +3983,7 @@ examples:
application/json: {"plan_id": "free_plan", "group": "", "name": "Free", "add_on": false, "auto_enable": true, "items": [{"feature_id": "messages", "included": 100, "reset": {"interval": "month"}}]}
responses:
"200":
application/json: {"id": "pro", "name": "Pro Plan", "description": null, "group": null, "version": 1, "add_on": false, "auto_enable": false, "price": {"amount": 10, "interval": "month", "display": {"primary_text": "<value>"}}, "items": [{"feature_id": "<id>", "included": 100, "unlimited": false, "reset": {"interval": "month"}, "price": {"amount": 0.5, "interval": "month", "billing_units": 4655.71, "billing_method": "prepaid", "max_purchase": 8104.69}, "display": {"primary_text": "<value>"}}, {"feature_id": "<id>", "included": 0, "unlimited": false, "reset": null, "price": {"amount": 10, "interval": "month", "billing_units": 5104.62, "billing_method": "prepaid", "max_purchase": null}, "display": {"primary_text": "<value>"}}], "created_at": 1016.83, "env": "sandbox", "archived": false, "base_variant_id": "<id>"}
application/json: {"id": "pro", "name": "Pro Plan", "description": null, "group": null, "version": 1, "add_on": false, "auto_enable": false, "price": {"amount": 10, "interval": "month", "display": {"primary_text": "<value>"}}, "items": [{"feature_id": "<id>", "included": 100, "unlimited": false, "reset": {"interval": "month"}, "price": {"amount": 0.5, "interval": "month", "billing_units": 4655.71, "billing_method": "prepaid", "max_purchase": 8104.69}, "display": {"primary_text": "<value>"}}, {"feature_id": "<id>", "included": 0, "unlimited": false, "reset": null, "price": {"amount": 10, "interval": "month", "billing_units": 5104.62, "billing_method": "prepaid", "max_purchase": null}, "display": {"primary_text": "<value>"}}], "created_at": 1016.83, "env": "sandbox", "archived": false, "base_variant_id": "<id>", "config": {"ignore_past_due": false}}
getPlan:
speakeasy-default-get-plan:
parameters:
@@ -3833,7 +3993,7 @@ examples:
application/json: {"plan_id": "pro_plan"}
responses:
"200":
application/json: {"id": "pro", "name": "Pro Plan", "description": null, "group": null, "version": 1, "add_on": true, "auto_enable": false, "price": {"amount": 10, "interval": "month", "display": {"primary_text": "<value>"}}, "items": [{"feature_id": "<id>", "included": 100, "unlimited": false, "reset": {"interval": "month"}, "price": {"amount": 0.5, "interval": "month", "billing_units": 6216.63, "billing_method": "usage_based", "max_purchase": 9351.86}, "display": {"primary_text": "<value>"}}, {"feature_id": "<id>", "included": 0, "unlimited": false, "reset": null, "price": {"amount": 10, "interval": "month", "billing_units": 5235.67, "billing_method": "usage_based", "max_purchase": 9347.74}, "display": {"primary_text": "<value>"}}], "created_at": 1101.73, "env": "sandbox", "archived": false, "base_variant_id": "<id>"}
application/json: {"id": "pro", "name": "Pro Plan", "description": null, "group": null, "version": 1, "add_on": true, "auto_enable": false, "price": {"amount": 10, "interval": "month", "display": {"primary_text": "<value>"}}, "items": [{"feature_id": "<id>", "included": 100, "unlimited": false, "reset": {"interval": "month"}, "price": {"amount": 0.5, "interval": "month", "billing_units": 6216.63, "billing_method": "usage_based", "max_purchase": 9351.86}, "display": {"primary_text": "<value>"}}, {"feature_id": "<id>", "included": 0, "unlimited": false, "reset": null, "price": {"amount": 10, "interval": "month", "billing_units": 5235.67, "billing_method": "usage_based", "max_purchase": 9347.74}, "display": {"primary_text": "<value>"}}], "created_at": 1101.73, "env": "sandbox", "archived": false, "base_variant_id": "<id>", "config": {"ignore_past_due": false}}
updatePlan:
speakeasy-default-update-plan:
parameters:
@@ -3843,7 +4003,7 @@ examples:
application/json: {"plan_id": "pro_plan", "group": "", "name": "Pro Plan (Updated)", "price": {"amount": 15, "interval": "month"}, "archived": false}
responses:
"200":
application/json: {"id": "pro", "name": "Pro Plan", "description": null, "group": null, "version": 1, "add_on": true, "auto_enable": true, "price": {"amount": 10, "interval": "month", "display": {"primary_text": "<value>"}}, "items": [{"feature_id": "<id>", "included": 100, "unlimited": false, "reset": {"interval": "month"}, "price": {"amount": 0.5, "interval": "month", "billing_units": 4113.21, "billing_method": "usage_based", "max_purchase": 5381.55}, "display": {"primary_text": "<value>"}}, {"feature_id": "<id>", "included": 0, "unlimited": false, "reset": null, "price": {"amount": 10, "interval": "month", "billing_units": 3844.43, "billing_method": "prepaid", "max_purchase": 1075.8}, "display": {"primary_text": "<value>"}}], "created_at": 5898.47, "env": "sandbox", "archived": false, "base_variant_id": null}
application/json: {"id": "pro", "name": "Pro Plan", "description": null, "group": null, "version": 1, "add_on": true, "auto_enable": true, "price": {"amount": 10, "interval": "month", "display": {"primary_text": "<value>"}}, "items": [{"feature_id": "<id>", "included": 100, "unlimited": false, "reset": {"interval": "month"}, "price": {"amount": 0.5, "interval": "month", "billing_units": 4113.21, "billing_method": "usage_based", "max_purchase": 5381.55}, "display": {"primary_text": "<value>"}}, {"feature_id": "<id>", "included": 0, "unlimited": false, "reset": null, "price": {"amount": 10, "interval": "month", "billing_units": 3844.43, "billing_method": "prepaid", "max_purchase": 1075.8}, "display": {"primary_text": "<value>"}}], "created_at": 5898.47, "env": "sandbox", "archived": false, "base_variant_id": null, "config": {"ignore_past_due": false}}
deletePlan:
speakeasy-default-delete-plan:
parameters:
@@ -3914,6 +4074,8 @@ examples:
responses:
"200":
application/json: {"success": true}
"202":
application/json: {"success": true}
updateEntity:
speakeasy-default-update-entity:
parameters:

View File

@@ -778,7 +778,9 @@ class Balances(BaseSDK):
)
if utils.match_response(http_res, "200", "application/json"):
return unmarshal_json_response(models.FinalizeLockResponse, http_res)
return unmarshal_json_response(models.FinalizeLockResponseBody1, http_res)
if utils.match_response(http_res, "202", "application/json"):
return unmarshal_json_response(models.FinalizeLockResponseBody2, http_res)
if utils.match_response(http_res, "4XX", "*"):
http_res_text = utils.stream_to_text(http_res)
raise errors.AutumnDefaultError(
@@ -877,7 +879,9 @@ class Balances(BaseSDK):
)
if utils.match_response(http_res, "200", "application/json"):
return unmarshal_json_response(models.FinalizeLockResponse, http_res)
return unmarshal_json_response(models.FinalizeLockResponseBody1, http_res)
if utils.match_response(http_res, "202", "application/json"):
return unmarshal_json_response(models.FinalizeLockResponseBody2, http_res)
if utils.match_response(http_res, "4XX", "*"):
http_res_text = await utils.stream_to_text_async(http_res)
raise errors.AutumnDefaultError(

View File

@@ -158,53 +158,96 @@ if TYPE_CHECKING:
UpdateSubscriptionParamsTypedDict,
)
from .checkop import (
CheckConfig,
CheckConfigTypedDict,
CheckCreditSchema,
CheckCreditSchemaTypedDict,
CheckEnv,
CheckFeature,
CheckFeatureTypedDict,
CheckFreeTrial,
CheckFreeTrialTypedDict,
CheckConfig1,
CheckConfig1TypedDict,
CheckConfig2,
CheckConfig2TypedDict,
CheckCreditSchema1,
CheckCreditSchema1TypedDict,
CheckCreditSchema2,
CheckCreditSchema2TypedDict,
CheckEnv1,
CheckEnv2,
CheckFeature1,
CheckFeature1TypedDict,
CheckFeature2,
CheckFeature2TypedDict,
CheckFreeTrial1,
CheckFreeTrial1TypedDict,
CheckFreeTrial2,
CheckFreeTrial2TypedDict,
CheckGlobals,
CheckGlobalsTypedDict,
CheckInterval,
CheckItem,
CheckItemTypedDict,
CheckInterval1,
CheckInterval2,
CheckItem1,
CheckItem1TypedDict,
CheckItem2,
CheckItem2TypedDict,
CheckLock,
CheckLockTypedDict,
CheckOnDecrease,
CheckOnIncrease,
CheckOnDecrease1,
CheckOnDecrease2,
CheckOnIncrease1,
CheckOnIncrease2,
CheckParams,
CheckParamsTypedDict,
CheckResponse,
CheckResponseBody1,
CheckResponseBody1TypedDict,
CheckResponseBody2,
CheckResponseBody2TypedDict,
CheckResponseTypedDict,
CheckRollover,
CheckRolloverTypedDict,
CheckTierBehavior,
ConfigDuration,
FeatureType,
Flag,
FlagDisplay,
FlagDisplayTypedDict,
FlagType,
FlagTypedDict,
FreeTrialDuration,
IncludedUsage,
IncludedUsageTypedDict,
Preview,
PreviewTypedDict,
Product,
ProductDisplay,
ProductDisplayTypedDict,
ProductScenario,
ProductType,
ProductTypedDict,
Properties,
PropertiesTypedDict,
Scenario,
UsageModel,
CheckRollover1,
CheckRollover1TypedDict,
CheckRollover2,
CheckRollover2TypedDict,
CheckTierBehavior1,
CheckTierBehavior2,
ConfigDuration1,
ConfigDuration2,
FeatureType1,
FeatureType2,
Flag1,
Flag1TypedDict,
Flag2,
Flag2TypedDict,
FlagDisplay1,
FlagDisplay1TypedDict,
FlagDisplay2,
FlagDisplay2TypedDict,
FlagType1,
FlagType2,
FreeTrialDuration1,
FreeTrialDuration2,
IncludedUsage1,
IncludedUsage1TypedDict,
IncludedUsage2,
IncludedUsage2TypedDict,
Preview1,
Preview1TypedDict,
Preview2,
Preview2TypedDict,
Product1,
Product1TypedDict,
Product2,
Product2TypedDict,
ProductDisplay1,
ProductDisplay1TypedDict,
ProductDisplay2,
ProductDisplay2TypedDict,
ProductScenario1,
ProductScenario2,
ProductType1,
ProductType2,
Properties1,
Properties1TypedDict,
Properties2,
Properties2TypedDict,
Scenario1,
Scenario2,
UsageModel1,
UsageModel2,
)
from .createbalanceop import (
CreateBalanceDuration,
@@ -285,6 +328,10 @@ if TYPE_CHECKING:
CreatePlanAttachAction,
CreatePlanBillingMethodRequest,
CreatePlanBillingMethodResponse,
CreatePlanConfigRequest,
CreatePlanConfigRequestTypedDict,
CreatePlanConfigResponse,
CreatePlanConfigResponseTypedDict,
CreatePlanCreditSchema,
CreatePlanCreditSchemaTypedDict,
CreatePlanCustomerEligibility,
@@ -479,6 +526,10 @@ if TYPE_CHECKING:
FinalizeLockGlobals,
FinalizeLockGlobalsTypedDict,
FinalizeLockResponse,
FinalizeLockResponseBody1,
FinalizeLockResponseBody1TypedDict,
FinalizeLockResponseBody2,
FinalizeLockResponseBody2TypedDict,
FinalizeLockResponseTypedDict,
)
from .getentityop import (
@@ -553,6 +604,8 @@ if TYPE_CHECKING:
from .getplanop import (
GetPlanAttachAction,
GetPlanBillingMethod,
GetPlanConfig,
GetPlanConfigTypedDict,
GetPlanCreditSchema,
GetPlanCreditSchemaTypedDict,
GetPlanCustomerEligibility,
@@ -670,6 +723,8 @@ if TYPE_CHECKING:
from .listplansop import (
ListPlansAttachAction,
ListPlansBillingMethod,
ListPlansConfig,
ListPlansConfigTypedDict,
ListPlansCreditSchema,
ListPlansCreditSchemaTypedDict,
ListPlansCustomerEligibility,
@@ -793,6 +848,8 @@ if TYPE_CHECKING:
ItemTypedDict,
Plan,
PlanBillingMethod,
PlanConfig,
PlanConfigTypedDict,
PlanCreditSchema,
PlanCreditSchemaTypedDict,
PlanDurationType,
@@ -1124,6 +1181,10 @@ if TYPE_CHECKING:
TrackParams,
TrackParamsTypedDict,
TrackResponse,
TrackResponseBody1,
TrackResponseBody1TypedDict,
TrackResponseBody2,
TrackResponseBody2TypedDict,
TrackResponseTypedDict,
)
from .updatebalanceop import (
@@ -1257,6 +1318,10 @@ if TYPE_CHECKING:
UpdatePlanBasePriceTypedDict,
UpdatePlanBillingMethodRequest,
UpdatePlanBillingMethodResponse,
UpdatePlanConfigRequest,
UpdatePlanConfigRequestTypedDict,
UpdatePlanConfigResponse,
UpdatePlanConfigResponseTypedDict,
UpdatePlanCreditSchema,
UpdatePlanCreditSchemaTypedDict,
UpdatePlanCustomerEligibility,
@@ -1461,32 +1526,54 @@ __all__ = [
"BinSize",
"Breakdown",
"BreakdownTypedDict",
"CheckConfig",
"CheckConfigTypedDict",
"CheckCreditSchema",
"CheckCreditSchemaTypedDict",
"CheckEnv",
"CheckFeature",
"CheckFeatureTypedDict",
"CheckFreeTrial",
"CheckFreeTrialTypedDict",
"CheckConfig1",
"CheckConfig1TypedDict",
"CheckConfig2",
"CheckConfig2TypedDict",
"CheckCreditSchema1",
"CheckCreditSchema1TypedDict",
"CheckCreditSchema2",
"CheckCreditSchema2TypedDict",
"CheckEnv1",
"CheckEnv2",
"CheckFeature1",
"CheckFeature1TypedDict",
"CheckFeature2",
"CheckFeature2TypedDict",
"CheckFreeTrial1",
"CheckFreeTrial1TypedDict",
"CheckFreeTrial2",
"CheckFreeTrial2TypedDict",
"CheckGlobals",
"CheckGlobalsTypedDict",
"CheckInterval",
"CheckItem",
"CheckItemTypedDict",
"CheckInterval1",
"CheckInterval2",
"CheckItem1",
"CheckItem1TypedDict",
"CheckItem2",
"CheckItem2TypedDict",
"CheckLock",
"CheckLockTypedDict",
"CheckOnDecrease",
"CheckOnIncrease",
"CheckOnDecrease1",
"CheckOnDecrease2",
"CheckOnIncrease1",
"CheckOnIncrease2",
"CheckParams",
"CheckParamsTypedDict",
"CheckResponse",
"CheckResponseBody1",
"CheckResponseBody1TypedDict",
"CheckResponseBody2",
"CheckResponseBody2TypedDict",
"CheckResponseTypedDict",
"CheckRollover",
"CheckRolloverTypedDict",
"CheckTierBehavior",
"ConfigDuration",
"CheckRollover1",
"CheckRollover1TypedDict",
"CheckRollover2",
"CheckRollover2TypedDict",
"CheckTierBehavior1",
"CheckTierBehavior2",
"ConfigDuration1",
"ConfigDuration2",
"CreateBalanceDuration",
"CreateBalanceGlobals",
"CreateBalanceGlobalsTypedDict",
@@ -1559,6 +1646,10 @@ __all__ = [
"CreatePlanAttachAction",
"CreatePlanBillingMethodRequest",
"CreatePlanBillingMethodResponse",
"CreatePlanConfigRequest",
"CreatePlanConfigRequestTypedDict",
"CreatePlanConfigResponse",
"CreatePlanConfigResponseTypedDict",
"CreatePlanCreditSchema",
"CreatePlanCreditSchemaTypedDict",
"CreatePlanCustomerEligibility",
@@ -1717,22 +1808,33 @@ __all__ = [
"EventsListParams",
"EventsListParamsTypedDict",
"ExpiryDurationType",
"FeatureType",
"FeatureType1",
"FeatureType2",
"FinalizeBalanceParams",
"FinalizeBalanceParamsTypedDict",
"FinalizeLockGlobals",
"FinalizeLockGlobalsTypedDict",
"FinalizeLockResponse",
"FinalizeLockResponseBody1",
"FinalizeLockResponseBody1TypedDict",
"FinalizeLockResponseBody2",
"FinalizeLockResponseBody2TypedDict",
"FinalizeLockResponseTypedDict",
"Flag",
"FlagDisplay",
"FlagDisplayTypedDict",
"FlagType",
"FlagTypedDict",
"Flag1",
"Flag1TypedDict",
"Flag2",
"Flag2TypedDict",
"FlagDisplay1",
"FlagDisplay1TypedDict",
"FlagDisplay2",
"FlagDisplay2TypedDict",
"FlagType1",
"FlagType2",
"Flags",
"FlagsTypedDict",
"FreeTrial",
"FreeTrialDuration",
"FreeTrialDuration1",
"FreeTrialDuration2",
"FreeTrialRequest",
"FreeTrialRequestTypedDict",
"FreeTrialTypedDict",
@@ -1801,6 +1903,8 @@ __all__ = [
"GetOrCreateCustomerUsageAlertTypedDict",
"GetPlanAttachAction",
"GetPlanBillingMethod",
"GetPlanConfig",
"GetPlanConfigTypedDict",
"GetPlanCreditSchema",
"GetPlanCreditSchemaTypedDict",
"GetPlanCustomerEligibility",
@@ -1840,8 +1944,10 @@ __all__ = [
"GetPlanStatus",
"GetPlanTierBehavior",
"GetPlanType",
"IncludedUsage",
"IncludedUsageTypedDict",
"IncludedUsage1",
"IncludedUsage1TypedDict",
"IncludedUsage2",
"IncludedUsage2TypedDict",
"Intent",
"Interval",
"IntervalTypedDict",
@@ -1915,6 +2021,8 @@ __all__ = [
"ListFeaturesType",
"ListPlansAttachAction",
"ListPlansBillingMethod",
"ListPlansConfig",
"ListPlansConfigTypedDict",
"ListPlansCreditSchema",
"ListPlansCreditSchemaTypedDict",
"ListPlansCustomerEligibility",
@@ -2024,6 +2132,8 @@ __all__ = [
"OpenCustomerPortalResponseTypedDict",
"Plan",
"PlanBillingMethod",
"PlanConfig",
"PlanConfigTypedDict",
"PlanCreditSchema",
"PlanCreditSchemaTypedDict",
"PlanDurationType",
@@ -2051,7 +2161,10 @@ __all__ = [
"PlanTierBehavior",
"PlanType",
"PlanTypedDict",
"Preview",
"Preview1",
"Preview1TypedDict",
"Preview2",
"Preview2TypedDict",
"PreviewAttachAttachDiscount",
"PreviewAttachAttachDiscountTypedDict",
"PreviewAttachBasePrice",
@@ -2211,7 +2324,6 @@ __all__ = [
"PreviewMultiAttachUsageLineItemPeriod",
"PreviewMultiAttachUsageLineItemPeriodTypedDict",
"PreviewMultiAttachUsageLineItemTypedDict",
"PreviewTypedDict",
"PreviewUpdateAttachDiscount",
"PreviewUpdateAttachDiscountTypedDict",
"PreviewUpdateBasePrice",
@@ -2285,14 +2397,22 @@ __all__ = [
"PreviewUpdateUsageLineItemPeriodTypedDict",
"PreviewUpdateUsageLineItemTypedDict",
"Processor",
"Product",
"ProductDisplay",
"ProductDisplayTypedDict",
"ProductScenario",
"ProductType",
"ProductTypedDict",
"Properties",
"PropertiesTypedDict",
"Product1",
"Product1TypedDict",
"Product2",
"Product2TypedDict",
"ProductDisplay1",
"ProductDisplay1TypedDict",
"ProductDisplay2",
"ProductDisplay2TypedDict",
"ProductScenario1",
"ProductScenario2",
"ProductType1",
"ProductType2",
"Properties1",
"Properties1TypedDict",
"Properties2",
"Properties2TypedDict",
"Purchase",
"PurchaseTypedDict",
"Range",
@@ -2309,7 +2429,8 @@ __all__ = [
"Rewards",
"RewardsType",
"RewardsTypedDict",
"Scenario",
"Scenario1",
"Scenario2",
"Security",
"SecurityTypedDict",
"SetupPaymentAttachDiscount",
@@ -2370,6 +2491,10 @@ __all__ = [
"TrackParams",
"TrackParamsTypedDict",
"TrackResponse",
"TrackResponseBody1",
"TrackResponseBody1TypedDict",
"TrackResponseBody2",
"TrackResponseBody2TypedDict",
"TrackResponseTypedDict",
"TrialsUsed",
"TrialsUsedTypedDict",
@@ -2495,6 +2620,10 @@ __all__ = [
"UpdatePlanBasePriceTypedDict",
"UpdatePlanBillingMethodRequest",
"UpdatePlanBillingMethodResponse",
"UpdatePlanConfigRequest",
"UpdatePlanConfigRequestTypedDict",
"UpdatePlanConfigResponse",
"UpdatePlanConfigResponseTypedDict",
"UpdatePlanCreditSchema",
"UpdatePlanCreditSchemaTypedDict",
"UpdatePlanCustomerEligibility",
@@ -2560,7 +2689,8 @@ __all__ = [
"UpdatePlanType",
"UpdateSubscriptionParams",
"UpdateSubscriptionParamsTypedDict",
"UsageModel",
"UsageModel1",
"UsageModel2",
]
_dynamic_imports: dict[str, str] = {
@@ -2708,53 +2838,96 @@ _dynamic_imports: dict[str, str] = {
"BillingUpdateToTypedDict": ".billingupdateop",
"UpdateSubscriptionParams": ".billingupdateop",
"UpdateSubscriptionParamsTypedDict": ".billingupdateop",
"CheckConfig": ".checkop",
"CheckConfigTypedDict": ".checkop",
"CheckCreditSchema": ".checkop",
"CheckCreditSchemaTypedDict": ".checkop",
"CheckEnv": ".checkop",
"CheckFeature": ".checkop",
"CheckFeatureTypedDict": ".checkop",
"CheckFreeTrial": ".checkop",
"CheckFreeTrialTypedDict": ".checkop",
"CheckConfig1": ".checkop",
"CheckConfig1TypedDict": ".checkop",
"CheckConfig2": ".checkop",
"CheckConfig2TypedDict": ".checkop",
"CheckCreditSchema1": ".checkop",
"CheckCreditSchema1TypedDict": ".checkop",
"CheckCreditSchema2": ".checkop",
"CheckCreditSchema2TypedDict": ".checkop",
"CheckEnv1": ".checkop",
"CheckEnv2": ".checkop",
"CheckFeature1": ".checkop",
"CheckFeature1TypedDict": ".checkop",
"CheckFeature2": ".checkop",
"CheckFeature2TypedDict": ".checkop",
"CheckFreeTrial1": ".checkop",
"CheckFreeTrial1TypedDict": ".checkop",
"CheckFreeTrial2": ".checkop",
"CheckFreeTrial2TypedDict": ".checkop",
"CheckGlobals": ".checkop",
"CheckGlobalsTypedDict": ".checkop",
"CheckInterval": ".checkop",
"CheckItem": ".checkop",
"CheckItemTypedDict": ".checkop",
"CheckInterval1": ".checkop",
"CheckInterval2": ".checkop",
"CheckItem1": ".checkop",
"CheckItem1TypedDict": ".checkop",
"CheckItem2": ".checkop",
"CheckItem2TypedDict": ".checkop",
"CheckLock": ".checkop",
"CheckLockTypedDict": ".checkop",
"CheckOnDecrease": ".checkop",
"CheckOnIncrease": ".checkop",
"CheckOnDecrease1": ".checkop",
"CheckOnDecrease2": ".checkop",
"CheckOnIncrease1": ".checkop",
"CheckOnIncrease2": ".checkop",
"CheckParams": ".checkop",
"CheckParamsTypedDict": ".checkop",
"CheckResponse": ".checkop",
"CheckResponseBody1": ".checkop",
"CheckResponseBody1TypedDict": ".checkop",
"CheckResponseBody2": ".checkop",
"CheckResponseBody2TypedDict": ".checkop",
"CheckResponseTypedDict": ".checkop",
"CheckRollover": ".checkop",
"CheckRolloverTypedDict": ".checkop",
"CheckTierBehavior": ".checkop",
"ConfigDuration": ".checkop",
"FeatureType": ".checkop",
"Flag": ".checkop",
"FlagDisplay": ".checkop",
"FlagDisplayTypedDict": ".checkop",
"FlagType": ".checkop",
"FlagTypedDict": ".checkop",
"FreeTrialDuration": ".checkop",
"IncludedUsage": ".checkop",
"IncludedUsageTypedDict": ".checkop",
"Preview": ".checkop",
"PreviewTypedDict": ".checkop",
"Product": ".checkop",
"ProductDisplay": ".checkop",
"ProductDisplayTypedDict": ".checkop",
"ProductScenario": ".checkop",
"ProductType": ".checkop",
"ProductTypedDict": ".checkop",
"Properties": ".checkop",
"PropertiesTypedDict": ".checkop",
"Scenario": ".checkop",
"UsageModel": ".checkop",
"CheckRollover1": ".checkop",
"CheckRollover1TypedDict": ".checkop",
"CheckRollover2": ".checkop",
"CheckRollover2TypedDict": ".checkop",
"CheckTierBehavior1": ".checkop",
"CheckTierBehavior2": ".checkop",
"ConfigDuration1": ".checkop",
"ConfigDuration2": ".checkop",
"FeatureType1": ".checkop",
"FeatureType2": ".checkop",
"Flag1": ".checkop",
"Flag1TypedDict": ".checkop",
"Flag2": ".checkop",
"Flag2TypedDict": ".checkop",
"FlagDisplay1": ".checkop",
"FlagDisplay1TypedDict": ".checkop",
"FlagDisplay2": ".checkop",
"FlagDisplay2TypedDict": ".checkop",
"FlagType1": ".checkop",
"FlagType2": ".checkop",
"FreeTrialDuration1": ".checkop",
"FreeTrialDuration2": ".checkop",
"IncludedUsage1": ".checkop",
"IncludedUsage1TypedDict": ".checkop",
"IncludedUsage2": ".checkop",
"IncludedUsage2TypedDict": ".checkop",
"Preview1": ".checkop",
"Preview1TypedDict": ".checkop",
"Preview2": ".checkop",
"Preview2TypedDict": ".checkop",
"Product1": ".checkop",
"Product1TypedDict": ".checkop",
"Product2": ".checkop",
"Product2TypedDict": ".checkop",
"ProductDisplay1": ".checkop",
"ProductDisplay1TypedDict": ".checkop",
"ProductDisplay2": ".checkop",
"ProductDisplay2TypedDict": ".checkop",
"ProductScenario1": ".checkop",
"ProductScenario2": ".checkop",
"ProductType1": ".checkop",
"ProductType2": ".checkop",
"Properties1": ".checkop",
"Properties1TypedDict": ".checkop",
"Properties2": ".checkop",
"Properties2TypedDict": ".checkop",
"Scenario1": ".checkop",
"Scenario2": ".checkop",
"UsageModel1": ".checkop",
"UsageModel2": ".checkop",
"CreateBalanceDuration": ".createbalanceop",
"CreateBalanceGlobals": ".createbalanceop",
"CreateBalanceGlobalsTypedDict": ".createbalanceop",
@@ -2827,6 +3000,10 @@ _dynamic_imports: dict[str, str] = {
"CreatePlanAttachAction": ".createplanop",
"CreatePlanBillingMethodRequest": ".createplanop",
"CreatePlanBillingMethodResponse": ".createplanop",
"CreatePlanConfigRequest": ".createplanop",
"CreatePlanConfigRequestTypedDict": ".createplanop",
"CreatePlanConfigResponse": ".createplanop",
"CreatePlanConfigResponseTypedDict": ".createplanop",
"CreatePlanCreditSchema": ".createplanop",
"CreatePlanCreditSchemaTypedDict": ".createplanop",
"CreatePlanCustomerEligibility": ".createplanop",
@@ -3003,6 +3180,10 @@ _dynamic_imports: dict[str, str] = {
"FinalizeLockGlobals": ".finalizelockop",
"FinalizeLockGlobalsTypedDict": ".finalizelockop",
"FinalizeLockResponse": ".finalizelockop",
"FinalizeLockResponseBody1": ".finalizelockop",
"FinalizeLockResponseBody1TypedDict": ".finalizelockop",
"FinalizeLockResponseBody2": ".finalizelockop",
"FinalizeLockResponseBody2TypedDict": ".finalizelockop",
"FinalizeLockResponseTypedDict": ".finalizelockop",
"GetEntityBillingControls": ".getentityop",
"GetEntityBillingControlsTypedDict": ".getentityop",
@@ -3069,6 +3250,8 @@ _dynamic_imports: dict[str, str] = {
"GetOrCreateCustomerUsageAlertTypedDict": ".getorcreatecustomerop",
"GetPlanAttachAction": ".getplanop",
"GetPlanBillingMethod": ".getplanop",
"GetPlanConfig": ".getplanop",
"GetPlanConfigTypedDict": ".getplanop",
"GetPlanCreditSchema": ".getplanop",
"GetPlanCreditSchemaTypedDict": ".getplanop",
"GetPlanCustomerEligibility": ".getplanop",
@@ -3178,6 +3361,8 @@ _dynamic_imports: dict[str, str] = {
"ListFeaturesType": ".listfeaturesop",
"ListPlansAttachAction": ".listplansop",
"ListPlansBillingMethod": ".listplansop",
"ListPlansConfig": ".listplansop",
"ListPlansConfigTypedDict": ".listplansop",
"ListPlansCreditSchema": ".listplansop",
"ListPlansCreditSchemaTypedDict": ".listplansop",
"ListPlansCustomerEligibility": ".listplansop",
@@ -3295,6 +3480,8 @@ _dynamic_imports: dict[str, str] = {
"ItemTypedDict": ".plan",
"Plan": ".plan",
"PlanBillingMethod": ".plan",
"PlanConfig": ".plan",
"PlanConfigTypedDict": ".plan",
"PlanCreditSchema": ".plan",
"PlanCreditSchemaTypedDict": ".plan",
"PlanDurationType": ".plan",
@@ -3615,6 +3802,10 @@ _dynamic_imports: dict[str, str] = {
"TrackParams": ".trackop",
"TrackParamsTypedDict": ".trackop",
"TrackResponse": ".trackop",
"TrackResponseBody1": ".trackop",
"TrackResponseBody1TypedDict": ".trackop",
"TrackResponseBody2": ".trackop",
"TrackResponseBody2TypedDict": ".trackop",
"TrackResponseTypedDict": ".trackop",
"UpdateBalanceGlobals": ".updatebalanceop",
"UpdateBalanceGlobalsTypedDict": ".updatebalanceop",
@@ -3738,6 +3929,10 @@ _dynamic_imports: dict[str, str] = {
"UpdatePlanBasePriceTypedDict": ".updateplanop",
"UpdatePlanBillingMethodRequest": ".updateplanop",
"UpdatePlanBillingMethodResponse": ".updateplanop",
"UpdatePlanConfigRequest": ".updateplanop",
"UpdatePlanConfigRequestTypedDict": ".updateplanop",
"UpdatePlanConfigResponse": ".updateplanop",
"UpdatePlanConfigResponseTypedDict": ".updateplanop",
"UpdatePlanCreditSchema": ".updateplanop",
"UpdatePlanCreditSchemaTypedDict": ".updateplanop",
"UpdatePlanCustomerEligibility": ".updateplanop",

File diff suppressed because it is too large Load Diff

View File

@@ -476,6 +476,36 @@ class FreeTrialRequest(BaseModel):
return m
class CreatePlanConfigRequestTypedDict(TypedDict):
r"""Miscellaneous plan-level configuration flags."""
ignore_past_due: NotRequired[bool]
r"""If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state."""
class CreatePlanConfigRequest(BaseModel):
r"""Miscellaneous plan-level configuration flags."""
ignore_past_due: Optional[bool] = False
r"""If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = set(["ignore_past_due"])
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k, serialized.get(n))
if val != UNSET_SENTINEL:
if val is not None or k not in optional_fields:
m[k] = val
return m
class CreatePlanParamsTypedDict(TypedDict):
plan_id: str
r"""The ID of the plan to create."""
@@ -495,6 +525,8 @@ class CreatePlanParamsTypedDict(TypedDict):
r"""Feature configurations for this plan. Each item defines included units, pricing, and reset behavior."""
free_trial: NotRequired[FreeTrialRequestTypedDict]
r"""Free trial configuration. Customers can try this plan before being charged."""
config: NotRequired[CreatePlanConfigRequestTypedDict]
r"""Miscellaneous plan-level configuration flags."""
class CreatePlanParams(BaseModel):
@@ -525,6 +557,9 @@ class CreatePlanParams(BaseModel):
free_trial: Optional[FreeTrialRequest] = None
r"""Free trial configuration. Customers can try this plan before being charged."""
config: Optional[CreatePlanConfigRequest] = None
r"""Miscellaneous plan-level configuration flags."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = set(
@@ -536,6 +571,7 @@ class CreatePlanParams(BaseModel):
"price",
"items",
"free_trial",
"config",
]
)
nullable_fields = set(["description"])
@@ -1121,6 +1157,36 @@ CreatePlanEnv = Union[
r"""Environment this plan belongs to ('sandbox' or 'live')."""
class CreatePlanConfigResponseTypedDict(TypedDict):
r"""Miscellaneous plan-level configuration flags."""
ignore_past_due: NotRequired[bool]
r"""If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state."""
class CreatePlanConfigResponse(BaseModel):
r"""Miscellaneous plan-level configuration flags."""
ignore_past_due: Optional[bool] = False
r"""If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = set(["ignore_past_due"])
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k, serialized.get(n))
if val != UNSET_SENTINEL:
if val is not None or k not in optional_fields:
m[k] = val
return m
CreatePlanStatus = Union[
Literal[
"active",
@@ -1219,6 +1285,8 @@ class CreatePlanResponseTypedDict(TypedDict):
r"""Whether the plan is archived. Archived plans cannot be attached to new customers."""
base_variant_id: Nullable[str]
r"""If this is a variant, the ID of the base plan it was created from."""
config: CreatePlanConfigResponseTypedDict
r"""Miscellaneous plan-level configuration flags."""
free_trial: NotRequired[CreatePlanFreeTrialResponseTypedDict]
r"""Free trial configuration. If set, new customers can try this plan before being charged."""
customer_eligibility: NotRequired[CreatePlanCustomerEligibilityTypedDict]
@@ -1266,6 +1334,9 @@ class CreatePlanResponse(BaseModel):
base_variant_id: Nullable[str]
r"""If this is a variant, the ID of the base plan it was created from."""
config: CreatePlanConfigResponse
r"""Miscellaneous plan-level configuration flags."""
free_trial: Optional[CreatePlanFreeTrialResponse] = None
r"""Free trial configuration. If set, new customers can try this plan before being charged."""

View File

@@ -5,8 +5,8 @@ from autumn_sdk.types import BaseModel, UNSET_SENTINEL
from autumn_sdk.utils import FieldMetadata, HeaderMetadata
import pydantic
from pydantic import model_serializer
from typing import Any, Dict, Literal, Optional
from typing_extensions import Annotated, NotRequired, TypedDict
from typing import Any, Dict, Literal, Optional, Union
from typing_extensions import Annotated, NotRequired, TypeAliasType, TypedDict
class FinalizeLockGlobalsTypedDict(TypedDict):
@@ -85,13 +85,36 @@ class FinalizeBalanceParams(BaseModel):
return m
class FinalizeLockResponseTypedDict(TypedDict):
class FinalizeLockResponseBody2TypedDict(TypedDict):
r"""Accepted. Autumn is experiencing degraded service from a downstream provider, so the finalize request was allowed fail-open."""
success: bool
class FinalizeLockResponseBody2(BaseModel):
r"""Accepted. Autumn is experiencing degraded service from a downstream provider, so the finalize request was allowed fail-open."""
success: bool
class FinalizeLockResponseBody1TypedDict(TypedDict):
r"""OK"""
success: bool
class FinalizeLockResponse(BaseModel):
class FinalizeLockResponseBody1(BaseModel):
r"""OK"""
success: bool
FinalizeLockResponseTypedDict = TypeAliasType(
"FinalizeLockResponseTypedDict",
Union[FinalizeLockResponseBody1TypedDict, FinalizeLockResponseBody2TypedDict],
)
FinalizeLockResponse = TypeAliasType(
"FinalizeLockResponse", Union[FinalizeLockResponseBody1, FinalizeLockResponseBody2]
)

View File

@@ -635,6 +635,36 @@ GetPlanEnv = Union[
r"""Environment this plan belongs to ('sandbox' or 'live')."""
class GetPlanConfigTypedDict(TypedDict):
r"""Miscellaneous plan-level configuration flags."""
ignore_past_due: NotRequired[bool]
r"""If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state."""
class GetPlanConfig(BaseModel):
r"""Miscellaneous plan-level configuration flags."""
ignore_past_due: Optional[bool] = False
r"""If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = set(["ignore_past_due"])
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k, serialized.get(n))
if val != UNSET_SENTINEL:
if val is not None or k not in optional_fields:
m[k] = val
return m
GetPlanStatus = Union[
Literal[
"active",
@@ -733,6 +763,8 @@ class GetPlanResponseTypedDict(TypedDict):
r"""Whether the plan is archived. Archived plans cannot be attached to new customers."""
base_variant_id: Nullable[str]
r"""If this is a variant, the ID of the base plan it was created from."""
config: GetPlanConfigTypedDict
r"""Miscellaneous plan-level configuration flags."""
free_trial: NotRequired[GetPlanFreeTrialTypedDict]
r"""Free trial configuration. If set, new customers can try this plan before being charged."""
customer_eligibility: NotRequired[GetPlanCustomerEligibilityTypedDict]
@@ -780,6 +812,9 @@ class GetPlanResponse(BaseModel):
base_variant_id: Nullable[str]
r"""If this is a variant, the ID of the base plan it was created from."""
config: GetPlanConfig
r"""Miscellaneous plan-level configuration flags."""
free_trial: Optional[GetPlanFreeTrial] = None
r"""Free trial configuration. If set, new customers can try this plan before being charged."""

View File

@@ -640,6 +640,36 @@ ListPlansEnv = Union[
r"""Environment this plan belongs to ('sandbox' or 'live')."""
class ListPlansConfigTypedDict(TypedDict):
r"""Miscellaneous plan-level configuration flags."""
ignore_past_due: NotRequired[bool]
r"""If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state."""
class ListPlansConfig(BaseModel):
r"""Miscellaneous plan-level configuration flags."""
ignore_past_due: Optional[bool] = False
r"""If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = set(["ignore_past_due"])
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k, serialized.get(n))
if val != UNSET_SENTINEL:
if val is not None or k not in optional_fields:
m[k] = val
return m
ListPlansStatus = Union[
Literal[
"active",
@@ -738,6 +768,8 @@ class ListPlansListTypedDict(TypedDict):
r"""Whether the plan is archived. Archived plans cannot be attached to new customers."""
base_variant_id: Nullable[str]
r"""If this is a variant, the ID of the base plan it was created from."""
config: ListPlansConfigTypedDict
r"""Miscellaneous plan-level configuration flags."""
free_trial: NotRequired[ListPlansFreeTrialTypedDict]
r"""Free trial configuration. If set, new customers can try this plan before being charged."""
customer_eligibility: NotRequired[ListPlansCustomerEligibilityTypedDict]
@@ -785,6 +817,9 @@ class ListPlansList(BaseModel):
base_variant_id: Nullable[str]
r"""If this is a variant, the ID of the base plan it was created from."""
config: ListPlansConfig
r"""Miscellaneous plan-level configuration flags."""
free_trial: Optional[ListPlansFreeTrial] = None
r"""Free trial configuration. If set, new customers can try this plan before being charged."""

View File

@@ -574,6 +574,36 @@ PlanEnv = Union[
r"""Environment this plan belongs to ('sandbox' or 'live')."""
class PlanConfigTypedDict(TypedDict):
r"""Miscellaneous plan-level configuration flags."""
ignore_past_due: NotRequired[bool]
r"""If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state."""
class PlanConfig(BaseModel):
r"""Miscellaneous plan-level configuration flags."""
ignore_past_due: Optional[bool] = False
r"""If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = set(["ignore_past_due"])
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k, serialized.get(n))
if val != UNSET_SENTINEL:
if val is not None or k not in optional_fields:
m[k] = val
return m
PlanStatus = Union[
Literal[
"active",
@@ -670,6 +700,8 @@ class PlanTypedDict(TypedDict):
r"""Whether the plan is archived. Archived plans cannot be attached to new customers."""
base_variant_id: Nullable[str]
r"""If this is a variant, the ID of the base plan it was created from."""
config: PlanConfigTypedDict
r"""Miscellaneous plan-level configuration flags."""
free_trial: NotRequired[FreeTrialTypedDict]
r"""Free trial configuration. If set, new customers can try this plan before being charged."""
customer_eligibility: NotRequired[CustomerEligibilityTypedDict]
@@ -715,6 +747,9 @@ class Plan(BaseModel):
base_variant_id: Nullable[str]
r"""If this is a variant, the ID of the base plan it was created from."""
config: PlanConfig
r"""Miscellaneous plan-level configuration flags."""
free_trial: Optional[FreeTrial] = None
r"""Free trial configuration. If set, new customers can try this plan before being charged."""

View File

@@ -7,8 +7,8 @@ from autumn_sdk.utils import FieldMetadata, HeaderMetadata, validate_const
import pydantic
from pydantic import model_serializer
from pydantic.functional_validators import AfterValidator
from typing import Any, Dict, Literal, Optional
from typing_extensions import Annotated, NotRequired, TypedDict
from typing import Any, Dict, Literal, Optional, Union
from typing_extensions import Annotated, NotRequired, TypeAliasType, TypedDict
class TrackGlobalsTypedDict(TypedDict):
@@ -134,7 +134,71 @@ class TrackParams(BaseModel):
return m
class TrackResponseTypedDict(TypedDict):
class TrackResponseBody2TypedDict(TypedDict):
r"""Accepted. Autumn is experiencing degraded service from a downstream provider, so the event was accepted for replay and will be tracked as soon as the service is restored."""
customer_id: str
r"""The ID of the customer whose usage was tracked."""
value: float
r"""The amount of usage that was recorded."""
balance: Nullable[BalanceTypedDict]
r"""The updated balance for the tracked feature. Null if tracking by event_name that affects multiple features."""
entity_id: NotRequired[str]
r"""The ID of the entity, if entity-scoped tracking was performed."""
event_name: NotRequired[str]
r"""The event name that was tracked, if event_name was used instead of feature_id."""
balances: NotRequired[Dict[str, BalanceTypedDict]]
r"""Map of feature_id to updated balance when tracking by event_name affects multiple features."""
class TrackResponseBody2(BaseModel):
r"""Accepted. Autumn is experiencing degraded service from a downstream provider, so the event was accepted for replay and will be tracked as soon as the service is restored."""
customer_id: str
r"""The ID of the customer whose usage was tracked."""
value: float
r"""The amount of usage that was recorded."""
balance: Nullable[Balance]
r"""The updated balance for the tracked feature. Null if tracking by event_name that affects multiple features."""
entity_id: Optional[str] = None
r"""The ID of the entity, if entity-scoped tracking was performed."""
event_name: Optional[str] = None
r"""The event name that was tracked, if event_name was used instead of feature_id."""
balances: Optional[Dict[str, Balance]] = None
r"""Map of feature_id to updated balance when tracking by event_name affects multiple features."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = set(["entity_id", "event_name", "balances"])
nullable_fields = set(["balance"])
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k, serialized.get(n))
is_nullable_and_explicitly_set = (
k in nullable_fields
and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member
)
if val != UNSET_SENTINEL:
if (
val is not None
or k not in optional_fields
or is_nullable_and_explicitly_set
):
m[k] = val
return m
class TrackResponseBody1TypedDict(TypedDict):
r"""OK"""
customer_id: str
@@ -151,7 +215,7 @@ class TrackResponseTypedDict(TypedDict):
r"""Map of feature_id to updated balance when tracking by event_name affects multiple features."""
class TrackResponse(BaseModel):
class TrackResponseBody1(BaseModel):
r"""OK"""
customer_id: str
@@ -198,6 +262,17 @@ class TrackResponse(BaseModel):
return m
TrackResponseTypedDict = TypeAliasType(
"TrackResponseTypedDict",
Union[TrackResponseBody1TypedDict, TrackResponseBody2TypedDict],
)
TrackResponse = TypeAliasType(
"TrackResponse", Union[TrackResponseBody1, TrackResponseBody2]
)
try:
TrackLock.model_rebuild()
except NameError:

View File

@@ -476,6 +476,36 @@ class UpdatePlanFreeTrialParams(BaseModel):
return m
class UpdatePlanConfigRequestTypedDict(TypedDict):
r"""Miscellaneous plan-level configuration flags."""
ignore_past_due: NotRequired[bool]
r"""If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state."""
class UpdatePlanConfigRequest(BaseModel):
r"""Miscellaneous plan-level configuration flags."""
ignore_past_due: Optional[bool] = False
r"""If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = set(["ignore_past_due"])
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k, serialized.get(n))
if val != UNSET_SENTINEL:
if val is not None or k not in optional_fields:
m[k] = val
return m
class UpdatePlanParamsTypedDict(TypedDict):
plan_id: str
r"""The ID of the plan to update."""
@@ -494,6 +524,8 @@ class UpdatePlanParamsTypedDict(TypedDict):
r"""Feature configurations for this plan. Each item defines included units, pricing, and reset behavior."""
free_trial: NotRequired[Nullable[UpdatePlanFreeTrialParamsTypedDict]]
r"""The free trial of the plan. Set to null to remove the free trial."""
config: NotRequired[UpdatePlanConfigRequestTypedDict]
r"""Miscellaneous plan-level configuration flags."""
version: NotRequired[float]
archived: NotRequired[bool]
new_plan_id: NotRequired[str]
@@ -527,6 +559,9 @@ class UpdatePlanParams(BaseModel):
free_trial: OptionalNullable[UpdatePlanFreeTrialParams] = UNSET
r"""The free trial of the plan. Set to null to remove the free trial."""
config: Optional[UpdatePlanConfigRequest] = None
r"""Miscellaneous plan-level configuration flags."""
version: Optional[float] = None
archived: Optional[bool] = False
@@ -546,6 +581,7 @@ class UpdatePlanParams(BaseModel):
"price",
"items",
"free_trial",
"config",
"version",
"archived",
"new_plan_id",
@@ -1134,6 +1170,36 @@ UpdatePlanEnv = Union[
r"""Environment this plan belongs to ('sandbox' or 'live')."""
class UpdatePlanConfigResponseTypedDict(TypedDict):
r"""Miscellaneous plan-level configuration flags."""
ignore_past_due: NotRequired[bool]
r"""If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state."""
class UpdatePlanConfigResponse(BaseModel):
r"""Miscellaneous plan-level configuration flags."""
ignore_past_due: Optional[bool] = False
r"""If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = set(["ignore_past_due"])
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k, serialized.get(n))
if val != UNSET_SENTINEL:
if val is not None or k not in optional_fields:
m[k] = val
return m
UpdatePlanStatus = Union[
Literal[
"active",
@@ -1232,6 +1298,8 @@ class UpdatePlanResponseTypedDict(TypedDict):
r"""Whether the plan is archived. Archived plans cannot be attached to new customers."""
base_variant_id: Nullable[str]
r"""If this is a variant, the ID of the base plan it was created from."""
config: UpdatePlanConfigResponseTypedDict
r"""Miscellaneous plan-level configuration flags."""
free_trial: NotRequired[UpdatePlanFreeTrialTypedDict]
r"""Free trial configuration. If set, new customers can try this plan before being charged."""
customer_eligibility: NotRequired[UpdatePlanCustomerEligibilityTypedDict]
@@ -1279,6 +1347,9 @@ class UpdatePlanResponse(BaseModel):
base_variant_id: Nullable[str]
r"""If this is a variant, the ID of the base plan it was created from."""
config: UpdatePlanConfigResponse
r"""Miscellaneous plan-level configuration flags."""
free_trial: Optional[UpdatePlanFreeTrial] = None
r"""Free trial configuration. If set, new customers can try this plan before being charged."""

View File

@@ -30,6 +30,11 @@ class Plans(BaseSDK):
free_trial: Optional[
Union[models.FreeTrialRequest, models.FreeTrialRequestTypedDict]
] = None,
config: Optional[
Union[
models.CreatePlanConfigRequest, models.CreatePlanConfigRequestTypedDict
]
] = None,
retries: OptionalNullable[utils.RetryConfig] = UNSET,
server_url: Optional[str] = None,
timeout_ms: Optional[int] = None,
@@ -50,6 +55,7 @@ class Plans(BaseSDK):
:param price: Base recurring price for the plan. Omit for free or usage-only plans.
:param items: Feature configurations for this plan. Each item defines included units, pricing, and reset behavior.
:param free_trial: Free trial configuration. Customers can try this plan before being charged.
:param config: Miscellaneous plan-level configuration flags.
:param retries: Override the default retry configuration for this method
:param server_url: Override the default server URL for this method
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
@@ -81,6 +87,9 @@ class Plans(BaseSDK):
free_trial=utils.get_pydantic_model(
free_trial, Optional[models.FreeTrialRequest]
),
config=utils.get_pydantic_model(
config, Optional[models.CreatePlanConfigRequest]
),
)
req = self._build_request(
@@ -163,6 +172,11 @@ class Plans(BaseSDK):
free_trial: Optional[
Union[models.FreeTrialRequest, models.FreeTrialRequestTypedDict]
] = None,
config: Optional[
Union[
models.CreatePlanConfigRequest, models.CreatePlanConfigRequestTypedDict
]
] = None,
retries: OptionalNullable[utils.RetryConfig] = UNSET,
server_url: Optional[str] = None,
timeout_ms: Optional[int] = None,
@@ -183,6 +197,7 @@ class Plans(BaseSDK):
:param price: Base recurring price for the plan. Omit for free or usage-only plans.
:param items: Feature configurations for this plan. Each item defines included units, pricing, and reset behavior.
:param free_trial: Free trial configuration. Customers can try this plan before being charged.
:param config: Miscellaneous plan-level configuration flags.
:param retries: Override the default retry configuration for this method
:param server_url: Override the default server URL for this method
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
@@ -214,6 +229,9 @@ class Plans(BaseSDK):
free_trial=utils.get_pydantic_model(
free_trial, Optional[models.FreeTrialRequest]
),
config=utils.get_pydantic_model(
config, Optional[models.CreatePlanConfigRequest]
),
)
req = self._build_request_async(
@@ -685,6 +703,11 @@ class Plans(BaseSDK):
models.UpdatePlanFreeTrialParamsTypedDict,
]
] = UNSET,
config: Optional[
Union[
models.UpdatePlanConfigRequest, models.UpdatePlanConfigRequestTypedDict
]
] = None,
version: Optional[float] = None,
archived: Optional[bool] = False,
new_plan_id: Optional[str] = None,
@@ -708,6 +731,7 @@ class Plans(BaseSDK):
:param price: The price of the plan. Set to null to remove the base price.
:param items: Feature configurations for this plan. Each item defines included units, pricing, and reset behavior.
:param free_trial: The free trial of the plan. Set to null to remove the free trial.
:param config: Miscellaneous plan-level configuration flags.
:param version:
:param archived:
:param new_plan_id: The new ID to use for the plan. Can only be updated if the plan has not been used by any customers.
@@ -742,6 +766,9 @@ class Plans(BaseSDK):
free_trial=utils.get_pydantic_model(
free_trial, OptionalNullable[models.UpdatePlanFreeTrialParams]
),
config=utils.get_pydantic_model(
config, Optional[models.UpdatePlanConfigRequest]
),
version=version,
archived=archived,
new_plan_id=new_plan_id,
@@ -830,6 +857,11 @@ class Plans(BaseSDK):
models.UpdatePlanFreeTrialParamsTypedDict,
]
] = UNSET,
config: Optional[
Union[
models.UpdatePlanConfigRequest, models.UpdatePlanConfigRequestTypedDict
]
] = None,
version: Optional[float] = None,
archived: Optional[bool] = False,
new_plan_id: Optional[str] = None,
@@ -853,6 +885,7 @@ class Plans(BaseSDK):
:param price: The price of the plan. Set to null to remove the base price.
:param items: Feature configurations for this plan. Each item defines included units, pricing, and reset behavior.
:param free_trial: The free trial of the plan. Set to null to remove the free trial.
:param config: Miscellaneous plan-level configuration flags.
:param version:
:param archived:
:param new_plan_id: The new ID to use for the plan. Can only be updated if the plan has not been used by any customers.
@@ -887,6 +920,9 @@ class Plans(BaseSDK):
free_trial=utils.get_pydantic_model(
free_trial, OptionalNullable[models.UpdatePlanFreeTrialParams]
),
config=utils.get_pydantic_model(
config, Optional[models.UpdatePlanConfigRequest]
),
version=version,
archived=archived,
new_plan_id=new_plan_id,

View File

@@ -307,7 +307,9 @@ class Autumn(BaseSDK):
)
if utils.match_response(http_res, "200", "application/json"):
return unmarshal_json_response(models.CheckResponse, http_res)
return unmarshal_json_response(models.CheckResponseBody1, http_res)
if utils.match_response(http_res, "202", "application/json"):
return unmarshal_json_response(models.CheckResponseBody2, http_res)
if utils.match_response(http_res, "4XX", "*"):
http_res_text = utils.stream_to_text(http_res)
raise errors.AutumnDefaultError(
@@ -420,7 +422,9 @@ class Autumn(BaseSDK):
)
if utils.match_response(http_res, "200", "application/json"):
return unmarshal_json_response(models.CheckResponse, http_res)
return unmarshal_json_response(models.CheckResponseBody1, http_res)
if utils.match_response(http_res, "202", "application/json"):
return unmarshal_json_response(models.CheckResponseBody2, http_res)
if utils.match_response(http_res, "4XX", "*"):
http_res_text = await utils.stream_to_text_async(http_res)
raise errors.AutumnDefaultError(
@@ -530,7 +534,9 @@ class Autumn(BaseSDK):
)
if utils.match_response(http_res, "200", "application/json"):
return unmarshal_json_response(models.TrackResponse, http_res)
return unmarshal_json_response(models.TrackResponseBody1, http_res)
if utils.match_response(http_res, "202", "application/json"):
return unmarshal_json_response(models.TrackResponseBody2, http_res)
if utils.match_response(http_res, "4XX", "*"):
http_res_text = utils.stream_to_text(http_res)
raise errors.AutumnDefaultError(
@@ -640,7 +646,9 @@ class Autumn(BaseSDK):
)
if utils.match_response(http_res, "200", "application/json"):
return unmarshal_json_response(models.TrackResponse, http_res)
return unmarshal_json_response(models.TrackResponseBody1, http_res)
if utils.match_response(http_res, "202", "application/json"):
return unmarshal_json_response(models.TrackResponseBody2, http_res)
if utils.match_response(http_res, "4XX", "*"):
http_res_text = await utils.stream_to_text_async(http_res)
raise errors.AutumnDefaultError(

View File

@@ -1,6 +1,7 @@
{
"name": "autumn",
"private": true,
"packageManager": "bun@1.3.10",
"workspaces": {
"packages": [
"server",
@@ -83,6 +84,7 @@
"setup": "node scripts/setup/setup.js",
"setup:s3-admin": "bun scripts/setup/setupS3Admin.ts",
"setup:test": "infisical run --env=dev --recursive -- bun scripts/setup/setup-test.ts",
"stripe:link-test": "ENV_FILE=.env infisical run --env=dev --recursive -- bun scripts/setup/link-test-stripe-account.ts",
"agent:bootstrap": "bash scripts/setup/agent-bootstrap.sh",
"dev:agent": "bash scripts/setup/devAgent.sh",
"migrate-functions": "infisical run --env=dev --recursive -- bun scripts/migrations/migrate-functions.ts",
@@ -110,7 +112,7 @@
"site": "cd apps/website && bun dev && cd ../..",
"docs": "bun -F @autumn/docs dev",
"docs:build": "bun -F @autumn/docs build",
"ts": "bun -F @autumn/server ts && bun -F autumn-js ts && bun -F @autumn/openapi ts && bun -F atmn ts && bun -F checkout ts",
"ts": "turbo run ts --filter=@autumn/server --filter=autumn-js --filter=@autumn/openapi --filter=atmn --filter=checkout",
"atmn:build": "bun -F atmn build",
"openapi:ts": "bun -F @autumn/openapi ts",
"js:ts": "bun -F autumn-js ts",
@@ -143,6 +145,7 @@
"husky": "^9.1.7",
"inquirer": "^12.10.0",
"knip": "^6.7.0",
"ts-to-zod": "^5.1.0"
"ts-to-zod": "^5.1.0",
"turbo": "^2.9.6"
}
}

View File

@@ -10,6 +10,8 @@ export type HandleBetterAuthRouteFn = (args: {
routeName: RouteName;
}) => Promise<{ status: number; body: unknown }>;
export type AutumnEndpoint = ReturnType<typeof createAuthEndpoint>;
/** Get route config by name from routeConfigs */
const getRouteConfig = (routeName: RouteName) => {
const route = routeConfigs.find((r) => r.route === routeName);
@@ -24,7 +26,7 @@ const getRouteConfig = (routeName: RouteName) => {
export const createAutumnEndpoint = <T extends RouteName>(
routeName: T,
handleRoute: HandleBetterAuthRouteFn,
) => {
): AutumnEndpoint => {
const config = getRouteConfig(routeName);
return createAuthEndpoint(
`/autumn/${routeName}` as `/autumn/${T}`,
@@ -38,5 +40,5 @@ export const createAutumnEndpoint = <T extends RouteName>(
status: result.status,
});
},
);
) as AutumnEndpoint;
};

View File

@@ -31,6 +31,10 @@ export const listPlansItemDisplaySchema = z.object({
secondaryText: z.union([z.string(), z.undefined()]).optional(),
});
export const listPlansConfigSchema = z.object({
ignorePastDue: z.boolean(),
});
export const listPlansParamsOutboundSchema = z.object({
customer_id: z.union([z.string(), z.undefined()]).optional(),
entity_id: z.union([z.string(), z.undefined()]).optional(),
@@ -148,6 +152,7 @@ export const listPlansListSchema = z.object({
env: listPlansEnvSchema,
archived: z.boolean(),
baseVariantId: z.string().nullable(),
config: listPlansConfigSchema,
customerEligibility: z
.union([listPlansCustomerEligibilitySchema, z.undefined()])
.optional(),

File diff suppressed because it is too large Load Diff

View File

@@ -1210,6 +1210,16 @@ components:
- type: string
- type: "null"
description: If this is a variant, the ID of the base plan it was created from.
config:
type: object
properties:
ignore_past_due:
type: boolean
default: false
description: If true, entitlements attached to this plan will still reset on
schedule even when the customer's product is in a past_due
state.
description: Miscellaneous plan-level configuration flags.
customer_eligibility:
type: object
properties:
@@ -1258,6 +1268,7 @@ components:
- env
- archived
- base_variant_id
- config
Balance:
type: object
properties:
@@ -3250,6 +3261,7 @@ paths:
@param price - Base recurring price for the plan. Omit for free or usage-only plans. (optional)
@param items - Feature configurations for this plan. Each item defines included units, pricing, and reset behavior. (optional)
@param freeTrial - Free trial configuration. Customers can try this plan before being charged. (optional)
@param config - Miscellaneous plan-level configuration flags. (optional)
@returns The created plan object.
tags:
@@ -3496,6 +3508,16 @@ paths:
- duration_length
description: Free trial configuration. Customers can try this plan before being
charged.
config:
type: object
properties:
ignore_past_due:
type: boolean
default: false
description: If true, entitlements attached to this plan will still reset on
schedule even when the customer's product is in a
past_due state.
description: Miscellaneous plan-level configuration flags.
required:
- plan_id
- name
@@ -3872,6 +3894,16 @@ paths:
- type: string
- type: "null"
description: If this is a variant, the ID of the base plan it was created from.
config:
type: object
properties:
ignore_past_due:
type: boolean
default: false
description: If true, entitlements attached to this plan will still reset on
schedule even when the customer's product is in a
past_due state.
description: Miscellaneous plan-level configuration flags.
customer_eligibility:
type: object
properties:
@@ -3920,6 +3952,7 @@ paths:
- env
- archived
- base_variant_id
- config
description: A plan defines a set of features, pricing, and entitlements that
can be attached to customers.
examples:
@@ -3967,6 +4000,8 @@ paths:
env: sandbox
archived: false
baseVariantId: null
config:
ignore_past_due: false
x-speakeasy-name-override: create
parameters:
- *a1
@@ -4370,6 +4405,16 @@ paths:
- type: string
- type: "null"
description: If this is a variant, the ID of the base plan it was created from.
config:
type: object
properties:
ignore_past_due:
type: boolean
default: false
description: If true, entitlements attached to this plan will still reset on
schedule even when the customer's product is in a
past_due state.
description: Miscellaneous plan-level configuration flags.
customer_eligibility:
type: object
properties:
@@ -4418,6 +4463,7 @@ paths:
- env
- archived
- base_variant_id
- config
description: A plan defines a set of features, pricing, and entitlements that
can be attached to customers.
examples:
@@ -4465,6 +4511,8 @@ paths:
env: sandbox
archived: false
baseVariantId: null
config:
ignore_past_due: false
x-speakeasy-name-override: get
parameters:
- *a1
@@ -4849,6 +4897,16 @@ paths:
- type: string
- type: "null"
description: If this is a variant, the ID of the base plan it was created from.
config:
type: object
properties:
ignore_past_due:
type: boolean
default: false
description: If true, entitlements attached to this plan will still reset on
schedule even when the customer's product is in
a past_due state.
description: Miscellaneous plan-level configuration flags.
customer_eligibility:
type: object
properties:
@@ -4897,6 +4955,7 @@ paths:
- env
- archived
- base_variant_id
- config
description: A plan defines a set of features, pricing, and entitlements that
can be attached to customers.
required:
@@ -4947,6 +5006,8 @@ paths:
env: sandbox
archived: false
baseVariantId: null
config:
ignore_past_due: false
x-speakeasy-name-override: list
parameters:
- *a1
@@ -4997,6 +5058,7 @@ paths:
@param price - The price of the plan. Set to null to remove the base price. (optional)
@param items - Feature configurations for this plan. Each item defines included units, pricing, and reset behavior. (optional)
@param freeTrial - The free trial of the plan. Set to null to remove the free trial. (optional)
@param config - Miscellaneous plan-level configuration flags. (optional)
@param newPlanId - The new ID to use for the plan. Can only be updated if the plan has not been used by any customers. (optional)
@returns The updated plan object.
@@ -5241,6 +5303,16 @@ paths:
description: Free trial configuration for a plan.
- type: "null"
description: The free trial of the plan. Set to null to remove the free trial.
config:
type: object
properties:
ignore_past_due:
type: boolean
default: false
description: If true, entitlements attached to this plan will still reset on
schedule even when the customer's product is in a
past_due state.
description: Miscellaneous plan-level configuration flags.
version:
type: number
archived:
@@ -5600,6 +5672,16 @@ paths:
- type: string
- type: "null"
description: If this is a variant, the ID of the base plan it was created from.
config:
type: object
properties:
ignore_past_due:
type: boolean
default: false
description: If true, entitlements attached to this plan will still reset on
schedule even when the customer's product is in a
past_due state.
description: Miscellaneous plan-level configuration flags.
customer_eligibility:
type: object
properties:
@@ -5648,6 +5730,7 @@ paths:
- env
- archived
- base_variant_id
- config
description: A plan defines a set of features, pricing, and entitlements that
can be attached to customers.
examples:
@@ -5695,6 +5778,8 @@ paths:
env: sandbox
archived: false
baseVariantId: null
config:
ignore_past_due: false
x-speakeasy-name-override: update
parameters:
- *a1
@@ -11540,6 +11625,18 @@ paths:
type: boolean
required:
- success
"202":
description: Accepted. Autumn is experiencing degraded service from a downstream
provider, so the finalize request was allowed fail-open.
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
required:
- success
x-speakeasy-name-override: finalize
parameters:
- *a1
@@ -11609,7 +11706,8 @@ paths:
@returns Whether access is allowed, plus the current balance for that
feature.
feature. If Autumn is experiencing degraded service from a downstream
provider, the API may return 202 and allow access fail-open.
requestBody:
required: true
content:
@@ -12204,6 +12302,532 @@ paths:
resets_at: 1773851121437
price: null
expires_at: null
"202":
description: Accepted. Autumn is experiencing degraded service from a downstream
provider, so access was allowed fail-open.
content:
application/json:
schema:
type: object
properties:
allowed:
type: boolean
description: Whether the customer is allowed to use the feature. True if they
have sufficient balance or the feature is
unlimited/boolean.
customer_id:
type: string
description: The ID of the customer that was checked.
entity_id:
anyOf:
- type: string
- type: "null"
description: The ID of the entity, if an entity-scoped check was performed.
required_balance:
type: number
description: The required balance that was checked against.
balance:
anyOf:
- $ref: "#/components/schemas/Balance"
- type: "null"
description: The customer's balance for this feature. Null if the customer has
no balance for this feature.
flag:
anyOf:
- type: object
properties:
id:
type: string
description: The unique identifier for this flag.
plan_id:
anyOf:
- type: string
- type: "null"
description: The plan ID this flag originates from, or null for standalone
flags.
expires_at:
anyOf:
- type: number
- type: "null"
description: Timestamp when this flag expires, or null for no expiration.
feature_id:
type: string
description: The feature ID this flag is for.
feature:
type: object
properties:
id:
type: string
description: The unique identifier for this feature, used in /check and /track
calls.
name:
type: string
description: Human-readable name displayed in the dashboard and billing UI.
type:
enum:
- boolean
- metered
- credit_system
type: string
description: "Feature type: 'boolean' for on/off access, 'metered' for
usage-tracked features, 'credit_system' for
unified credit pools."
consumable:
type: boolean
description: "For metered features: true if usage resets periodically (API
calls, credits), false if allocated
persistently (seats, storage)."
event_names:
type: array
items:
type: string
description: Event names that trigger this feature's balance. Allows multiple
features to respond to a single event.
credit_schema:
type: array
items:
type: object
properties:
metered_feature_id:
type: string
description: ID of the metered feature that draws from this credit system.
credit_cost:
type: number
description: Credits consumed per unit of the metered feature.
required:
- metered_feature_id
- credit_cost
description: "For credit_system features: maps metered features to their credit
costs."
display:
type: object
properties:
singular:
anyOf:
- type: string
- type: "null"
description: Singular form for UI display (e.g., 'API call', 'seat').
plural:
anyOf:
- type: string
- type: "null"
description: Plural form for UI display (e.g., 'API calls', 'seats').
description: Display names for the feature in billing UI and customer-facing
components.
archived:
type: boolean
description: Whether the feature is archived and hidden from the dashboard.
required:
- id
- name
- type
- consumable
- archived
description: The full feature object if expanded.
required:
- id
- plan_id
- expires_at
- feature_id
examples:
- id: cus_ent_39qmLooixXLAqMywgXywjAz96rV
plan_id: pro_plan
expires_at: null
feature_id: dashboard
- type: "null"
description: The flag associated with this check, if any.
preview:
type: object
properties:
scenario:
enum:
- usage_limit
- feature_flag
type: string
description: The reason access was denied. 'usage_limit' means the customer
exceeded their balance, 'feature_flag' means the
feature is not included in their plan.
title:
type: string
description: A title suitable for displaying in a paywall or upgrade modal.
message:
type: string
description: A message explaining why access was denied.
feature_id:
type: string
description: The ID of the feature that was checked.
feature_name:
type: string
description: The display name of the feature.
products:
type: array
items:
type: object
properties:
id:
type: string
description: The ID of the product you set when creating the product
name:
type: string
description: The name of the product
group:
anyOf:
- type: string
- type: "null"
description: Product group which this product belongs to
env:
enum:
- sandbox
- live
type: string
description: The environment of the product
is_add_on:
type: boolean
description: Whether the product is an add-on and can be purchased alongside
other products
is_default:
type: boolean
description: Whether the product is the default product
archived:
type: boolean
description: Whether this product has been archived and is no longer available
version:
type: number
description: The current version of the product
created_at:
type: number
description: The timestamp of when the product was created in milliseconds since
epoch
items:
type: array
items:
type: object
properties:
type:
anyOf:
- enum:
- feature
- priced_feature
- price
type: string
- type: "null"
description: The type of the product item
feature_id:
anyOf:
- type: string
- type: "null"
description: The feature ID of the product item. If the item is a fixed price,
should be `null`
feature_type:
anyOf:
- enum:
- single_use
- continuous_use
- boolean
- static
type: string
- type: "null"
description: Single use features are used once and then depleted, like API calls
or credits. Continuous use features are
those being used on an ongoing-basis, like
storage or seats.
included_usage:
anyOf:
- anyOf:
- type: number
- const: inf
- type: "null"
description: The amount of usage included for this feature.
interval:
anyOf:
- enum:
- minute
- hour
- day
- week
- month
- quarter
- semi_annual
- year
type: string
- type: "null"
description: The reset or billing interval of the product item. If null, feature
will have no reset date, and if there's a
price, it will be billed one-off.
interval_count:
anyOf:
- type: number
- type: "null"
description: The interval count of the product item.
price:
anyOf:
- type: number
- type: "null"
description: The price of the product item. Should be `null` if tiered pricing
is set.
tiers:
anyOf:
- type: array
items:
anyOf:
- {}
- type: "null"
- type: "null"
description: Tiered pricing for the product item. Not applicable for fixed price
items.
tier_behavior:
anyOf:
- enum:
- graduated
- volume
type: string
- type: "null"
description: "How tiers are applied: graduated (split across bands) or volume
(flat rate for the matched tier). Defaults
to graduated."
usage_model:
anyOf:
- enum:
- prepaid
- pay_per_use
type: string
- type: "null"
description: Whether the feature should be prepaid upfront or billed for how
much they use end of billing period.
billing_units:
anyOf:
- type: number
- type: "null"
description: The amount per billing unit (eg. $9 / 250 units)
reset_usage_when_enabled:
anyOf:
- type: boolean
- type: "null"
description: Whether the usage should be reset when the product is enabled.
entity_feature_id:
anyOf:
- type: string
- type: "null"
description: The entity feature ID of the product item if applicable.
display:
anyOf:
- type: object
properties:
primary_text:
type: string
secondary_text:
anyOf:
- type: string
- type: "null"
required:
- primary_text
- type: "null"
description: The display of the product item.
quantity:
anyOf:
- type: number
- type: "null"
description: Used in customer context. Quantity of the feature the customer has
prepaid for.
next_cycle_quantity:
anyOf:
- type: number
- type: "null"
description: Used in customer context. Quantity of the feature the customer will
prepay for in the next cycle.
config:
anyOf:
- type: object
properties:
rollover:
anyOf:
- type: object
properties:
max:
anyOf:
- type: number
- type: "null"
max_percentage:
anyOf:
- type: number
- type: "null"
duration:
enum:
- month
- forever
type: string
default: month
length:
type: number
required:
- length
- type: "null"
on_increase:
anyOf:
- enum:
- bill_immediately
- prorate_immediately
- prorate_next_cycle
- bill_next_cycle
type: string
- type: "null"
on_decrease:
anyOf:
- enum:
- prorate
- prorate_immediately
- prorate_next_cycle
- none
- no_prorations
type: string
- type: "null"
- type: "null"
description: Configuration for rollover and proration behavior of the feature.
description: Product item defining features and pricing within a product
description: Array of product items that define the product's features and
pricing
free_trial:
anyOf:
- type: object
properties:
duration:
enum:
- day
- month
- year
type: string
description: The duration type of the free trial
length:
type: number
description: The length of the duration type specified
unique_fingerprint:
type: boolean
description: Whether the free trial is limited to one per customer fingerprint
card_required:
type: boolean
description: Whether the free trial requires a card. If false, the customer can
attach the product without going through
a checkout flow or having a card on
file.
trial_available:
anyOf:
- type: boolean
default: true
- type: "null"
description: Used in customer context. Whether the free trial is available for
the customer if they were to attach the
product.
required:
- duration
- length
- unique_fingerprint
- card_required
- type: "null"
description: Free trial configuration for this product, if available
base_variant_id:
anyOf:
- type: string
- type: "null"
description: ID of the base variant this product is derived from
scenario:
enum:
- scheduled
- active
- new
- renew
- upgrade
- update_prepaid_quantity
- downgrade
- cancel
- expired
- past_due
type: string
description: Scenario for when this product is used in attach flows
properties:
type: object
properties:
is_free:
type: boolean
description: True if the product has no base price or usage prices
is_one_off:
type: boolean
description: True if the product only contains a one-time price
interval_group:
anyOf:
- type: string
- type: "null"
description: The billing interval group for recurring products (e.g., 'monthly',
'yearly')
has_trial:
anyOf:
- type: boolean
- type: "null"
description: True if the product includes a free trial
updateable:
anyOf:
- type: boolean
- type: "null"
description: True if the product can be updated after creation (only applicable
if there are prepaid recurring prices)
required:
- is_free
- is_one_off
required:
- id
- name
- group
- env
- is_add_on
- is_default
- archived
- version
- created_at
- items
- free_trial
- base_variant_id
description: Products that would grant access to this feature. Use to display
upgrade options.
required:
- scenario
- title
- message
- feature_id
- feature_name
- products
description: Upgrade/upsell information when access is denied. Only present if
with_preview was true and allowed is false.
required:
- allowed
- customer_id
- balance
- flag
examples:
- allowed: true
customer_id: cus_123
entity_id: null
required_balance: 1
balance:
feature_id: messages
granted: 100
remaining: 72
usage: 28
unlimited: false
overage_allowed: false
max_purchase: null
next_reset_at: 1773851121437
breakdown:
- id: cus_ent_39qmLooixXLAqMywgXywjAz96rV
plan_id: pro_plan
included_grant: 100
prepaid_grant: 0
remaining: 72
usage: 28
unlimited: false
reset:
interval: month
resets_at: 1773851121437
price: null
expires_at: null
x-speakeasy-name-override: check
parameters:
- *a1
@@ -12263,7 +12887,10 @@ paths:
@returns The usage value recorded, with either a single updated balance
or a map of updated balances.
or a map of updated balances. If Autumn is experiencing degraded service
from a downstream provider, the API may return 202 after accepting the
event for replay so it can be tracked as soon as the service is
restored.
requestBody:
required: true
content:
@@ -12386,6 +13013,71 @@ paths:
resets_at: 1773851121437
price: null
expires_at: null
"202":
description: Accepted. Autumn is experiencing degraded service from a downstream
provider, so the event was accepted for replay and will be tracked
as soon as the service is restored.
content:
application/json:
schema:
type: object
properties:
customer_id:
type: string
description: The ID of the customer whose usage was tracked.
entity_id:
type: string
description: The ID of the entity, if entity-scoped tracking was performed.
event_name:
type: string
description: The event name that was tracked, if event_name was used instead of
feature_id.
value:
type: number
description: The amount of usage that was recorded.
balance:
anyOf:
- $ref: "#/components/schemas/Balance"
- type: "null"
description: The updated balance for the tracked feature. Null if tracking by
event_name that affects multiple features.
balances:
type: object
propertyNames:
type: string
additionalProperties:
$ref: "#/components/schemas/Balance"
description: Map of feature_id to updated balance when tracking by event_name
affects multiple features.
required:
- customer_id
- value
- balance
examples:
- customer_id: cus_123
value: 1
balance:
feature_id: messages
granted: 100
remaining: 72
usage: 28
unlimited: false
overage_allowed: false
max_purchase: null
next_reset_at: 1773851121437
breakdown:
- id: cus_ent_39qmLooixXLAqMywgXywjAz96rV
plan_id: pro_plan
included_grant: 100
prepaid_grant: 0
remaining: 72
usage: 28
unlimited: false
reset:
interval: month
resets_at: 1773851121437
price: null
expires_at: null
x-speakeasy-name-override: track
parameters:
- *a1

View File

@@ -16,16 +16,38 @@ import {
balancesTrackJsDoc,
} from "../jsDocs/balancesJsDocs";
type SpecWithResponses = {
responses?: Record<string, object | undefined>;
};
const withAcceptedResponse = <TSpec extends SpecWithResponses>(
spec: TSpec,
nameOverride: string,
description: string,
) => ({
...spec,
"x-speakeasy-name-override": nameOverride,
responses: {
...spec.responses,
202: {
...spec.responses?.["200"],
description,
},
},
});
export const balancesCheckContract = oc
.route({
method: "POST",
path: "/v1/balances.check",
operationId: "check",
description: balancesCheckJsDoc,
spec: (spec) => ({
...spec,
"x-speakeasy-name-override": "check",
}),
spec: (spec) =>
withAcceptedResponse(
spec,
"check",
"Accepted. Autumn is experiencing degraded service from a downstream provider, so access was allowed fail-open.",
),
})
.input(
ExtCheckParamsSchema.meta({
@@ -64,10 +86,12 @@ export const balancesTrackContract = oc
path: "/v1/balances.track",
operationId: "track",
description: balancesTrackJsDoc,
spec: (spec) => ({
...spec,
"x-speakeasy-name-override": "track",
}),
spec: (spec) =>
withAcceptedResponse(
spec,
"track",
"Accepted. Autumn is experiencing degraded service from a downstream provider, so the event was accepted for replay and will be tracked as soon as the service is restored.",
),
})
.input(
TrackParamsSchema.meta({
@@ -156,10 +180,12 @@ export const balancesFinalizeContract = oc
tags: ["balances"],
description:
"Finalize a previously locked balance. Use 'confirm' to commit the deduction, or 'release' to return the held balance.",
spec: (spec) => ({
...spec,
"x-speakeasy-name-override": "finalize",
}),
spec: (spec) =>
withAcceptedResponse(
spec,
"finalize",
"Accepted. Autumn is experiencing degraded service from a downstream provider, so the finalize request was allowed fail-open.",
),
})
.input(
FinalizeLockParamsV0Schema.meta({

View File

@@ -27,7 +27,7 @@ export const balancesCheckJsDoc = createJSDocDescription({
],
methodName: "check",
returns:
"Whether access is allowed, plus the current balance for that feature.",
"Whether access is allowed, plus the current balance for that feature. If Autumn is experiencing degraded service from a downstream provider, the API may return 202 and allow access fail-open.",
});
export const balancesTrackJsDoc = createJSDocDescription({
@@ -56,5 +56,5 @@ export const balancesTrackJsDoc = createJSDocDescription({
],
methodName: "track",
returns:
"The usage value recorded, with either a single updated balance or a map of updated balances.",
"The usage value recorded, with either a single updated balance or a map of updated balances. If Autumn is experiencing degraded service from a downstream provider, the API may return 202 after accepting the event for replay so it can be tracked as soon as the service is restored.",
});

View File

@@ -1,16 +1,16 @@
lockVersion: 2.0.0
id: 7b300647-cd76-49e9-bf77-7d1bf5446d66
management:
docChecksum: f38917335defaad3a30006a26044a642
docChecksum: f77f5b270eb05aabdf92746cfc1c8a1c
docVersion: 2.2.0
speakeasyVersion: 1.759.3
generationVersion: 2.869.25
releaseVersion: 0.10.17
configChecksum: c6b2bd1231da8dc3af5be7430f3cfbac
persistentEdits:
generation_id: 3a5123d6-893b-4feb-88cd-f29b20541bbd
pristine_commit_hash: 907e29e66eda637e4bf967fbeed5cf8d0ebc3a0b
pristine_tree_hash: d73724a3beca30566c4e7ff020eeafcadee9f575
generation_id: a3b10b54-8096-4879-ace9-e1d782c59725
pristine_commit_hash: dd3f08315b4b61f09a17e02d5f3ae7f181b0f077
pristine_tree_hash: f6afcc186b6659c0ea8956f84bdb3a2bb5ec56c9
features:
typescript:
additionalDependencies: 0.1.0
@@ -410,70 +410,126 @@ trackedFiles:
id: 786823ab8ff0
last_write_checksum: sha1:bdaf1519faa1b1024d4e015cb936dc7406959f6d
pristine_git_object: dc3e4bd7fc8266aa083959b5eac4f8a111f7479f
docs/models/check-config.md:
id: 51e4ae8b2551
last_write_checksum: sha1:5c8cd73639f2401662e134559d6c1d4556ce0279
pristine_git_object: d3f109cef10784fb7a3dd840a34f6214c04e29fe
docs/models/check-credit-schema.md:
id: 23d351e08612
last_write_checksum: sha1:2ecc9e7fd584aa86f0527836fbb37b0afbaa669d
pristine_git_object: c77bf103d178ca28a3192f153a676e80735904b2
docs/models/check-env.md:
id: d46376d0c4e0
last_write_checksum: sha1:79f6d930209b23c2bf5eb7ef468feeb2cf92f7b3
pristine_git_object: c91506826d1df807c7e52fc71b93d43a08e64356
docs/models/check-feature.md:
id: 17698212d17f
last_write_checksum: sha1:7da866b793c5b1dc17acbe43c867a0bfcf1d988f
pristine_git_object: aac2da8f1701079e0ee2d546f741ef5232557632
docs/models/check-free-trial.md:
id: cf185d0b9316
last_write_checksum: sha1:bc98bdff33e3810402bbd6223688c5aa09844685
pristine_git_object: 9a2eab113dd5e34faccf718bd046d044ab0e498d
docs/models/check-config1.md:
id: 12248c65dbd6
last_write_checksum: sha1:407da9555ee976adfaaf07ca71a4af839f3942b0
pristine_git_object: 56c99235d306fbc59686c31d8076f042ece7d5d3
docs/models/check-config2.md:
id: c06d98423c85
last_write_checksum: sha1:3f01425adf99f5b98bd3fb776efad63477ffa179
pristine_git_object: 37a12465f59734444b5f211e211b5d39e9b68667
docs/models/check-credit-schema1.md:
id: c6a4121792d7
last_write_checksum: sha1:7498fb3cb82d21dbb2442176bdc616b9517c720a
pristine_git_object: 3d117f48048a47d91bc0bb8fe828bacefe233530
docs/models/check-credit-schema2.md:
id: cb287a316d3f
last_write_checksum: sha1:39a4cc55bb3c56f3d011e9636e4b910695bef383
pristine_git_object: a6c02f3e96e45adce816a2ceaf35de2ecfef6eb4
docs/models/check-env1.md:
id: 39164c945d1e
last_write_checksum: sha1:f4c8b026ef7193fb5378997d0024a437bbca10c9
pristine_git_object: 5651062b5218ba6e284e37ebe7ce1747e4488511
docs/models/check-env2.md:
id: 810bf217e738
last_write_checksum: sha1:e3f78affbb5b2b3076fa7180f47a4e3d916260f2
pristine_git_object: 395bc6a69007183a1e85dfe5c7e36a920280a33c
docs/models/check-feature1.md:
id: 4911e5ca3bbd
last_write_checksum: sha1:6cf187837869d8b6e7ed6317f54889850408f36a
pristine_git_object: ea7f5ff13062d1e64b8804efe7f305f4d25935ea
docs/models/check-feature2.md:
id: 3e789aa99fd1
last_write_checksum: sha1:5d7218e3d596e6ae9283c057cf0bb7d8ff46c6df
pristine_git_object: 6fd456302a01f5b85a9645ba8dcc8d5652f10cd1
docs/models/check-free-trial1.md:
id: 13ac0bc6851a
last_write_checksum: sha1:22d4778d00f68a471d6ed1fa321a83813f8f6d0b
pristine_git_object: bcf98bdacd52e00b9e7e09eb572f5ff4d7a02f8b
docs/models/check-free-trial2.md:
id: 06c598c39d08
last_write_checksum: sha1:8c946023c4a81045f9277d716736fe6fefd2103e
pristine_git_object: 55dab740695b859763c4ffabc568e0c12045af17
docs/models/check-globals.md:
id: c1c736dc89d3
last_write_checksum: sha1:ca5e3ab0ab17689f318982a7889bcc89c7c0e1c4
pristine_git_object: e7a1e28ebd8cb19e0fd665f56754c4252ced391b
docs/models/check-interval.md:
id: 2b947e7da9da
last_write_checksum: sha1:a45ec5c1aa13d5d55190e3d5defb98dea5e56b28
pristine_git_object: 7d90a519f2488653231e338d3d87749b6dd3a429
docs/models/check-item.md:
id: 65ebecbc13ac
last_write_checksum: sha1:7c3aed95d659392564bd1c629f79fac31f752235
pristine_git_object: e0e6ed2f5ff1c7c3b2fc7275169503fd19758e7c
docs/models/check-interval1.md:
id: 7771ce869477
last_write_checksum: sha1:229ea582c6e22e87c33355cbac400f3ce7c11ced
pristine_git_object: 101b7190ea6edbfdbb64f8d621913cc678e5c9b7
docs/models/check-interval2.md:
id: 73c11b51e0f4
last_write_checksum: sha1:fb169811b4d093482185911fe3622f931171a583
pristine_git_object: 6663f4f81d2eb31450edb35fb1e1994b02a21e4a
docs/models/check-item1.md:
id: 371420ba5084
last_write_checksum: sha1:c60759f6237512021ab47e2ead20159cabe1c254
pristine_git_object: f2137cf567b3b05143afc2d5b6567b7208d66ce0
docs/models/check-item2.md:
id: 455e28bf1f61
last_write_checksum: sha1:f6c8fc2cbcc944e29d6c9f1affb1819f04a01ff5
pristine_git_object: f426f9d7d6e854d2964306d16231ac1a83bfcb7e
docs/models/check-lock.md:
id: dcd32828bfb4
last_write_checksum: sha1:e1abe8cbfa6ae715aee62cd16d53fb9fe9bc42d5
pristine_git_object: b21ba54a0652e2c016fcb4434880c429fa4c41b3
docs/models/check-on-decrease.md:
id: 361f05432960
last_write_checksum: sha1:4aae28abd12eeccf2ee789c3684cb06052776115
pristine_git_object: e08007c0ffd502919dd23fab540d0ce3ac92150f
docs/models/check-on-increase.md:
id: 9f889141cf7b
last_write_checksum: sha1:539207de265a87ce63f2b37cd9a88d5dddc5ce8b
pristine_git_object: 985357bc0cc5110a25535a26fe123d923eccc52b
docs/models/check-on-decrease1.md:
id: bbd6ca066659
last_write_checksum: sha1:5ac919c7c94dce26869b1b96263edd6fe0ef6ffe
pristine_git_object: 8d7b2619fdbf6c7759f0b02bdf6222a1481f0c8b
docs/models/check-on-decrease2.md:
id: 333ab766169b
last_write_checksum: sha1:b569dd9fc4f5095e837349449e41747d1547ab2d
pristine_git_object: 81fba0dc1ca715c2c87150852f5ea6b3d7ea9b03
docs/models/check-on-increase1.md:
id: 42764b15d460
last_write_checksum: sha1:5c45815e45132fc03f35e20118b8c0ae4c0e23d1
pristine_git_object: a6f9602cbdfae47422af9644d90b58637cbc480c
docs/models/check-on-increase2.md:
id: f8686ee92533
last_write_checksum: sha1:1c0a4bf558d318e6be90470c4e18156e23db7780
pristine_git_object: a834fd56d91c8463fbfda0c5326874862dd042f9
docs/models/check-params.md:
id: 1f4a01957fbe
last_write_checksum: sha1:c8c546b4aa4d1e459aef8131e522e6bf41ccc7c7
pristine_git_object: 5815e9a4d8b5921e63cce39209bb8172a65659d8
docs/models/check-response-body1.md:
id: fe7fb45cea45
last_write_checksum: sha1:26897ebc453ccd5c894ba598f285a74d05fc515b
pristine_git_object: 25a19c5abf9e43599ca4d4c06db50bd4befa6296
docs/models/check-response-body2.md:
id: 5dee363a1bb2
last_write_checksum: sha1:33baa24a565d51b768bc28121ed5c596ee7ea4d1
pristine_git_object: 8c6dd5fc87a5b3584d6ad74fc457bea794fa8915
docs/models/check-response.md:
id: d686426b106e
last_write_checksum: sha1:c886a81c0a5fc1c3e16c4ac0f85837556d02a049
pristine_git_object: f80e7e0b59a829dd4546bd0c6e80c3514b9be4c9
docs/models/check-rollover.md:
id: e0c3715cbbae
last_write_checksum: sha1:80175a4212763459f3ed77feaccd5e14c457d88c
pristine_git_object: e84db9458a58a2be052b70c4f23e083554650b06
docs/models/check-tier-behavior.md:
id: 89be3843344e
last_write_checksum: sha1:942afb288468d96e6b14d3ae855b8dfbc2540083
pristine_git_object: 77d39923ac11253f4bef2b2a581c9a1c6e634393
docs/models/config-duration.md:
id: d65392b01d8d
last_write_checksum: sha1:ee95e37dba737aae387490c38a25e7cd540d31f4
pristine_git_object: d7f89da44a6bcb92ea2604a44881f3492644353b
last_write_checksum: sha1:097a5eaecd280f329d04998f22ec0054dac66860
pristine_git_object: f92670361472d702fe8f0904bcef87757f774ccc
docs/models/check-rollover1.md:
id: 1ce2cc8c99b8
last_write_checksum: sha1:0bab5a46354397ab98699802d8d8b68bb9438d91
pristine_git_object: 37f686b82cce1cb0c19d46e7690ff1600a4b364f
docs/models/check-rollover2.md:
id: f14d7927e0fe
last_write_checksum: sha1:2ac20e2990a0692eae5805f7d1c0e190cade568c
pristine_git_object: 0c0c3533abe5f1ba1bd1406d9f9990da76d1d5c8
docs/models/check-tier-behavior1.md:
id: f706971c8df7
last_write_checksum: sha1:9ba7e214d2dec5bd53b56e352fa24181402eea7e
pristine_git_object: c0614492aa04236769f57c04c93e6231ebada5d0
docs/models/check-tier-behavior2.md:
id: a7c60a76efaa
last_write_checksum: sha1:3f5cd2bb25df5d2e15981ff6428e3eb2f3b6dbd0
pristine_git_object: 286bb306b086cd4ac3b2fb2558763725dda76a7c
docs/models/config-duration1.md:
id: b92f5461077c
last_write_checksum: sha1:d985bf6694856a41dc6e989e459bb9e776465fd2
pristine_git_object: a1484c1b5ab2f08ae0d2b352091a10c128b57951
docs/models/config-duration2.md:
id: 69fbee651fe4
last_write_checksum: sha1:42075b517dc431b582ffb160ee3bae87b3939314
pristine_git_object: c85f00335a0f5ebaf2db639064603783b7231f8d
docs/models/create-balance-duration.md:
id: ecd288ab29a3
last_write_checksum: sha1:7b89f54a11e3018b909dbf2c2cdb244748a79c40
@@ -642,6 +698,14 @@ trackedFiles:
id: 4b62f4430e70
last_write_checksum: sha1:6f14cf6ec48162bc6154580375c55f699b9925a1
pristine_git_object: 5a51ad5a3c5938a475f94789e10e56e93aa198f5
docs/models/create-plan-config-request.md:
id: 43ddb5f98ee5
last_write_checksum: sha1:69d4b3a831978ba13e5973140d21f35746dffa7a
pristine_git_object: 01a28803ce9f6db4294cf8b37dc09f4406dbb0eb
docs/models/create-plan-config-response.md:
id: 2ad1b88a85c3
last_write_checksum: sha1:2965fcdded006fc7e79cc236bed9d84051c798c0
pristine_git_object: 481a5081af12979bc32ef1f599f253b04cad34d8
docs/models/create-plan-credit-schema.md:
id: 213fe4cef877
last_write_checksum: sha1:9a9109b25682ec0ed4db881cf449e6ed823eb124
@@ -716,8 +780,8 @@ trackedFiles:
pristine_git_object: 4636c8e7bc514c5398be5f2af59d18fcf652cfd3
docs/models/create-plan-params.md:
id: 9570d70789a1
last_write_checksum: sha1:d8adbcb0249b2161bafbe297f77fbe68ecac9527
pristine_git_object: 73f30152ca92f1e90ebc0f6404c58893fba0eea8
last_write_checksum: sha1:de76069455af87200818a8d7b2d192cb1b2bf26d
pristine_git_object: 215e4320b6640213542773b24f0404e4b5af376e
docs/models/create-plan-plan-item.md:
id: cc6b2127965e
last_write_checksum: sha1:32b1546a311beca13ff1ec2ea13f55fe67b839fb
@@ -768,8 +832,8 @@ trackedFiles:
pristine_git_object: f99bd3cdd5b9038791efdc0811b61abb4b8c7db9
docs/models/create-plan-response.md:
id: f48e8b1136af
last_write_checksum: sha1:a203f0caab2f9ab1592ac1fe2f94fbf43d11aa87
pristine_git_object: 72eae3131ae2b03bdbcb7e1123b8b54c6105d74d
last_write_checksum: sha1:caacca009b6ebd1a12cff7200d485eed907db391
pristine_git_object: f618e72a80ecdefee38ff6c7fc4efe12493bdaeb
docs/models/create-plan-rollover-request.md:
id: 10237b75cd73
last_write_checksum: sha1:4c1b0ddde1b8d4232668b42e694cff3ca1c19f43
@@ -1014,10 +1078,14 @@ trackedFiles:
id: 3a927f275515
last_write_checksum: sha1:19a85259a30b26567db272e409038d45136a35c8
pristine_git_object: cdf1d50ae086bd5778c6c266097c00619c0787df
docs/models/feature-type.md:
id: c6368d6178e0
last_write_checksum: sha1:6cfb774eadb97f33ce64f0e3a0d6a651f989b2c9
pristine_git_object: 8d1c1037ac18f2073977feb666331ee662cd3ad3
docs/models/feature-type1.md:
id: 7a7856945efc
last_write_checksum: sha1:d58d7f86b5538743051f1907fe11cba4eb25b587
pristine_git_object: 2f84c4455758c76b44852be1ca78db23dc247cd4
docs/models/feature-type2.md:
id: cba2c8cb3ceb
last_write_checksum: sha1:d966dffe5ba0b6cea35acb591f76d3ba354c0ab5
pristine_git_object: 22cb0f95afca20abd0512ff1b879945666ae942e
docs/models/finalize-balance-params.md:
id: d27a9dc54b34
last_write_checksum: sha1:4a792e241eec2080f50ce35affdbe233f2452da5
@@ -1026,30 +1094,54 @@ trackedFiles:
id: 9e46b2266879
last_write_checksum: sha1:71ca1201534ec6648233b162a2182853e22c5bf3
pristine_git_object: f9b057e603470bb3b10559db649d12276ca9441f
docs/models/finalize-lock-response-body1.md:
id: a26657e9fc9b
last_write_checksum: sha1:3ec646f95ff32c26aabe5344be76ba1fd20141a2
pristine_git_object: 1ecb12ad7b1f4295d92707205dfd15a638f04c43
docs/models/finalize-lock-response-body2.md:
id: b6c64f1548c8
last_write_checksum: sha1:8cd028fcf2ae8e01308deb5f4f6aa521fb6e5c12
pristine_git_object: d8e92965780a197fb88d8d7ffab88683fe6c038c
docs/models/finalize-lock-response.md:
id: 1d3e59ed6f9f
last_write_checksum: sha1:2cb76104cdcfc8523df0b1bee455803d92d1a03d
pristine_git_object: 73e853665d84c32272456719c739e803c14f8494
docs/models/flag-display.md:
id: ce9b9b5870aa
last_write_checksum: sha1:be8f81dafec1083eba0da6699a54562e549da313
pristine_git_object: 382a852fd69e97fa81176acdd66a374f5254399a
docs/models/flag-type.md:
id: bea64d93e37a
last_write_checksum: sha1:f347144e427f1c112728d1822c769c87fce21e6f
pristine_git_object: 7bb722b222e6bd30c8da293c4e3ab33005c0f14d
docs/models/flag.md:
id: f7a84826e2db
last_write_checksum: sha1:68a6e6d129bcef481cfb50fc83955242d6c63edf
pristine_git_object: 2648907da03277b759d0a677570c0aaf679c6aca
last_write_checksum: sha1:228fb911552a0230572611e839dd1d88a67e2f0a
pristine_git_object: 1245c94d0e602d8ef227c2b8b806fcb182b038c6
docs/models/flag-display1.md:
id: 795088cca79e
last_write_checksum: sha1:434ec2ae0dac8c5387d8a9d605603fe88000d25f
pristine_git_object: 794b09f09fbf266c9d5eb6d9466bf62f8b9ed2cd
docs/models/flag-display2.md:
id: d89ae8a6f251
last_write_checksum: sha1:1aa8f537c82e8734615e93edbe9001143f636c6d
pristine_git_object: da2af4c5d2803a58d4e4024c4f932bf98d81f47b
docs/models/flag-type1.md:
id: 15d64d2ad155
last_write_checksum: sha1:5c3e6abbce2cc1e2031dec3753e1b772c33c2be2
pristine_git_object: f89e223ad297c3a58ae898e13db7189b6dd7f0b1
docs/models/flag-type2.md:
id: d17b05a3a757
last_write_checksum: sha1:06900ede6a3c179425a57395ccfdede8c6cb05cd
pristine_git_object: 35462df3dbfed697a499518ef17b3a0a7e18a115
docs/models/flag1.md:
id: 56f975d669ad
last_write_checksum: sha1:76d82de9c6f767225df3d503c13ed5b2ff9235a1
pristine_git_object: 9a60283c41cf15707c6a18d145bb6a526f290f66
docs/models/flag2.md:
id: aa1218c7a1e0
last_write_checksum: sha1:de961b4f67dbaee523da2fe948eaa7f3953c402c
pristine_git_object: 4e103bd91045d0ea4aa9942bd2ebcef6353459ea
docs/models/flags.md:
id: cb7c8de0dda0
last_write_checksum: sha1:1ab6efab085526a9c4762eee212dcf17657695b1
pristine_git_object: 31ef9d606867dca40dea4bc8c751118acfb7077f
docs/models/free-trial-duration.md:
id: f12ff48f6deb
last_write_checksum: sha1:522ce4071e5cacf6aed1573e6b9c4ef8114de6f7
pristine_git_object: be7e436b27f6c19e74687875395980c34840b330
docs/models/free-trial-duration1.md:
id: 489b02917323
last_write_checksum: sha1:c8eeda3fd04248398afb5d63fa625a63ad4b3433
pristine_git_object: 55a7c3ba219ef88575dd74aef87d4ef591b2f2e4
docs/models/free-trial-duration2.md:
id: b59a2d07f9ed
last_write_checksum: sha1:2344cafa7f5cfa06525a5a9d62dd685f541b8434
pristine_git_object: e07184b88c1a11c20ea90e111fc98e2ebfb1a600
docs/models/free-trial-request.md:
id: 746a54d9b71f
last_write_checksum: sha1:3e9f8119181b6d56ed4f0021f8f97766996ffb04
@@ -1206,6 +1298,10 @@ trackedFiles:
id: 81d8a111a09a
last_write_checksum: sha1:25fc939c3c24f1e4fdee1ac9f9668dcaea817291
pristine_git_object: d7318d7d8db471de2c14e9f80225da5437dc0aea
docs/models/get-plan-config.md:
id: 607800ff047a
last_write_checksum: sha1:f4d97021b0aee67fcb2c809e9b93bd0d1991d801
pristine_git_object: 5983e36521ca84b8505225e9f8eb71d593aca228
docs/models/get-plan-credit-schema.md:
id: fdfd3a232487
last_write_checksum: sha1:bda036d0335542dc4bea36444ead3b4d1fc31c6b
@@ -1284,8 +1380,8 @@ trackedFiles:
pristine_git_object: 77c04173688934e1b024f1401da75240777ab5c5
docs/models/get-plan-response.md:
id: fd0d6a5893f8
last_write_checksum: sha1:97aae03bfffc36ee5bf342362365923dc0da73e1
pristine_git_object: ba0e0dfac6d39006ef18de08de9f2f233d6abda9
last_write_checksum: sha1:2380f1b851cf82b1382a13b53ef60eeebca23f96
pristine_git_object: f6cfa4064e78a99d02d2e134f233cf4f3cf19b39
docs/models/get-plan-rollover.md:
id: 8ff9768b18a9
last_write_checksum: sha1:1f0608e063f1cb07555af25541af1b3c39aa09d1
@@ -1302,10 +1398,14 @@ trackedFiles:
id: 5300ef539ed8
last_write_checksum: sha1:b334efb80b4e13e356c43248994d2f2640ffcf27
pristine_git_object: b6ff1ca2773ceb3a33da7acc3bf2144f2823c16a
docs/models/included-usage.md:
id: f27abcdfdd7d
last_write_checksum: sha1:ca0a41260fa62322a9525f4267ac0ec6d93ae6d8
pristine_git_object: 5fe6a61067cd319d6cd0d1e1e7f1d165c0d4579d
docs/models/included-usage1.md:
id: a4def1415784
last_write_checksum: sha1:83f97786c0a5ca88c4f689e318146531cdd84ba8
pristine_git_object: cfc9b8b8cde10b6df809ed1cafcca97b60f1d729
docs/models/included-usage2.md:
id: d32fd48d0d1e
last_write_checksum: sha1:1db7b73b664823c5938063172e43017b807eea84
pristine_git_object: c3892aa1ab8837c731f49e042711f10729d82df9
docs/models/intent.md:
id: a4a6fa8818f7
last_write_checksum: sha1:39fa3a78bda572fa9b8a765966413b6d2b4436ea
@@ -1470,6 +1570,10 @@ trackedFiles:
id: 925f450419aa
last_write_checksum: sha1:6b7a4aa06733643802a7ca7e0f6fff763ca86eaa
pristine_git_object: 0466e6a0248bc7e481df111bed7f2db6e27c1e7e
docs/models/list-plans-config.md:
id: 0c2ac2565c92
last_write_checksum: sha1:c7211fb3a1c9db22f2da181ec43bfa151c5e9f50
pristine_git_object: f1e6424536556ef65d6fbc0086b41d6ed4c3a324
docs/models/list-plans-credit-schema.md:
id: 3f2d4bd971cc
last_write_checksum: sha1:11870331e68516a49daa39eab1dc751ee0a8674b
@@ -1520,8 +1624,8 @@ trackedFiles:
pristine_git_object: 378d7d1cba1dbb7be7733b007749bb6d719e26bf
docs/models/list-plans-list.md:
id: d916e8f7c446
last_write_checksum: sha1:44b80ecdbc23afc3712a4c66b009c235aaeda807
pristine_git_object: 94c1c5e7f7a3b7bca023c517724c9188f5787bfd
last_write_checksum: sha1:518ad868148d67928c79b2da7a12df4ad4a4c833
pristine_git_object: 6883b46582a1178990d14025eaa40e749c2a45db
docs/models/list-plans-params.md:
id: 4b66bf1417a6
last_write_checksum: sha1:ace49e58845a78383d5e26214e791bf7a131fd5b
@@ -1552,8 +1656,8 @@ trackedFiles:
pristine_git_object: 1f6ac37850068cf1dfe4dc7743d0abab5cebb127
docs/models/list-plans-response.md:
id: 9441ad31d57f
last_write_checksum: sha1:bc3ef6b2727337618f63666765f639f53e8572cb
pristine_git_object: 55a7c5e5e99353bdc08a15805106262cf2c6bc4a
last_write_checksum: sha1:f19898200a35677e2d68233bc40f1b05ae2bde90
pristine_git_object: d2ed9c818b2e80d634ddb6dda47d30a1c7d57a38
docs/models/list-plans-rollover.md:
id: 19aa526beff0
last_write_checksum: sha1:9179fd3d1ab7622bdbf4808116af5cc39c08fc43
@@ -1730,6 +1834,10 @@ trackedFiles:
id: 4789ae90ae01
last_write_checksum: sha1:7e999cb8f855e8f3d917a2024ed3fd88803b45cd
pristine_git_object: aa533c8b3c984f8773a81063ee748107b2eff98d
docs/models/plan-config.md:
id: 261d8a3d0cf4
last_write_checksum: sha1:096ce56e419994eabe3e85c5b0dc19d847f87ea5
pristine_git_object: 31572368e97f28ca2fe42e948c2b16de6722e375
docs/models/plan-credit-schema.md:
id: 4a323c1dbf0a
last_write_checksum: sha1:167acec310caca3e8e3b1cd5461c5453994f09c9
@@ -1800,8 +1908,8 @@ trackedFiles:
pristine_git_object: 7bc7590d5b2edd57dc26811f4a9ce9e60d4c02a3
docs/models/plan.md:
id: 900c4149ef4b
last_write_checksum: sha1:62a2df64c93f1320fb1a1175222770ede624008b
pristine_git_object: e12ea4639ef56be38114ad4e493c05043a98e7f0
last_write_checksum: sha1:cda2b09a51edc8803af0e3f264958871d9453f8e
pristine_git_object: 437656dd99caa5529d947667b536dcbdb62ee3d3
docs/models/preview-attach-attach-discount.md:
id: b0e773c166f7
last_write_checksum: sha1:a6efccaad3aedb6172053dc61824402f891ff6ed
@@ -2338,34 +2446,58 @@ trackedFiles:
id: 3c7caea04355
last_write_checksum: sha1:4526b7aa9999cbf699a15b2187aa5bd4de5b6206
pristine_git_object: f62b42a1a7d41787d477f99ef1702a735196a400
docs/models/preview.md:
id: ca71b601ef12
last_write_checksum: sha1:aa806d7dd8515ee48400ccbae3f07b86b9694420
pristine_git_object: d8d0ac14ea6dafffa2f62eccb094cca9f153c4bf
docs/models/preview1.md:
id: 203e34d3c393
last_write_checksum: sha1:baa476c6f9eca778b764c559b11eb985d9396c46
pristine_git_object: 6b9852fd043a11b17349ff52cbdafb537ac867e0
docs/models/preview2.md:
id: 96d6fae57a72
last_write_checksum: sha1:728c176a1f265ca95c54c05ec4b62bb429b26aa2
pristine_git_object: 3abb2cf65f13570a222275a9b2c7c38be94d5f81
docs/models/processor.md:
id: e77acb454265
last_write_checksum: sha1:2547723a165d332580ab872bb3cf5f1070ceec3d
pristine_git_object: c4c66c1e5f96fa971a6359bbf77bf3b6df448d2b
docs/models/product-display.md:
id: 21fc9cc2b072
last_write_checksum: sha1:f97e0642300ed0870335c631395e187150d12838
pristine_git_object: 71aafeb419a55dced06ff025e7aa4ed9af46b812
docs/models/product-scenario.md:
id: 53b34e452304
last_write_checksum: sha1:d8d212b4bce953dba908f5a676ac29b51420b380
pristine_git_object: 5389e3320fc5eb7fac528b4f405b73143565b6e5
docs/models/product-type.md:
id: 739b492c48c8
last_write_checksum: sha1:b16bb5e2b258d3eabb0213f6dd24c5b36a5fc581
pristine_git_object: 42b3d7af1ce89e608a6c6c41c65098305b5ac826
docs/models/product.md:
id: c91436bbe13a
last_write_checksum: sha1:041b51afd3f44784a3ac0e9fe1d343ce034c6d5c
pristine_git_object: 5316a24e66c301315d6be2662e9a814022b0af04
docs/models/properties.md:
id: 78b1b1d1b631
last_write_checksum: sha1:5d6627cde2aa86a31974cd3bf255765757c35da2
pristine_git_object: fda272f14753b6e647c681e24011c9de15a57724
docs/models/product-display1.md:
id: 0ab8e93a2eb3
last_write_checksum: sha1:c111a88e04ea033eff7c19977d3a56d24ba22845
pristine_git_object: 2eac6685823dcf5710c6fb12670ea593f7a84944
docs/models/product-display2.md:
id: ec6de1d4fb2e
last_write_checksum: sha1:0766d3275e4a6b992f1cb7b1c9e78e1bf4a3af83
pristine_git_object: 942b99d64bb2b5f8af337646041845f0f2389d3b
docs/models/product-scenario1.md:
id: 2d76692936bf
last_write_checksum: sha1:d4e3a79025c88076b2e186a155f0019191855db8
pristine_git_object: e51e6f25dfc0709cd257497ef67d3c286669f49a
docs/models/product-scenario2.md:
id: 68f198bdb022
last_write_checksum: sha1:341100a208fd01a1068084692136256901378445
pristine_git_object: 1e22767d9b6c5398a324476254198d69d40fb86e
docs/models/product-type1.md:
id: a0c4545ab104
last_write_checksum: sha1:573f1476d0dbdccf29519c23178d3083edfc36b3
pristine_git_object: 24d3e6b9a36a6fbbbc305db59fc05635b2bcecb2
docs/models/product-type2.md:
id: c75d4dab1916
last_write_checksum: sha1:0e5d9f554d0ab6ebd5073b00b14d5eddaf42c825
pristine_git_object: 5add6b6648df42f5dd60678e644fec5a3f2626f4
docs/models/product1.md:
id: 880ca8ae9886
last_write_checksum: sha1:9253388ef4ce974184b84ebeb012d18defed9e21
pristine_git_object: 67ec68bcf882341e97e4575429c1656c5a5bbafa
docs/models/product2.md:
id: 6262b044d234
last_write_checksum: sha1:eba731a0429ff4824f8e658bc87b6b9047ff4b3a
pristine_git_object: 0a1d5f6fda8ab96d8987a5617bb55fd3882ffbd4
docs/models/properties1.md:
id: d1dd750f2ed3
last_write_checksum: sha1:2336ba133059be249159bdcd6a7981282ad69796
pristine_git_object: a3d7dfc6064d13237ed0944d3c5f1ca80d787232
docs/models/properties2.md:
id: 3ada091965bd
last_write_checksum: sha1:aa9bfb0870b6f8161503b9fe62408dcba1e571cd
pristine_git_object: e72588a57659e03f689537809123070a75c8c341
docs/models/purchase.md:
id: f872769b6939
last_write_checksum: sha1:f478ae26fe728efde7d8e38ce46593dab6d5f9d0
@@ -2402,10 +2534,14 @@ trackedFiles:
id: 4551c882db3e
last_write_checksum: sha1:400f48d09c30265fc4650ca42db90109dfdda599
pristine_git_object: 08b89a9cc150d2d174408e0ccb7d2eea9b8e4014
docs/models/scenario.md:
id: e3aad8ab5efa
last_write_checksum: sha1:092442eb1ef3d6258528e50ee796c1f2dc6ccdeb
pristine_git_object: d237cbd24dcea87d28d5fe57feeeda9244676f66
docs/models/scenario1.md:
id: 46a671d6aaa0
last_write_checksum: sha1:1a40c54b7c3f4053fda78bffca450e380d31eb87
pristine_git_object: 6ab64adcc85734db7926b0135581597635cf9049
docs/models/scenario2.md:
id: c2fda7f528b7
last_write_checksum: sha1:9d51684de62b540568dd2cfc0e8037478c81a4e5
pristine_git_object: 4475bd8dba44c421eb6db5490cebc474911d1eb5
docs/models/security.md:
id: 452e4d4eb67a
last_write_checksum: sha1:d2af82412a97b139d12d416d11a235638001243b
@@ -2546,10 +2682,18 @@ trackedFiles:
id: 68e025b0826f
last_write_checksum: sha1:2fa060bc795efd2a0ae9847a6cea279e939428a3
pristine_git_object: 55fa006ced11395c51d165a41989961f9e4fb50d
docs/models/track-response-body1.md:
id: d7877cb6c21d
last_write_checksum: sha1:21b8bfcf5415c11b307fcd01b24f4b9d7eaf5e96
pristine_git_object: 58406f1f8e53c70a3dcf907163e4efb296c3d885
docs/models/track-response-body2.md:
id: 19b3b7964db8
last_write_checksum: sha1:bfafaa6d0ab7f90f0f0d59187cc28ae1ca02426f
pristine_git_object: d42ee63d96530895da40e96e16dfd31a90362b27
docs/models/track-response.md:
id: 0d3ebb1bbfdf
last_write_checksum: sha1:cbc389501f2c883260810a00712ef6d5d2451230
pristine_git_object: 727d375f19c28f14c860435fc13a608219a335d7
last_write_checksum: sha1:c63642815e61185f51fcf507d7ec72da814f6283
pristine_git_object: 055635deefc56df1bd122c90c0bfe1d65572b389
docs/models/trials-used.md:
id: 983b78eb51b7
last_write_checksum: sha1:0fdc1753311eb276ea3d69f275f9bafaf196e538
@@ -2834,6 +2978,14 @@ trackedFiles:
id: ddca1b594754
last_write_checksum: sha1:684b8ac067ff95bd19c8252fed27767389012afc
pristine_git_object: 2f38389e4cc43531f126c82a08713edf787e877f
docs/models/update-plan-config-request.md:
id: fa3951297b61
last_write_checksum: sha1:5d642675fb5464890506da5ddb298a143ed520a1
pristine_git_object: 79c5f1d0f2b9d60e2241013dd8803b6cf2c763eb
docs/models/update-plan-config-response.md:
id: 75c895fbca2f
last_write_checksum: sha1:711b349287f71b3f530d351cde4bebce679c8d6e
pristine_git_object: 75f575da5daebff8680e5d1baf2d9e3a4f853f2e
docs/models/update-plan-credit-schema.md:
id: acaf39d42386
last_write_checksum: sha1:af3af2720a587f377efbf14df3e586cc376ead26
@@ -2908,8 +3060,8 @@ trackedFiles:
pristine_git_object: 585c71d0660618338988c819b2c60b5ee4ea29c9
docs/models/update-plan-params.md:
id: baf87a97d876
last_write_checksum: sha1:c2de3cac48cb3dff413360fe334a837079a116ae
pristine_git_object: 5e8b0bc939e635beeb18a74fe3abe2afb23f6731
last_write_checksum: sha1:048b00f5258601c7af582a64abbeaf8de7938caa
pristine_git_object: 3445626b7213751c0b52a5cdf3c613eca096e95d
docs/models/update-plan-plan-item.md:
id: 681d03177a17
last_write_checksum: sha1:9cec44182899deefeaf66dbb255ab7fe80da50b1
@@ -2960,8 +3112,8 @@ trackedFiles:
pristine_git_object: a91ea7b581af0524ec0a17e2d4dfecca576a5d68
docs/models/update-plan-response.md:
id: 438137d6d905
last_write_checksum: sha1:329a0b80646f3292472ff9cbab0b3ae0ab7568bb
pristine_git_object: c6ecdd729c185b0a631a16ba5efb9eab98dd0990
last_write_checksum: sha1:e44c03a173c911d8c8e9c392048270ed19229f1a
pristine_git_object: 0fa67fd6b6f5b7c2def19cda7c60d1942ea2a7bc
docs/models/update-plan-rollover-request.md:
id: 70f500c0dfa8
last_write_checksum: sha1:4830be56801429a844896eeb64eaee855b1011d8
@@ -2998,14 +3150,18 @@ trackedFiles:
id: 2f1abbd42a8a
last_write_checksum: sha1:5c1757a7109e6925391b398bb87223028bd4492d
pristine_git_object: eba25f992fc1e385d65829b01c5846800a44a0b4
docs/models/usage-model.md:
id: 32a269601e79
last_write_checksum: sha1:faa6fbdacaf3e836fef0c74a2430790ed5181d55
pristine_git_object: 14952a4ee67b77ab09f4697e1767649ea412d2d5
docs/models/usage-model1.md:
id: fa88bc92daa3
last_write_checksum: sha1:3c948395ac14ed8930fa41e081f6143de1526f82
pristine_git_object: 3fcafed36cef9c45bcd170c80b1a998197538abe
docs/models/usage-model2.md:
id: 4b2c49a4e9d7
last_write_checksum: sha1:e46213634d6ca1ca4a76ea51e7676beec5b21f48
pristine_git_object: 5e8352cec8aebcd5044ccde5ddcd70a0fbb8537d
docs/sdks/autumn/README.md:
id: d27c9292a1a3
last_write_checksum: sha1:8b3c26a9a0202d01d704f782172e06caef3a9b64
pristine_git_object: e613982bdfa00068af639c756df5ef757e4829b5
last_write_checksum: sha1:0dc24af0d8472b62c75517844334dd35ad491ffa
pristine_git_object: 679856e90f40fadd8549a409a8bb126fd6363578
docs/sdks/balances/README.md:
id: 6ca85866f00d
last_write_checksum: sha1:a4e8baf562d105f12dec6e90ac7a38f8a2c8c5b4
@@ -3032,8 +3188,8 @@ trackedFiles:
pristine_git_object: c93f73a5c5039722cb5799d69e9e4f208ccecfd8
docs/sdks/plans/README.md:
id: 2d8c741fff57
last_write_checksum: sha1:2cd1f3247a34fc5a32816eff83acbd35e2d0cd8d
pristine_git_object: 91259eb35197ab1242d2644e67f67c4e17f80704
last_write_checksum: sha1:2b61a17cf98e0c244bfaddc9b5b945d1ec778b12
pristine_git_object: 9aca7bb4d101682e58743d6fc70415dcc839c38b
docs/sdks/referrals/README.md:
id: 50b71f597f20
last_write_checksum: sha1:9a541f0191db895e4a8ea17c4b61c725ecc40972
@@ -3080,8 +3236,8 @@ trackedFiles:
pristine_git_object: 35150249724d4013c7a9bab5043914c68e294790
src/funcs/balances-finalize.ts:
id: 0cadf4150802
last_write_checksum: sha1:77127694ddec8674a3ba9a52cd67def01e4e28eb
pristine_git_object: 3f90ce62bddced2b9a1bde942534a394be7edb33
last_write_checksum: sha1:96d985206081d494a4f031b5a225bebc1e8b75d9
pristine_git_object: dc348d3d1eaca950c5feda453c43c3d66bb3a0d5
src/funcs/balances-update.ts:
id: a4d3bafe74f2
last_write_checksum: sha1:c179574469056b82c8ab32eb9f8bf64c3c647114
@@ -3120,8 +3276,8 @@ trackedFiles:
pristine_git_object: 61691b0590dbd42f823a8f27518d591f33b97768
src/funcs/check.ts:
id: e962b1e3321b
last_write_checksum: sha1:88705e19bfe4ef3397cc66b815ec842590111be0
pristine_git_object: c4526b300b3976a4c4fe429a40e0bf5d0c0df718
last_write_checksum: sha1:c3c35363a3c1e4999457e18b0b3c0729aa7dd717
pristine_git_object: 995bbfab95f0f6381d7070577a8282aed553d9ea
src/funcs/customers-delete.ts:
id: 92955b4ca056
last_write_checksum: sha1:14160671d93a76cca245a45c25d8465f2e39acd0
@@ -3184,8 +3340,8 @@ trackedFiles:
pristine_git_object: fe5c26238dbcbfef4adffd82d978cfd3b613f96d
src/funcs/plans-create.ts:
id: d67d1d814264
last_write_checksum: sha1:9bc6bf4d8e612c5a9a4914b3ed564bae963383f5
pristine_git_object: 1f6e621322beeee49bf97b983620583849b50645
last_write_checksum: sha1:03438a389dc8312ca1452083e25c57659c2f17ed
pristine_git_object: 27f9713e25d633e18fd781d5c8480e8771c466ff
src/funcs/plans-delete.ts:
id: 993ab1ed44c2
last_write_checksum: sha1:b2b08ac5da98abb9ecda305f9456212e49b9786e
@@ -3200,8 +3356,8 @@ trackedFiles:
pristine_git_object: 3ba5652a7b770a940b0112c9a208f75a6de8642e
src/funcs/plans-update.ts:
id: 86e469e08973
last_write_checksum: sha1:b12108c74307779f582ccd7a8819c1ea968847bf
pristine_git_object: 3d31c3c41956539a19ff1fee506ee43352995296
last_write_checksum: sha1:bfa1ddc48b3a03c38aac1b809ea01224ec75a14c
pristine_git_object: a5ec6ae3a68cf3d6f2cd3bf18e7f6dda0363ccb9
src/funcs/referrals-create-code.ts:
id: f2088dbf847d
last_write_checksum: sha1:f885e8dbe651c2f8c07a3297f31901277d9a57ed
@@ -3212,8 +3368,8 @@ trackedFiles:
pristine_git_object: 5d218a3b4c0d19fbe8ecbb93faef58a04f41282a
src/funcs/track.ts:
id: eb7e0b123329
last_write_checksum: sha1:cb235c96fcac0bc8cc105f7e0efe38577177ca74
pristine_git_object: d37789d33ee1991fbd95bafeeab189ee5427c9b9
last_write_checksum: sha1:1b4f465358428f86a39948ffb6678de215a92835
pristine_git_object: 41a9c7ac2b86c85aef42280879b6ce5c902510ed
src/hooks/hooks.ts:
id: a2463fc6f69b
last_write_checksum: sha1:3a90d88b4c6c07247db8e5f6441a79538232394e
@@ -3320,8 +3476,8 @@ trackedFiles:
pristine_git_object: 1543f29cf697328e23e26ff3d623ef6d84a4feaf
src/models/check-op.ts:
id: 42085bda016a
last_write_checksum: sha1:b621d75cdce22ec92d3fd5cbd938bddf4da62b95
pristine_git_object: 0db3f06ad666fbde55d75ce6443d511dbd933855
last_write_checksum: sha1:0653c63228033f9c13814b934095dd88faa887ce
pristine_git_object: 0f03290733a87dc35e3da844a26ca662a120bd78
src/models/create-balance-op.ts:
id: 537b8ff86863
last_write_checksum: sha1:4d14f12804833140651eb101cef96b9305b45164
@@ -3336,8 +3492,8 @@ trackedFiles:
pristine_git_object: 74a7f92cc3812461d09b81b1a85c7275026f2162
src/models/create-plan-op.ts:
id: e094d152f358
last_write_checksum: sha1:ac80a628d0ce4acf2db1c8d26aadfd2c83532413
pristine_git_object: 9acfcae0a828bc3e9ba9ad3f6ecf74012b93ecec
last_write_checksum: sha1:6107859fc5094bca9697694e3b8cbfb91df38cad
pristine_git_object: ad0c4e4420045aca9ec519fa2c3ba157dbee48ed
src/models/create-referral-code-op.ts:
id: 745cd70e7a69
last_write_checksum: sha1:01ce64d29c3bd84e0c9bf1e6a979e7e493f10d67
@@ -3372,8 +3528,8 @@ trackedFiles:
pristine_git_object: fe9f3ba6325264cd07c3735c675e401a5d91a78e
src/models/finalize-lock-op.ts:
id: 8b7c7048d1dd
last_write_checksum: sha1:8f356c8c314ec0f7eda45c765c63393f61b19247
pristine_git_object: e32f582176649899148ca6afba2175c75dc7abdf
last_write_checksum: sha1:1b4b9e92bcd8ef4c059768b239c8c74c47403abd
pristine_git_object: 1bd8afff1e3e103eaa4c4779bc2b6c4142eb9e02
src/models/get-entity-op.ts:
id: 7932a3cea5c1
last_write_checksum: sha1:c53be8c587568ad3abffb5f5ce9276d83b373bfe
@@ -3388,8 +3544,8 @@ trackedFiles:
pristine_git_object: deca1630425d491788791d872ba43ff4ef269bc6
src/models/get-plan-op.ts:
id: 91c8f8dda7c8
last_write_checksum: sha1:df46ba07b2f642fdaf861fb0e1d4f65cfd7f3b01
pristine_git_object: 665e7ae7909a2d4ab8d04537ed7d45245aecf204
last_write_checksum: sha1:f5df6bccbb2c8bd7585033268f32a7c1b3612621
pristine_git_object: 009eb7eaaa368b9a865761e9067f56f94f82a748
src/models/http-client-errors.ts:
id: 5f17dcf0d62b
last_write_checksum: sha1:994ced121c54fecd0af038ccfb7855fbfd3868ec
@@ -3412,8 +3568,8 @@ trackedFiles:
pristine_git_object: 0f260a39a6ffe401412f6ad510b9e752acd42d3e
src/models/list-plans-op.ts:
id: 513cde894485
last_write_checksum: sha1:1d53cc585d7a8b1127bb77c6ee5474bdcc3ccd5b
pristine_git_object: e44bfa5332c08c7f6e44771046020cda081b2671
last_write_checksum: sha1:2ea91a8bf554199747d047a32edd4a3c7b4b1a53
pristine_git_object: 327e836308abe5459b65b535b45df79654340ed7
src/models/multi-attach-op.ts:
id: 99a2b77c1afc
last_write_checksum: sha1:3bad363528e0a60a5a72558a99bfd755277c54fe
@@ -3424,8 +3580,8 @@ trackedFiles:
pristine_git_object: 4a9318890026bc6e67a8a5b65dc596ae7f25f855
src/models/plan.ts:
id: 9e9698a64fe7
last_write_checksum: sha1:a9266076fdff2f4e9cd96b220b812fbc8e87cf96
pristine_git_object: 71ff35a1a51aef807f47cad94057bc0d121d87ec
last_write_checksum: sha1:d609d4a0d755d9672a9b1f55f148421acf0e3dd7
pristine_git_object: 6034f631bc7041d13e4108aac597ef865d6e0017
src/models/preview-attach-op.ts:
id: 3efc6e3443a7
last_write_checksum: sha1:5468f9876d252848952011798951298d353f45e3
@@ -3460,8 +3616,8 @@ trackedFiles:
pristine_git_object: f297de760b7e2a3456058f007ef13f7d9620a595
src/models/track-op.ts:
id: 5e6a750e8fec
last_write_checksum: sha1:7ca84225f0debe7dc4f4f4f4586052c07a089b78
pristine_git_object: 5643ee40331787c6d2f93e73ed47f0d2c9f779ca
last_write_checksum: sha1:5854e5918eb4d709da5aedcf9aa120e13af4122c
pristine_git_object: 183a2ea5fa8fbf342c52ae63bfc445209a983dac
src/models/update-balance-op.ts:
id: 69282313a00e
last_write_checksum: sha1:d8a5f711a56c32c9dd9fb71b611df33684a3c260
@@ -3480,8 +3636,8 @@ trackedFiles:
pristine_git_object: b1b8e80440aa378657be836028b4bf806c6949b4
src/models/update-plan-op.ts:
id: 54b4f842d3b2
last_write_checksum: sha1:130d7434a1183984cb5153086aae9c57cd6a5f75
pristine_git_object: d6f73962d26f9352bd679f647ae7dc6516cf0691
last_write_checksum: sha1:18a0a4e467e8e8e5bc327024b4c7946743511aba
pristine_git_object: 248544b9b92c9cf10b4af81635e5784c45731fae
src/sdk/balances.ts:
id: 9ad229cb9d64
last_write_checksum: sha1:3e195bbaeea3a9bc5afd4095d92949f3cad0956e
@@ -3512,16 +3668,16 @@ trackedFiles:
pristine_git_object: ecac2264817bb369ff2dbf0f0e9029807e67ff77
src/sdk/plans.ts:
id: c0cb8188cdc1
last_write_checksum: sha1:b970e5940c053fed5735704e9ee346e8306f65f0
pristine_git_object: 05783781bb918ed4b858e779ab12d97c224b527f
last_write_checksum: sha1:62ee50f030050dae85c77a2f877b2471970f29d6
pristine_git_object: 521774c3587bff53d05bf80accc45eb9ccb926ac
src/sdk/referrals.ts:
id: bf164167845c
last_write_checksum: sha1:b73c1db6a419f5c7f6643382d5bc399204e95150
pristine_git_object: 01839523f5433d6365b0f2704b81e5aa72288e66
src/sdk/sdk.ts:
id: 784571af2f69
last_write_checksum: sha1:2505d60046dbd734a1da32f481ed4af8500f2cc9
pristine_git_object: 8a04912ebb49b7d22dcc52ba740b36111666570a
last_write_checksum: sha1:61c9b3c1eb12d00fb48988e99a5b71f2402cf49a
pristine_git_object: b2ef09cb26175aee2ba6103f0c287a0db01522ac
src/types/async.ts:
id: fac8da972f86
last_write_checksum: sha1:3ff07b3feaf390ec1aeb18ff938e139c6c4a9585
@@ -3861,7 +4017,7 @@ examples:
application/json: {}
responses:
"200":
application/json: {"list": [{"id": "pro", "name": "Pro Plan", "description": null, "group": null, "version": 1, "add_on": true, "auto_enable": false, "price": {"amount": 10, "interval": "month", "display": {"primary_text": "<value>"}}, "items": [{"feature_id": "<id>", "included": 100, "unlimited": false, "reset": {"interval": "month"}, "price": {"amount": 0.5, "interval": "month", "billing_units": 4969.56, "billing_method": "usage_based", "max_purchase": 5540.05}, "display": {"primary_text": "<value>"}}, {"feature_id": "<id>", "included": 0, "unlimited": false, "reset": null, "price": {"amount": 10, "interval": "month", "billing_units": 7445.4, "billing_method": "usage_based", "max_purchase": 66.27}, "display": {"primary_text": "<value>"}}], "created_at": 3936.86, "env": "sandbox", "archived": false, "base_variant_id": "<id>"}]}
application/json: {"list": [{"id": "pro", "name": "Pro Plan", "description": null, "group": null, "version": 1, "add_on": true, "auto_enable": false, "price": {"amount": 10, "interval": "month", "display": {"primary_text": "<value>"}}, "items": [{"feature_id": "<id>", "included": 100, "unlimited": false, "reset": {"interval": "month"}, "price": {"amount": 0.5, "interval": "month", "billing_units": 4969.56, "billing_method": "usage_based", "max_purchase": 5540.05}, "display": {"primary_text": "<value>"}}, {"feature_id": "<id>", "included": 0, "unlimited": false, "reset": null, "price": {"amount": 10, "interval": "month", "billing_units": 7445.4, "billing_method": "usage_based", "max_purchase": 66.27}, "display": {"primary_text": "<value>"}}], "created_at": 3936.86, "env": "sandbox", "archived": false, "base_variant_id": "<id>", "config": {"ignore_past_due": false}}]}
attach:
speakeasy-default-attach:
parameters:
@@ -4120,6 +4276,8 @@ examples:
responses:
"200":
application/json: {"allowed": true, "customer_id": "cus_123", "entity_id": null, "required_balance": 1, "balance": {"feature_id": "messages", "granted": 100, "remaining": 72, "usage": 28, "unlimited": false, "overage_allowed": false, "max_purchase": null, "next_reset_at": 1773851121437, "breakdown": [{"id": "cus_ent_39qmLooixXLAqMywgXywjAz96rV", "plan_id": "pro_plan", "included_grant": 100, "prepaid_grant": 0, "remaining": 72, "usage": 28, "unlimited": false, "reset": {"interval": "month", "resets_at": 1773851121437}, "price": null, "expires_at": null}]}, "flag": {"id": "cus_ent_39qmLooixXLAqMywgXywjAz96rV", "plan_id": "pro_plan", "expires_at": null, "feature_id": "dashboard"}}
"202":
application/json: {"allowed": true, "customer_id": "cus_123", "entity_id": null, "required_balance": 1, "balance": {"feature_id": "messages", "granted": 100, "remaining": 72, "usage": 28, "unlimited": false, "overage_allowed": false, "max_purchase": null, "next_reset_at": 1773851121437, "breakdown": [{"id": "cus_ent_39qmLooixXLAqMywgXywjAz96rV", "plan_id": "pro_plan", "included_grant": 100, "prepaid_grant": 0, "remaining": 72, "usage": 28, "unlimited": false, "reset": {"interval": "month", "resets_at": 1773851121437}, "price": null, "expires_at": null}]}, "flag": {"id": "cus_ent_39qmLooixXLAqMywgXywjAz96rV", "plan_id": "pro_plan", "expires_at": null, "feature_id": "dashboard"}}
track:
speakeasy-default-track:
parameters:
@@ -4130,6 +4288,8 @@ examples:
responses:
"200":
application/json: {"customer_id": "cus_123", "value": 1, "balance": {"feature_id": "messages", "granted": 100, "remaining": 72, "usage": 28, "unlimited": false, "overage_allowed": false, "max_purchase": null, "next_reset_at": 1773851121437, "breakdown": [{"id": "cus_ent_39qmLooixXLAqMywgXywjAz96rV", "plan_id": "pro_plan", "included_grant": 100, "prepaid_grant": 0, "remaining": 72, "usage": 28, "unlimited": false, "reset": {"interval": "month", "resets_at": 1773851121437}, "price": null, "expires_at": null}]}}
"202":
application/json: {"customer_id": "cus_123", "value": 1, "balance": {"feature_id": "messages", "granted": 100, "remaining": 72, "usage": 28, "unlimited": false, "overage_allowed": false, "max_purchase": null, "next_reset_at": 1773851121437, "breakdown": [{"id": "cus_ent_39qmLooixXLAqMywgXywjAz96rV", "plan_id": "pro_plan", "included_grant": 100, "prepaid_grant": 0, "remaining": 72, "usage": 28, "unlimited": false, "reset": {"interval": "month", "resets_at": 1773851121437}, "price": null, "expires_at": null}]}}
eventsList:
speakeasy-default-events-list:
parameters:
@@ -4277,7 +4437,7 @@ examples:
application/json: {"plan_id": "free_plan", "group": "", "name": "Free", "add_on": false, "auto_enable": true, "items": [{"feature_id": "messages", "included": 100, "reset": {"interval": "month"}}]}
responses:
"200":
application/json: {"id": "pro", "name": "Pro Plan", "description": null, "group": null, "version": 1, "add_on": false, "auto_enable": false, "price": {"amount": 10, "interval": "month", "display": {"primary_text": "<value>"}}, "items": [{"feature_id": "<id>", "included": 100, "unlimited": false, "reset": {"interval": "month"}, "price": {"amount": 0.5, "interval": "month", "billing_units": 4655.71, "billing_method": "prepaid", "max_purchase": 8104.69}, "display": {"primary_text": "<value>"}}, {"feature_id": "<id>", "included": 0, "unlimited": false, "reset": null, "price": {"amount": 10, "interval": "month", "billing_units": 5104.62, "billing_method": "prepaid", "max_purchase": null}, "display": {"primary_text": "<value>"}}], "created_at": 1016.83, "env": "sandbox", "archived": false, "base_variant_id": "<id>"}
application/json: {"id": "pro", "name": "Pro Plan", "description": null, "group": null, "version": 1, "add_on": false, "auto_enable": false, "price": {"amount": 10, "interval": "month", "display": {"primary_text": "<value>"}}, "items": [{"feature_id": "<id>", "included": 100, "unlimited": false, "reset": {"interval": "month"}, "price": {"amount": 0.5, "interval": "month", "billing_units": 4655.71, "billing_method": "prepaid", "max_purchase": 8104.69}, "display": {"primary_text": "<value>"}}, {"feature_id": "<id>", "included": 0, "unlimited": false, "reset": null, "price": {"amount": 10, "interval": "month", "billing_units": 5104.62, "billing_method": "prepaid", "max_purchase": null}, "display": {"primary_text": "<value>"}}], "created_at": 1016.83, "env": "sandbox", "archived": false, "base_variant_id": "<id>", "config": {"ignore_past_due": false}}
getPlan:
speakeasy-default-get-plan:
parameters:
@@ -4287,7 +4447,7 @@ examples:
application/json: {"plan_id": "pro_plan"}
responses:
"200":
application/json: {"id": "pro", "name": "Pro Plan", "description": null, "group": null, "version": 1, "add_on": true, "auto_enable": false, "price": {"amount": 10, "interval": "month", "display": {"primary_text": "<value>"}}, "items": [{"feature_id": "<id>", "included": 100, "unlimited": false, "reset": {"interval": "month"}, "price": {"amount": 0.5, "interval": "month", "billing_units": 6216.63, "billing_method": "usage_based", "max_purchase": 9351.86}, "display": {"primary_text": "<value>"}}, {"feature_id": "<id>", "included": 0, "unlimited": false, "reset": null, "price": {"amount": 10, "interval": "month", "billing_units": 5235.67, "billing_method": "usage_based", "max_purchase": 9347.74}, "display": {"primary_text": "<value>"}}], "created_at": 1101.73, "env": "sandbox", "archived": false, "base_variant_id": "<id>"}
application/json: {"id": "pro", "name": "Pro Plan", "description": null, "group": null, "version": 1, "add_on": true, "auto_enable": false, "price": {"amount": 10, "interval": "month", "display": {"primary_text": "<value>"}}, "items": [{"feature_id": "<id>", "included": 100, "unlimited": false, "reset": {"interval": "month"}, "price": {"amount": 0.5, "interval": "month", "billing_units": 6216.63, "billing_method": "usage_based", "max_purchase": 9351.86}, "display": {"primary_text": "<value>"}}, {"feature_id": "<id>", "included": 0, "unlimited": false, "reset": null, "price": {"amount": 10, "interval": "month", "billing_units": 5235.67, "billing_method": "usage_based", "max_purchase": 9347.74}, "display": {"primary_text": "<value>"}}], "created_at": 1101.73, "env": "sandbox", "archived": false, "base_variant_id": "<id>", "config": {"ignore_past_due": false}}
updatePlan:
speakeasy-default-update-plan:
parameters:
@@ -4297,7 +4457,7 @@ examples:
application/json: {"plan_id": "pro_plan", "group": "", "name": "Pro Plan (Updated)", "price": {"amount": 15, "interval": "month"}, "archived": false}
responses:
"200":
application/json: {"id": "pro", "name": "Pro Plan", "description": null, "group": null, "version": 1, "add_on": true, "auto_enable": true, "price": {"amount": 10, "interval": "month", "display": {"primary_text": "<value>"}}, "items": [{"feature_id": "<id>", "included": 100, "unlimited": false, "reset": {"interval": "month"}, "price": {"amount": 0.5, "interval": "month", "billing_units": 4113.21, "billing_method": "usage_based", "max_purchase": 5381.55}, "display": {"primary_text": "<value>"}}, {"feature_id": "<id>", "included": 0, "unlimited": false, "reset": null, "price": {"amount": 10, "interval": "month", "billing_units": 3844.43, "billing_method": "prepaid", "max_purchase": 1075.8}, "display": {"primary_text": "<value>"}}], "created_at": 5898.47, "env": "sandbox", "archived": false, "base_variant_id": null}
application/json: {"id": "pro", "name": "Pro Plan", "description": null, "group": null, "version": 1, "add_on": true, "auto_enable": true, "price": {"amount": 10, "interval": "month", "display": {"primary_text": "<value>"}}, "items": [{"feature_id": "<id>", "included": 100, "unlimited": false, "reset": {"interval": "month"}, "price": {"amount": 0.5, "interval": "month", "billing_units": 4113.21, "billing_method": "usage_based", "max_purchase": 5381.55}, "display": {"primary_text": "<value>"}}, {"feature_id": "<id>", "included": 0, "unlimited": false, "reset": null, "price": {"amount": 10, "interval": "month", "billing_units": 3844.43, "billing_method": "prepaid", "max_purchase": 1075.8}, "display": {"primary_text": "<value>"}}], "created_at": 5898.47, "env": "sandbox", "archived": false, "base_variant_id": null, "config": {"ignore_past_due": false}}
deletePlan:
speakeasy-default-delete-plan:
parameters:
@@ -4368,6 +4528,8 @@ examples:
responses:
"200":
application/json: {"success": true}
"202":
application/json: {"success": true}
updateEntity:
speakeasy-default-update-entity:
parameters:

View File

@@ -1136,6 +1136,14 @@ components:
- type: string
- type: "null"
description: If this is a variant, the ID of the base plan it was created from.
config:
type: object
properties:
ignore_past_due:
type: boolean
default: false
description: If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
description: Miscellaneous plan-level configuration flags.
customer_eligibility:
type: object
properties:
@@ -1179,6 +1187,7 @@ components:
- env
- archived
- base_variant_id
- config
Balance:
type: object
properties:
@@ -3072,6 +3081,7 @@ paths:
@param price - Base recurring price for the plan. Omit for free or usage-only plans. (optional)
@param items - Feature configurations for this plan. Each item defines included units, pricing, and reset behavior. (optional)
@param freeTrial - Free trial configuration. Customers can try this plan before being charged. (optional)
@param config - Miscellaneous plan-level configuration flags. (optional)
@returns The created plan object.
tags:
@@ -3298,6 +3308,14 @@ paths:
required:
- duration_length
description: Free trial configuration. Customers can try this plan before being charged.
config:
type: object
properties:
ignore_past_due:
type: boolean
default: false
description: If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
description: Miscellaneous plan-level configuration flags.
required:
- plan_id
- name
@@ -3644,6 +3662,14 @@ paths:
- type: string
- type: "null"
description: If this is a variant, the ID of the base plan it was created from.
config:
type: object
properties:
ignore_past_due:
type: boolean
default: false
description: If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
description: Miscellaneous plan-level configuration flags.
customer_eligibility:
type: object
properties:
@@ -3687,6 +3713,7 @@ paths:
- env
- archived
- base_variant_id
- config
description: A plan defines a set of features, pricing, and entitlements that can be attached to customers.
examples:
- id: pro
@@ -3733,6 +3760,8 @@ paths:
env: sandbox
archived: false
baseVariantId: null
config:
ignore_past_due: false
x-speakeasy-name-override: create
parameters:
- *a1
@@ -4103,6 +4132,14 @@ paths:
- type: string
- type: "null"
description: If this is a variant, the ID of the base plan it was created from.
config:
type: object
properties:
ignore_past_due:
type: boolean
default: false
description: If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
description: Miscellaneous plan-level configuration flags.
customer_eligibility:
type: object
properties:
@@ -4146,6 +4183,7 @@ paths:
- env
- archived
- base_variant_id
- config
description: A plan defines a set of features, pricing, and entitlements that can be attached to customers.
examples:
- id: pro
@@ -4192,6 +4230,8 @@ paths:
env: sandbox
archived: false
baseVariantId: null
config:
ignore_past_due: false
x-speakeasy-name-override: get
parameters:
- *a1
@@ -4540,6 +4580,14 @@ paths:
- type: string
- type: "null"
description: If this is a variant, the ID of the base plan it was created from.
config:
type: object
properties:
ignore_past_due:
type: boolean
default: false
description: If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
description: Miscellaneous plan-level configuration flags.
customer_eligibility:
type: object
properties:
@@ -4583,6 +4631,7 @@ paths:
- env
- archived
- base_variant_id
- config
description: A plan defines a set of features, pricing, and entitlements that can be attached to customers.
required:
- list
@@ -4632,6 +4681,8 @@ paths:
env: sandbox
archived: false
baseVariantId: null
config:
ignore_past_due: false
x-speakeasy-name-override: list
parameters:
- *a1
@@ -4682,6 +4733,7 @@ paths:
@param price - The price of the plan. Set to null to remove the base price. (optional)
@param items - Feature configurations for this plan. Each item defines included units, pricing, and reset behavior. (optional)
@param freeTrial - The free trial of the plan. Set to null to remove the free trial. (optional)
@param config - Miscellaneous plan-level configuration flags. (optional)
@param newPlanId - The new ID to use for the plan. Can only be updated if the plan has not been used by any customers. (optional)
@returns The updated plan object.
@@ -4911,6 +4963,14 @@ paths:
description: Free trial configuration for a plan.
- type: "null"
description: The free trial of the plan. Set to null to remove the free trial.
config:
type: object
properties:
ignore_past_due:
type: boolean
default: false
description: If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
description: Miscellaneous plan-level configuration flags.
version:
type: number
archived:
@@ -5239,6 +5299,14 @@ paths:
- type: string
- type: "null"
description: If this is a variant, the ID of the base plan it was created from.
config:
type: object
properties:
ignore_past_due:
type: boolean
default: false
description: If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
description: Miscellaneous plan-level configuration flags.
customer_eligibility:
type: object
properties:
@@ -5282,6 +5350,7 @@ paths:
- env
- archived
- base_variant_id
- config
description: A plan defines a set of features, pricing, and entitlements that can be attached to customers.
examples:
- id: pro
@@ -5328,6 +5397,8 @@ paths:
env: sandbox
archived: false
baseVariantId: null
config:
ignore_past_due: false
x-speakeasy-name-override: update
parameters:
- *a1
@@ -10598,6 +10669,17 @@ paths:
type: boolean
required:
- success
"202":
description: Accepted. Autumn is experiencing degraded service from a downstream provider, so the finalize request was allowed fail-open.
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
required:
- success
x-speakeasy-name-override: finalize
parameters:
- *a1
@@ -10657,7 +10739,7 @@ paths:
@param withPreview - If true, includes upgrade/upsell information in the response when access is denied. Useful for displaying paywalls. (optional)
@returns Whether access is allowed, plus the current balance for that feature.
@returns Whether access is allowed, plus the current balance for that feature. If Autumn is experiencing degraded service from a downstream provider, the API may return 202 and allow access fail-open.
requestBody:
required: true
content:
@@ -11204,6 +11286,492 @@ paths:
resets_at: 1773851121437
price: null
expires_at: null
"202":
description: Accepted. Autumn is experiencing degraded service from a downstream provider, so access was allowed fail-open.
content:
application/json:
schema:
type: object
properties:
allowed:
type: boolean
description: Whether the customer is allowed to use the feature. True if they have sufficient balance or the feature is unlimited/boolean.
customer_id:
type: string
description: The ID of the customer that was checked.
entity_id:
anyOf:
- type: string
- type: "null"
description: The ID of the entity, if an entity-scoped check was performed.
required_balance:
type: number
description: The required balance that was checked against.
balance:
anyOf:
- $ref: "#/components/schemas/Balance"
- type: "null"
description: The customer's balance for this feature. Null if the customer has no balance for this feature.
flag:
anyOf:
- type: object
properties:
id:
type: string
description: The unique identifier for this flag.
plan_id:
anyOf:
- type: string
- type: "null"
description: The plan ID this flag originates from, or null for standalone flags.
expires_at:
anyOf:
- type: number
- type: "null"
description: Timestamp when this flag expires, or null for no expiration.
feature_id:
type: string
description: The feature ID this flag is for.
feature:
type: object
properties:
id:
type: string
description: The unique identifier for this feature, used in /check and /track calls.
name:
type: string
description: Human-readable name displayed in the dashboard and billing UI.
type:
enum:
- boolean
- metered
- credit_system
type: string
description: "Feature type: 'boolean' for on/off access, 'metered' for usage-tracked features, 'credit_system' for unified credit pools."
consumable:
type: boolean
description: "For metered features: true if usage resets periodically (API calls, credits), false if allocated persistently (seats, storage)."
event_names:
type: array
items:
type: string
description: Event names that trigger this feature's balance. Allows multiple features to respond to a single event.
credit_schema:
type: array
items:
type: object
properties:
metered_feature_id:
type: string
description: ID of the metered feature that draws from this credit system.
credit_cost:
type: number
description: Credits consumed per unit of the metered feature.
required:
- metered_feature_id
- credit_cost
description: "For credit_system features: maps metered features to their credit costs."
display:
type: object
properties:
singular:
anyOf:
- type: string
- type: "null"
description: Singular form for UI display (e.g., 'API call', 'seat').
plural:
anyOf:
- type: string
- type: "null"
description: Plural form for UI display (e.g., 'API calls', 'seats').
description: Display names for the feature in billing UI and customer-facing components.
archived:
type: boolean
description: Whether the feature is archived and hidden from the dashboard.
required:
- id
- name
- type
- consumable
- archived
description: The full feature object if expanded.
required:
- id
- plan_id
- expires_at
- feature_id
examples:
- id: cus_ent_39qmLooixXLAqMywgXywjAz96rV
plan_id: pro_plan
expires_at: null
feature_id: dashboard
- type: "null"
description: The flag associated with this check, if any.
preview:
type: object
properties:
scenario:
enum:
- usage_limit
- feature_flag
type: string
description: The reason access was denied. 'usage_limit' means the customer exceeded their balance, 'feature_flag' means the feature is not included in their plan.
title:
type: string
description: A title suitable for displaying in a paywall or upgrade modal.
message:
type: string
description: A message explaining why access was denied.
feature_id:
type: string
description: The ID of the feature that was checked.
feature_name:
type: string
description: The display name of the feature.
products:
type: array
items:
type: object
properties:
id:
type: string
description: The ID of the product you set when creating the product
name:
type: string
description: The name of the product
group:
anyOf:
- type: string
- type: "null"
description: Product group which this product belongs to
env:
enum:
- sandbox
- live
type: string
description: The environment of the product
is_add_on:
type: boolean
description: Whether the product is an add-on and can be purchased alongside other products
is_default:
type: boolean
description: Whether the product is the default product
archived:
type: boolean
description: Whether this product has been archived and is no longer available
version:
type: number
description: The current version of the product
created_at:
type: number
description: The timestamp of when the product was created in milliseconds since epoch
items:
type: array
items:
type: object
properties:
type:
anyOf:
- enum:
- feature
- priced_feature
- price
type: string
- type: "null"
description: The type of the product item
feature_id:
anyOf:
- type: string
- type: "null"
description: The feature ID of the product item. If the item is a fixed price, should be `null`
feature_type:
anyOf:
- enum:
- single_use
- continuous_use
- boolean
- static
type: string
- type: "null"
description: Single use features are used once and then depleted, like API calls or credits. Continuous use features are those being used on an ongoing-basis, like storage or seats.
included_usage:
anyOf:
- anyOf:
- type: number
- const: inf
- type: "null"
description: The amount of usage included for this feature.
interval:
anyOf:
- enum:
- minute
- hour
- day
- week
- month
- quarter
- semi_annual
- year
type: string
- type: "null"
description: The reset or billing interval of the product item. If null, feature will have no reset date, and if there's a price, it will be billed one-off.
interval_count:
anyOf:
- type: number
- type: "null"
description: The interval count of the product item.
price:
anyOf:
- type: number
- type: "null"
description: The price of the product item. Should be `null` if tiered pricing is set.
tiers:
anyOf:
- type: array
items:
anyOf:
- {}
- type: "null"
- type: "null"
description: Tiered pricing for the product item. Not applicable for fixed price items.
tier_behavior:
anyOf:
- enum:
- graduated
- volume
type: string
- type: "null"
description: "How tiers are applied: graduated (split across bands) or volume (flat rate for the matched tier). Defaults to graduated."
usage_model:
anyOf:
- enum:
- prepaid
- pay_per_use
type: string
- type: "null"
description: Whether the feature should be prepaid upfront or billed for how much they use end of billing period.
billing_units:
anyOf:
- type: number
- type: "null"
description: The amount per billing unit (eg. $9 / 250 units)
reset_usage_when_enabled:
anyOf:
- type: boolean
- type: "null"
description: Whether the usage should be reset when the product is enabled.
entity_feature_id:
anyOf:
- type: string
- type: "null"
description: The entity feature ID of the product item if applicable.
display:
anyOf:
- type: object
properties:
primary_text:
type: string
secondary_text:
anyOf:
- type: string
- type: "null"
required:
- primary_text
- type: "null"
description: The display of the product item.
quantity:
anyOf:
- type: number
- type: "null"
description: Used in customer context. Quantity of the feature the customer has prepaid for.
next_cycle_quantity:
anyOf:
- type: number
- type: "null"
description: Used in customer context. Quantity of the feature the customer will prepay for in the next cycle.
config:
anyOf:
- type: object
properties:
rollover:
anyOf:
- type: object
properties:
max:
anyOf:
- type: number
- type: "null"
max_percentage:
anyOf:
- type: number
- type: "null"
duration:
enum:
- month
- forever
type: string
default: month
length:
type: number
required:
- length
- type: "null"
on_increase:
anyOf:
- enum:
- bill_immediately
- prorate_immediately
- prorate_next_cycle
- bill_next_cycle
type: string
- type: "null"
on_decrease:
anyOf:
- enum:
- prorate
- prorate_immediately
- prorate_next_cycle
- none
- no_prorations
type: string
- type: "null"
- type: "null"
description: Configuration for rollover and proration behavior of the feature.
description: Product item defining features and pricing within a product
description: Array of product items that define the product's features and pricing
free_trial:
anyOf:
- type: object
properties:
duration:
enum:
- day
- month
- year
type: string
description: The duration type of the free trial
length:
type: number
description: The length of the duration type specified
unique_fingerprint:
type: boolean
description: Whether the free trial is limited to one per customer fingerprint
card_required:
type: boolean
description: Whether the free trial requires a card. If false, the customer can attach the product without going through a checkout flow or having a card on file.
trial_available:
anyOf:
- type: boolean
default: true
- type: "null"
description: Used in customer context. Whether the free trial is available for the customer if they were to attach the product.
required:
- duration
- length
- unique_fingerprint
- card_required
- type: "null"
description: Free trial configuration for this product, if available
base_variant_id:
anyOf:
- type: string
- type: "null"
description: ID of the base variant this product is derived from
scenario:
enum:
- scheduled
- active
- new
- renew
- upgrade
- update_prepaid_quantity
- downgrade
- cancel
- expired
- past_due
type: string
description: Scenario for when this product is used in attach flows
properties:
type: object
properties:
is_free:
type: boolean
description: True if the product has no base price or usage prices
is_one_off:
type: boolean
description: True if the product only contains a one-time price
interval_group:
anyOf:
- type: string
- type: "null"
description: The billing interval group for recurring products (e.g., 'monthly', 'yearly')
has_trial:
anyOf:
- type: boolean
- type: "null"
description: True if the product includes a free trial
updateable:
anyOf:
- type: boolean
- type: "null"
description: True if the product can be updated after creation (only applicable if there are prepaid recurring prices)
required:
- is_free
- is_one_off
required:
- id
- name
- group
- env
- is_add_on
- is_default
- archived
- version
- created_at
- items
- free_trial
- base_variant_id
description: Products that would grant access to this feature. Use to display upgrade options.
required:
- scenario
- title
- message
- feature_id
- feature_name
- products
description: Upgrade/upsell information when access is denied. Only present if with_preview was true and allowed is false.
required:
- allowed
- customer_id
- balance
- flag
examples:
- allowed: true
customer_id: cus_123
entity_id: null
required_balance: 1
balance:
feature_id: messages
granted: 100
remaining: 72
usage: 28
unlimited: false
overage_allowed: false
max_purchase: null
next_reset_at: 1773851121437
breakdown:
- id: cus_ent_39qmLooixXLAqMywgXywjAz96rV
plan_id: pro_plan
included_grant: 100
prepaid_grant: 0
remaining: 72
usage: 28
unlimited: false
reset:
interval: month
resets_at: 1773851121437
price: null
expires_at: null
x-speakeasy-name-override: check
parameters:
- *a1
@@ -11252,7 +11820,7 @@ paths:
@param properties - Additional properties to attach to this usage event. (optional)
@returns The usage value recorded, with either a single updated balance or a map of updated balances.
@returns The usage value recorded, with either a single updated balance or a map of updated balances. If Autumn is experiencing degraded service from a downstream provider, the API may return 202 after accepting the event for replay so it can be tracked as soon as the service is restored.
requestBody:
required: true
content:
@@ -11366,6 +11934,66 @@ paths:
resets_at: 1773851121437
price: null
expires_at: null
"202":
description: Accepted. Autumn is experiencing degraded service from a downstream provider, so the event was accepted for replay and will be tracked as soon as the service is restored.
content:
application/json:
schema:
type: object
properties:
customer_id:
type: string
description: The ID of the customer whose usage was tracked.
entity_id:
type: string
description: The ID of the entity, if entity-scoped tracking was performed.
event_name:
type: string
description: The event name that was tracked, if event_name was used instead of feature_id.
value:
type: number
description: The amount of usage that was recorded.
balance:
anyOf:
- $ref: "#/components/schemas/Balance"
- type: "null"
description: The updated balance for the tracked feature. Null if tracking by event_name that affects multiple features.
balances:
type: object
propertyNames:
type: string
additionalProperties:
$ref: "#/components/schemas/Balance"
description: Map of feature_id to updated balance when tracking by event_name affects multiple features.
required:
- customer_id
- value
- balance
examples:
- customer_id: cus_123
value: 1
balance:
feature_id: messages
granted: 100
remaining: 72
usage: 28
unlimited: false
overage_allowed: false
max_purchase: null
next_reset_at: 1773851121437
breakdown:
- id: cus_ent_39qmLooixXLAqMywgXywjAz96rV
plan_id: pro_plan
included_grant: 100
prepaid_grant: 0
remaining: 72
usage: 28
unlimited: false
reset:
interval: month
resets_at: 1773851121437
price: null
expires_at: null
x-speakeasy-name-override: track
parameters:
- *a1

View File

@@ -2,15 +2,15 @@ speakeasyVersion: 1.759.3
sources:
Autumn API:
sourceNamespace: autumn-api
sourceRevisionDigest: sha256:48d0d29f5d454f92a932ab5b2038e24e12d1c67de6373802d1e371d4553c63f0
sourceBlobDigest: sha256:7019c1735364681528d8a9d51224980dfd8194c1df00d8d201a9554e5a6b3f82
sourceRevisionDigest: sha256:d3d26ba6ab7db3f5a3661985d71d8697e1e812c0848b0f62a1cb7ae4e3c7037f
sourceBlobDigest: sha256:dcc11a057d047411aebf667a59812453b3c8dd193d38690a4f17effa0387f8a2
tags:
- latest
- 2.2.0
Autumn API Stripped:
sourceNamespace: autumn-api-stripped
sourceRevisionDigest: sha256:23262259d149413f10097c6d7a3218ccd248f0d6f2aed4ced72a3ffca50893ad
sourceBlobDigest: sha256:6bce1dbff55410405a54a3f9f7809ecfd8702c0245cc81340bad0dd1541ad710
sourceRevisionDigest: sha256:78382a2128f29c0978491db8a16d12a521afc9e92cb2ec02081f36e4e03589f4
sourceBlobDigest: sha256:9a2b226378970e998c818cfe866f7f65bacf818b3bcbcbd40fadf4704e38c124
tags:
- latest
- 2.2.0
@@ -18,17 +18,17 @@ targets:
autumn:
source: Autumn API
sourceNamespace: autumn-api
sourceRevisionDigest: sha256:48d0d29f5d454f92a932ab5b2038e24e12d1c67de6373802d1e371d4553c63f0
sourceBlobDigest: sha256:7019c1735364681528d8a9d51224980dfd8194c1df00d8d201a9554e5a6b3f82
sourceRevisionDigest: sha256:d3d26ba6ab7db3f5a3661985d71d8697e1e812c0848b0f62a1cb7ae4e3c7037f
sourceBlobDigest: sha256:dcc11a057d047411aebf667a59812453b3c8dd193d38690a4f17effa0387f8a2
codeSamplesNamespace: autumn-api-typescript-code-samples
codeSamplesRevisionDigest: sha256:ed725e6d550745811ba55b8f9abcfd47782d47cfe73d09757a4bbf56b240b6a4
codeSamplesRevisionDigest: sha256:ea5f6eed39d476d88dea6d073a04ccf460abdf0a408f6191091d3dd4a11a012f
autumn-python:
source: Autumn API Stripped
sourceNamespace: autumn-api-stripped
sourceRevisionDigest: sha256:23262259d149413f10097c6d7a3218ccd248f0d6f2aed4ced72a3ffca50893ad
sourceBlobDigest: sha256:6bce1dbff55410405a54a3f9f7809ecfd8702c0245cc81340bad0dd1541ad710
sourceRevisionDigest: sha256:78382a2128f29c0978491db8a16d12a521afc9e92cb2ec02081f36e4e03589f4
sourceBlobDigest: sha256:9a2b226378970e998c818cfe866f7f65bacf818b3bcbcbd40fadf4704e38c124
codeSamplesNamespace: autumn-api-python-code-samples
codeSamplesRevisionDigest: sha256:061cc94559a245c03c357d5b0d6126ac4fc685ba6deef135e80ed7bae2a038e2
codeSamplesRevisionDigest: sha256:00e6b68bf6ecaab905d0d77badf57de5813a81541f4a7665771e4208c9af4ac6
workflow:
workflowVersion: 1.0.0
speakeasyVersion: pinned

View File

@@ -181,7 +181,7 @@ const response = await client.check({
@param lock - Reserve units of a feature upfront by passing a lock_id, then call balances.finalize to confirm or release the hold. (optional)
@param withPreview - If true, includes upgrade/upsell information in the response when access is denied. Useful for displaying paywalls. (optional)
@returns Whether access is allowed, plus the current balance for that feature.
@returns Whether access is allowed, plus the current balance for that feature. If Autumn is experiencing degraded service from a downstream provider, the API may return 202 and allow access fail-open.
* [track](docs/sdks/autumn/README.md#track) - Records usage for a customer feature and returns updated balances.
Use this after an action happens to decrement usage, or send a negative value to credit balance back.
@@ -205,7 +205,7 @@ const response = await client.track({ customerId: "cus_123", eventName: "ai_chat
@param value - The amount of usage to record. Defaults to 1. Use negative values to credit balance (e.g., when removing a seat). (optional)
@param properties - Additional properties to attach to this usage event. (optional)
@returns The usage value recorded, with either a single updated balance or a map of updated balances.
@returns The usage value recorded, with either a single updated balance or a map of updated balances. If Autumn is experiencing degraded service from a downstream provider, the API may return 202 after accepting the event for replay so it can be tracked as soon as the service is restored.
### [Balances](docs/sdks/balances/README.md)
@@ -893,7 +893,7 @@ const response = await client.check({
@param lock - Reserve units of a feature upfront by passing a lock_id, then call balances.finalize to confirm or release the hold. (optional)
@param withPreview - If true, includes upgrade/upsell information in the response when access is denied. Useful for displaying paywalls. (optional)
@returns Whether access is allowed, plus the current balance for that feature.
@returns Whether access is allowed, plus the current balance for that feature. If Autumn is experiencing degraded service from a downstream provider, the API may return 202 and allow access fail-open.
- [`customersDelete`](docs/sdks/customers/README.md#delete) - Deletes a customer by ID.
- [`customersGetOrCreate`](docs/sdks/customers/README.md#getorcreate) - Creates a customer if they do not exist, or returns the existing customer by your external customer ID.
@@ -1113,7 +1113,7 @@ const response = await client.track({ customerId: "cus_123", eventName: "ai_chat
@param value - The amount of usage to record. Defaults to 1. Use negative values to credit balance (e.g., when removing a seat). (optional)
@param properties - Additional properties to attach to this usage event. (optional)
@returns The usage value recorded, with either a single updated balance or a map of updated balances.
@returns The usage value recorded, with either a single updated balance or a map of updated balances. If Autumn is experiencing degraded service from a downstream provider, the API may return 202 after accepting the event for replay so it can be tracked as soon as the service is restored.
</details>
<!-- End Standalone functions [standalone-funcs] -->

View File

@@ -152,6 +152,7 @@ async function $do(
| SDKValidationError
>(
M.json(200, models.FinalizeLockResponse$inboundSchema),
M.json(202, models.FinalizeLockResponse$inboundSchema),
M.fail("4XX"),
M.fail("5XX"),
)(response, req);

View File

@@ -57,7 +57,7 @@ import { Result } from "../types/fp.js";
* @param lock - Reserve units of a feature upfront by passing a lock_id, then call balances.finalize to confirm or release the hold. (optional)
* @param withPreview - If true, includes upgrade/upsell information in the response when access is denied. Useful for displaying paywalls. (optional)
*
* @returns Whether access is allowed, plus the current balance for that feature.
* @returns Whether access is allowed, plus the current balance for that feature. If Autumn is experiencing degraded service from a downstream provider, the API may return 202 and allow access fail-open.
*/
export function check(
client: AutumnCore,
@@ -183,6 +183,7 @@ async function $do(
| SDKValidationError
>(
M.json(200, models.CheckResponse$inboundSchema),
M.json(202, models.CheckResponse$inboundSchema),
M.fail("4XX"),
M.fail("5XX"),
)(response, req);

View File

@@ -103,6 +103,7 @@ import { Result } from "../types/fp.js";
* @param price - Base recurring price for the plan. Omit for free or usage-only plans. (optional)
* @param items - Feature configurations for this plan. Each item defines included units, pricing, and reset behavior. (optional)
* @param freeTrial - Free trial configuration. Customers can try this plan before being charged. (optional)
* @param config - Miscellaneous plan-level configuration flags. (optional)
*
* @returns The created plan object.
*/

View File

@@ -71,6 +71,7 @@ import { Result } from "../types/fp.js";
* @param price - The price of the plan. Set to null to remove the base price. (optional)
* @param items - Feature configurations for this plan. Each item defines included units, pricing, and reset behavior. (optional)
* @param freeTrial - The free trial of the plan. Set to null to remove the free trial. (optional)
* @param config - Miscellaneous plan-level configuration flags. (optional)
* @param newPlanId - The new ID to use for the plan. Can only be updated if the plan has not been used by any customers. (optional)
*
* @returns The updated plan object.

View File

@@ -49,7 +49,7 @@ import { Result } from "../types/fp.js";
* @param value - The amount of usage to record. Defaults to 1. Use negative values to credit balance (e.g., when removing a seat). (optional)
* @param properties - Additional properties to attach to this usage event. (optional)
*
* @returns The usage value recorded, with either a single updated balance or a map of updated balances.
* @returns The usage value recorded, with either a single updated balance or a map of updated balances. If Autumn is experiencing degraded service from a downstream provider, the API may return 202 after accepting the event for replay so it can be tracked as soon as the service is restored.
*/
export function track(
client: AutumnCore,
@@ -175,6 +175,7 @@ async function $do(
| SDKValidationError
>(
M.json(200, models.TrackResponse$inboundSchema),
M.json(202, models.TrackResponse$inboundSchema),
M.fail("4XX"),
M.fail("5XX"),
)(response, req);

View File

@@ -74,10 +74,14 @@ export class FailOpenHook implements SDKInitHook, AfterErrorHook {
fetcher: async (input, init) => {
try {
return init == null ? await fetch(input) : await fetch(input, init);
} catch {
} catch (error) {
console.log(error);
console.log(
`Network failed to reach Autumn: ${error}. Returning 555 Network Error.`,
);
return new Response(null, {
status: 503,
statusText: "Autumn Unreachable",
status: 555,
statusText: "Network Error",
});
}
},

File diff suppressed because it is too large Load Diff

View File

@@ -316,6 +316,16 @@ export type FreeTrialRequest = {
cardRequired?: boolean | undefined;
};
/**
* Miscellaneous plan-level configuration flags.
*/
export type CreatePlanConfigRequest = {
/**
* If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
*/
ignorePastDue?: boolean | undefined;
};
export type CreatePlanParams = {
/**
* The ID of the plan to create.
@@ -353,6 +363,10 @@ export type CreatePlanParams = {
* Free trial configuration. Customers can try this plan before being charged.
*/
freeTrial?: FreeTrialRequest | undefined;
/**
* Miscellaneous plan-level configuration flags.
*/
config?: CreatePlanConfigRequest | undefined;
};
/**
@@ -707,6 +721,16 @@ export const CreatePlanEnv = {
*/
export type CreatePlanEnv = OpenEnum<typeof CreatePlanEnv>;
/**
* Miscellaneous plan-level configuration flags.
*/
export type CreatePlanConfigResponse = {
/**
* If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
*/
ignorePastDue: boolean;
};
/**
* The customer's current status with this plan. 'active' if attached, 'scheduled' if pending activation.
*/
@@ -817,6 +841,10 @@ export type CreatePlanResponse = {
* If this is a variant, the ID of the base plan it was created from.
*/
baseVariantId: string | null;
/**
* Miscellaneous plan-level configuration flags.
*/
config: CreatePlanConfigResponse;
customerEligibility?: CreatePlanCustomerEligibility | undefined;
};
@@ -1160,6 +1188,34 @@ export function freeTrialRequestToJSON(
);
}
/** @internal */
export type CreatePlanConfigRequest$Outbound = {
ignore_past_due: boolean;
};
/** @internal */
export const CreatePlanConfigRequest$outboundSchema: z.ZodMiniType<
CreatePlanConfigRequest$Outbound,
CreatePlanConfigRequest
> = z.pipe(
z.object({
ignorePastDue: z._default(z.boolean(), false),
}),
z.transform((v) => {
return remap$(v, {
ignorePastDue: "ignore_past_due",
});
}),
);
export function createPlanConfigRequestToJSON(
createPlanConfigRequest: CreatePlanConfigRequest,
): string {
return JSON.stringify(
CreatePlanConfigRequest$outboundSchema.parse(createPlanConfigRequest),
);
}
/** @internal */
export type CreatePlanParams$Outbound = {
plan_id: string;
@@ -1171,6 +1227,7 @@ export type CreatePlanParams$Outbound = {
price?: CreatePlanPriceRequest$Outbound | undefined;
items?: Array<CreatePlanPlanItem$Outbound> | undefined;
free_trial?: FreeTrialRequest$Outbound | undefined;
config?: CreatePlanConfigRequest$Outbound | undefined;
};
/** @internal */
@@ -1188,6 +1245,7 @@ export const CreatePlanParams$outboundSchema: z.ZodMiniType<
price: z.optional(z.lazy(() => CreatePlanPriceRequest$outboundSchema)),
items: z.optional(z.array(z.lazy(() => CreatePlanPlanItem$outboundSchema))),
freeTrial: z.optional(z.lazy(() => FreeTrialRequest$outboundSchema)),
config: z.optional(z.lazy(() => CreatePlanConfigRequest$outboundSchema)),
}),
z.transform((v) => {
return remap$(v, {
@@ -1580,6 +1638,31 @@ export const CreatePlanEnv$inboundSchema: z.ZodMiniType<
unknown
> = openEnums.inboundSchema(CreatePlanEnv);
/** @internal */
export const CreatePlanConfigResponse$inboundSchema: z.ZodMiniType<
CreatePlanConfigResponse,
unknown
> = z.pipe(
z.object({
ignore_past_due: z._default(types.boolean(), false),
}),
z.transform((v) => {
return remap$(v, {
"ignore_past_due": "ignorePastDue",
});
}),
);
export function createPlanConfigResponseFromJSON(
jsonString: string,
): SafeParseResult<CreatePlanConfigResponse, SDKValidationError> {
return safeParse(
jsonString,
(x) => CreatePlanConfigResponse$inboundSchema.parse(JSON.parse(x)),
`Failed to parse 'CreatePlanConfigResponse' from JSON`,
);
}
/** @internal */
export const CreatePlanStatus$inboundSchema: z.ZodMiniType<
CreatePlanStatus,
@@ -1644,6 +1727,7 @@ export const CreatePlanResponse$inboundSchema: z.ZodMiniType<
env: CreatePlanEnv$inboundSchema,
archived: types.boolean(),
base_variant_id: types.nullable(types.string()),
config: z.lazy(() => CreatePlanConfigResponse$inboundSchema),
customer_eligibility: types.optional(
z.lazy(() => CreatePlanCustomerEligibility$inboundSchema),
),

View File

@@ -8,6 +8,7 @@ import { safeParse } from "../lib/schemas.js";
import { ClosedEnum } from "../types/enums.js";
import { Result as SafeParseResult } from "../types/fp.js";
import * as types from "../types/primitives.js";
import { smartUnion } from "../types/smart-union.js";
import { SDKValidationError } from "./sdk-validation-error.js";
export type FinalizeLockGlobals = {
@@ -46,12 +47,23 @@ export type FinalizeBalanceParams = {
};
/**
* OK
* Accepted. Autumn is experiencing degraded service from a downstream provider, so the finalize request was allowed fail-open.
*/
export type FinalizeLockResponse = {
export type FinalizeLockResponseBody2 = {
success: boolean;
};
/**
* OK
*/
export type FinalizeLockResponseBody1 = {
success: boolean;
};
export type FinalizeLockResponse =
| FinalizeLockResponseBody1
| FinalizeLockResponseBody2;
/** @internal */
export const Action$outboundSchema: z.ZodMiniEnum<typeof Action> = z.enum(
Action,
@@ -93,13 +105,50 @@ export function finalizeBalanceParamsToJSON(
}
/** @internal */
export const FinalizeLockResponse$inboundSchema: z.ZodMiniType<
FinalizeLockResponse,
export const FinalizeLockResponseBody2$inboundSchema: z.ZodMiniType<
FinalizeLockResponseBody2,
unknown
> = z.object({
success: types.boolean(),
});
export function finalizeLockResponseBody2FromJSON(
jsonString: string,
): SafeParseResult<FinalizeLockResponseBody2, SDKValidationError> {
return safeParse(
jsonString,
(x) => FinalizeLockResponseBody2$inboundSchema.parse(JSON.parse(x)),
`Failed to parse 'FinalizeLockResponseBody2' from JSON`,
);
}
/** @internal */
export const FinalizeLockResponseBody1$inboundSchema: z.ZodMiniType<
FinalizeLockResponseBody1,
unknown
> = z.object({
success: types.boolean(),
});
export function finalizeLockResponseBody1FromJSON(
jsonString: string,
): SafeParseResult<FinalizeLockResponseBody1, SDKValidationError> {
return safeParse(
jsonString,
(x) => FinalizeLockResponseBody1$inboundSchema.parse(JSON.parse(x)),
`Failed to parse 'FinalizeLockResponseBody1' from JSON`,
);
}
/** @internal */
export const FinalizeLockResponse$inboundSchema: z.ZodMiniType<
FinalizeLockResponse,
unknown
> = smartUnion([
z.lazy(() => FinalizeLockResponseBody1$inboundSchema),
z.lazy(() => FinalizeLockResponseBody2$inboundSchema),
]);
export function finalizeLockResponseFromJSON(
jsonString: string,
): SafeParseResult<FinalizeLockResponse, SDKValidationError> {

View File

@@ -368,6 +368,16 @@ export const GetPlanEnv = {
*/
export type GetPlanEnv = OpenEnum<typeof GetPlanEnv>;
/**
* Miscellaneous plan-level configuration flags.
*/
export type GetPlanConfig = {
/**
* If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
*/
ignorePastDue: boolean;
};
/**
* The customer's current status with this plan. 'active' if attached, 'scheduled' if pending activation.
*/
@@ -478,6 +488,10 @@ export type GetPlanResponse = {
* If this is a variant, the ID of the base plan it was created from.
*/
baseVariantId: string | null;
/**
* Miscellaneous plan-level configuration flags.
*/
config: GetPlanConfig;
customerEligibility?: GetPlanCustomerEligibility | undefined;
};
@@ -866,6 +880,31 @@ export function getPlanFreeTrialFromJSON(
export const GetPlanEnv$inboundSchema: z.ZodMiniType<GetPlanEnv, unknown> =
openEnums.inboundSchema(GetPlanEnv);
/** @internal */
export const GetPlanConfig$inboundSchema: z.ZodMiniType<
GetPlanConfig,
unknown
> = z.pipe(
z.object({
ignore_past_due: z._default(types.boolean(), false),
}),
z.transform((v) => {
return remap$(v, {
"ignore_past_due": "ignorePastDue",
});
}),
);
export function getPlanConfigFromJSON(
jsonString: string,
): SafeParseResult<GetPlanConfig, SDKValidationError> {
return safeParse(
jsonString,
(x) => GetPlanConfig$inboundSchema.parse(JSON.parse(x)),
`Failed to parse 'GetPlanConfig' from JSON`,
);
}
/** @internal */
export const GetPlanStatus$inboundSchema: z.ZodMiniType<
GetPlanStatus,
@@ -928,6 +967,7 @@ export const GetPlanResponse$inboundSchema: z.ZodMiniType<
env: GetPlanEnv$inboundSchema,
archived: types.boolean(),
base_variant_id: types.nullable(types.string()),
config: z.lazy(() => GetPlanConfig$inboundSchema),
customer_eligibility: types.optional(
z.lazy(() => GetPlanCustomerEligibility$inboundSchema),
),

View File

@@ -372,6 +372,16 @@ export const ListPlansEnv = {
*/
export type ListPlansEnv = OpenEnum<typeof ListPlansEnv>;
/**
* Miscellaneous plan-level configuration flags.
*/
export type ListPlansConfig = {
/**
* If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
*/
ignorePastDue: boolean;
};
/**
* The customer's current status with this plan. 'active' if attached, 'scheduled' if pending activation.
*/
@@ -482,6 +492,10 @@ export type ListPlansList = {
* If this is a variant, the ID of the base plan it was created from.
*/
baseVariantId: string | null;
/**
* Miscellaneous plan-level configuration flags.
*/
config: ListPlansConfig;
customerEligibility?: ListPlansCustomerEligibility | undefined;
};
@@ -891,6 +905,31 @@ export function listPlansFreeTrialFromJSON(
export const ListPlansEnv$inboundSchema: z.ZodMiniType<ListPlansEnv, unknown> =
openEnums.inboundSchema(ListPlansEnv);
/** @internal */
export const ListPlansConfig$inboundSchema: z.ZodMiniType<
ListPlansConfig,
unknown
> = z.pipe(
z.object({
ignore_past_due: z._default(types.boolean(), false),
}),
z.transform((v) => {
return remap$(v, {
"ignore_past_due": "ignorePastDue",
});
}),
);
export function listPlansConfigFromJSON(
jsonString: string,
): SafeParseResult<ListPlansConfig, SDKValidationError> {
return safeParse(
jsonString,
(x) => ListPlansConfig$inboundSchema.parse(JSON.parse(x)),
`Failed to parse 'ListPlansConfig' from JSON`,
);
}
/** @internal */
export const ListPlansStatus$inboundSchema: z.ZodMiniType<
ListPlansStatus,
@@ -953,6 +992,7 @@ export const ListPlansList$inboundSchema: z.ZodMiniType<
env: ListPlansEnv$inboundSchema,
archived: types.boolean(),
base_variant_id: types.nullable(types.string()),
config: z.lazy(() => ListPlansConfig$inboundSchema),
customer_eligibility: types.optional(
z.lazy(() => ListPlansCustomerEligibility$inboundSchema),
),

View File

@@ -349,6 +349,16 @@ export const PlanEnv = {
*/
export type PlanEnv = OpenEnum<typeof PlanEnv>;
/**
* Miscellaneous plan-level configuration flags.
*/
export type PlanConfig = {
/**
* If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
*/
ignorePastDue: boolean;
};
/**
* The customer's current status with this plan. 'active' if attached, 'scheduled' if pending activation.
*/
@@ -456,6 +466,10 @@ export type Plan = {
* If this is a variant, the ID of the base plan it was created from.
*/
baseVariantId: string | null;
/**
* Miscellaneous plan-level configuration flags.
*/
config: PlanConfig;
customerEligibility?: CustomerEligibility | undefined;
};
@@ -811,6 +825,29 @@ export function freeTrialFromJSON(
export const PlanEnv$inboundSchema: z.ZodMiniType<PlanEnv, unknown> = openEnums
.inboundSchema(PlanEnv);
/** @internal */
export const PlanConfig$inboundSchema: z.ZodMiniType<PlanConfig, unknown> = z
.pipe(
z.object({
ignore_past_due: z._default(types.boolean(), false),
}),
z.transform((v) => {
return remap$(v, {
"ignore_past_due": "ignorePastDue",
});
}),
);
export function planConfigFromJSON(
jsonString: string,
): SafeParseResult<PlanConfig, SDKValidationError> {
return safeParse(
jsonString,
(x) => PlanConfig$inboundSchema.parse(JSON.parse(x)),
`Failed to parse 'PlanConfig' from JSON`,
);
}
/** @internal */
export const PlanStatus$inboundSchema: z.ZodMiniType<PlanStatus, unknown> =
openEnums.inboundSchema(PlanStatus);
@@ -866,6 +903,7 @@ export const Plan$inboundSchema: z.ZodMiniType<Plan, unknown> = z.pipe(
env: PlanEnv$inboundSchema,
archived: types.boolean(),
base_variant_id: types.nullable(types.string()),
config: z.lazy(() => PlanConfig$inboundSchema),
customer_eligibility: types.optional(z.lazy(() =>
CustomerEligibility$inboundSchema
)),

View File

@@ -7,6 +7,7 @@ import { remap as remap$ } from "../lib/primitives.js";
import { safeParse } from "../lib/schemas.js";
import { Result as SafeParseResult } from "../types/fp.js";
import * as types from "../types/primitives.js";
import { smartUnion } from "../types/smart-union.js";
import { Balance, Balance$inboundSchema } from "./balance.js";
import { SDKValidationError } from "./sdk-validation-error.js";
@@ -58,9 +59,9 @@ export type TrackParams = {
};
/**
* OK
* Accepted. Autumn is experiencing degraded service from a downstream provider, so the event was accepted for replay and will be tracked as soon as the service is restored.
*/
export type TrackResponse = {
export type TrackResponseBody2 = {
/**
* The ID of the customer whose usage was tracked.
*/
@@ -87,6 +88,38 @@ export type TrackResponse = {
balances?: { [k: string]: Balance } | undefined;
};
/**
* OK
*/
export type TrackResponseBody1 = {
/**
* The ID of the customer whose usage was tracked.
*/
customerId: string;
/**
* The ID of the entity, if entity-scoped tracking was performed.
*/
entityId?: string | undefined;
/**
* The event name that was tracked, if event_name was used instead of feature_id.
*/
eventName?: string | undefined;
/**
* The amount of usage that was recorded.
*/
value: number;
/**
* The updated balance for the tracked feature. Null if tracking by event_name that affects multiple features.
*/
balance: Balance | null;
/**
* Map of feature_id to updated balance when tracking by event_name affects multiple features.
*/
balances?: { [k: string]: Balance } | undefined;
};
export type TrackResponse = TrackResponseBody1 | TrackResponseBody2;
/** @internal */
export type TrackLock$Outbound = {
lock_id: string;
@@ -156,8 +189,8 @@ export function trackParamsToJSON(trackParams: TrackParams): string {
}
/** @internal */
export const TrackResponse$inboundSchema: z.ZodMiniType<
TrackResponse,
export const TrackResponseBody2$inboundSchema: z.ZodMiniType<
TrackResponseBody2,
unknown
> = z.pipe(
z.object({
@@ -177,6 +210,57 @@ export const TrackResponse$inboundSchema: z.ZodMiniType<
}),
);
export function trackResponseBody2FromJSON(
jsonString: string,
): SafeParseResult<TrackResponseBody2, SDKValidationError> {
return safeParse(
jsonString,
(x) => TrackResponseBody2$inboundSchema.parse(JSON.parse(x)),
`Failed to parse 'TrackResponseBody2' from JSON`,
);
}
/** @internal */
export const TrackResponseBody1$inboundSchema: z.ZodMiniType<
TrackResponseBody1,
unknown
> = z.pipe(
z.object({
customer_id: types.string(),
entity_id: types.optional(types.string()),
event_name: types.optional(types.string()),
value: types.number(),
balance: types.nullable(Balance$inboundSchema),
balances: types.optional(z.record(z.string(), Balance$inboundSchema)),
}),
z.transform((v) => {
return remap$(v, {
"customer_id": "customerId",
"entity_id": "entityId",
"event_name": "eventName",
});
}),
);
export function trackResponseBody1FromJSON(
jsonString: string,
): SafeParseResult<TrackResponseBody1, SDKValidationError> {
return safeParse(
jsonString,
(x) => TrackResponseBody1$inboundSchema.parse(JSON.parse(x)),
`Failed to parse 'TrackResponseBody1' from JSON`,
);
}
/** @internal */
export const TrackResponse$inboundSchema: z.ZodMiniType<
TrackResponse,
unknown
> = smartUnion([
z.lazy(() => TrackResponseBody1$inboundSchema),
z.lazy(() => TrackResponseBody2$inboundSchema),
]);
export function trackResponseFromJSON(
jsonString: string,
): SafeParseResult<TrackResponse, SDKValidationError> {

View File

@@ -316,6 +316,16 @@ export type UpdatePlanFreeTrialParams = {
cardRequired?: boolean | undefined;
};
/**
* Miscellaneous plan-level configuration flags.
*/
export type UpdatePlanConfigRequest = {
/**
* If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
*/
ignorePastDue?: boolean | undefined;
};
export type UpdatePlanParams = {
/**
* The ID of the plan to update.
@@ -350,6 +360,10 @@ export type UpdatePlanParams = {
* The free trial of the plan. Set to null to remove the free trial.
*/
freeTrial?: UpdatePlanFreeTrialParams | null | undefined;
/**
* Miscellaneous plan-level configuration flags.
*/
config?: UpdatePlanConfigRequest | undefined;
version?: number | undefined;
archived?: boolean | undefined;
/**
@@ -710,6 +724,16 @@ export const UpdatePlanEnv = {
*/
export type UpdatePlanEnv = OpenEnum<typeof UpdatePlanEnv>;
/**
* Miscellaneous plan-level configuration flags.
*/
export type UpdatePlanConfigResponse = {
/**
* If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past_due state.
*/
ignorePastDue: boolean;
};
/**
* The customer's current status with this plan. 'active' if attached, 'scheduled' if pending activation.
*/
@@ -820,6 +844,10 @@ export type UpdatePlanResponse = {
* If this is a variant, the ID of the base plan it was created from.
*/
baseVariantId: string | null;
/**
* Miscellaneous plan-level configuration flags.
*/
config: UpdatePlanConfigResponse;
customerEligibility?: UpdatePlanCustomerEligibility | undefined;
};
@@ -1163,6 +1191,34 @@ export function updatePlanFreeTrialParamsToJSON(
);
}
/** @internal */
export type UpdatePlanConfigRequest$Outbound = {
ignore_past_due: boolean;
};
/** @internal */
export const UpdatePlanConfigRequest$outboundSchema: z.ZodMiniType<
UpdatePlanConfigRequest$Outbound,
UpdatePlanConfigRequest
> = z.pipe(
z.object({
ignorePastDue: z._default(z.boolean(), false),
}),
z.transform((v) => {
return remap$(v, {
ignorePastDue: "ignore_past_due",
});
}),
);
export function updatePlanConfigRequestToJSON(
updatePlanConfigRequest: UpdatePlanConfigRequest,
): string {
return JSON.stringify(
UpdatePlanConfigRequest$outboundSchema.parse(updatePlanConfigRequest),
);
}
/** @internal */
export type UpdatePlanParams$Outbound = {
plan_id: string;
@@ -1174,6 +1230,7 @@ export type UpdatePlanParams$Outbound = {
price?: UpdatePlanBasePrice$Outbound | null | undefined;
items?: Array<UpdatePlanPlanItem$Outbound> | undefined;
free_trial?: UpdatePlanFreeTrialParams$Outbound | null | undefined;
config?: UpdatePlanConfigRequest$Outbound | undefined;
version?: number | undefined;
archived: boolean;
new_plan_id?: string | undefined;
@@ -1198,6 +1255,7 @@ export const UpdatePlanParams$outboundSchema: z.ZodMiniType<
freeTrial: z.optional(
z.nullable(z.lazy(() => UpdatePlanFreeTrialParams$outboundSchema)),
),
config: z.optional(z.lazy(() => UpdatePlanConfigRequest$outboundSchema)),
version: z.optional(z.number()),
archived: z._default(z.boolean(), false),
newPlanId: z.optional(z.string()),
@@ -1594,6 +1652,31 @@ export const UpdatePlanEnv$inboundSchema: z.ZodMiniType<
unknown
> = openEnums.inboundSchema(UpdatePlanEnv);
/** @internal */
export const UpdatePlanConfigResponse$inboundSchema: z.ZodMiniType<
UpdatePlanConfigResponse,
unknown
> = z.pipe(
z.object({
ignore_past_due: z._default(types.boolean(), false),
}),
z.transform((v) => {
return remap$(v, {
"ignore_past_due": "ignorePastDue",
});
}),
);
export function updatePlanConfigResponseFromJSON(
jsonString: string,
): SafeParseResult<UpdatePlanConfigResponse, SDKValidationError> {
return safeParse(
jsonString,
(x) => UpdatePlanConfigResponse$inboundSchema.parse(JSON.parse(x)),
`Failed to parse 'UpdatePlanConfigResponse' from JSON`,
);
}
/** @internal */
export const UpdatePlanStatus$inboundSchema: z.ZodMiniType<
UpdatePlanStatus,
@@ -1656,6 +1739,7 @@ export const UpdatePlanResponse$inboundSchema: z.ZodMiniType<
env: UpdatePlanEnv$inboundSchema,
archived: types.boolean(),
base_variant_id: types.nullable(types.string()),
config: z.lazy(() => UpdatePlanConfigResponse$inboundSchema),
customer_eligibility: types.optional(
z.lazy(() => UpdatePlanCustomerEligibility$inboundSchema),
),

View File

@@ -90,6 +90,7 @@ export class Plans extends ClientSDK {
* @param price - Base recurring price for the plan. Omit for free or usage-only plans. (optional)
* @param items - Feature configurations for this plan. Each item defines included units, pricing, and reset behavior. (optional)
* @param freeTrial - Free trial configuration. Customers can try this plan before being charged. (optional)
* @param config - Miscellaneous plan-level configuration flags. (optional)
*
* @returns The created plan object.
*/
@@ -207,6 +208,7 @@ export class Plans extends ClientSDK {
* @param price - The price of the plan. Set to null to remove the base price. (optional)
* @param items - Feature configurations for this plan. Each item defines included units, pricing, and reset behavior. (optional)
* @param freeTrial - The free trial of the plan. Set to null to remove the free trial. (optional)
* @param config - Miscellaneous plan-level configuration flags. (optional)
* @param newPlanId - The new ID to use for the plan. Can only be updated if the plan has not been used by any customers. (optional)
*
* @returns The updated plan object.

View File

@@ -89,7 +89,7 @@ export class Autumn extends ClientSDK {
* @param lock - Reserve units of a feature upfront by passing a lock_id, then call balances.finalize to confirm or release the hold. (optional)
* @param withPreview - If true, includes upgrade/upsell information in the response when access is denied. Useful for displaying paywalls. (optional)
*
* @returns Whether access is allowed, plus the current balance for that feature.
* @returns Whether access is allowed, plus the current balance for that feature. If Autumn is experiencing degraded service from a downstream provider, the API may return 202 and allow access fail-open.
*/
async check(
request: models.CheckParams,
@@ -126,7 +126,7 @@ export class Autumn extends ClientSDK {
* @param value - The amount of usage to record. Defaults to 1. Use negative values to credit balance (e.g., when removing a seat). (optional)
* @param properties - Additional properties to attach to this usage event. (optional)
*
* @returns The usage value recorded, with either a single updated balance or a map of updated balances.
* @returns The usage value recorded, with either a single updated balance or a map of updated balances. If Autumn is experiencing degraded service from a downstream provider, the API may return 202 after accepting the event for replay so it can be tracked as soon as the service is restored.
*/
async track(
request: models.TrackParams,

View File

@@ -17,7 +17,7 @@ cache_url="${LOCAL_CACHE_URL:-redis://localhost:6379}"
echo "dev-local: overriding Infisical DATABASE_URL/CACHE_URL with local values and disabling CACHE_CERT"
echo "dev-local: DATABASE_URL=${logged_database_url}"
exec infisical run --env=prod -- env \
exec infisical run --recursive --env=prod -- env \
ENV_FILE=.env.prod \
NODE_ENV=development \
DATABASE_URL="${database_url}" \

View File

@@ -47,7 +47,7 @@ const portArgs = [
`-ti:${checkoutPort}`,
].join(" ");
const killCmd = `lsof ${portArgs} | xargs kill -9 2>/dev/null || true`;
const devCmd = `ENV_FILE=.env infisical run --env=dev -- bun scripts/dev.ts --worktree ${worktreeNum}`;
const devCmd = `ENV_FILE=.env infisical run --recursive --env=dev -- bun scripts/dev.ts --worktree ${worktreeNum}`;
const rootDir = dirname(fileURLToPath(import.meta.url));
const projectRoot = join(rootDir, "..");

View File

@@ -0,0 +1,47 @@
# Stripe Test OAuth Linking
Use this when local tests say the test org has no linked Stripe account, or when Stripe Connect webhooks are visible in Stripe but Autumn cannot map events back to `unit-test-org`.
The Connect webhook destination should be:
```txt
https://c.autumn.ngrok.app/webhooks/connect/sandbox
```
OAuth still needs the Autumn org row to store the connected account ID:
```json
{ "test_stripe_connect": { "account_id": "acct_..." } }
```
## Commands
List recent connected accounts for the test org email:
```sh
bun stripe:link-test -- --list --email=unit-test-org@test.com
```
Link an explicit account:
```sh
bun stripe:link-test -- --account-id=acct_...
```
Link the newest account matching the test org email:
```sh
bun stripe:link-test -- --latest --email=unit-test-org@test.com
```
If the org has a direct Stripe secret key, `createStripeCli` will prefer that over OAuth Connect. To force the OAuth account for sandbox tests:
```sh
bun stripe:link-test -- --account-id=acct_... --clear-secret-key
```
After linking, rerun a focused checkout test before the full suite:
```sh
ENV_FILE=.env infisical run --env=dev --recursive -- bun test --timeout 0 server/tests/integration/billing/attach/checkout/stripe-checkout/prepaid/stripe-checkout-prepaid-basic.test.ts
```

View File

@@ -0,0 +1,169 @@
#!/usr/bin/env bun
import { AppEnv, organizations } from "@autumn/shared";
import { eq } from "drizzle-orm";
import { initDrizzle } from "@server/db/initDrizzle.js";
import { createStripeCli } from "@server/external/connect/createStripeCli.js";
import { initMasterStripe } from "@server/external/connect/initStripeCli.js";
import { OrgService } from "@server/internal/orgs/OrgService.js";
import { clearOrgCache } from "@server/internal/orgs/orgUtils/clearOrgCache.js";
import { loadLocalEnv } from "@server/utils/envUtils.js";
loadLocalEnv();
const args = process.argv.slice(2);
const readFlag = (name: string) => {
const inline = args.find((arg) => arg.startsWith(`${name}=`));
if (inline) return inline.slice(name.length + 1);
const idx = args.indexOf(name);
return idx === -1 ? undefined : args[idx + 1];
};
const hasFlag = (name: string) => args.includes(name);
const usage = () => {
console.log(`Usage:
bun stripe:link-test -- --account-id=acct_...
bun stripe:link-test -- --latest --email=unit-test-org@test.com
bun stripe:link-test -- --list --email=unit-test-org@test.com
Options:
--org=<slug-or-id> Autumn org to update. Defaults to TESTS_ORG.
--env=<sandbox|live> Stripe environment. Defaults to sandbox.
--account-id=<acct_...> Connected Stripe account ID to link.
--email=<email> Filter Stripe connected accounts by email.
--latest Link the newest connected account matching --email.
--clear-secret-key Clear the org's direct Stripe key for this env so Connect is used.
--list Print matching connected accounts without updating.
`);
};
if (hasFlag("--help") || hasFlag("-h")) {
usage();
process.exit(0);
}
const env =
(readFlag("--env") || "sandbox").toLowerCase() === "live"
? AppEnv.Live
: AppEnv.Sandbox;
const orgRef = readFlag("--org") || process.env.TESTS_ORG;
const email = readFlag("--email");
const accountIdArg = readFlag("--account-id");
if (!orgRef) {
throw new Error("Missing org. Pass --org=<slug-or-id> or set TESTS_ORG.");
}
const { db, client } = initDrizzle();
const getOrg = async () => {
const bySlug = await OrgService.getBySlug({ db, slug: orgRef });
if (bySlug) return bySlug;
return await OrgService.get({ db, orgId: orgRef });
};
const listAccounts = async () => {
const stripe = initMasterStripe({ env, skipInstrumentation: true });
const accounts = await stripe.accounts.list({ limit: 100 });
return accounts.data
.filter((account) => !email || account.email === email)
.sort((a, b) => b.created - a.created);
};
try {
const org = await getOrg();
const accounts = await listAccounts();
if (hasFlag("--list")) {
console.log(
JSON.stringify(
accounts.map((account) => ({
id: account.id,
email: account.email,
created: new Date(account.created * 1000).toISOString(),
charges_enabled: account.charges_enabled,
details_submitted: account.details_submitted,
})),
null,
2,
),
);
process.exit(0);
}
const accountId =
accountIdArg || (hasFlag("--latest") ? accounts[0]?.id : undefined);
if (!accountId) {
throw new Error(
"Missing account. Pass --account-id=acct_... or use --latest with --email=...",
);
}
const directKeyField =
env === AppEnv.Sandbox ? "test_api_key" : "live_api_key";
const directWebhookSecretField =
env === AppEnv.Sandbox ? "test_webhook_secret" : "live_webhook_secret";
const hasDirectKey = Boolean(org.stripe_config?.[directKeyField]);
if (hasDirectKey && !hasFlag("--clear-secret-key")) {
throw new Error(
`${org.slug} has stripe_config.${directKeyField}; createStripeCli will prefer that over Connect. Re-run with --clear-secret-key to use the OAuth account.`,
);
}
const stripe = initMasterStripe({ env, accountId, skipInstrumentation: true });
await stripe.accounts.retrieve();
await OrgService.updateStripeConnect({
db,
orgId: org.id,
accountId,
env,
});
if (hasDirectKey) {
await db
.update(organizations)
.set({
stripe_config: {
...(org.stripe_config || {}),
[directKeyField]: null,
[directWebhookSecretField]: null,
},
})
.where(eq(organizations.id, org.id));
await clearOrgCache({ db, orgId: org.id });
}
const updatedOrg = await OrgService.get({ db, orgId: org.id });
const resolvedStripe = createStripeCli({
org: updatedOrg,
env,
skipInstrumentation: true,
});
const resolvedAccount = await resolvedStripe.accounts.retrieve();
console.log(
JSON.stringify(
{
org: { id: updatedOrg.id, slug: updatedOrg.slug },
env,
linked_account_id: accountId,
resolved_account_id: resolvedAccount.id,
test_stripe_connect: updatedOrg.test_stripe_connect,
live_stripe_connect: updatedOrg.live_stripe_connect,
},
null,
2,
),
);
} finally {
await client.end();
}
process.exit(0);

View File

@@ -0,0 +1,9 @@
#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$0")/../.."
ENV_FILE=.env infisical run --env=dev --recursive -- bun scripts/setup/link-test-stripe-account.ts \
--org=unit-test-org \
--account-id=acct_1TObjo5ch7bV1B9z \
--clear-secret-key

View File

@@ -8,7 +8,7 @@ export TEST_FILE_CONCURRENCY=${TEST_FILE_CONCURRENCY:-3}
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
SERVER_DIR="$PROJECT_ROOT/server"
BUN_CMD="infisical run --env=dev -- bun"
BUN_CMD="infisical run --recursive --env=dev -- bun"
# Test runner function
BUN_PARALLEL() {

View File

@@ -29,6 +29,7 @@
"clear-master": "ENV_FILE=.env infisical run --env=dev --recursive -- bun tests/clearMasterOrg.ts",
"cm": "ENV_FILE=.env infisical run --env=dev --recursive -- bun tests/clearMaster.ts",
"ts": "bunx tsgo --build --noEmit",
"test:unit": "bun test tests/unit",
"test:integration": "ENV_FILE=.env infisical run --env=dev --recursive -- bun test --timeout 0 --preload ./tests/setup-integration-tests.ts",
"loadtest": "ENV_FILE=.env infisical run --env=dev --recursive -- npx artillery run perf/load-test/artillery.yml",
"loadtest:leak": "ENV_FILE=.env infisical run --env=dev --recursive -- bun perf/load-test/runLeakTest.ts",

View File

@@ -2,7 +2,7 @@
* Load test setup — creates products and 500 customers with Stripe payment methods.
*
* Run: cd server && bun loadtest:setup
* or: ENV_FILE=.env infisical run --env=dev -- bun perf/load-test/setup.ts
* or: ENV_FILE=.env infisical run --recursive --env=dev -- bun perf/load-test/setup.ts
*/
import { loadLocalEnv } from "../../src/utils/envUtils.js";

View File

@@ -21,4 +21,4 @@ fi
# # Remove .ts extension if present
# path_after_tests="${path_after_tests%.ts}"
# # Use scripts/test.ts which auto-detects framework
# NODE_ENV=development infisical run --env=dev -- bun ../scripts/test.ts "$path_after_tests"
# NODE_ENV=development infisical run --recursive --env=dev -- bun ../scripts/test.ts "$path_after_tests"

View File

@@ -10,6 +10,7 @@ import { RCMappingService } from "@/external/revenueCat/misc/RCMappingService";
import type { RevenueCatWebhookContext } from "@/external/revenueCat/webhookMiddlewares/revenuecatWebhookContext";
import { CusService } from "@/internal/customers/CusService";
import { computeRolloutSnapshot } from "@/internal/misc/rollouts/rolloutUtils.js";
import { pricesOnlyOneOff } from "@/internal/products/prices/priceUtils.js";
import { ProductService } from "@/internal/products/ProductService";
import { getOrCreateCustomer } from "../../../internal/customers/cusUtils/getOrCreateCustomer";
@@ -69,8 +70,16 @@ export const resolveRevenuecatResources = async ({
}),
]);
// If the customer has a product from a different processor than RevenueCat and it has no subscriptions, throw an error
// If the customer has a product from a different processor than RevenueCat and it has no subscriptions, throw an error.
//
// Exception: true one-off purchases (no recurring intervals) are safe to mix
// across processors because they create a parallel cus_product without
// replacing the customer's existing subscription. This lets a Stripe-subscribed
// customer buy a one-off pack via RevenueCat (and vice versa).
const incomingIsOneOff = pricesOnlyOneOff(product.prices);
if (
!incomingIsOneOff &&
customer.customer_products.some(
(cp) =>
cp.processor?.type !== ProcessorType.RevenueCat &&

View File

@@ -8,6 +8,7 @@ import { stripeLegacySeederMiddleware } from "./webhookMiddlewares/stripeLegacyS
import { stripeSyncMiddleware } from "./webhookMiddlewares/stripeSyncMiddleware.js";
import { stripeToAutumnCustomerMiddleware } from "./webhookMiddlewares/stripeToAutumnCustomerMiddleware.js";
import type { StripeWebhookHonoEnv } from "./webhookMiddlewares/stripeWebhookContext.js";
import { stripeWebhookEarlyAckMiddleware } from "./webhookMiddlewares/stripeWebhookEarlyAckMiddleware.js";
import { stripeWebhookRefreshMiddleware } from "./webhookMiddlewares/stripeWebhookRefreshMiddleware.js";
export const stripeWebhookRouter = new Hono<StripeWebhookHonoEnv>();
@@ -16,12 +17,13 @@ export const stripeWebhookRouter = new Hono<StripeWebhookHonoEnv>();
stripeWebhookRouter.post(
"/webhooks/stripe/:orgId/:env",
stripeLegacySeederMiddleware,
stripeIdempotencyMiddleware,
stripeWebhookEarlyAckMiddleware,
stripeWebhookRefreshMiddleware,
stripeSyncMiddleware,
stripeToAutumnCustomerMiddleware,
stripeLoggerMiddleware,
traceEnrichMiddleware,
stripeIdempotencyMiddleware,
handleStripeWebhookEvent,
);
@@ -29,11 +31,12 @@ stripeWebhookRouter.post(
stripeWebhookRouter.post(
"/webhooks/connect/:env",
stripeConnectSeederMiddleware,
stripeIdempotencyMiddleware,
stripeWebhookEarlyAckMiddleware,
stripeWebhookRefreshMiddleware,
stripeSyncMiddleware,
stripeToAutumnCustomerMiddleware,
stripeLoggerMiddleware,
traceEnrichMiddleware,
stripeIdempotencyMiddleware,
handleStripeWebhookEvent,
);

View File

@@ -63,6 +63,9 @@ export const stripeLegacySeederMiddleware = async (
);
} catch (err: unknown) {
const message = err instanceof Error ? err.message : String(err);
logger.warn(
`Stripe legacy webhook signature verification failed: ${message}`,
);
return c.json({ error: `Webhook Error: ${message}` }, 400);
}

View File

@@ -0,0 +1,38 @@
import type { Context, Next } from "hono";
import type { StripeWebhookHonoEnv } from "./stripeWebhookContext";
const getWaitUntil = (c: Context<StripeWebhookHonoEnv>) => {
try {
return c.executionCtx.waitUntil.bind(c.executionCtx);
} catch {
return undefined;
}
};
export const stripeWebhookEarlyAckMiddleware = async (
c: Context<StripeWebhookHonoEnv>,
next: Next,
) => {
const ctx = c.get("ctx");
const runWebhook = () =>
Promise.resolve()
.then(next)
.catch((error) => {
ctx.logger.error(`Stripe webhook background processing failed: ${error}`, {
error,
});
});
const waitUntil = getWaitUntil(c);
if (waitUntil) {
try {
waitUntil(runWebhook());
} catch (error) {
ctx.logger.error(`Stripe webhook waitUntil failed: ${error}`, { error });
}
} else {
setImmediate(() => void runWebhook());
}
return c.json({ received: true }, 200);
};

View File

@@ -7,6 +7,7 @@ import { claimLockReceipt } from "@/internal/balances/utils/lock/claimLockReceip
import { deleteLockReceipt } from "@/internal/balances/utils/lock/deleteLockReceipt.js";
import { fetchLockReceipt } from "@/internal/balances/utils/lock/fetchLockReceipt.js";
import { isFullSubjectRolloutEnabled } from "@/internal/misc/rollouts/fullSubjectRolloutUtils.js";
import { addToExtraLogs } from "@/utils/logging/addToExtraLogs.js";
import { buildFinalizeLockContext } from "./buildFinalizeLockContext.js";
import { runFinalizeLockV2 } from "./runFinalizeLockV2.js";
import { runRedisFinalizeLock } from "./runRedisFinalizeLock.js";
@@ -24,7 +25,13 @@ export const runFinalizeLock = async (args: RunFinalizeLockArgs) => {
return withRedisFailOpen({
source: "runFinalizeLock",
run: () => runFinalizeLockInner(args),
fallback: () => ({ success: true }),
fallback: () => {
addToExtraLogs({
ctx: args.ctx,
extras: { finalizeLockFailedOpen: true },
});
return { success: true };
},
});
};

Some files were not shown because too many files have changed in this diff Show More