Drop-in React components for displaying AI usage and billing to your customers.
npm install @quotadev/react @quotadev/sdkWrap your app with QuotaProvider, then use the components anywhere:
import { QuotaProvider, UsageMeter, UsageHistory } from "@quotadev/react";
function App() {
return (
<QuotaProvider apiKey={process.env.QUOTA_API_KEY}>
<Dashboard />
</QuotaProvider>
);
}
function Dashboard() {
return (
<>
<UsageMeter
customerId="cus_abc123"
feature="ai-summarization"
showUpgradePrompt
upgradeUrl="/pricing"
/>
<UsageHistory
customerId="cus_abc123"
period="current_month"
theme="dark"
/>
</>
);
}Context provider that configures the SDK for all child components.
| Prop | Type | Default | Description |
|---|---|---|---|
apiKey |
string |
— | Your Quota API key |
baseUrl |
string |
https://api.usequota.dev |
API base URL |
Displays current usage as a progress bar with optional upgrade prompt.
| Prop | Type | Default | Description |
|---|---|---|---|
customerId |
string |
— | Customer to show usage for |
feature |
string |
— | Filter by feature |
showUpgradePrompt |
boolean |
false |
Show prompt when near/over limit |
upgradeUrl |
string |
— | URL for the upgrade CTA |
label |
string |
— | Custom label text |
size |
"sm" | "md" | "lg" |
"md" |
Size variant |
className |
string |
— | Custom CSS class |
Displays usage history as a chart or table.
| Prop | Type | Default | Description |
|---|---|---|---|
customerId |
string |
— | Customer to show history for |
period |
"current_month" | "last_30_days" | "last_7_days" |
"current_month" |
Time period |
feature |
string |
— | Filter by feature |
theme |
"light" | "dark" | "auto" |
"auto" |
Color theme |
view |
"chart" | "table" |
"chart" |
Display mode |
className |
string |
— | Custom CSS class |
Returns a configured Quota SDK instance from context.
import { useQuota } from "@quotadev/react";
function MyComponent() {
const quota = useQuota();
const handleAction = async () => {
const check = await quota.check({
customerId: "cus_abc123",
feature: "ai-summarization",
estimatedTokens: 500,
});
if (!check.allowed) {
alert("Usage limit reached");
}
};
}Fetches current usage data for a customer.
import { useUsage } from "@quotadev/react";
function UsageDisplay() {
const { data, isLoading, error } = useUsage({
customerId: "cus_abc123",
feature: "ai-summarization",
pollInterval: 30000, // refresh every 30s
});
if (isLoading) return <span>Loading...</span>;
if (!data) return null;
return (
<div>
<p>{data.tokens.toLocaleString()} tokens used</p>
<p>{data.percentUsed}% of limit</p>
</div>
);
}Fetches usage history records for a customer.
react>= 18react-dom>= 18
MIT