Skip to main content

Create a Limit

Limits are linked to meters. First create a meter, then create a limit that references it.
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

// 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:
// 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:
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:
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:
// Check only GPT-4 limits
const result = await client.limits.check({
  customerId: "cust_123",
  dimensions: { model: "gpt-4" }
});

List Limits

// 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

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

const limit = await client.limits.update("lmt_abc123", {
  name: "Updated limit name",
  limitValue: 200000,  // Increase limit
  alertThresholds: [75, 90, 100]
});

Delete a Limit

const result = await client.limits.delete("lmt_abc123");

if (result.success) {
  console.log("Limit deleted");
}