Create a Limit
Limits are linked to meters. First create a meter, then create a limit that references it.Copy
import Limitry from '@limitry/sdk';
const client = new Limitry();
// First, create or get a meter
const meter = await client.meters.create({
name: "Total Tokens",
aggregation: "sum",
field: "values.tokens",
eventFilter: { eventType: "llm.completion" }
});
// Create a limit using that meter
const limit = await client.limits.create({
name: "Daily token limit",
meterId: meter.id,
limitValue: 100000,
period: "day",
customerId: "cust_123"
});
console.log(`Created limit: ${limit.id}`);
Limit Options
Periods
Copy
// Hourly (resets every hour on the hour)
const limit = await client.limits.create({
name: "Hourly limit",
meterId: meter.id,
limitValue: 10000,
period: "hour",
customerId: "cust_123"
});
// Daily (resets at midnight in customer's timezone)
period: "day"
// Weekly (resets Monday midnight in customer's timezone)
period: "week"
// Monthly (resets on customer's billing cycle day)
period: "month"
// Annual (resets on customer's billing cycle anniversary)
period: "annual"
// Lifetime (never resets)
period: "all_time"
Dimension Filters
Apply limits to specific segments of events:Copy
// Only limit GPT-4 usage
const limit = await client.limits.create({
name: "GPT-4 daily limit",
meterId: meter.id,
limitValue: 50000,
period: "day",
customerId: "cust_123",
dimensionFilters: { model: "gpt-4" }
});
// Limit a specific feature
const limit = await client.limits.create({
name: "Premium feature limit",
meterId: featureMeter.id,
limitValue: 100,
period: "month",
customerId: "cust_123",
dimensionFilters: { feature: "advanced-analysis" }
});
Alert Thresholds
Get notified at specific usage levels:Copy
const limit = await client.limits.create({
name: "Daily limit with alerts",
meterId: meter.id,
limitValue: 100000,
period: "day",
customerId: "cust_123",
alertThresholds: [50, 80, 100] // Alert at 50%, 80%, and 100%
});
Check Limits
Check if a customer is within their limits:Copy
const result = await client.limits.check({ customerId: "cust_123" });
console.log(`Allowed: ${result.allowed}`);
for (const limit of result.limits) {
const pct = (limit.used / limit.limit) * 100;
console.log(`${limit.name}: ${limit.used.toLocaleString()}/${limit.limit.toLocaleString()} (${pct.toFixed(1)}%)`);
console.log(` Remaining: ${limit.remaining.toLocaleString()}`);
console.log(` Exceeded: ${limit.exceeded}`);
if (limit.reset) { // Unix timestamp, null for all_time
console.log(` Resets at: ${new Date(limit.reset * 1000)}`);
}
}
Check with Filters
Check limits that match specific dimensions:Copy
// Check only GPT-4 limits
const result = await client.limits.check({
customerId: "cust_123",
dimensions: { model: "gpt-4" }
});
List Limits
Copy
// List all limits
const limits = await client.limits.list();
for (const limit of limits.data) {
console.log(`${limit.name} (${limit.id})`);
console.log(` Meter: ${limit.meterId}`);
console.log(` Limit: ${limit.limitValue} per ${limit.period}`);
if (limit.dimensionFilters) {
console.log(` Filters: ${JSON.stringify(limit.dimensionFilters)}`);
}
}
// Filter by customer
const limits = await client.limits.list({ customerId: "cust_123" });
// Pagination
const limits = await client.limits.list({ limit: 50 });
if (limits.hasMore) {
const nextPage = await client.limits.list({ cursor: limits.nextCursor });
}
The
limit parameter in list() controls pagination (max items per page), not the limit value.Get a Limit
Copy
const limit = await client.limits.retrieve("lmt_abc123");
console.log(`Name: ${limit.name}`);
console.log(`Meter ID: ${limit.meterId}`);
console.log(`Limit Value: ${limit.limitValue}`);
console.log(`Period: ${limit.period}`);
console.log(`Customer: ${limit.customerId}`);
console.log(`Filters: ${JSON.stringify(limit.dimensionFilters)}`);
Update a Limit
Copy
const limit = await client.limits.update("lmt_abc123", {
name: "Updated limit name",
limitValue: 200000, // Increase limit
alertThresholds: [75, 90, 100]
});
Delete a Limit
Copy
const result = await client.limits.delete("lmt_abc123");
if (result.success) {
console.log("Limit deleted");
}