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

# Save a dated link profile

> Explicitly save the current monitored-watch category and native supplier-rank profile as an immutable 90-day baseline.

`save_profile_snapshot`

Explicitly save the current monitored-watch category and native supplier-rank profile as an immutable 90-day baseline. Requires read and write access. No provider collection or schedule.

<Note>This command name is absent from deployment evidence dated 2026-09-20. Hosted availability for this current definition is unverified; inspect your connected catalog before invoking it. Verify the command and its input schema in the selected environment.</Note>

| Access | Behavior |
| - | - |
| `watches:write`, `watches:read` | Writes or admits work |

This operation changes saved state. Review its inputs and retry behavior before calling.

## Example request

Connect through [MCP](/guides/connect-mcp), [CLI](/guides/connect-cli), or [HTTP](/guides/connect-http). Replace example identifiers with records from your workspace.

<CodeGroup>
  ```json MCP theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "save_profile_snapshot",
      "arguments": {
        "projectId": "project_example",
        "idempotencyKey": "profile-example"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  agentlinkops call save_profile_snapshot --args '{"projectId":"project_example","idempotencyKey":"profile-example"}'
  ```

  ```bash HTTP theme={null}
  curl --fail-with-body https://app.agentlinkops.com/v1/commands/save_profile_snapshot \
    -H "Authorization: Bearer $AGENTLINKOPS_TOKEN" \
    -H 'Content-Type: application/json' \
    --data '{"projectId":"project_example","idempotencyKey":"profile-example"}'
  ```
</CodeGroup>

## Returned result

Illustrative data validated against the documented response schema. IDs and dates are examples, not a live account capture. MCP returns this data in `structuredContent` and in a text content block; generic HTTP and CLI return the JSON result directly.

<Accordion title="Full response example">
  ```json theme={null}
  {
    "snapshot": {
      "schema_version": 1,
      "id": "snapshot_example",
      "workspace_id": "workspace_example",
      "project_id": "project_example",
      "capture_started_at": "2026-10-14T12:00:00.000Z",
      "captured_at": "2026-10-14T12:00:00.000Z",
      "expires_at": "2027-01-12T12:00:00.000Z",
      "content_hash": "sha256:0000000000000000000000000000000000000000000000000000000000000000",
      "basis": "non_archived_monitored_watches",
      "consistency": "bounded_read_interval",
      "unique_physical_links": false,
      "whole_web_coverage": false,
      "total_watches": 0,
      "categories": {
        "display": {
          "denominator": 0,
          "known_count": 0,
          "unknown_count": 0,
          "unknown_share": null,
          "items": []
        },
        "chosen": {
          "denominator": 0,
          "known_count": 0,
          "unknown_count": 0,
          "unknown_share": null,
          "items": []
        },
        "assessed": {
          "denominator": 0,
          "known_count": 0,
          "unknown_count": 0,
          "unknown_share": null,
          "items": []
        }
      },
      "authority": [],
      "notes": [
        "This empty example does not establish that no links existed."
      ]
    },
    "replayed": false
  }
  ```
</Accordion>

## Input fields

Omit optional fields when you do not want to supply them. Null is accepted only where listed. Unknown input properties are rejected.

| Field | Type | Presence | Meaning and constraints |
| - | - | - | - |
| `projectId` | string | Required | project ID from create/list. minLength: `1`; maxLength: `200` |
| `idempotencyKey` | string | Required | Caller-generated key reused only for retries of the same operation and arguments in this workspace. minLength: `1`; maxLength: `200` |

### Validation and omitted values

Requires watches:read and watches:write. Supply a new idempotencyKey for a new save. Reuse the same project and key after an uncertain response to retrieve the retained save, even if current source data has changed. An expired save requires a new key.

Saves up to 1,000 non-archived enrolled watch rows with a 1,500,000-byte source and record bound. Active and paused monitors are included; one-off candidate checks are excluded. This is a watch-row population; it does not count unique physical links or distinct referring domains.

Chosen categories, available current assessments and display categories remain separate. DataForSEO page and domain ranks retain their native 0-1000 scale and retrieval dates. Missing categories and scores remain unknown; repeated domain scores count once per watch.

The immutable snapshot records a bounded read interval and expires after 90 days. A project can retain up to 500 unexpired snapshots. Project or workspace erasure removes the evidence; erasing a contained watch removes the entire snapshot. Saving starts no provider collection or recurring schedule.

## Output fields

Fields inside optional or nullable parents apply only when that parent exists. [Common schema conventions](/reference/schemas) explain evidence states, empty lists and extensions.

* **`snapshot`** (object, required): additional fields rejected
* **`replayed`** (boolean, required): True when the response reuses an earlier request with the same idempotency value.

<Accordion title="All fields and nested objects">
  | Field | Type | Presence | Meaning and constraints |
  | - | - | - | - |
  | `snapshot` | object | Required | additional fields rejected |
  | `snapshot.schema_version` | number | Required | must equal `1` |
  | `snapshot.id` | string | Required | Resource identifier returned by the operation. minLength: `1`; maxLength: `200` |
  | `snapshot.workspace_id` | string | Required | Workspace that owns this record. minLength: `1`; maxLength: `200` |
  | `snapshot.project_id` | string | Required | Project that owns this record. minLength: `1`; maxLength: `200` |
  | `snapshot.capture_started_at` | string | Required | pattern: `"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$"` |
  | `snapshot.captured_at` | string | Required | pattern: `"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$"` |
  | `snapshot.expires_at` | string | Required | pattern: `"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$"` |
  | `snapshot.content_hash` | string | Required | pattern: `"^sha256:[a-f0-9]{64}$"` |
  | `snapshot.basis` | string | Required | must equal `"non_archived_monitored_watches"` |
  | `snapshot.consistency` | string | Required | must equal `"bounded_read_interval"` |
  | `snapshot.unique_physical_links` | boolean | Required | must equal `false` |
  | `snapshot.whole_web_coverage` | boolean | Required | False: these results do not measure the whole web. must equal `false` |
  | `snapshot.total_watches` | integer | Required | minimum: `0`; maximum: `9007199254740991` |
  | `snapshot.categories` | object | Required | additional fields rejected |
  | `snapshot.categories.display` | object | Required | additional fields rejected |
  | `snapshot.categories.display.denominator` | integer | Required | minimum: `0`; maximum: `9007199254740991` |
  | `snapshot.categories.display.known_count` | integer | Required | minimum: `0`; maximum: `9007199254740991` |
  | `snapshot.categories.display.unknown_count` | integer | Required | minimum: `0`; maximum: `9007199254740991` |
  | `snapshot.categories.display.unknown_share` | number / null | Required | |
  | `snapshot.categories.display.items` | array | Required | Records in this bounded page. |
  | `snapshot.categories.display.items[].value` | string / null | Required | |
  | `snapshot.categories.display.items[].count` | integer | Required | minimum: `0`; maximum: `9007199254740991` |
  | `snapshot.categories.display.items[].share` | number | Required | minimum: `0`; maximum: `1` |
  | `snapshot.categories.chosen` | object | Required | additional fields rejected |
  | `snapshot.categories.chosen.denominator` | integer | Required | minimum: `0`; maximum: `9007199254740991` |
  | `snapshot.categories.chosen.known_count` | integer | Required | minimum: `0`; maximum: `9007199254740991` |
  | `snapshot.categories.chosen.unknown_count` | integer | Required | minimum: `0`; maximum: `9007199254740991` |
  | `snapshot.categories.chosen.unknown_share` | number / null | Required | |
  | `snapshot.categories.chosen.items` | array | Required | Records in this bounded page. |
  | `snapshot.categories.chosen.items[].value` | string / null | Required | |
  | `snapshot.categories.chosen.items[].count` | integer | Required | minimum: `0`; maximum: `9007199254740991` |
  | `snapshot.categories.chosen.items[].share` | number | Required | minimum: `0`; maximum: `1` |
  | `snapshot.categories.assessed` | object | Required | additional fields rejected |
  | `snapshot.categories.assessed.denominator` | integer | Required | minimum: `0`; maximum: `9007199254740991` |
  | `snapshot.categories.assessed.known_count` | integer | Required | minimum: `0`; maximum: `9007199254740991` |
  | `snapshot.categories.assessed.unknown_count` | integer | Required | minimum: `0`; maximum: `9007199254740991` |
  | `snapshot.categories.assessed.unknown_share` | number / null | Required | |
  | `snapshot.categories.assessed.items` | array | Required | Records in this bounded page. |
  | `snapshot.categories.assessed.items[].value` | string / null | Required | |
  | `snapshot.categories.assessed.items[].count` | integer | Required | minimum: `0`; maximum: `9007199254740991` |
  | `snapshot.categories.assessed.items[].share` | number | Required | minimum: `0`; maximum: `1` |
  | `snapshot.authority` | array | Required | |
  | `snapshot.authority[].provider` | string | Required | |
  | `snapshot.authority[].name` | string | Required | |
  | `snapshot.authority[].scope` | string | Required | values: `"page"`, `"domain"` |
  | `snapshot.authority[].scale` | string | Required | |
  | `snapshot.authority[].histogram` | object | Required | additional fields rejected |
  | `snapshot.authority[].histogram.denominator` | integer | Required | minimum: `0`; maximum: `9007199254740991` |
  | `snapshot.authority[].histogram.known_count` | integer | Required | minimum: `0`; maximum: `9007199254740991` |
  | `snapshot.authority[].histogram.unknown_count` | integer | Required | minimum: `0`; maximum: `9007199254740991` |
  | `snapshot.authority[].histogram.unknown_share` | number / null | Required | |
  | `snapshot.authority[].histogram.items` | array | Required | Records in this bounded page. |
  | `snapshot.authority[].histogram.items[].value` | string / null | Required | |
  | `snapshot.authority[].histogram.items[].count` | integer | Required | minimum: `0`; maximum: `9007199254740991` |
  | `snapshot.authority[].histogram.items[].share` | number | Required | minimum: `0`; maximum: `1` |
  | `snapshot.authority[].mean` | number / null | Required | |
  | `snapshot.authority[].oldest_retrieved_at` | string / null | Required | |
  | `snapshot.authority[].newest_retrieved_at` | string / null | Required | |
  | `snapshot.notes` | array | Required | |
  | `replayed` | boolean | Required | True when the response reuses an earlier request with the same idempotency value. |
</Accordion>

[Download input schema](/schemas/save_profile_snapshot.input.json) · [Download output schema](/schemas/save_profile_snapshot.output.json)

## Errors and retries

When retrying with idempotencyKey, reuse the original value and the same arguments; preserve originally omitted optional fields. Generic HTTP puts idempotencyKey in the JSON body, while resource routes use the header where listed below. A changed payload under a reused key can conflict. Operation-specific errors include `INVALID_PROFILE_SNAPSHOT_INPUT`, `PROFILE_SNAPSHOT_ACCESS_DENIED`, `PROFILE_SNAPSHOT_SCHEMA_UNAVAILABLE`, `PROFILE_SNAPSHOT_LIMIT`, `PROFILE_SNAPSHOT_SOURCE_CHANGED`, `PROFILE_SNAPSHOT_EXPIRED`.

See [error recovery](/reference/errors) for status, scope, cooldown, cursor and retry handling. Unknown observations are result data and do not establish loss.

## HTTP resource routes

This operation has no separate resource alias. Use its generic command route in a matching environment.

## Continue

[list\_profile\_snapshots](/reference/commands/list_profile_snapshots) · [list\_profile\_snapshot\_records](/reference/commands/list_profile_snapshot_records)

Follow the [related workflow](/guides/reports), inspect [capability status](/capability-status), or return to the [command index](/reference/index).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.