# Get a version

A saved version: its full configuration and what changed since then.

|  |  |
| --- | --- |
| REST | `GET /api/v1/agents/{agent_id}/versions/{version}` |
| MCP tool | `get_version` |
| Classification | **Read** (changes nothing) |
| Scope | `agents:read` |
| Minimum role on the agent | editor |
| Confirmation | Not needed |
| Retry safety | Safe to retry with the same input |
| Success status | 200 |

## What it does

A saved version: its full configuration and what changed since then.

## Side effects

None. It only reads.

## Inputs

| Name | Type | Required | In | Description |
| --- | --- | --- | --- | --- |
| `agent_id` | string | yes | path | The agent id (agt_...), from list_agents. |
| `version` | integer | yes | path |  |

## Example

REST:

```bash
curl "https://covo.lanaai.io/api/v1/agents/agt_4edc89bb2964/versions/3" \
  -H "Authorization: Bearer $COVO_TOKEN"
```

MCP (POST /mcp):

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_version",
    "arguments": {
      "agent_id": "agt_4edc89bb2964",
      "version": 3
    }
  }
}
```

## Response

Returns an object with `number`, `label`, `revision`, `created_by`, `client`, `created_at`, `configuration` and `changes_since`. This is a real response, shortened to two items per list.

200 response:

```json
{
  "number": 3,
  "label": "Before launch",
  "revision": 7,
  "created_by": "avery@example.test",
  "client": {
    "name": "docs-examples",
    "interface": "rest"
  },
  "created_at": "2026-10-07T20:14:41.903Z",
  "configuration": {
    "links": [
      {
        "id": "5b81ea7d-47bd-498f-83c7-562142f3ce7c",
        "url": "https://cal.example/avery",
        "icon": "",
        "tags": [],
        "title": "Book a discovery call",
        "enabled": true,
        "category": "booking",
        "keywords": [],
        "priority": 0,
        "image_url": null,
        "expires_at": null,
        "visibility": "public",
        "description": ""
      }
    ],
    "offers": [],
    "places": [
      {
        "id": "56a01a61-e1a5-4bdf-b1d7-533d280b81e9",
        "key": "pl_a82927d351",
        "kind": "profile",
        "name": "Main link",
        "channel": "",
        "context": "",
        "enabled": true,
        "greeting": "",
        "embed_mode": "floating",
        "is_default": true,
        "allowed_origins": [],
        "suggested_prompts": []
      }
    ],
    "identity": {
      "headline": "Founder, Northwind Labs. Private AI for small firms.",
      "location": "",
      "long_bio": "",
      "expertise": [],
      "interests": [],
      "short_bio": "Avery builds private AI systems for small professional firms.",
      "avatar_url": null,
      "occupation": "",
      "represents": "individual",
      "display_name": "Avery Quinn",
      "contact_email": null,
      "contact_preferences": ""
    },
    "knowledge": [
      {
        "id": "ae45522f-f757-4870-9053-4f4c7f43940e",
        "tags": [],
        "title": "Northwind Labs",
        "is_faq": false,
        "content": "Northwind Labs builds private AI systems for small law firms. Engagements run six to ten weeks.",
        "category": "company",
        "priority": 0,
        "question": null,
        "visibility": "public",
        "knowledge_base_id": null
      }
    ],
    "personality": {
      "tone": "Warm, direct and practical.",
      "greeting": "Hi, I am Avery’s Concierge. Ask me about spring projects.",
      "agent_name": "",
      "boundaries": "",
      "instructions": "",
      "assistant_label": "AI Concierge",
      "fallback_behavior": "offer_contact",
      "lead_capture_mode": "balanced",
      "prohibited_topics": [],
      "suggested_prompts": []
    }
  },
  "changes_since": []
}
```

Over MCP the same object comes back as the tool result, in `structuredContent` and as JSON text.

## Errors

| Status | Code | Meaning |
| --- | --- | --- |
| 401 | `unauthorized` | No token, or it is unknown, revoked or expired. OAuth apps refresh or reconnect. |
| 403 | `account_suspended` | The account that owns the token is paused. |
| 403 | `insufficient_scope` | The token lacks `agents:read`. |
| 404 | `agent_not_found` | Unknown agent, or not reachable with this token. |
| 400 | `bad_request` | An input is invalid; `field` names it. |
| 429 | `rate_limited` | Wait `Retry-After` seconds. |
