Skip to main content
The fastest path is the TypeScript SDK — six lines from install to first result. Raw HTTP works too if you’re integrating from a runtime where the SDK isn’t a fit; both are documented below.

1. Get an API key

Scanner keys are self-serve from the dashboard:
  1. Sign up at app.getsly.ai (creates your tenant)
  2. Go to Developers → API Keys → Scanner API Keys → Create Scanner Key
  3. Pick scopes (scan, batch, read, tests — all four by default), copy the psk_live_… shown once
  4. You instantly get 100 free trial credits — no email, no ops touch
Test keys can be created by any user; live keys require owner or admin role on your tenant. Beyond the trial, top up via credit packs or apply for the design-partner program (5,000 free credits + Scale pricing locked). Need help? partners@getsly.ai.

2. Install + scan (TypeScript / JavaScript)

npm install @sly_ai/scanner
import { Scanner } from '@sly_ai/scanner';

const scanner = new Scanner({ apiKey: process.env.SCANNER_KEY! });
const result = await scanner.scan({ domain: 'shopify.com' });

console.log(result.readiness_score);   // 0–100
console.log(scanner.balance);           // remaining credits, auto-tracked
That’s the integration. See the SDK reference for batch helpers, typed errors, and pagination.

2b. Scan via raw HTTP (any language)

curl -X POST https://scanner.getsly.ai/v1/scanner/scan \
  -H "Authorization: Bearer $SCANNER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domain": "shopify.com"}'
Response (truncated):
{
  "id": "c5e4f1…",
  "request_id": "2fb64db5-…",
  "domain": "shopify.com",
  "readiness_score": 72,
  "protocol_score": 80,
  "data_score": 85,
  "accessibility_score": 60,
  "checkout_score": 65,
  "business_model": "saas",
  "protocol_results": [
    { "protocol": "acp", "status": "confirmed", "confidence": "high" },
    { "protocol": "x402", "status": "not_detected" }
  ],
  "scan_status": "completed"
}
The response also includes an X-Credits-Remaining header so you can track your balance without an extra call. See data model for every field.

3. Check your balance

SDK:
const summary = await scanner.getBalance();
// { balance: 96, grantedTotal: 100, consumedTotal: 4 }
HTTP:
curl -H "Authorization: Bearer $SCANNER_KEY" \
  https://scanner.getsly.ai/v1/scanner/credits/balance
{ "balance": 96, "grantedTotal": 100, "consumedTotal": 4 }

4. Batch-score a merchant list

SDK — bounded-concurrency stream (recommended for 10–500 domains):
const domains = ['shopify.com', 'nike.com', 'adidas.com'];

for await (const { input, result, error } of scanner.scanMany(domains, { concurrency: 10 })) {
  if (error) console.error(`${input.domain} failed:`, error.message);
  else console.log(`${input.domain}: score ${result!.readiness_score}`);
}
SDK — server-side batch (recommended for 500+ or when you want a polling handle):
const batch = await scanner.createBatch({
  domains: domains.map((d) => ({ domain: d })),
  name: 'Q2 audit',
});
const finished = await scanner.waitForBatch(batch.id, {
  pollIntervalMs: 5_000,
  onProgress: (b) => console.log(`${b.completed_targets}/${b.total_targets}`),
});
HTTP:
curl -X POST https://scanner.getsly.ai/v1/scanner/scan/batch \
  -H "Authorization: Bearer $SCANNER_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Q2 audit",
    "domains": [
      { "domain": "shopify.com" },
      { "domain": "amazon.com" },
      { "domain": "mercadolibre.com" }
    ]
  }'
Returns a batch_id. Poll /v1/scanner/scan/batch/:id every few seconds for progress.

5. Audit your charges

Every consume row in the ledger links to the scan it paid for via ?expand=scan:
for await (const entry of scanner.iterateLedger({ expandScan: true })) {
  if (entry.reason === 'consume' && entry.scan) {
    console.log(entry.created_at, entry.scan.domain, entry.scan.readiness_score);
  }
}
Or via HTTP:
curl -H "Authorization: Bearer $SCANNER_KEY" \
  "https://scanner.getsly.ai/v1/scanner/credits/ledger?expand=scan&limit=50"

6. Find best prospects

curl -H "Authorization: Bearer $SCANNER_KEY" \
  "https://scanner.getsly.ai/v1/scanner/prospects?priority=critical&limit=25"
Each returned prospect combines demand signals + readiness gap into an opportunity_score. Export the full list as CSV with /v1/scanner/prospects/export.

What’s next