Skip to content

feat(cards): consolidate card velocity limit configuration - #1225

Merged
DhruvPareek merged 1 commit into
mainfrom
dp/card-velocity-rules-api
Oct 27, 2026
Merged

DhruvPareek merged 1 commit into
mainfrom
dp/card-velocity-rules-api

Conversation

@DhruvPareek

@DhruvPareek DhruvPareek commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Reason

Card velocity limits currently have separate configuration fields on card and platform resources. Make the velocity-rule collection the single API configuration surface, with consistent amount/count semantics and documentation.

Overview

Defines create, list, get, and delete at /card-velocity-limits and /card-velocity-limits/{id}. Omitting/null cardId configures per-card platform defaults; supplying it targets one owned card. Creation returns 201, while an existing target/metric/window/duration returns 409 CONFLICT with the unchanged rule's ID. Delete/recreate is explicit; inheritance governs the interval between requests and a failed replacement leaves deletion in effect.

Removes maxSpendPerTransaction, maxSpendPerDay, and maxTransactionsPerDay from card creation/update, card responses, platform CardConfig, and agent card update requests. The surrounding card/config endpoints remain for their other operations. Replaces the three scalar-limit capability flags with supportsVelocityLimits. Agent-wide budgets, merchant-category controls, risk ceilings, and provider-enforced constraints remain separate.

All Grid-managed per-authorization, UTC calendar, and rolling amount/count controls use the rule API. Requests/responses have no currency field; amount caps use each card's minor units, including USD cents for USDB-funded USD cards. APPROVED includes $0 approvals; amount usage is holds less releases, while releases do not restore the approval count. Rules apply only where Grid decides authorizations. Platforms cannot access another platform's or Lightspark-managed rules.

Adds the Velocity Limits guide and navigation, updates issuance/wallet/status documentation, removes scalar-limit examples, and refreshes webhook samples. The top-level path follows /card-disputes/{id}: /cards/velocity-limits/{id} fails Grid's ambiguity lint against existing /cards/{id}/reveal, tokenize, and PIN actions. Underlying rule model/ID names are retained.

This is the API contract/documentation change. It does not migrate database settings or backend handlers. The backend must adopt the new route, canonical rule storage, and capability flag before this contract and its generated client are deployed. Generated artifacts are in webdev #39019, with #1226 inheritance documentation generated in webdev #39024. These generated PRs require the backend migration before merging; the separate regeneration #39178 has been consolidated into them. Card → platform → program inheritance is described here and refined by child #1226.

Test Plan

  • make build and make lint on both API branches — passed, 0 errors (187 warnings, 740 infos).
  • Parsed the new guide and all three edited snippets with @mdx-js/mdx — passed.
  • Validated guide request/response examples and updated issuance examples against the bundled OpenAPI schema with AJV — passed.
  • Structural assertions confirmed that only the three legacy limit properties were removed from each existing card/config model; unrelated properties, agent spending-policy shapes, and existing non-velocity routes are preserved.
  • Searched source specs and card guides for the removed scalar fields, capability flags, and old route names — no remaining references.
  • Restacked on current main (4f1963bf) and rebuilt both generated bundles to resolve conflicts, retaining the upstream agent card hand-over endpoint and SWIFT/UETR models. Removed the API/Lightspark lower-cap wording from the guide and endpoint description; enforcement is unchanged.

@vercel

vercel Bot commented Oct 23, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

3 Skipped Deployments
Project Deployment Actions Updated
grid-cards-demo Ignored Ignored Preview Oct 26, 2026 11:43pm UTC
grid-flow-builder Ignored Ignored Preview Oct 26, 2026 11:43pm UTC
grid-wallet-demo Ignored Ignored Preview Oct 26, 2026 11:43pm UTC

Request Review

@mintlify

mintlify Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated
Grid 🟢 Ready View Preview Oct 26, 2026, 11:44 PM

@greptile-apps

greptile-apps Bot commented Oct 23, 2026

Copy link
Copy Markdown
Contributor

This PR does not match any of the 3 configured review trigger rules.

DhruvPareek commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor Author

DhruvPareek added a commit that referenced this pull request Oct 26, 2026
## Reason

Card spending limits are changing from the strictest value across all scopes to inheritance by specificity. Document the policy so platforms can predict which configured cap will apply.

## Overview

For each count or currency-specific amount cap and matching metric/window, use card scope first, platform scope second, and program scope last. At the selected scope the lower API or Lightspark-managed cap applies. An unset cap inherits; an explicit zero remains configured and blocks.

Updates create/update/read card fields, platform defaults, and velocity-rule documentation. Amount and count inherit separately; distinct rolling durations remain independent. Provider-enforced account caps remain outside this Grid hierarchy. No request/response shape changes or new lifetime window.

Stacked on #1225. Companion webdev PR implements this policy; the generated client update is kept separate from backend logic.

## Test Plan

- `make build` — passed; regenerated both OpenAPI bundles.
- `make lint` — passed (existing warnings only).
@DhruvPareek
DhruvPareek force-pushed the dp/card-velocity-rules-api branch from 68acaa3 to 305e38f Compare October 26, 2026 21:26
@DhruvPareek
DhruvPareek marked this pull request as ready for review October 26, 2026 21:28
DhruvPareek added a commit that referenced this pull request Oct 26, 2026
Card spending limits are changing from the strictest value across all scopes to inheritance by specificity. Document the policy so platforms can predict which configured cap will apply.

For each count or currency-specific amount cap and matching metric/window, use card scope first, platform scope second, and program scope last. At the selected scope the lower API or Lightspark-managed cap applies. An unset cap inherits; an explicit zero remains configured and blocks.

Updates create/update/read card fields, platform defaults, and velocity-rule documentation. Amount and count inherit separately; distinct rolling durations remain independent. Provider-enforced account caps remain outside this Grid hierarchy. No request/response shape changes or new lifetime window.

Stacked on #1225. Companion webdev PR implements this policy; the generated client update is kept separate from backend logic.

- `make build` — passed; regenerated both OpenAPI bundles.
- `make lint` — passed (existing warnings only).
@DhruvPareek
DhruvPareek force-pushed the dp/card-velocity-rules-api branch from 305e38f to 5151036 Compare October 26, 2026 22:01
@DhruvPareek DhruvPareek changed the title feat(cards): define platform-managed velocity rule API feat(cards): consolidate card velocity limit configuration Oct 26, 2026
DhruvPareek added a commit that referenced this pull request Oct 26, 2026
Card spending limits are changing from the strictest value across all scopes to inheritance by specificity. Document the policy so platforms can predict which configured cap will apply.

For each count or currency-specific amount cap and matching metric/window, use card scope first, platform scope second, and program scope last. At the selected scope the lower API or Lightspark-managed cap applies. An unset cap inherits; an explicit zero remains configured and blocks.

Updates create/update/read card fields, platform defaults, and velocity-rule documentation. Amount and count inherit separately; distinct rolling durations remain independent. Provider-enforced account caps remain outside this Grid hierarchy. No request/response shape changes or new lifetime window.

Stacked on #1225. Companion webdev PR implements this policy; the generated client update is kept separate from backend logic.

- `make build` — passed; regenerated both OpenAPI bundles.
- `make lint` — passed (existing warnings only).
@DhruvPareek
DhruvPareek force-pushed the dp/card-velocity-rules-api branch from 5151036 to fc8b95d Compare October 26, 2026 22:54
@github-actions github-actions Bot added the breaking-change Introduces a breaking change to the OpenAPI spec label Oct 26, 2026
@github-actions

github-actions Bot commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

⚠️ Breaking OpenAPI changes detected

oasdiff reports 78 error / 33 warning changes to openapi.yaml.
This PR will need approval from an API reviewer before merge.

Errors (78)

  • GET /agents/me/cards — removed the required property data/items/card/cardCapabilities/supportsSpendLimits from the response with the 200 status [response-required-property-removed].
  • GET /agents/me/cards — removed the required property data/items/card/cardCapabilities/supportsSpendLimitsAtIssuance from the response with the 200 status [response-required-property-removed].
  • GET /agents/me/cards — removed the required property data/items/card/cardCapabilities/supportsTransactionCountLimit from the response with the 200 status [response-required-property-removed].
  • GET /agents/me/cards — removed the required property data/items/card/maxSpendPerDay from the response with the 200 status [response-required-property-removed].
  • GET /agents/me/cards — removed the required property data/items/card/maxSpendPerTransaction from the response with the 200 status [response-required-property-removed].
  • GET /agents/me/cards — removed the required property data/items/card/maxTransactionsPerDay from the response with the 200 status [response-required-property-removed].
  • POST /agents/me/cards — removed the required property card/cardCapabilities/supportsSpendLimits from the response with the 201 status [response-required-property-removed].
  • POST /agents/me/cards — removed the required property card/cardCapabilities/supportsSpendLimitsAtIssuance from the response with the 201 status [response-required-property-removed].
  • POST /agents/me/cards — removed the required property card/cardCapabilities/supportsTransactionCountLimit from the response with the 201 status [response-required-property-removed].
  • POST /agents/me/cards — removed the required property card/maxSpendPerDay from the response with the 201 status [response-required-property-removed].
  • POST /agents/me/cards — removed the required property card/maxSpendPerTransaction from the response with the 201 status [response-required-property-removed].
  • POST /agents/me/cards — removed the required property card/maxTransactionsPerDay from the response with the 201 status [response-required-property-removed].
  • GET /agents/me/cards/{cardId} — removed the required property card/cardCapabilities/supportsSpendLimits from the response with the 200 status [response-required-property-removed].
  • GET /agents/me/cards/{cardId} — removed the required property card/cardCapabilities/supportsSpendLimitsAtIssuance from the response with the 200 status [response-required-property-removed].
  • GET /agents/me/cards/{cardId} — removed the required property card/cardCapabilities/supportsTransactionCountLimit from the response with the 200 status [response-required-property-removed].
  • GET /agents/me/cards/{cardId} — removed the required property card/maxSpendPerDay from the response with the 200 status [response-required-property-removed].
  • GET /agents/me/cards/{cardId} — removed the required property card/maxSpendPerTransaction from the response with the 200 status [response-required-property-removed].
  • GET /agents/me/cards/{cardId} — removed the required property card/maxTransactionsPerDay from the response with the 200 status [response-required-property-removed].
  • PATCH /agents/me/cards/{cardId} — removed the required property card/cardCapabilities/supportsSpendLimits from the response with the 200 status [response-required-property-removed].
  • PATCH /agents/me/cards/{cardId} — removed the required property card/cardCapabilities/supportsSpendLimitsAtIssuance from the response with the 200 status [response-required-property-removed].
  • PATCH /agents/me/cards/{cardId} — removed the required property card/cardCapabilities/supportsTransactionCountLimit from the response with the 200 status [response-required-property-removed].
  • PATCH /agents/me/cards/{cardId} — removed the required property card/maxSpendPerDay from the response with the 200 status [response-required-property-removed].
  • PATCH /agents/me/cards/{cardId} — removed the required property card/maxSpendPerTransaction from the response with the 200 status [response-required-property-removed].
  • PATCH /agents/me/cards/{cardId} — removed the required property card/maxTransactionsPerDay from the response with the 200 status [response-required-property-removed].
  • GET /agents/me/internal-accounts — removed the required property data/items/cardCapabilities/supportsSpendLimits from the response with the 200 status [response-required-property-removed].
  • GET /agents/me/internal-accounts — removed the required property data/items/cardCapabilities/supportsSpendLimitsAtIssuance from the response with the 200 status [response-required-property-removed].
  • GET /agents/me/internal-accounts — removed the required property data/items/cardCapabilities/supportsTransactionCountLimit from the response with the 200 status [response-required-property-removed].
  • POST /agents/{agentId}/card-handover — removed the required property cardCapabilities/supportsSpendLimits from the response with the 200 status [response-required-property-removed].
  • POST /agents/{agentId}/card-handover — removed the required property cardCapabilities/supportsSpendLimitsAtIssuance from the response with the 200 status [response-required-property-removed].
  • POST /agents/{agentId}/card-handover — removed the required property cardCapabilities/supportsTransactionCountLimit from the response with the 200 status [response-required-property-removed].
  • POST /agents/{agentId}/card-handover — removed the required property maxSpendPerDay from the response with the 200 status [response-required-property-removed].
  • POST /agents/{agentId}/card-handover — removed the required property maxSpendPerTransaction from the response with the 200 status [response-required-property-removed].
  • POST /agents/{agentId}/card-handover — removed the required property maxTransactionsPerDay from the response with the 200 status [response-required-property-removed].
  • GET /cards — removed the required property data/items/cardCapabilities/supportsSpendLimits from the response with the 200 status [response-required-property-removed].
  • GET /cards — removed the required property data/items/cardCapabilities/supportsSpendLimitsAtIssuance from the response with the 200 status [response-required-property-removed].
  • GET /cards — removed the required property data/items/cardCapabilities/supportsTransactionCountLimit from the response with the 200 status [response-required-property-removed].
  • GET /cards — removed the required property data/items/maxSpendPerDay from the response with the 200 status [response-required-property-removed].
  • GET /cards — removed the required property data/items/maxSpendPerTransaction from the response with the 200 status [response-required-property-removed].
  • GET /cards — removed the required property data/items/maxTransactionsPerDay from the response with the 200 status [response-required-property-removed].
  • POST /cards — removed the required property cardCapabilities/supportsSpendLimits from the response with the 201 status [response-required-property-removed].
  • POST /cards — removed the required property cardCapabilities/supportsSpendLimitsAtIssuance from the response with the 201 status [response-required-property-removed].
  • POST /cards — removed the required property cardCapabilities/supportsTransactionCountLimit from the response with the 201 status [response-required-property-removed].
  • POST /cards — removed the required property maxSpendPerDay from the response with the 201 status [response-required-property-removed].
  • POST /cards — removed the required property maxSpendPerTransaction from the response with the 201 status [response-required-property-removed].
  • POST /cards — removed the required property maxTransactionsPerDay from the response with the 201 status [response-required-property-removed].
  • GET /cards/{id} — removed the required property cardCapabilities/supportsSpendLimits from the response with the 200 status [response-required-property-removed].
  • GET /cards/{id} — removed the required property cardCapabilities/supportsSpendLimitsAtIssuance from the response with the 200 status [response-required-property-removed].
  • GET /cards/{id} — removed the required property cardCapabilities/supportsTransactionCountLimit from the response with the 200 status [response-required-property-removed].
  • GET /cards/{id} — removed the required property maxSpendPerDay from the response with the 200 status [response-required-property-removed].
  • GET /cards/{id} — removed the required property maxSpendPerTransaction from the response with the 200 status [response-required-property-removed].
  • GET /cards/{id} — removed the required property maxTransactionsPerDay from the response with the 200 status [response-required-property-removed].
  • PATCH /cards/{id} — removed the required property cardCapabilities/supportsSpendLimits from the response with the 200 status [response-required-property-removed].
  • PATCH /cards/{id} — removed the required property cardCapabilities/supportsSpendLimitsAtIssuance from the response with the 200 status [response-required-property-removed].
  • PATCH /cards/{id} — removed the required property cardCapabilities/supportsTransactionCountLimit from the response with the 200 status [response-required-property-removed].
  • PATCH /cards/{id} — removed the required property maxSpendPerDay from the response with the 200 status [response-required-property-removed].
  • PATCH /cards/{id} — removed the required property maxSpendPerTransaction from the response with the 200 status [response-required-property-removed].
  • PATCH /cards/{id} — removed the required property maxTransactionsPerDay from the response with the 200 status [response-required-property-removed].
  • GET /customers/internal-accounts — removed the required property data/items/cardCapabilities/supportsSpendLimits from the response with the 200 status [response-required-property-removed].
  • GET /customers/internal-accounts — removed the required property data/items/cardCapabilities/supportsSpendLimitsAtIssuance from the response with the 200 status [response-required-property-removed].
  • GET /customers/internal-accounts — removed the required property data/items/cardCapabilities/supportsTransactionCountLimit from the response with the 200 status [response-required-property-removed].
  • POST /internal-accounts — removed the required property cardCapabilities/supportsSpendLimits from the response with the 200 status [response-required-property-removed].
  • POST /internal-accounts — removed the required property cardCapabilities/supportsSpendLimits from the response with the 201 status [response-required-property-removed].
  • POST /internal-accounts — removed the required property cardCapabilities/supportsSpendLimitsAtIssuance from the response with the 200 status [response-required-property-removed].
  • POST /internal-accounts — removed the required property cardCapabilities/supportsSpendLimitsAtIssuance from the response with the 201 status [response-required-property-removed].
  • POST /internal-accounts — removed the required property cardCapabilities/supportsTransactionCountLimit from the response with the 200 status [response-required-property-removed].
  • POST /internal-accounts — removed the required property cardCapabilities/supportsTransactionCountLimit from the response with the 201 status [response-required-property-removed].
  • PATCH /internal-accounts/{id} — removed the required property cardCapabilities/supportsSpendLimits from the response with the 200 status [response-required-property-removed].
  • PATCH /internal-accounts/{id} — removed the required property cardCapabilities/supportsSpendLimitsAtIssuance from the response with the 200 status [response-required-property-removed].
  • PATCH /internal-accounts/{id} — removed the required property cardCapabilities/supportsTransactionCountLimit from the response with the 200 status [response-required-property-removed].
  • GET /platform/internal-accounts — removed the required property data/items/cardCapabilities/supportsSpendLimits from the response with the 200 status [response-required-property-removed].
  • GET /platform/internal-accounts — removed the required property data/items/cardCapabilities/supportsSpendLimitsAtIssuance from the response with the 200 status [response-required-property-removed].
  • GET /platform/internal-accounts — removed the required property data/items/cardCapabilities/supportsTransactionCountLimit from the response with the 200 status [response-required-property-removed].
  • POST /sandbox/internal-accounts/{accountId}/fund — removed the required property cardCapabilities/supportsSpendLimits from the response with the 200 status [response-required-property-removed].
  • POST /sandbox/internal-accounts/{accountId}/fund — removed the required property cardCapabilities/supportsSpendLimitsAtIssuance from the response with the 200 status [response-required-property-removed].
  • POST /sandbox/internal-accounts/{accountId}/fund — removed the required property cardCapabilities/supportsTransactionCountLimit from the response with the 200 status [response-required-property-removed].
  • POST webhook:card-pin-status-change — added the new required request property allOf[subschema #2]/data/cardCapabilities/supportsVelocityLimits [new-required-request-property].
  • POST webhook:card-status-change — added the new required request property allOf[subschema #2]/data/cardCapabilities/supportsVelocityLimits [new-required-request-property].
  • POST webhook:internal-account-status — added the new required request property allOf[subschema #2]/data/cardCapabilities/supportsVelocityLimits [new-required-request-property].

Warnings (33)

Show sample
  • PATCH /agents/me/cards/{cardId} — removed the request property maxSpendPerDay [request-property-removed].
  • PATCH /agents/me/cards/{cardId} — removed the request property maxSpendPerTransaction [request-property-removed].
  • PATCH /agents/me/cards/{cardId} — removed the request property maxTransactionsPerDay [request-property-removed].
  • POST /cards — removed the request property maxSpendPerDay [request-property-removed].
  • POST /cards — removed the request property maxSpendPerTransaction [request-property-removed].
  • POST /cards — removed the request property maxTransactionsPerDay [request-property-removed].
  • PATCH /cards/{id} — removed the request property maxSpendPerDay [request-property-removed].
  • PATCH /cards/{id} — removed the request property maxSpendPerTransaction [request-property-removed].
  • PATCH /cards/{id} — removed the request property maxTransactionsPerDay [request-property-removed].
  • GET /config — removed the optional property cardConfigs/maxSpendPerDay from the response with the 200 status [response-optional-property-removed].
  • GET /config — removed the optional property cardConfigs/maxSpendPerTransaction from the response with the 200 status [response-optional-property-removed].
  • GET /config — removed the optional property cardConfigs/maxTransactionsPerDay from the response with the 200 status [response-optional-property-removed].
  • PATCH /config — removed the request property cardConfigs/maxSpendPerDay [request-property-removed].
  • PATCH /config — removed the request property cardConfigs/maxSpendPerTransaction [request-property-removed].
  • PATCH /config — removed the request property cardConfigs/maxTransactionsPerDay [request-property-removed].
  • PATCH /config — removed the optional property cardConfigs/maxSpendPerDay from the response with the 200 status [response-optional-property-removed].
  • PATCH /config — removed the optional property cardConfigs/maxSpendPerTransaction from the response with the 200 status [response-optional-property-removed].
  • PATCH /config — removed the optional property cardConfigs/maxTransactionsPerDay from the response with the 200 status [response-optional-property-removed].
  • POST webhook:card-pin-status-change — removed the request property allOf[subschema #2]/data/cardCapabilities/supportsSpendLimits [request-property-removed].
  • POST webhook:card-pin-status-change — removed the request property allOf[subschema #2]/data/cardCapabilities/supportsSpendLimitsAtIssuance [request-property-removed].
  • POST webhook:card-pin-status-change — removed the request property allOf[subschema #2]/data/cardCapabilities/supportsTransactionCountLimit [request-property-removed].
  • POST webhook:card-pin-status-change — removed the request property allOf[subschema #2]/data/maxSpendPerDay [request-property-removed].
  • POST webhook:card-pin-status-change — removed the request property allOf[subschema #2]/data/maxSpendPerTransaction [request-property-removed].
  • POST webhook:card-pin-status-change — removed the request property allOf[subschema #2]/data/maxTransactionsPerDay [request-property-removed].
  • POST webhook:card-status-change — removed the request property allOf[subschema #2]/data/cardCapabilities/supportsSpendLimits [request-property-removed].
  • …and 8 more warnings.

Detected by oasdiff. Full report: job summary or the oasdiff-report artifact.

DhruvPareek added a commit that referenced this pull request Oct 26, 2026
Card spending limits are changing from the strictest value across all scopes to inheritance by specificity. Document the policy so platforms can predict which configured cap will apply.

For each count or currency-specific amount cap and matching metric/window, use card scope first, platform scope second, and program scope last. At the selected scope the lower API or Lightspark-managed cap applies. An unset cap inherits; an explicit zero remains configured and blocks.

Updates create/update/read card fields, platform defaults, and velocity-rule documentation. Amount and count inherit separately; distinct rolling durations remain independent. Provider-enforced account caps remain outside this Grid hierarchy. No request/response shape changes or new lifetime window.

Stacked on #1225. Companion webdev PR implements this policy; the generated client update is kept separate from backend logic.

- `make build` — passed; regenerated both OpenAPI bundles.
- `make lint` — passed (existing warnings only).
@DhruvPareek
DhruvPareek force-pushed the dp/card-velocity-rules-api branch from fc8b95d to 22cdafc Compare October 26, 2026 22:58
DhruvPareek added a commit that referenced this pull request Oct 26, 2026
Card spending limits are changing from the strictest value across all scopes to inheritance by specificity. Document the policy so platforms can predict which configured cap will apply.

For each count or currency-specific amount cap and matching metric/window, use card scope first, platform scope second, and program scope last. At the selected scope the lower API or Lightspark-managed cap applies. An unset cap inherits; an explicit zero remains configured and blocks.

Updates create/update/read card fields, platform defaults, and velocity-rule documentation. Amount and count inherit separately; distinct rolling durations remain independent. Provider-enforced account caps remain outside this Grid hierarchy. No request/response shape changes or new lifetime window.

Stacked on #1225. Companion webdev PR implements this policy; the generated client update is kept separate from backend logic.

- `make build` — passed; regenerated both OpenAPI bundles.
- `make lint` — passed (existing warnings only).
@DhruvPareek
DhruvPareek force-pushed the dp/card-velocity-rules-api branch from 22cdafc to 7a52af6 Compare October 26, 2026 23:43
@DhruvPareek
DhruvPareek merged commit 64bc49a into main Oct 27, 2026
9 checks passed
@DhruvPareek
DhruvPareek deleted the dp/card-velocity-rules-api branch October 27, 2026 16:43
DhruvPareek added a commit that referenced this pull request Oct 27, 2026
Card spending limits are changing from the strictest value across all scopes to inheritance by specificity. Document the policy so platforms can predict which configured cap will apply.

For each count or currency-specific amount cap and matching metric/window, use card scope first, platform scope second, and program scope last. At the selected scope the lower API or Lightspark-managed cap applies. An unset cap inherits; an explicit zero remains configured and blocks.

Updates create/update/read card fields, platform defaults, and velocity-rule documentation. Amount and count inherit separately; distinct rolling durations remain independent. Provider-enforced account caps remain outside this Grid hierarchy. No request/response shape changes or new lifetime window.

Stacked on #1225. Companion webdev PR implements this policy; the generated client update is kept separate from backend logic.

- `make build` — passed; regenerated both OpenAPI bundles.
- `make lint` — passed (existing warnings only).
DhruvPareek added a commit that referenced this pull request Oct 27, 2026
Card spending limits are changing from the strictest value across all scopes to inheritance by specificity. Document the policy so platforms can predict which configured cap will apply.

For each count or currency-specific amount cap and matching metric/window, use card scope first, platform scope second, and program scope last. At the selected scope the lower API or Lightspark-managed cap applies. An unset cap inherits; an explicit zero remains configured and blocks.

Updates create/update/read card fields, platform defaults, and velocity-rule documentation. Amount and count inherit separately; distinct rolling durations remain independent. Provider-enforced account caps remain outside this Grid hierarchy. No request/response shape changes or new lifetime window.

Stacked on #1225. Companion webdev PR implements this policy; the generated client update is kept separate from backend logic.

- `make build` — passed; regenerated both OpenAPI bundles.
- `make lint` — passed (existing warnings only).
DhruvPareek added a commit that referenced this pull request Oct 27, 2026
Card spending limits are changing from the strictest value across all scopes to inheritance by specificity. Document the policy so platforms can predict which configured cap will apply.

For each count or currency-specific amount cap and matching metric/window, use card scope first, platform scope second, and program scope last. At the selected scope the lower API or Lightspark-managed cap applies. An unset cap inherits; an explicit zero remains configured and blocks.

Updates create/update/read card fields, platform defaults, and velocity-rule documentation. Amount and count inherit separately; distinct rolling durations remain independent. Provider-enforced account caps remain outside this Grid hierarchy. No request/response shape changes or new lifetime window.

Stacked on #1225. Companion webdev PR implements this policy; the generated client update is kept separate from backend logic.

- `make build` — passed; regenerated both OpenAPI bundles.
- `make lint` — passed (existing warnings only).

This branch was successfully deployed

1 active deployment
staging - mintlify — 7a52af62 Deployed Oct 26, 2026 by mintlify[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking-change Introduces a breaking change to the OpenAPI spec

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants