Perq

Verified free AI credits, free tiers and startup programs. Every result has a source link and last-verified date.

Hosted MCP Server

npx add-mcp 'https://perq.sh/mcp'

Installs into Claude Code, Codex, Cursor and more

Documentation

For agents

Let your agent answer “what free credits can I get for X?” with Perq’s verified data: 147 live offers across 12 categories and 7 packs, each with the vendor’s source URL, a verbatim quote from that page and a last-verified time (latest: Oct 20, 2026, 6:27 AM ET). No API key, no signup, read-only, CORS open. Want new offers before they’re listed? See early access (webhook, private feed, MCP).

Please show the source link and last-verified date with every offer, and never present an offer that the API didn’t return. Terms belong to the vendors and can change.

Remote MCP server

URL: https://perq.sh/mcp. Transport: Streamable HTTP (stateless, JSON responses). No auth. Tools:

  • find_credits(need, filters?): Answers “what free credits can I get for X”. Ranked offers for a plain-language need. Filters: category, type, student, no_application, include_closed, limit.
  • get_offer(id): One offer with its source quote, last-verified time, recorded changes and the packs that contain it.
  • list_packs(): Curated bundles with their headline and up-to total where one is computed.
  • get_pack(slug): One pack with every offer and how its total was computed.
  • recently_changed(days?): Offers added, updated or closed in the last N days (US Eastern dates).
  • subscribe(email | webhook_url, topics?): Early access: new offers about 24h before they are public. Email gets a confirmation link; a webhook gets its signing secret, a private feed token and a signed verification ping.
  • early_offers(token): Embargoed offers (each with public_after) plus new, changed and closed events from the last 30 days, for a private feed token.

Claude Code

claude mcp add --transport http perq https://perq.sh/mcp

Cursor (~/.cursor/mcp.json or.cursor/mcp.json)

{
  "mcpServers": {
    "perq": {
      "url": "https://perq.sh/mcp"
    }
  }
}

VS Code (.vscode/mcp.json)

{
  "servers": {
    "perq": {
      "type": "http",
      "url": "https://perq.sh/mcp"
    }
  }
}

Codex (~/.codex/config.toml)

[mcp_servers.perq]
url = "https://perq.sh/mcp"

Claude Desktop and claude.ai

Settings → Connectors → Add custom connector, then paste https://perq.sh/mcp.

Other clients

Point any MCP client that supports Streamable HTTP at https://perq.sh/mcp. For stdio-only clients, bridge it:

# Any client that only speaks stdio
npx -y mcp-remote https://perq.sh/mcp

Raw JSON-RPC, for testing:

curl -sS https://perq.sh/mcp -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"find_credits","arguments":{"need":"free speech to text credits","filters":{"limit":3}}}}'

Search API

GET https://perq.sh/api/search?q=<need> returns offers ranked against a plain-language need. Closed offers are excluded unless include_closed=true.

  • q: the need, e.g. “free speech to text credits”, “GPU for a bootstrapped startup”, “vector database”.
  • category: cloud-gpu, llm-api, agents-automation, voice-audio, observability, dev-tools, database-backend, perk-marketplace, vector-db, image-video, productivity, accelerator
  • type: startup-program, free-tier, signup-credit, student-education, marketplace-perk, accelerator-perk, promo-code
  • student=true: only offers for students, educators or researchers.
  • no_application=true: only free tiers, signup credits and promo codes (no application or approval).
  • limit: 1–50, default 10.
curl -sS -G "https://perq.sh/api/search" \
  --data-urlencode "q=free speech to text credits" -d limit=5
# GPU compute for a bootstrapped startup, no application needed
curl -sS -G "https://perq.sh/api/search" --data-urlencode "q=GPU for a bootstrapped startup" -d no_application=true

# Student and research perks for LLM APIs
curl -sS -G "https://perq.sh/api/search" --data-urlencode "q=LLM API" -d student=true

# One offer by id
curl -sS "https://perq.sh/api/offers/deepgram-200-credit"

GET https://perq.sh/api/offers/<id> returns one offer (404 with suggestions for an unknown id). Response fields include credit_value, eligibility, how_to_claim, claim_url, source_url, source_snippet, last_verified and status. Example result (real data):

{
  "query": "free speech to text credits",
  "total_matches": "…",
  "results": [
    {
      "id": "deepgram-200-credit",
      "vendor": "Deepgram",
      "category": "voice/audio",
      "offer_type": "signup credit",
      "status": "live",
      "credit_value": "$200 free credit, then pay-as-you-go",
      "eligibility": "New Deepgram accounts",
      "how_to_claim": "Sign up",
      "claim_url": "https://deepgram.com/pricing",
      "source_url": "https://deepgram.com/pricing",
      "source_snippet": "Free $200 Credit then pay-as-you-go",
      "last_verified": "2026-10-20T06:12:52-04:00",
      "no_application": true,
      "perq_url": "https://perq.sh/offers/deepgram-200-credit",
      "score": "…"
    }
  ]
}

Static files: /api/offers.json (full dataset), /api/packs.json (packs with total breakdowns), /llms.txt, /llms-full.txt, /feed.xml.

Early access: new offers before they’re public

Newly verified offers go to subscribers first and appear on Perq (site, search API, MCP search, llms.txt, feeds, sitemap) about 24 hours later. Closures and changes are delivered right away. People can subscribe by email on /newsletter. Agents have three options:

1. Webhook (push)

POST https://perq.sh/api/subscribe with webhook_url (https, public host, port 443 or 8443) and optional topics (llm-api, gpu, voice, startup-programs, student, agents, dev-tools; omit for everything).

curl -sS https://perq.sh/api/subscribe -H 'content-type: application/json' \
  -d '{"webhook_url":"https://example.com/hooks/perq","topics":["llm-api","gpu"]}'

Response (201). The secret is shown once: store it.

{
  "id": "sub_…",
  "kind": "webhook",
  "status": "active",
  "topics": [
    "llm-api",
    "gpu"
  ],
  "webhook_url": "https://example.com/hooks/perq",
  "secret": "whsec_… (shown once)",
  "feed_token": "pf_sub_….…",
  "feed_json": "https://perq.sh/api/early/pf_sub_….….json",
  "feed_rss": "https://perq.sh/api/early/pf_sub_….….rss",
  "unsubscribe": {
    "method": "POST",
    "url": "https://perq.sh/api/unsubscribe",
    "body": {
      "token": "pf_sub_….…"
    }
  },
  "verification_ping": {
    "delivered": true,
    "http_status": 200
  }
}

We immediately POST a signed perq.verification ping. Answer any 2xx to activate deliveries (a failed ping is retried before each daily delivery for 7 days). After that, every new offer, change and closure arrives as one JSON POST with event type offer.new, offer.changed or offer.closed:

{
  "type": "offer.new",
  "event_id": "new:<offer-id>",
  "delivery_id": "dlv_…",
  "created_at": "2026-10-21T10:20:00Z",
  "subscriber_id": "sub_…",
  "embargoed": true,
  "public_after": "2026-10-22T10:20:00Z",
  "offer": {
    "id": "<offer-id>",
    "vendor": "…",
    "category": "…",
    "offer_type": "…",
    "status": "live",
    "credit_value": "…",
    "eligibility": "…",
    "how_to_claim": "…",
    "claim_url": "https://…",
    "source_url": "https://…",
    "source_snippet": "…",
    "last_verified": "…",
    "page_url": "https://perq.sh/offers/<offer-id>"
  },
  "feed_json": "https://perq.sh/api/early/pf_….json"
}

Headers: X-Perq-Event, X-Perq-Delivery (dedupe on it), X-Perq-Timestamp (unix seconds) and X-Perq-Signature: v1=<hex HMAC-SHA256(secret, timestamp + "." + raw body)>. Redirects are not followed; failed deliveries are retried on the next daily run (up to 6 attempts).

import crypto from 'node:crypto';
// rawBody: the exact bytes received. secret: the whsec_… value from signup.
function verifyPerq(secret, rawBody, headers) {
  const ts = headers['x-perq-timestamp'], sig = headers['x-perq-signature'] || '';
  if (!ts || Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false; // replay window: 5 minutes
  const want = 'v1=' + crypto.createHmac('sha256', secret).update(ts + '.' + rawBody).digest('hex');
  return sig.length === want.length && crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(want));
} // then dedupe on x-perq-delivery
import hmac, hashlib, time
def verify_perq(secret: str, raw_body: bytes, headers) -> bool:
    ts, sig = headers.get('X-Perq-Timestamp', ''), headers.get('X-Perq-Signature', '')
    if not ts or abs(time.time() - int(ts)) > 300: return False
    want = 'v1=' + hmac.new(secret.encode(), ts.encode() + b'.' + raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(sig, want)

2. Private feed (pull)

Every subscriber gets a private feed: GET https://perq.sh/api/early/<feed_token>.json or .rss. It lists offers that are still embargoed (each with public_after) and new, changed and closed events from the last 30 days, filtered by your topics. The token works like a password. Webhook signups get it in the response; email subscribers see it after they confirm and in every digest.

3. MCP

The MCP server at https://perq.sh/mcp has subscribe (email or webhook_url, topics) and early_offers(token). Only subscribe an address or URL your user asked you to.

curl -sS https://perq.sh/mcp -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"early_offers","arguments":{"token":"pf_sub_….…"}}}'

Email (for people)

curl -sS https://perq.sh/api/subscribe -H 'content-type: application/json' \
  -d '{"email":"you@example.com","topics":["voice"]}'
# -> 202 {"status":"pending_confirmation", ...}: the person must click the link in the email

Double opt-in: nothing is sent until the confirmation link is clicked. One digest per day, only on days with something new. One-click unsubscribe (RFC 8058 List-Unsubscribe) in every email.

Unsubscribe and limits

Webhooks and feeds: POST https://perq.sh/api/unsubscribe with {"token":"<feed_token>"}. Limits per IP: 5 signups per 10 minutes (email) or per hour (webhooks); feeds 240 requests per hour per token. Webhook URLs that resolve to private, loopback, link-local or reserved addresses are rejected, and the address is checked again before every delivery. Errors are JSON: {"error":"rate_limited","message":"…","retry_after":…}.

Agent skill

A SKILL.md (agentskills.io format) that tells an agent when to use Perq and how to present results: /skill.md. Source and plugin manifests: github.com/f-o-x11/perq-skill (MIT).

Any agent (Claude Code, Codex, Cursor, Hermes Agent and others), via the skills CLI:

npx skills add f-o-x11/perq-skill

Claude Code plugin (skill + MCP server):

claude plugin marketplace add f-o-x11/perq-skill
claude plugin install perq@perq

Gemini CLI extension:

gemini extensions install https://github.com/f-o-x11/perq-skill

Or copy the file by hand for Claude Code:

mkdir -p ~/.claude/skills/perq && curl -fsSL https://perq.sh/skill.md -o ~/.claude/skills/perq/SKILL.md

Fair use

Free to use with attribution (a link to https://perq.sh). Responses are cached for five minutes. The data is re-verified against vendor pages daily. Questions or corrections: ops@avatar33.com. Perq is operated by Avatar 8 LLC. No paid ranking.