Install any skill in seconds. Free to start, no credit card required.
Get Started Free →jeremylongshore/hex-rate-limits
Implement Hex rate limiting, backoff, and idempotency patterns.
Passed 21 of 25 test cases with the skill, and 9 of 25 without it.
and 13 more in the full report
12 fixed9 passed either way4 still failing0 broke
Tokens, turns and time describe resource use, not a dollar price.
One of 12 test cases the skill fixed. Same model, same prompt, with and without the skill.
When polling status for an active Hex run, what exact REST URI path is queried using `runId`?
| Checked | Without skill | With skill |
|---|---|---|
| The status endpoint URI path is specified as `/api/v1/run/${runId}/status`. | Missed | Passed |
The instructions your model reads when the skill loads.
Hex's API enforces tight limits on project run triggers (20 per minute, 60 per hour) while leaving read operations like status checks and project listing largely unthrottled. Data teams scheduling batch analytics runs or triggering parameterized notebooks from CI/CD pipelines must carefully manage the hourly cap, since a single pipeline triggering 15 projects can consume a quarter of the hourly budget. Polling run status is free, but triggering runs is the bottleneck that shapes integration architecture.
| Endpoint | Limit | Window | Scope |
|---|---|---|---|
| RunProject (trigger) | 20 req | 1 minute | Per API token |
| RunProject (trigger) | 60 req | 1 hour | Per API token |
| GetRunStatus | No hard limit | - | Per API token |
| ListProjects | No hard limit | - | Per API token |
| CancelRun | No hard limit | - | Per API token |
class HexRateLimiter {
private minuteTokens: number = 20;
private hourlyTokens: number = 60;
private lastMinuteRefill: number = Date.now();
private lastHourlyRefill: number = Date.now();
private queue: Array<{ resolve: () => void }> = [];
async acquire(): Promise<void> {
this.refill();
if (this.minuteTokens >= 1 && this.hourlyTokens >= 1) {
this.minuteTokens -= 1;
this.hourlyTokens -= 1;
return;
}
return new Promise(resolve => this.queue.push({ resolve }));
}
private refill() {
const now = Date.now();
this.minuteTokens = Math.min(20, this.minuteTokens + ((now - this.lastMinuteRefill) / 60_000) * 20);
this.lastMinuteRefill = now;
test cases passed, vs 9 / 25 without
More skills from the same source and nearby in the registry, with their headline benchmark lift.