> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getsly.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Quickstart

> Five-minute walkthrough: install the SDK, run a scan, read the score.

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](https://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](/scanner/credits-and-billing#credit-packs) or apply for the [design-partner program](/scanner/credits-and-billing#design-partner-program-free-beta) (5,000 free credits + Scale pricing locked).

Need help? [partners@getsly.ai](mailto:partners@getsly.ai).

## 2. Install + scan (TypeScript / JavaScript)

```bash theme={null}
npm install @sly_ai/scanner
```

```ts theme={null}
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](/scanner/sdk) for batch helpers, typed errors, and pagination.

## 2b. Scan via raw HTTP (any language)

```bash theme={null}
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):

```json theme={null}
{
  "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](/scanner/data-model) for every field.

## 3. Check your balance

**SDK:**

```ts theme={null}
const summary = await scanner.getBalance();
// { balance: 96, grantedTotal: 100, consumedTotal: 4 }
```

**HTTP:**

```bash theme={null}
curl -H "Authorization: Bearer $SCANNER_KEY" \
  https://scanner.getsly.ai/v1/scanner/credits/balance
```

```json theme={null}
{ "balance": 96, "grantedTotal": 100, "consumedTotal": 4 }
```

## 4. Batch-score a merchant list

**SDK** — bounded-concurrency stream (recommended for 10–500 domains):

```ts theme={null}
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):

```ts theme={null}
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:**

```bash theme={null}
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`:

```ts theme={null}
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:

```bash theme={null}
curl -H "Authorization: Bearer $SCANNER_KEY" \
  "https://scanner.getsly.ai/v1/scanner/credits/ledger?expand=scan&limit=50"
```

## 6. Find best prospects

```bash theme={null}
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

* [SDK reference](/scanner/sdk) — typed methods, errors, retries
* [Authentication](/scanner/authentication) — keys vs JWT
* [Credits & billing](/scanner/credits-and-billing) — pricing, auto-refunds, top-ups
* [Endpoint reference](/scanner/endpoints/scan)
