CYCLOPS LABSDOCS / INTEGRATIONSFILE Nº D11

Cyclops,
where you work.

Alerts and new launches into your automations, the stored scan next to a swap button, and the scan again inside the wallet before you sign. Each one reads the same public API and says plainly when there is nothing on record.

STATUS

What exists
today.

Webhooks
Live
Signed alert and launch deliveries to your own https endpoint. POST /v1/me/webhooks
n8n nodes
Built · not on npm yet
Cyclops Trigger (alerts, launches) and a Cyclops node (stored read, scans, inspect, launches). packages/n8n-nodes-cyclops
Zapier app
Built · not on Zapier yet
New Alert and New Launch triggers, Scan Token, Find Stored Scan. packages/zapier-cyclops
@cyclops/warn
Built · not on npm yet
A pre-trade warning for dApps: React component or <cyclops-warn> element. packages/warn
MetaMask Snap
Built · not listed yet
The stored scan inside the MetaMask confirmation, before you sign. packages/snap
@cyclops/scoring
Prepared · licence pending
The scoring rules as pure functions with a reproducible build. packages/scoring

“Built” means the code and its tests are in the repository. Packages reach npm, Zapier and the MetaMask Snaps Directory only when Cyclops Labs publishes them; until then, use them from source.

WEBHOOKS

Signed,
every time.

Register up to five https endpoints per account (Holder tier). Cyclops sends two events: alert, when one of your alert rules fires, and launch, for every new Torch launch with its first-minute stats. A failed delivery is retried with backoff, up to six attempts over about three hours; a hook that keeps failing is switched off and the list says why.

REGISTER · POST /v1/me/webhooks
curl -X POST https://cyclopslabs.dev/api/v1/me/webhooks \
  -H 'x-api-key: cyc_…' -H 'content-type: application/json' \
  -d '{"url": "https://example.com/cyclops", "events": ["alert", "launch"]}'
# → { "webhook": { "id": 7, … }, "secret": "whsec_…" }   the secret is shown once
BODY
{ "id": "9f2c…", "event": "alert", "at": "2026-10-29T12:00:00.000Z",
  "data": { "kind": "…", "target": "0x…", "title": "…", "lines": ["…"], "url": "…", "ruleId": 3 } }

Verify every request against the raw body before parsing it. Refuse anything unsigned, mis-signed, or older than five minutes, so a captured delivery can't be replayed. The scheme is the same as Stripe’s, so existing verifiers fit.

VERIFY · x-cyclops-signature
import { createHmac, timingSafeEqual } from 'node:crypto';

// header: x-cyclops-signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of "t.body">
export function verify(secret, rawBody, header, toleranceSec = 300) {
  const parts = Object.fromEntries(header.split(',').map((p) => p.split('=')));
  const t = Number(parts.t);
  if (!Number.isFinite(t) || Math.abs(Date.now() / 1000 - t) > toleranceSec) return false;
  const want = Buffer.from(createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex'));
  const got = Buffer.from(parts.v1 ?? '');
  return want.length === got.length && timingSafeEqual(want, got);
}

Targets must be public https on port 443; localhost, private ranges and URLs with credentials are refused, and each target is re-checked before every send. Test a hook with POST /v1/me/webhooks/{id}/test.

N8N

Two nodes,
one key.

Cyclops Trigger registers a webhook on your account when the workflow is activated and deletes it when it is deactivated. It checks every delivery’s signature and answers 401 to anything that fails, so the workflow never runs on a forged event. It needs a Holder key and a public https URL (n8n Cloud, or self-hosted behind a domain).

Cyclops reads the record: Stored Read (never starts a scan), Scan Token, Scan Wallet, Inspect and List Launches. Scans count against the key’s hourly limit.

Source and install notes: packages/n8n-nodes-cyclops. Keys come from the API key page.

ZAPIER

Triggers
and actions.

New Alert and New Launch are REST hooks on the same signed webhooks: turning a Zap on registers one, turning it off deletes it, and a delivery that fails the signature check is dropped. The Zap editor’s test step shows your latest real alerts or launches.

Scan Token scans a token now and returns the score, label, flags and holders, with the full scan alongside. Find Stored Scan returns what is already on record and finds nothing when there is no scan, so a Zap can branch on it.

Source: packages/zapier-cyclops (a Zapier CLI project).

PRE-TRADE WARNING

Next to the
swap button.

@cyclops/warn shows the stored scan for the token a user is about to trade: label and score, the top three observations, when it was scanned, and the launch outcome if the chain recorded one. It reads GET /v1/explorer/{address}, a cached read that never starts a scan and answers any origin. With no scan on record it says so and links to one; if Cyclops can't be reached it says that, and shows nothing in its place. It never blocks a trade.

REACT
import { CyclopsWarn } from '@cyclops/warn/react';

<CyclopsWarn address={token} />
ANY PAGE · CUSTOM ELEMENT
<script type="module">
  import { defineCyclopsWarn } from '@cyclops/warn/element';
  defineCyclopsWarn();
</script>
<cyclops-warn address="0x…"></cyclops-warn>

A Low score with no flags reads “No flags fired in this scan. That is not evidence that nothing is wrong.” Theme it with the --cyclops-warn-* custom properties. Source: packages/warn.

METAMASK SNAP

Before
you sign.

The Cyclops Snap adds the stored scan to MetaMask’s transaction confirmation on Robinhood Chain: the contract you are calling and, for a router swap, the tokens named in the calldata that Cyclops has scanned. A High score asks MetaMask for one extra confirmation. On any other chain the snap says it checked nothing.

The only thing that leaves the snap is the addresses it looks up. Source: packages/snap. It is not in the MetaMask Snaps Directory yet.

THE SCORE ITSELF

Rules you
can rebuild.

The rules behind every score are being prepared for release as @cyclops/scoring: pure functions with no dependencies, a rule-table test suite and a reproducible build with a published SHA-256 digest. The licence has not been chosen, so it is not open source yet. Until then, the weights and thresholds are published in the methodology and every change is in the score changelog.