Google Maps Export
gmapsscraper/google-maps-agent-skills
Export Google Maps business data to CSV, JSON, or CRM format (HubSpot, Pipedrive, Salesforce).
Agent skill
by jeremylongshore in jeremylongshore/tons-of-skills-marketplace
Survive HubSpot API rate limits at production scale. An agent skill from jeremylongshore/tons-of-skills-marketplace.
$ npx skills add jeremylongshore/tons-of-skills-marketplace --skill hubspot-rate-limit-survival -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install jeremylongshore/tons-of-skills-marketplace hubspot-rate-limit-survival --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/jeremylongshore/tons-of-skills-marketplace.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/.curated/hubspot-rate-limit-survival .claude/skills/hubspot-rate-limit-survival && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "hubspot-rate-limit-survival" agent skill from https://github.com/jeremylongshore/tons-of-skills-marketplace/tree/main/skills/.curated/hubspot-rate-limit-survival into .claude/skills/hubspot-rate-limit-survival/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hubspot-rate-limit-survival", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/jeremylongshore/tons-of-skills-marketplace/tree/main/skills/.curated/hubspot-rate-limit-survivalType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add jeremylongshore/tons-of-skills-marketplace --skill hubspot-rate-limit-survival -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install jeremylongshore/tons-of-skills-marketplace hubspot-rate-limit-survival --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jeremylongshore/tons-of-skills-marketplace.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/.curated/hubspot-rate-limit-survival .agents/skills/hubspot-rate-limit-survival && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "hubspot-rate-limit-survival" agent skill from https://github.com/jeremylongshore/tons-of-skills-marketplace/tree/main/skills/.curated/hubspot-rate-limit-survival into .agents/skills/hubspot-rate-limit-survival/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hubspot-rate-limit-survival", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add jeremylongshore/tons-of-skills-marketplace --skill hubspot-rate-limit-survival -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install jeremylongshore/tons-of-skills-marketplace hubspot-rate-limit-survival --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jeremylongshore/tons-of-skills-marketplace.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/.curated/hubspot-rate-limit-survival .cursor/skills/hubspot-rate-limit-survival && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "hubspot-rate-limit-survival" agent skill from https://github.com/jeremylongshore/tons-of-skills-marketplace/tree/main/skills/.curated/hubspot-rate-limit-survival into .cursor/skills/hubspot-rate-limit-survival/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hubspot-rate-limit-survival", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/jeremylongshore/tons-of-skills-marketplace.git --path skills/.curated/hubspot-rate-limit-survival--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add jeremylongshore/tons-of-skills-marketplace --skill hubspot-rate-limit-survival -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install jeremylongshore/tons-of-skills-marketplace hubspot-rate-limit-survival --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jeremylongshore/tons-of-skills-marketplace.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/.curated/hubspot-rate-limit-survival .gemini/skills/hubspot-rate-limit-survival && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "hubspot-rate-limit-survival" agent skill from https://github.com/jeremylongshore/tons-of-skills-marketplace/tree/main/skills/.curated/hubspot-rate-limit-survival into .gemini/skills/hubspot-rate-limit-survival/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hubspot-rate-limit-survival", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install jeremylongshore/tons-of-skills-marketplace hubspot-rate-limit-survivalInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add jeremylongshore/tons-of-skills-marketplace --skill hubspot-rate-limit-survival -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/jeremylongshore/tons-of-skills-marketplace.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/.curated/hubspot-rate-limit-survival .github/skills/hubspot-rate-limit-survival && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "hubspot-rate-limit-survival" agent skill from https://github.com/jeremylongshore/tons-of-skills-marketplace/tree/main/skills/.curated/hubspot-rate-limit-survival into .github/skills/hubspot-rate-limit-survival/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hubspot-rate-limit-survival", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add jeremylongshore/tons-of-skills-marketplace --skill hubspot-rate-limit-survival -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install jeremylongshore/tons-of-skills-marketplace hubspot-rate-limit-survival --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jeremylongshore/tons-of-skills-marketplace.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/.curated/hubspot-rate-limit-survival .opencode/skills/hubspot-rate-limit-survival && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "hubspot-rate-limit-survival" agent skill from https://github.com/jeremylongshore/tons-of-skills-marketplace/tree/main/skills/.curated/hubspot-rate-limit-survival into .opencode/skills/hubspot-rate-limit-survival/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hubspot-rate-limit-survival", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
hubspot-rate-limit-survivalSurvive HubSpot API rate limits at production scale. An agent skill from jeremylongshore/tons-of-skills-marketplace.
Hubspot Rate Limit Survival is an agent skill from jeremylongshore/tons-of-skills-marketplace. Survive HubSpot API rate limits at production scale. Covers daily 500K portal quota, per-10s burst limits, batch API efficiency (100x), token bucket pattern, queue-based worker architecture, and Retry-After header parsing. Use when a sync job burns the daily quota before 8am, when a parallelized batch job retry-storms on 429s, when single-record reads waste 99% of available throughput, or when instrumenting a rate-limit dashboard for an Ops Hub Enterprise portal. Trigger with "hubspot rate limit", "hubspot…
Its SKILL.md is about 3.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including reference files (for example `references/API_REFERENCE.md` and `references/implementation-guide.md`). Compatibility notes: Designed for Claude Code
It sits in Sales & Support, covering Rate limiting and CRM management. It works with HubSpot. The repository describes itself as: Model-agnostic agent-skills platform with a harness-free canonical layer, verified adapters, and the ccpi package manager. Explore at tonsofskills.com. The licence is MIT.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit cfae287. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadBash(curl:*)Bash(jq:*)Bash(python3:*)From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
curljqFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
api.hubapi.comAlso links to:
developers.hubspot.comhubspot.comstatus.hubspot.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
HUBSPOT_ACCESS_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Designed for Claude Code
From compatibility in the SKILL.md frontmatter.
Hubspot Rate Limit Survival loads about 3.6k tokens when it runs, and up to ~12k if it reads all its reference files. Until then it costs about 173 tokens; SKILL.md has 803 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from jeremylongshore/tons-of-skills-marketplace at commit cfae287, republished under its MIT licence (© jeremylongshore). 803 words, ~3,580 tokens.
.claude/skills/hubspot-rate-limit-survival/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.Rate-limit your HubSpot integration so it survives production volume without burning the portal's daily quota before lunch. This skill covers the six failure modes that take down integrations at scale and gives you the code to prevent each one.
Key invariant: HubSpot rate limits are portal-scoped, not app-scoped. Every private app and OAuth app in the same portal shares the same daily and per-10s buckets. There is no per-app isolation.
The six production failures this skill prevents:
GET /contacts/{id} costs 1 quota unit and returns 1 record. POST /contacts/batch/read with 100 IDs costs 1 unit and returns 100 records. Single-record reads waste 99% of available throughput.Retry-After: N. Backing off by 1s when N=30 produces 29 consecutive failures. Backing off by 30s when N=1 adds unnecessary latency. Always parse and honor the header exactly.@hubspot/api-client (npm) or hubspot (pip) for SDK-based integrationsbullmq (npm) or celery+redis-py (Python)Auth: Every API call requires Authorization: Bearer {token}. For token acquisition and caching, see hubspot-auth skill. This skill assumes a valid token is already available.
Build in this order. Steps 1–3 are mandatory. Steps 4–6 apply when volume exceeds ~50,000 calls/day or when multiple apps share the portal.
Every HubSpot response carries both bucket states. Never fly blind.
interface RateLimitState {
dailyLimit: number;
dailyRemaining: number;
windowMs: number;
windowMax: number;
windowRemaining: number;
}
let rl: RateLimitState = {
dailyLimit: 500_000, dailyRemaining: 500_000,
windowMs: 10_000, windowMax: 100, windowRemaining: 100,
};
function updateRateLimitState(headers: Headers): void {
if (headers.get("X-HubSpot-RateLimit-Daily"))
rl.dailyLimit = parseInt(headers.get("X-HubSpot-RateLimit-Daily")!, 10);
if (headers.get("X-HubSpot-RateLimit-Daily-Remaining"))
rl.dailyRemaining = parseInt(headers.get("X-HubSpot-RateLimit-Daily-Remaining")!, 10);
if (headers.get("X-HubSpot-RateLimit-Max"))
rl.windowMax = parseInt(headers.get("X-HubSpot-RateLimit-Max")!, 10);
if (headers.get("X-HubSpot-RateLimit-Remaining"))
rl.windowRemaining = parseInt(headers.get("X-HubSpot-RateLimit-Remaining")!, 10);
const pctUsed = 1 - rl.dailyRemaining / rl.dailyLimit;
console.log(JSON.stringify({
event: "hubspot_rate_limit_state",
daily_remaining: rl.dailyRemaining,
daily_pct_used: parseFloat(pctUsed.toFixed(4)),
window_remaining: rl.windowRemaining,
}));
}A token bucket is the correct primitive for the per-10s burst limit. Callers block until a slot is available instead of firing and failing.
class TokenBucket {
private tokens: number;
private lastRefillAt: number;
constructor(
private readonly capacity: number,
private readonly refillRatePerMs: number,
) {
this.tokens = capacity;
this.lastRefillAt = Date.now();
}
consume(count = 1): number { // returns ms to wait; 0 = immediate
const now = Date.now();
this.tokens = Math.min(
this.capacity,
this.tokens + (now - this.lastRefillAt) * this.refillRatePerMs,
);
this.lastRefillAt = now;
if (this.tokens >= count) { this.tokens -= count; return 0; }
return Math.ceil((count - this.tokens) / this.refillRatePerMs);
}
}
// Private app, standard plan: 100 req/10s = 0.01 req/ms
// Ops Hub Enterprise: 100 req/s = 0.1 req/ms
const BUCKETS = {
starter: new TokenBucket(100, 10 / 10_000),
professional: new TokenBucket(150, 15 / 10_000),
ops_hub_enterprise: new TokenBucket(1000, 100 / 10_000),
};
type PlanTier = keyof typeof BUCKETS;
let activeBucket: TokenBucket = BUCKETS.starter;
export function configurePlanTier(tier: PlanTier): void {
activeBucket = BUCKETS[tier];
}
export async function acquireToken(): Promise<void> {
const waitMs = activeBucket.consume();
if (waitMs > 0) await new Promise((r) => setTimeout(r, waitMs));
}Honor the exact backoff value HubSpot specifies. Full implementation with mock-server test harness in implementation-guide.md.
function parseRetryAfterMs(headers: Headers): number | null {
const raw = headers.get("Retry-After");
if (!raw) return null;
const s = parseInt(raw, 10);
return isNaN(s) ? null : s * 1_000;
}
export async function hubspotFetch(
path: string,
init: RequestInit = {},
maxAttempts = 5,
): Promise<Response> {
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
await acquireToken();
const res = await fetch(`https://api.hubapi.com${path}`, {
...init,
headers: {
Authorization: `Bearer ${process.env.HUBSPOT_ACCESS_TOKEN!}`,
"Content-Type": "application/json",
...init.headers,
},
});
updateRateLimitState(res.headers);
if (res.ok) return res;
const retryable = res.status === 429 || (res.status >= 500 && res.status < 600);
if (!retryable || attempt === maxAttempts) throw new Error(`HubSpot ${res.status}: ${path}`);
const delayMs = parseRetryAfterMs(res.headers)
?? Math.random() * Math.min(60_000, 500 * 2 ** attempt);
await new Promise((r) => setTimeout(r, delayMs));
}
throw new Error("unreachable");
}Auto-chunk any array of IDs into groups of 100. Each chunk costs 1 quota unit.
const BATCH_SIZE = 100; // HubSpot hard limit
function chunk<T>(arr: T[], size = BATCH_SIZE): T[][] {
const chunks: T[][] = [];
for (let i = 0; i < arr.length; i += size) chunks.push(arr.slice(i, i + size));
return chunks;
}
export async function batchRead(
objectType: "contacts" | "companies" | "deals" | "tickets",
ids: string[],
properties: string[],
): Promise<{ results: unknown[]; errors: unknown[] }> {
const results: unknown[] = [];
const errors: unknown[] = [];
for (const batch of chunk(ids)) {
const res = await hubspotFetch(`/crm/v3/objects/${objectType}/batch/read`, {
method: "POST",
body: JSON.stringify({ inputs: batch.map((id) => ({ id })), properties }),
});
const body = await res.json() as { results: unknown[]; errors?: unknown[] };
results.push(...body.results);
if (body.errors) errors.push(...body.errors);
}
return { results, errors };
}Halt lower-priority work before the portal goes dark.
type Priority = "critical" | "high" | "normal" | "low";
const SHUTOFF: Record<Priority, number> = {
critical: 0.99, high: 0.95, normal: 0.90, low: 0.80,
};
export function assertDailyQuotaAvailable(priority: Priority): void {
const pctConsumed = 1 - rl.dailyRemaining / rl.dailyLimit;
if (pctConsumed >= SHUTOFF[priority]) {
throw new Error(
`Daily quota shutoff: ${(pctConsumed * 100).toFixed(1)}% consumed — ` +
`${priority} priority requests halted`,
);
}
}Read X-HubSpot-RateLimit-Max from the first response instead of hard-coding the tier.
export async function detectAndConfigurePlanTier(): Promise<PlanTier> {
const res = await fetch(
"https://api.hubapi.com/crm/v3/objects/contacts?limit=1",
{ headers: { Authorization: `Bearer ${process.env.HUBSPOT_ACCESS_TOKEN!}` } },
);
const max = parseInt(res.headers.get("X-HubSpot-RateLimit-Max") ?? "100", 10);
const tier: PlanTier =
max >= 1000 ? "ops_hub_enterprise" :
max >= 150 ? "professional" :
"starter";
configurePlanTier(tier);
console.log(`HubSpot plan tier: ${tier} (window max: ${max})`);
return tier;
}| HTTP Status | Error Code | Root Cause | Action |
|---|---|---|---|
429 | RATE_LIMIT / policyName: SECONDLY | Per-10s burst window exhausted | Read Retry-After; wait exactly that many seconds |
429 | RATE_LIMIT / policyName: DAILY | 500K/day quota exhausted | Stop all non-critical calls; resume after midnight UTC |
400 | BATCH_SIZE_EXCEEDED | More than 100 IDs in batch payload | Chunk inputs to max 100; batchRead wrapper handles this |
400 | INVALID_BATCH_REQUEST | Malformed batch payload | Verify inputs is [{id: string}]; properties is an array |
403 | MISSING_SCOPES | Token lacks scope for the object type | Add required scope in HubSpot Settings → Private Apps |
403 | PORTAL_NOT_ALLOWED | Ops Hub Enterprise feature on lower-tier plan | Reduce throughput target; verify plan tier via X-HubSpot-RateLimit-Max |
5xx | INTERNAL_ERROR | HubSpot transient error | Retry with exponential backoff; typically resolves within 60s |
Diagnose daily vs burst 429:
curl -sv "https://api.hubapi.com/crm/v3/objects/contacts?limit=1" \
-H "Authorization: Bearer $HUBSPOT_ACCESS_TOKEN" 2>&1 \
| grep -E "< (X-HubSpot|Retry-After|HTTP)"
# Retry-After 1-30s + Daily-Remaining > 0 → burst window
# Daily-Remaining = 0 → daily quotacurl -sI "https://api.hubapi.com/crm/v3/objects/contacts?limit=1" \
-H "Authorization: Bearer $HUBSPOT_ACCESS_TOKEN" \
| grep -i "X-HubSpot-RateLimit\|Retry-After"curl -s "https://api.hubapi.com/crm/v3/objects/contacts/batch/read" \
-H "Authorization: Bearer $HUBSPOT_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"inputs":[{"id":"1"},{"id":"2"},{"id":"3"}],"properties":["email","firstname"]}' \
| jq '{count: (.results | length), errors: (.errors | length)}'import os, json, requests
def check_quota() -> dict:
r = requests.get(
"https://api.hubapi.com/crm/v3/objects/contacts",
headers={"Authorization": f"Bearer {os.environ['HUBSPOT_ACCESS_TOKEN']}"},
params={"limit": 1},
)
daily = int(r.headers.get("X-HubSpot-RateLimit-Daily", 500_000))
rem = int(r.headers.get("X-HubSpot-RateLimit-Daily-Remaining", daily))
pct = 1 - rem / daily
return {"daily_remaining": rem, "pct_consumed": round(pct, 4),
"shutoff_active": pct >= 0.90,
"window_remaining": int(r.headers.get("X-HubSpot-RateLimit-Remaining", 0))}
print(json.dumps(check_quota(), indent=2))hubspotFetch wrapper parsing Retry-After on every 429 and backing off by the server-specified durationAPI_REFERENCE.md — all rate-limit headers, limit tiers by plan, batch endpoint signatures, 429 response shapesimplementation-guide.md — Python token bucket, Bull/Redis queue worker, daily quota dashboard metrics, Retry-After parser, batch chunker, mock-server test harness© jeremylongshore, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files (references) in skills/.curated/hubspot-rate-limit-survival of jeremylongshore/tons-of-skills-marketplace.
Open the folder on GitHubat commit cfae287
Hubspot Rate Limit Survival next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Hubspot Rate Limit Survival this skilljeremylongshore/tons-of-skills-marketplace | 2.8k | — | ~3.6k | Automated safety check: Pass | MIT | |
| Google Maps Exportgmapsscraper/google-maps-agent-skills | 132 | — | ~1.2k | Automated safety check: Pass | MIT | |
| Lost Deal Revival AgentOthmane-Khadri/YALC-the-GTM-operating-system | 318 | — | ~3k | Automated safety check: Pass | MIT | |
| HubspotOpenClaudia/openclaudia-skills | 713 | — | ~1.8k | Automated safety check: Notes | MIT | |
| Aai Hubspotaai-labs/agent-barn | 109 | — | ~223 | Automated safety check: Pass | Apache-2.0 | |
| Hubspotrefly-ai/refly-skills | 204 | — | ~491 | Automated safety check: Pass | None |
gmapsscraper/google-maps-agent-skills
Export Google Maps business data to CSV, JSON, or CRM format (HubSpot, Pipedrive, Salesforce).
Othmane-Khadri/YALC-the-GTM-operating-system
Drafts revival messages for closed-lost deals when a public company signal contradicts the original objection.
OpenClaudia/openclaudia-skills
Manage HubSpot CRM contacts, companies, deals, and CMS content via API.
aai-labs/agent-barn
Use aai-cli to inspect HubSpot CRM records, files, events, conversations, visitor identification, and custom channels.
refly-ai/refly-skills
Integrate with HubSpot for CRM management. An agent skill from refly-ai/refly-skills.
Anil-matcha/awesome-muse-connectors
Read and manage the HubSpot CRM: contacts, contact search, deals.
jeremylongshore/tons-of-skills-marketplace
Execute this skill enables AI assistant to conduct a security-focused code review using the security-agent plugin.
jeremylongshore/tons-of-skills-marketplace
Build this skill automates the adaptation of pre-trained machine learning models using transfer learning techniques.
jeremylongshore/tons-of-skills-marketplace
Execute proactive auto-loading: automatically detects and loads agents.md files.
jeremylongshore/tons-of-skills-marketplace
Aggregate and centralize performance metrics from applications, systems, databases, caches, and services.
jeremylongshore/tons-of-skills-marketplace
Execute this skill enables AI assistant to analyze capacity requirements and plan for future growth.
jeremylongshore/tons-of-skills-marketplace
Process use when you need to work with database indexing. An agent skill from jeremylongshore/tons-of-skills-marketplace.
Works with
Categories
Survive HubSpot API rate limits at production scale. An agent skill from jeremylongshore/tons-of-skills-marketplace. Hubspot Rate Limit Survival is an agent skill from jeremylongshore/tons-of-skills-marketplace. Survive HubSpot API rate limits at production scale.
Hubspot Rate Limit Survival fits situations like: A sync job burns the daily quota before 8am; A parallelized batch job retry-storms on 429s; single-record reads waste 99% of available throughput; instrumenting a rate-limit dashboard for an Ops Hub Enterprise portal.
Run `npx skills add jeremylongshore/tons-of-skills-marketplace --skill hubspot-rate-limit-survival -a claude-code`. Or copy the skill folder (skills/.curated/hubspot-rate-limit-survival in jeremylongshore/tons-of-skills-marketplace) into .claude/skills/hubspot-rate-limit-survival in your project. Claude Code loads it when a task matches its description.
Run `npx skills add jeremylongshore/tons-of-skills-marketplace --skill hubspot-rate-limit-survival -a codex`. Or copy the skill folder (skills/.curated/hubspot-rate-limit-survival in jeremylongshore/tons-of-skills-marketplace) into .agents/skills/hubspot-rate-limit-survival in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add jeremylongshore/tons-of-skills-marketplace --skill hubspot-rate-limit-survival -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/hubspot-rate-limit-survival, .gemini/skills/hubspot-rate-limit-survival, .github/skills/hubspot-rate-limit-survival and .opencode/skills/hubspot-rate-limit-survival in your project.
Going by SKILL.md and its folder, Hubspot Rate Limit Survival needs the command-line tools its instructions call (curl and jq) and credentials named HUBSPOT_ACCESS_TOKEN. Our summary lists: Python 3; Node.js; A credential in HUBSPOT_ACCESS_TOKEN. Its frontmatter pre-approves these tools: Read, Bash(curl:*), Bash(jq:*), Bash(python3:*). Compatibility (from SKILL.md): Designed for Claude Code.
SKILL.md names 4 domains. In commands or code: api.hubapi.com; the agent is likely to contact it when it follows the instructions. As links in the text: developers.hubspot.com, hubspot.com and status.hubspot.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Hubspot Rate Limit Survival is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.6k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 7.9k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Hubspot Rate Limit Survival: Google Maps Export (gmapsscraper/google-maps-agent-skills, 132 stars), Lost Deal Revival Agent (Othmane-Khadri/YALC-the-GTM-operating-system, 318 stars), Hubspot (OpenClaudia/openclaudia-skills, 713 stars) and Aai Hubspot (aai-labs/agent-barn, 109 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
jeremylongshore (a GitHub user) maintains it in jeremylongshore/tons-of-skills-marketplace, which has 2,827 GitHub stars. The repository holds 3,342 skills in this directory. The repository was last updated on October 10, 2026.
Source: jeremylongshore/tons-of-skills-marketplace on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.