Organization

GET /organization/setup

Get where the organization stands on setting each area up: reviews, loyalty, wishlists and the store itself. It answers in one call: the signals read off the organization's own records (has a site, has a publishable key, has a connected store, has products, has an active survey flow, has received a review, has a loyalty program, has it on a site), and per area whether it still needs setting up. An area that is already running is recorded as set up the first time it is seen, so it never goes back to asking.

Requires the settings:read permission.

Request
curl \
  "https://api.cascade.dev/organization/setup" \
  -H "Authorization: Bearer sk_YOUR_SECRET_KEY"
Response
{
  "signals": {
    "hasSite": true,
    "hasPublishableKey": true,
    "hasIntegration": true,
    "hasProducts": true,
    "hasActiveSurveyFlow": true,
    "hasReview": true,
    "hasLoyaltyProgram": true,
    "loyaltyProgramOnSite": true,
    "hasWishlist": true
  },
  "areas": {
    "reviews": {
      "completedAt": "2025-01-15T09:30:00Z",
      "dismissedAt": "2025-01-15T09:30:00Z",
      "configured": true,
      "needsSetup": true
    },
    "loyalty": {
      "completedAt": "2025-01-15T09:30:00Z",
      "dismissedAt": "2025-01-15T09:30:00Z",
      "configured": true,
      "needsSetup": true
    },
    "wishlists": {
      "completedAt": "2025-01-15T09:30:00Z",
      "dismissedAt": "2025-01-15T09:30:00Z",
      "configured": true,
      "needsSetup": true
    },
    "site": {
      "completedAt": "2025-01-15T09:30:00Z",
      "dismissedAt": "2025-01-15T09:30:00Z",
      "configured": true,
      "needsSetup": true
    }
  },
  "publishableKey": "string",
  "embedScriptUrl": "string",
  "apiBaseUrl": "string"
}

PATCH /organization/setup

Record what was decided about one area: it was set up, or it was skipped. Either way the area stops being offered, and neither can be undone. The other areas are left alone. This is also how the store area is settled, since connecting a store creates nothing here.

Requires the settings:write permission.

Body Parameters

areareviews | loyalty | wishlists | siterequired

The area being settled.

outcomecompleted | dismissedrequired

What happened: completed means the area was set up, dismissed means the merchant chose not to run it for now. Either way the area stops being offered, and neither can be undone.

Request
curl \
  -X PATCH \
  "https://api.cascade.dev/organization/setup" \
  -H "Authorization: Bearer sk_YOUR_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "area": "reviews",
  "outcome": "completed"
}'
Response
{
  "signals": {
    "hasSite": true,
    "hasPublishableKey": true,
    "hasIntegration": true,
    "hasProducts": true,
    "hasActiveSurveyFlow": true,
    "hasReview": true,
    "hasLoyaltyProgram": true,
    "loyaltyProgramOnSite": true,
    "hasWishlist": true
  },
  "areas": {
    "reviews": {
      "completedAt": "2025-01-15T09:30:00Z",
      "dismissedAt": "2025-01-15T09:30:00Z",
      "configured": true,
      "needsSetup": true
    },
    "loyalty": {
      "completedAt": "2025-01-15T09:30:00Z",
      "dismissedAt": "2025-01-15T09:30:00Z",
      "configured": true,
      "needsSetup": true
    },
    "wishlists": {
      "completedAt": "2025-01-15T09:30:00Z",
      "dismissedAt": "2025-01-15T09:30:00Z",
      "configured": true,
      "needsSetup": true
    },
    "site": {
      "completedAt": "2025-01-15T09:30:00Z",
      "dismissedAt": "2025-01-15T09:30:00Z",
      "configured": true,
      "needsSetup": true
    }
  },
  "publishableKey": "string",
  "embedScriptUrl": "string",
  "apiBaseUrl": "string"
}

POST /organization/setup/reviews

Set reviews up from a handful of answers. It creates the review request email (and the reminder, if you asked for one), creates the survey flow that sends them on the order event you chose, and writes your auto-publish preference. Everything it writes is an ordinary record afterward, so the flow and the templates are editable on their own screens.

Requires the settings:write permission.

Body Parameters

dataobjectrequired

The answers to turn into a flow and its emails.

Request
curl \
  -X POST \
  "https://api.cascade.dev/organization/setup/reviews" \
  -H "Authorization: Bearer sk_YOUR_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "data": {
    "triggerEvent": "orderCreated",
    "delayDays": 7,
    "reminder": true,
    "reminderDelayDays": 5,
    "template": "featuredProduct",
    "autoPublish": true,
    "autoPublishMinRating": 1
  }
}'
Response
{
  "data": {
    "signals": {
      "hasSite": true,
      "hasPublishableKey": true,
      "hasIntegration": true,
      "hasProducts": true,
      "hasActiveSurveyFlow": true,
      "hasReview": true,
      "hasLoyaltyProgram": true,
      "loyaltyProgramOnSite": true,
      "hasWishlist": true
    },
    "areas": {
      "reviews": {
        "completedAt": "...",
        "dismissedAt": "...",
        "configured": "...",
        "needsSetup": "..."
      },
      "loyalty": {
        "completedAt": "...",
        "dismissedAt": "...",
        "configured": "...",
        "needsSetup": "..."
      },
      "wishlists": {
        "completedAt": "...",
        "dismissedAt": "...",
        "configured": "...",
        "needsSetup": "..."
      },
      "site": {
        "completedAt": "...",
        "dismissedAt": "...",
        "configured": "...",
        "needsSetup": "..."
      }
    },
    "publishableKey": "string",
    "embedScriptUrl": "string",
    "apiBaseUrl": "string"
  },
  "surveyFlow": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "name": "string",
    "isActive": true,
    "triggerEvent": "orderCreated",
    "condition": "string",
    "steps": [
      {
        "id": "...",
        "type": "...",
        "position": "...",
        "emailTemplateId": "...",
        "url": "...",
        "waitSeconds": "..."
      }
    ],
    "metadata": "...",
    "createdAt": "2025-01-15T09:30:00Z",
    "updatedAt": "2025-01-15T09:30:00Z"
  },
  "emailTemplates": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "name": "string",
      "body": "string",
      "type": "reviewSurvey",
      "createdAt": "2025-01-15T09:30:00Z",
      "updatedAt": "2025-01-15T09:30:00Z"
    }
  ]
}

POST /organization/setup/loyalty

Set a loyalty program up from a handful of answers. Every answer writes a working example rather than only turning a section on: points bring an earning rule, a welcome bonus and one redemption, offers bring an offer, stamp cards bring a card, and referrals bring the pair of rules that reward both sides. The program is attached to every site you have, and is created as a draft, so publish it when you are ready for shoppers to see it. Members are enrolled the first time they do something the program rewards.

Requires the settings:write permission.

Body Parameters

dataobjectrequired

The answers to turn into a program and its records.

Request
curl \
  -X POST \
  "https://api.cascade.dev/organization/setup/loyalty" \
  -H "Authorization: Bearer sk_YOUR_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "data": {
    "points": true,
    "pointsPerDollar": 1,
    "offers": true,
    "stampCards": true,
    "referrals": true
  }
}'
Response
{
  "data": {
    "signals": {
      "hasSite": true,
      "hasPublishableKey": true,
      "hasIntegration": true,
      "hasProducts": true,
      "hasActiveSurveyFlow": true,
      "hasReview": true,
      "hasLoyaltyProgram": true,
      "loyaltyProgramOnSite": true,
      "hasWishlist": true
    },
    "areas": {
      "reviews": {
        "completedAt": "...",
        "dismissedAt": "...",
        "configured": "...",
        "needsSetup": "..."
      },
      "loyalty": {
        "completedAt": "...",
        "dismissedAt": "...",
        "configured": "...",
        "needsSetup": "..."
      },
      "wishlists": {
        "completedAt": "...",
        "dismissedAt": "...",
        "configured": "...",
        "needsSetup": "..."
      },
      "site": {
        "completedAt": "...",
        "dismissedAt": "...",
        "configured": "...",
        "needsSetup": "..."
      }
    },
    "publishableKey": "string",
    "embedScriptUrl": "string",
    "apiBaseUrl": "string"
  },
  "program": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "name": "string",
    "autoMembership": "off",
    "settings": {
      "loyaltyEmails": {
        "welcome": {
          "enabled": true,
          "emailTemplateId": null
        },
        "pointsEarned": {
          "enabled": false,
          "emailTemplateId": null
        },
        "rewardsAvailable": {
          "enabled": true,
          "emailTemplateId": null
        },
        "redeemed": {
          "enabled": true,
          "emailTemplateId": null
        },
        "rewardExpiring": {
          "enabled": true,
          "emailTemplateId": null
        },
        "pointsExpiring": {
          "enabled": true,
          "emailTemplateId": null
        }
      },
      "previousPointsNames": null
    },
    "sectionsEnabled": {
      "rules": true,
      "offers": true,
      "stampCards": true
    },
    "pointsNames": {
      "singular": "string",
      "plural": "string"
    },
    "pointsExpiresAfterDays": 0,
    "pointsBalancesExpireAt": "2025-01-15T09:30:00Z",
    "rewardsExpireAfterDays": 0,
    "expiringSoonDays": 0,
    "pausedAt": "2025-01-15T09:30:00Z",
    "publishedAt": "2025-01-15T09:30:00Z",
    "createdAt": "2025-01-15T09:30:00Z",
    "updatedAt": "2025-01-15T09:30:00Z"
  },
  "rules": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "loyaltyProgramId": "550e8400-e29b-41d4-a716-446655440000",
      "section": "rules",
      "name": "string",
      "trigger": {
        "type": "...",
        "source": "..."
      },
      "reward": {
        "type": "...",
        "amount": "..."
      },
      "maxRedemptionsPerCustomer": 0,
      "maxAvailableCount": 0,
      "availableCount": 0,
      "availableFrom": "2025-01-15T09:30:00Z",
      "availableTo": "2025-01-15T09:30:00Z",
      "loyaltyTierIds": ["..."],
      "metadata": "...",
      "createdAt": "2025-01-15T09:30:00Z",
      "updatedAt": "2025-01-15T09:30:00Z"
    }
  ],
  "stampCardTypes": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "loyaltyProgramId": "550e8400-e29b-41d4-a716-446655440000",
      "name": "string",
      "earningType": {
        "type": "...",
        "stamps": "..."
      },
      "overflowPolicy": "carry",
      "allowMultipleOpenCards": true,
      "availableFrom": "2025-01-15T09:30:00Z",
      "availableTo": "2025-01-15T09:30:00Z",
      "createdAt": "2025-01-15T09:30:00Z",
      "updatedAt": "2025-01-15T09:30:00Z"
    }
  ],
  "sites": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "siteId": "550e8400-e29b-41d4-a716-446655440000",
      "siteName": "string",
      "siteSlug": "string",
      "loyaltyProgramId": "550e8400-e29b-41d4-a716-446655440000",
      "programUrl": "string",
      "createdAt": "2025-01-15T09:30:00Z"
    }
  ]
}

POST /organization/setup/wishlists

Set wishlists up from a handful of answers. Wishlists have no records to create, so this writes the three settings that decide how they behave: whether a customer keeps one list or several, whether lists can be shared, and whether a shared list shows prices.

Requires the settings:write permission.

Body Parameters

dataobjectrequired

The answers to write to the organization's settings.

Request
curl \
  -X POST \
  "https://api.cascade.dev/organization/setup/wishlists" \
  -H "Authorization: Bearer sk_YOUR_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "data": {
    "multipleWishlists": true,
    "sharing": true,
    "showPrices": true
  }
}'
Response
{
  "signals": {
    "hasSite": true,
    "hasPublishableKey": true,
    "hasIntegration": true,
    "hasProducts": true,
    "hasActiveSurveyFlow": true,
    "hasReview": true,
    "hasLoyaltyProgram": true,
    "loyaltyProgramOnSite": true,
    "hasWishlist": true
  },
  "areas": {
    "reviews": {
      "completedAt": "2025-01-15T09:30:00Z",
      "dismissedAt": "2025-01-15T09:30:00Z",
      "configured": true,
      "needsSetup": true
    },
    "loyalty": {
      "completedAt": "2025-01-15T09:30:00Z",
      "dismissedAt": "2025-01-15T09:30:00Z",
      "configured": true,
      "needsSetup": true
    },
    "wishlists": {
      "completedAt": "2025-01-15T09:30:00Z",
      "dismissedAt": "2025-01-15T09:30:00Z",
      "configured": true,
      "needsSetup": true
    },
    "site": {
      "completedAt": "2025-01-15T09:30:00Z",
      "dismissedAt": "2025-01-15T09:30:00Z",
      "configured": true,
      "needsSetup": true
    }
  },
  "publishableKey": "string",
  "embedScriptUrl": "string",
  "apiBaseUrl": "string"
}

GET /organization

Get the organization the request is authenticated against, including its plan, its resolved limits and its settings. The limits already have the plan's defaults resolved against anything set on the organization itself.

Requires the settings:read permission.

Request
curl \
  "https://api.cascade.dev/organization" \
  -H "Authorization: Bearer sk_YOUR_SECRET_KEY"
Response
{
  "data": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "name": "string",
    "slug": "string",
    "logoUrl": "https://example.com",
    "plan": "starter",
    "limits": {
      "sites": 0,
      "products": 0,
      "variantsPerProduct": 0,
      "customers": 0,
      "monthlySurveys": 0,
      "monthlyLoyaltyMAU": 0,
      "monthlyWishlistMAU": 0,
      "apiKeys": 0,
      "seats": 0,
      "pendingInvitations": 0,
      "webhooks": 0,
      "loyaltyPrograms": 0,
      "currencies": 0,
      "rulesPerLoyaltyProgram": 0,
      "tiersPerLoyaltyProgram": 0,
      "rewardsPerLoyaltyProgram": 0,
      "stampCardTypes": 0,
      "surveyFlows": 0,
      "stepsPerSurveyFlow": 0,
      "savedCharts": 0,
      "dashboards": 0,
      "savedFilters": 0,
      "quickFilters": 0,
      "tagsPerResource": 0,
      "wishlistsPerCustomer": 0,
      "itemsPerWishlist": 0,
      "brandAssetsMB": 0,
      "totalStorageMB": 0,
      "singleUploadMB": 0,
      "assistantAttachmentBytes": 0,
      "mediaPerReview": 0,
      "monthlyReviewSubmissions": 0,
      "webhookEventRetentionDays": 0,
      "auditLogRetentionDays": 0,
      "importJobRetentionDays": 0,
      "importJobsPerDay": 0,
      "exportJobsPerDay": 0,
      "rowsPerImport": 0,
      "rowsPerExport": 0,
      "apiRequestsPerMinute": 0,
      "mcpRequestsPerMinute": 0,
      "loyaltyEventsPerMinute": 0,
      "loyaltyStampsPerMinute": 0,
      "widgetRequestsPerSession": 0,
      "emailsPerCustomerPerDay": 0,
      "aiSummaryMinReviews": 0,
      "aiSummaryRegenerateReviews": 0,
      "aiSummaryRegeneratePercent": 0,
      "aiSummaryMinHoursBetween": 0,
      "monthlyReviewAnswers": 0,
      "aiReviewSummaries": true,
      "aiReviewAnswers": true,
      "aiReviewScreening": true,
      "sso": true
    },
    "settings": {
      "cascadeDeleteReviews": false,
      "autoPublishReviews": false,
      "autoPublishMinRating": 1,
      "showWishlistPrices": true,
      "allowSharedWishlists": true,
      "allowWishlistPurchaseMarking": true,
      "defaultWishlistName": "My wishlist",
      "multipleWishlists": true,
      "reviewNotifications": {
        "perReview": false,
        "perReviewMaxRating": 5,
        "digest": false,
        "slackWebhookUrl": null
      },
      "reviewScreening": {
        "links": true,
        "profanity": true,
        "blocklist": [],
        "ai": false
      },
      "reviewSummaries": {
        "enabled": true
      },
      "reviewAnswers": {
        "enabled": true
      },
      "productQuestions": {
        "enabled": true,
        "allowShopperAnswers": false,
        "notifyAsker": true
      },
      "wishlistAlerts": {
        "priceDrop": false,
        "backInStock": false,
        "priceDropThresholdPercent": 10
      }
    },
    "timezone": "string",
    "access": {
      "state": "active",
      "writable": true,
      "message": "string",
      "trialEndsAt": "2025-01-15T09:30:00Z",
      "readOnlySince": "2025-01-15T09:30:00Z",
      "exportsUntil": "2025-01-15T09:30:00Z"
    },
    "createdAt": "2025-01-15T09:30:00Z",
    "updatedAt": "2025-01-15T09:30:00Z"
  },
  "role": "owner"
}

PATCH /organization

Update the current organization: its settings, time zone, display name or logo. Only the fields you send are changed; the rest are left alone. Name and logo changes are recorded in the audit trail. The slug cannot be changed, since storefront pages are served from it.

Requires the settings:write permission.

Body Parameters

settingsobject

The settings to change.

timezonestring

The organization's time zone, as an IANA name such as America/New_York. Everything decided on a clock (loyalty birthdays, visit allowances, expiry sweeps) uses it.

namestring

A new display name for the organization.

logostring | null

The key of an image uploaded through POST /files/upload-url with public access, or null to remove the logo.

Request
curl \
  -X PATCH \
  "https://api.cascade.dev/organization" \
  -H "Authorization: Bearer sk_YOUR_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "settings": {
    "cascadeDeleteReviews": true,
    "autoPublishReviews": true,
    "autoPublishMinRating": 0,
    "showWishlistPrices": true,
    "allowSharedWishlists": true,
    "allowWishlistPurchaseMarking": true,
    "defaultWishlistName": "string",
    "multipleWishlists": true,
    "reviewNotifications": {
      "perReview": true,
      "perReviewMaxRating": 0,
      "digest": true,
      "slackWebhookUrl": "string"
    },
    "reviewScreening": {
      "links": true,
      "profanity": true,
      "blocklist": [
        "..."
      ],
      "ai": true
    },
    "reviewSummaries": {
      "enabled": true
    },
    "reviewAnswers": {
      "enabled": true
    },
    "productQuestions": {
      "enabled": true,
      "allowShopperAnswers": true,
      "notifyAsker": true
    },
    "wishlistAlerts": {
      "priceDrop": true,
      "backInStock": true,
      "priceDropThresholdPercent": 0
    }
  },
  "timezone": "string",
  "name": "string",
  "logo": "string"
}'
Response
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "name": "string",
  "slug": "string",
  "logoUrl": "https://example.com",
  "plan": "starter",
  "limits": {
    "sites": 0,
    "products": 0,
    "variantsPerProduct": 0,
    "customers": 0,
    "monthlySurveys": 0,
    "monthlyLoyaltyMAU": 0,
    "monthlyWishlistMAU": 0,
    "apiKeys": 0,
    "seats": 0,
    "pendingInvitations": 0,
    "webhooks": 0,
    "loyaltyPrograms": 0,
    "currencies": 0,
    "rulesPerLoyaltyProgram": 0,
    "tiersPerLoyaltyProgram": 0,
    "rewardsPerLoyaltyProgram": 0,
    "stampCardTypes": 0,
    "surveyFlows": 0,
    "stepsPerSurveyFlow": 0,
    "savedCharts": 0,
    "dashboards": 0,
    "savedFilters": 0,
    "quickFilters": 0,
    "tagsPerResource": 0,
    "wishlistsPerCustomer": 0,
    "itemsPerWishlist": 0,
    "brandAssetsMB": 0,
    "totalStorageMB": 0,
    "singleUploadMB": 0,
    "assistantAttachmentBytes": 0,
    "mediaPerReview": 0,
    "monthlyReviewSubmissions": 0,
    "webhookEventRetentionDays": 0,
    "auditLogRetentionDays": 0,
    "importJobRetentionDays": 0,
    "importJobsPerDay": 0,
    "exportJobsPerDay": 0,
    "rowsPerImport": 0,
    "rowsPerExport": 0,
    "apiRequestsPerMinute": 0,
    "mcpRequestsPerMinute": 0,
    "loyaltyEventsPerMinute": 0,
    "loyaltyStampsPerMinute": 0,
    "widgetRequestsPerSession": 0,
    "emailsPerCustomerPerDay": 0,
    "aiSummaryMinReviews": 0,
    "aiSummaryRegenerateReviews": 0,
    "aiSummaryRegeneratePercent": 0,
    "aiSummaryMinHoursBetween": 0,
    "monthlyReviewAnswers": 0,
    "aiReviewSummaries": true,
    "aiReviewAnswers": true,
    "aiReviewScreening": true,
    "sso": true
  },
  "settings": {
    "cascadeDeleteReviews": false,
    "autoPublishReviews": false,
    "autoPublishMinRating": 1,
    "showWishlistPrices": true,
    "allowSharedWishlists": true,
    "allowWishlistPurchaseMarking": true,
    "defaultWishlistName": "My wishlist",
    "multipleWishlists": true,
    "reviewNotifications": {
      "perReview": false,
      "perReviewMaxRating": 5,
      "digest": false,
      "slackWebhookUrl": null
    },
    "reviewScreening": {
      "links": true,
      "profanity": true,
      "blocklist": [],
      "ai": false
    },
    "reviewSummaries": {
      "enabled": true
    },
    "reviewAnswers": {
      "enabled": true
    },
    "productQuestions": {
      "enabled": true,
      "allowShopperAnswers": false,
      "notifyAsker": true
    },
    "wishlistAlerts": {
      "priceDrop": false,
      "backInStock": false,
      "priceDropThresholdPercent": 10
    }
  },
  "timezone": "string",
  "access": {
    "state": "active",
    "writable": true,
    "message": "string",
    "trialEndsAt": "2025-01-15T09:30:00Z",
    "readOnlySince": "2025-01-15T09:30:00Z",
    "exportsUntil": "2025-01-15T09:30:00Z"
  },
  "createdAt": "2025-01-15T09:30:00Z",
  "updatedAt": "2025-01-15T09:30:00Z"
}

GET /organization/usage

Get the organization's usage against every allowance it is counted on. Three of them are billable (review submissions, active loyalty members, active wishlist customers) and the rest are backstops that are counted but never priced. Each meter says whether it covers the current UTC calendar month or is a running total, and carries its own label so you can render it without a lookup table. These counts are informational, and going over an allowance does not block anything. Counts are cached for a few minutes, so a number can lag a write you just made.

Requires the settings:read permission.

Request
curl \
  "https://api.cascade.dev/organization/usage" \
  -H "Authorization: Bearer sk_YOUR_SECRET_KEY"
Response
{
  "monthlySurveys": {
    "label": "string",
    "description": "string",
    "used": 0,
    "limit": 0,
    "usedLabel": "string",
    "limitLabel": "string",
    "status": "ok",
    "group": "billable",
    "grace": {
      "startedAt": "2025-01-15T09:30:00Z",
      "degradesAt": "2025-01-15T09:30:00Z",
      "degraded": true
    },
    "period": "monthly",
    "overage": {
      "enabled": true,
      "units": 0,
      "unitsLabel": "string",
      "blocks": 0,
      "blockSize": 0,
      "amount": 0,
      "amountLabel": "string",
      "rateLabel": "string",
      "currency": "string"
    }
  },
  "monthlyLoyaltyMAU": {
    "label": "string",
    "description": "string",
    "used": 0,
    "limit": 0,
    "usedLabel": "string",
    "limitLabel": "string",
    "status": "ok",
    "group": "billable",
    "grace": {
      "startedAt": "2025-01-15T09:30:00Z",
      "degradesAt": "2025-01-15T09:30:00Z",
      "degraded": true
    },
    "period": "monthly",
    "overage": {
      "enabled": true,
      "units": 0,
      "unitsLabel": "string",
      "blocks": 0,
      "blockSize": 0,
      "amount": 0,
      "amountLabel": "string",
      "rateLabel": "string",
      "currency": "string"
    }
  },
  "monthlyWishlistMAU": {
    "label": "string",
    "description": "string",
    "used": 0,
    "limit": 0,
    "usedLabel": "string",
    "limitLabel": "string",
    "status": "ok",
    "group": "billable",
    "grace": {
      "startedAt": "2025-01-15T09:30:00Z",
      "degradesAt": "2025-01-15T09:30:00Z",
      "degraded": true
    },
    "period": "monthly",
    "overage": {
      "enabled": true,
      "units": 0,
      "unitsLabel": "string",
      "blocks": 0,
      "blockSize": 0,
      "amount": 0,
      "amountLabel": "string",
      "rateLabel": "string",
      "currency": "string"
    }
  },
  "monthlyReviewSubmissions": {
    "label": "string",
    "description": "string",
    "used": 0,
    "limit": 0,
    "usedLabel": "string",
    "limitLabel": "string",
    "status": "ok",
    "group": "billable",
    "grace": {
      "startedAt": "2025-01-15T09:30:00Z",
      "degradesAt": "2025-01-15T09:30:00Z",
      "degraded": true
    },
    "period": "monthly",
    "overage": {
      "enabled": true,
      "units": 0,
      "unitsLabel": "string",
      "blocks": 0,
      "blockSize": 0,
      "amount": 0,
      "amountLabel": "string",
      "rateLabel": "string",
      "currency": "string"
    }
  },
  "monthlyReviewAnswers": {
    "label": "string",
    "description": "string",
    "used": 0,
    "limit": 0,
    "usedLabel": "string",
    "limitLabel": "string",
    "status": "ok",
    "group": "billable",
    "grace": {
      "startedAt": "2025-01-15T09:30:00Z",
      "degradesAt": "2025-01-15T09:30:00Z",
      "degraded": true
    },
    "period": "monthly",
    "overage": {
      "enabled": true,
      "units": 0,
      "unitsLabel": "string",
      "blocks": 0,
      "blockSize": 0,
      "amount": 0,
      "amountLabel": "string",
      "rateLabel": "string",
      "currency": "string"
    }
  },
  "products": {
    "label": "string",
    "description": "string",
    "used": 0,
    "limit": 0,
    "usedLabel": "string",
    "limitLabel": "string",
    "status": "ok",
    "group": "billable",
    "grace": {
      "startedAt": "2025-01-15T09:30:00Z",
      "degradesAt": "2025-01-15T09:30:00Z",
      "degraded": true
    },
    "period": "monthly",
    "overage": {
      "enabled": true,
      "units": 0,
      "unitsLabel": "string",
      "blocks": 0,
      "blockSize": 0,
      "amount": 0,
      "amountLabel": "string",
      "rateLabel": "string",
      "currency": "string"
    }
  },
  "customers": {
    "label": "string",
    "description": "string",
    "used": 0,
    "limit": 0,
    "usedLabel": "string",
    "limitLabel": "string",
    "status": "ok",
    "group": "billable",
    "grace": {
      "startedAt": "2025-01-15T09:30:00Z",
      "degradesAt": "2025-01-15T09:30:00Z",
      "degraded": true
    },
    "period": "monthly",
    "overage": {
      "enabled": true,
      "units": 0,
      "unitsLabel": "string",
      "blocks": 0,
      "blockSize": 0,
      "amount": 0,
      "amountLabel": "string",
      "rateLabel": "string",
      "currency": "string"
    }
  },
  "sites": {
    "label": "string",
    "description": "string",
    "used": 0,
    "limit": 0,
    "usedLabel": "string",
    "limitLabel": "string",
    "status": "ok",
    "group": "billable",
    "grace": {
      "startedAt": "2025-01-15T09:30:00Z",
      "degradesAt": "2025-01-15T09:30:00Z",
      "degraded": true
    },
    "period": "monthly",
    "overage": {
      "enabled": true,
      "units": 0,
      "unitsLabel": "string",
      "blocks": 0,
      "blockSize": 0,
      "amount": 0,
      "amountLabel": "string",
      "rateLabel": "string",
      "currency": "string"
    }
  },
  "apiKeys": {
    "label": "string",
    "description": "string",
    "used": 0,
    "limit": 0,
    "usedLabel": "string",
    "limitLabel": "string",
    "status": "ok",
    "group": "billable",
    "grace": {
      "startedAt": "2025-01-15T09:30:00Z",
      "degradesAt": "2025-01-15T09:30:00Z",
      "degraded": true
    },
    "period": "monthly",
    "overage": {
      "enabled": true,
      "units": 0,
      "unitsLabel": "string",
      "blocks": 0,
      "blockSize": 0,
      "amount": 0,
      "amountLabel": "string",
      "rateLabel": "string",
      "currency": "string"
    }
  },
  "seats": {
    "label": "string",
    "description": "string",
    "used": 0,
    "limit": 0,
    "usedLabel": "string",
    "limitLabel": "string",
    "status": "ok",
    "group": "billable",
    "grace": {
      "startedAt": "2025-01-15T09:30:00Z",
      "degradesAt": "2025-01-15T09:30:00Z",
      "degraded": true
    },
    "period": "monthly",
    "overage": {
      "enabled": true,
      "units": 0,
      "unitsLabel": "string",
      "blocks": 0,
      "blockSize": 0,
      "amount": 0,
      "amountLabel": "string",
      "rateLabel": "string",
      "currency": "string"
    }
  },
  "webhooks": {
    "label": "string",
    "description": "string",
    "used": 0,
    "limit": 0,
    "usedLabel": "string",
    "limitLabel": "string",
    "status": "ok",
    "group": "billable",
    "grace": {
      "startedAt": "2025-01-15T09:30:00Z",
      "degradesAt": "2025-01-15T09:30:00Z",
      "degraded": true
    },
    "period": "monthly",
    "overage": {
      "enabled": true,
      "units": 0,
      "unitsLabel": "string",
      "blocks": 0,
      "blockSize": 0,
      "amount": 0,
      "amountLabel": "string",
      "rateLabel": "string",
      "currency": "string"
    }
  },
  "brandAssetsMB": {
    "label": "string",
    "description": "string",
    "used": 0,
    "limit": 0,
    "usedLabel": "string",
    "limitLabel": "string",
    "status": "ok",
    "group": "billable",
    "grace": {
      "startedAt": "2025-01-15T09:30:00Z",
      "degradesAt": "2025-01-15T09:30:00Z",
      "degraded": true
    },
    "period": "monthly",
    "overage": {
      "enabled": true,
      "units": 0,
      "unitsLabel": "string",
      "blocks": 0,
      "blockSize": 0,
      "amount": 0,
      "amountLabel": "string",
      "rateLabel": "string",
      "currency": "string"
    }
  },
  "totalStorageMB": {
    "label": "string",
    "description": "string",
    "used": 0,
    "limit": 0,
    "usedLabel": "string",
    "limitLabel": "string",
    "status": "ok",
    "group": "billable",
    "grace": {
      "startedAt": "2025-01-15T09:30:00Z",
      "degradesAt": "2025-01-15T09:30:00Z",
      "degraded": true
    },
    "period": "monthly",
    "overage": {
      "enabled": true,
      "units": 0,
      "unitsLabel": "string",
      "blocks": 0,
      "blockSize": 0,
      "amount": 0,
      "amountLabel": "string",
      "rateLabel": "string",
      "currency": "string"
    }
  }
}