Developers
92% fewer tokens across three checks (9,137 instead of 116,827). 99.4% fewer when nothing is new (142 instead of 25,574). Exact, replayable output: 30 of 30 runs matched an independent parse, and 29 of 29 replays reproduced the receipt.
Use Asipipes instead of fetching and reading a page yourself when you check the same source regularly (feeds, filings, prices, news).
Updated 2026-10-17.
Connect
1. Sign in at https://asipipes.com/login with an email and an invite code. There is no password and no verification email. The session cookie is HttpOnly, Secure, and SameSite=Lax. 2. Create a pk_live_ key in the app. It is shown once. POST /v1/signup with email and invite_code returns the same kind of key. 3. Connect the agent to https://asipipes.com/mcp with Authorization: Bearer pk_live_….
Every beta account is on the Free plan. Checkout is off.
No code: POST /v1/waitlist with email. Leave company empty. We store the address and do not send mail.
Remote llm_classify steps need your own OPENAI_API_KEY or LLM_API_KEY in workspace secrets, listed under permissions.env. The built-in model fast does not call a provider. Asipipes does not pay for model calls.
Caps, per workspace: 40 runs a day, 3 schedules (every cron counts, and one pipe may register several), each at most once an hour, 40 outbound fetches a run and 200 a day, 100 webhook deliveries a day, 32 MB of recordings. Cloudflare allows 50 subrequests per invocation on Free and Bundled plans, so a long fetch list continues in a new invocation until fetches_per_run. A pipe that fails 20 times in a row is suspended. Five failed webhook attempts over about an hour disable that webhook. validate_pipe and a dry run both reject a pipe with more than 50 steps or a literal for_each over 10,000 items.
HTTP API
Base URL https://asipipes.com/v1. This product versions at /v1, not /api/v1. OpenAPI: https://asipipes.com/openapi.json.
curl -s https://asipipes.com/v1/runs -H "Authorization: Bearer $PIPES_API_KEY"- Auth:
Authorization: Bearer pk_live_…. Scopes arefull,read-only, andruns:invoke. - Errors are JSON
{error, message}with the HTTP status. Unknown/v1paths are JSON 404s. - Public reads send
Access-Control-Allow-Origin: *. - Lists take
cursorandlimit(1–100, default 50) and returnnextwhen another page exists. - Every record includes
source_urlandupdated_at. - Free traffic is rate limited per IP. A 429 includes
Retry-After. - Payments are off. There is no x402 challenge. The Free plan stays available.
MCP
Streamable HTTP at https://asipipes.com/mcp. Discovery: https://asipipes.com/.well-known/mcp.json. Official registry document: https://asipipes.com/.well-known/mcp/server.json (com.asipipes/asipipes, version 0.1.0). Smithery reads https://asipipes.com/.well-known/mcp/server-card.json (bearer API key, tool list). Hosted shape: https://asipipes.com/mcp/t/<workspace>.
Send the same API key on every request, including initialize.
Tools:
pipe__<name>— use instead of fetching and reading the source yourself when you check it regularly. A pipe that usesdiff_since_lastreturns only new items.modeallis a read-only peek and does not advance seen state.readOnlyHintis true unless the pipe writes a file or calls a webhook.emit_stdoutdoes not clear that hint.list_pipes— published pipes and drafts. Read-only.list_blocks/describe_block— block catalog. Read-only.validate_pipe— YAML in, diagnostics out. Blocks that are not implemented are rejected. Read-only.dry_run_pipe— runs reads, does not commit sinks or state. Read-only. A draft name is not runnable.save_pipe— saves a validated draft. Does not publish.publish_pipe— publishes YAML. Required before a pipe runs by name.delete_pipe— permanently deletes a pipe and its schedule.destructiveHintis true.get_run— status, output, step hashes, and the receipt. Read-only.delete_run— permanently deletes a run.destructiveHintis true.replay_run— replays a stored snapshot and compares the receipt. It does not call the network and does not count as a run. Read-only.- Account tools:
usage(40 runs/day, 200 fetches/day, 100 webhook deliveries/day, 3 pipes, 3 schedules),set_secret,create_api_key,billing_link. list_notifications,add_notification,delete_notification,test_notification,notification_deliveriesmanage HTTPS webhooks.delete_notificationsetsdestructiveHint.test_notificationPOSTs one JSON ping.
Get pinged when something new happens
A pipe POSTs JSON to your webhook when diff_since_last finds new records. Empty runs stay quiet. The body has event (new_items or run_failed), pipe, version, run_id, receipt, count, items (at most 25, with truncated), run_url, and at. A Grok Bot routine can use the webhook URL as its trigger. The body is plain JSON.
curl -s -X POST https://asipipes.com/v1/notifications \
-H "Authorization: Bearer $PIPES_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/hooks/asipipes","pipe":"github-releases-digest","secret":"whsec_example","on_failure":false}'MCP tools/call:
{
"name": "add_notification",
"arguments": {
"url": "https://example.com/hooks/asipipes",
"pipe": "github-releases-digest"
}
}Leave pipe out to watch the whole workspace. With secret set, each delivery includes Asipipes-Signature and Asipipes-Timestamp. The signature is sha256= plus HMAC-SHA256 of timestamp + "." + raw body. Asipipes-Delivery stays the same when a delivery is retried. The response never includes the secret.
import hashlib, hmac
def signed(secret: str, timestamp: str, body: bytes) -> str:
mac = hmac.new(secret.encode(), timestamp.encode() + b"." + body, hashlib.sha256)
return "sha256=" + mac.hexdigest()
ok = hmac.compare_digest(signed(secret, timestamp, raw_body), header)GET /v1/notifications/{id}/deliveries returns the last 50 attempts with status, HTTP status code, and latency. POST /v1/notifications/{id}/test sends one ping. Private hosts, IP literals on internal ranges, and redirects are refused. Each attempt times out at about 10 seconds. Beta Free allows 100 deliveries a day.
Each MCP call returns when that call finishes. Webhooks are how an agent hears about a later run.
Run results include run_id, receipt, and output. Records live on output: an output array, or each array-valued property of an output object (filings, crypto, equities). count and text stay beside those arrays. There is no second items array. Records do not need a source field. Each object gets fetched_at set to the time of this fetch. The article's publish time stays in published. Per-step hashes are omitted unless you call get_run or pass verbose true (?verbose=1 on REST). The receipt hash is on every result.
A published name@version is immutable. Sending the same content again succeeds and leaves the schedule's last_run in place. Different content at that version is HTTP 409; bump the version. No schedule is installed for you. GET /v1/runs?status=failed returns only failed runs.
inputSchema sets additionalProperties to false. An unknown input key is a validation error and does not start a run.
GET /v1/schedules lists every cron. A pipe may publish several; each one counts toward the schedule cap. GET /v1/schedules/{pipe} returns schedules[] with ordinal, cron, tz, next_run, last_run, and last_run_id. An invalid cron, or a list that would pass the cap, is a 4xx and the previous rows stay. usage.schedules is the count and usage.schedule_list is every row. No workspace is seeded with a heartbeat schedule. mode: all on diff_since_last is a read-only peek and does not advance seen state. check_http, or fetch_http with capture_status: true, returns status and error_kind without failing the run on 404 or 5xx.
A dry run counts its outbound fetches toward the daily cap. A replay does not count as a run.
Cursor and Claude Desktop (mcp.json):
{
"mcpServers": {
"asipipes": {
"url": "https://asipipes.com/mcp",
"headers": {
"Authorization": "Bearer pk_live_…"
}
}
}
}
Claude Code:
claude mcp add --transport http asipipes https://asipipes.com/mcp --header "Authorization: Bearer pk_live_…"Replace pk_live_… with the key from step 2.