---
title: "start_internal_link_scan"
method: POST
path: "/v1/internal-links/scans"
---

# start_internal_link_scan

`POST /v1/internal-links/scans`

## Request

- Base URL: `https://app.agentlinkops.com`
- URL: `https://app.agentlinkops.com/v1/internal-links/scans`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer

Supply projectId and requestId in the JSON body. HTTP202 returns saved background intent; requestId is the retry identity.

## Headers

- `X-Workspace-ID` string

## Request body

- object
  - `projectId` string, required: project ID from create/list.
  - `requestId` string, required: Caller-generated retry key. Reuse the same key and website scope after an uncertain response.
  - `pageLimit` union: Stop after this many pages (300, 1000, 10000 or 100000), at most the run limit of your plan. Background-engine scans only.
    - 300
    - 1000
    - 10000
    - 100000

## Response `202`

Supply projectId and requestId in the JSON body. HTTP202 returns saved background intent; requestId is the retry identity.

- object
  - `scan` object, required
    - `version` 'internal-link-scan-v1' | 'internal-link-scan-qualification-v2', required
    - `id` string, required: Resource identifier returned by the operation.
    - `projectId` string, required
    - `domain` string, required
    - `homepage` string, required
    - `state` 'queued' | 'running' | 'paused' | 'cancelled' | 'complete' | 'limit_reached' | 'failed', required: Saved lifecycle or evidence state, as enumerated for this record.
    - `reason` string, nullable, required: Recorded explanation; null when no explanation applies.
    - `createdAt` string, required
    - `updatedAt` string, required
    - `expiresAt` string, required
    - `completedAt` string, nullable, required
    - `revision` integer, required: Optimistic concurrency revision; supply it as expectedRevision on the next write.
    - `controlRevision` integer, required
    - `discoveredCount` integer, required
    - `completeCount` integer, required
    - `unknownCount` integer, required
    - `pendingCount` integer, required
    - `admittedCount` integer, required
    - `edgeCount` integer, required
    - `excludedReferences` integer, required
    - `exclusions` object, required
    - `nextEligibleAt` string, required
    - `discovery` object, required
      - `state` 'pending' | 'complete', required: Saved lifecycle or evidence state, as enumerated for this record.
      - `coverage` object: Dataset scope and completeness, including limits on what these results establish.
        - `completeSiteCensus` false, required
        - `truncated` boolean, required
        - `reasons` string[], required
      - `documents` object[]
        - `requestedUrl` string, required
        - `finalUrl` string, nullable, required
        - `checkedAt` string, required
        - `sha256` string, nullable, required
        - `status` integer, nullable, required: Resource lifecycle status.
        - `reason` string, nullable, required: Recorded explanation; null when no explanation applies.
        - `kind` 'robots' | 'index' | 'urlset' | 'unknown', required
    - `coverage` object, required: Dataset scope and completeness, including limits on what these results establish.
      - `inventory` 'partial', required
      - `completeSiteCensus` false, required
      - `representation` 'raw_html', required
      - `frontierTruncated` boolean, required
      - `renderedVisibility` false, required
      - `canonicalAliasesMerged` false, required
    - `usage` object, required
      - `unit` 'admitted_page', required
      - `period` string, required
      - `limit` union, required
        - 300
        - 1000
        - 10000
        - 100000
      - `used` integer, required
      - `resetsAt` string, required
  - `limits` object, required
    - `pagesPerRun` union, required
      - 300
      - 1000
      - 10000
      - 100000
    - `workspacePagesPerDay` union, required
      - 300
      - 1000
      - 10000
      - 100000
    - `retainedRunsAndSnapshotsPerProject` 20, required
    - `retentionDays` 30, required
    - `pageBytes` 2097152, required
    - `pageTimeoutMs` 20000, required
    - `leaseMs` 90000, required
    - `maxAttempts` 3, required
    - `edgesPerPage` 1000, required
    - `pageSize` 100, required

## Other responses

- `429`: Request-rate or usage refusal. Inspect error.code and recovery details before retrying.
- `default`: Error envelope. Non-configuration 5xx messages are masked and details omitted; allowlisted configuration errors retain static operator recovery.

## Changes

- **2026-10-20** `1bf30c2912b2`: 8 breaking, 2 warning, 4 info
  - the `edgesPerPage` response property const value changed from `200` to `1000` for the status `202`
  - the `limit` response property const value `300` was removed for the status `202`
  - the `pagesPerRun` response property const value `300` was removed for the status `202`
  - the `version` response property const value `internal-link-scan-v1` was removed for the status `202`
  - …10 more

[Operation history](https://skmtc.dev/agentlinkops/apis/agentlinkops-http-api/changes/v1/internal-links/scans/post.md)

---

[API](https://skmtc.dev/agentlinkops/apis/agentlinkops-http-api.md) · [All operations](https://skmtc.dev/agentlinkops/apis/agentlinkops-http-api/llms.txt) · [OpenAPI document](https://skmtc.dev/agentlinkops/apis/agentlinkops-http-api/revisions/1bf30c2912b2?raw)
