> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.markup.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.markup.ai/_mcp/server.

# Link Integrity

> Run the Link Integrity agent (link_integrity) via the Markup AI API.

**API name:** `link_integrity` · **Category:** Accuracy

Check every hyperlink and bare URL for anchor/URL mismatches, dead destinations, domain decay, misattributed citations, and off-topic links. For what this agent does and why it matters, see [Link Integrity](/agents/link-integrity) in the Agent Catalog.

## What it returns

The run status plus one issue per flagged link — its location in the text, the issue type, and the risk level. The agent reports findings only; it does not return replacement URLs. It checks the first 50 links per run and warns when it hits that cap. Because links are fetched over the network, runs take longer than text-only agents — prefer the async flow for anything longer than a short document.

## Run this agent

Agents are run by ID, but you never need to hardcode one: resolve the ID from the agent's stable `name` (`link_integrity`) with `GET /agents`, then call `POST /agents/{agent_id}/run`. Pass `wait=true` to block until the run completes; omit it to get a `workflow_id` back immediately and track the run with `GET /agents/workflows/{workflow_id}` (or a `webhook_url` in the request body).

**`cURL`**

```bash title="cURL"
TOKEN="YOUR_TOKEN"

# Resolve the agent ID by name
AGENT_ID=$(curl -s "https://api.markup.ai/agents?page_size=100" \
  -H "Authorization: Bearer $TOKEN" \
  | jq -r '.agents[] | select(.name == "link_integrity") | .id')

# Run the agent and wait for the result
curl -X POST "https://api.markup.ai/agents/$AGENT_ID/run?wait=true" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"text": "Your content to check."}'
```

**`Python`**

```python title="Python"
import requests

BASE = "https://api.markup.ai"
HEADERS = {"Authorization": "Bearer YOUR_TOKEN"}

# Resolve the agent ID by name
agents = requests.get(
    f"{BASE}/agents", headers=HEADERS, params={"page_size": 100}
).json()["agents"]
agent_id = next(a["id"] for a in agents if a["name"] == "link_integrity")

# Run the agent and wait for the result
run = requests.post(
    f"{BASE}/agents/{agent_id}/run",
    headers=HEADERS,
    params={"wait": "true"},
    json={"text": "Your content to check."},
).json()
print(run["status"], run.get("result"))
```

**`TypeScript`**

```typescript title="TypeScript"
const BASE = "https://api.markup.ai";
const headers = { Authorization: "Bearer YOUR_TOKEN" };

// Resolve the agent ID by name
const { agents } = await (
  await fetch(`${BASE}/agents?page_size=100`, { headers })
).json();
const agentId = agents.find((a) => a.name === "link_integrity").id;

// Run the agent and wait for the result
const run = await (
  await fetch(`${BASE}/agents/${agentId}/run?wait=true`, {
    method: "POST",
    headers: { ...headers, "Content-Type": "application/json" },
    body: JSON.stringify({ text: "Your content to check." }),
  })
).json();
console.log(run.status, run.result);
```

Prefer MCP? On the hosted MCP server, run this agent with `markupai_run_agents` and `agents: ["link_integrity"]`, or let `markupai_review` select it from your goal — see the [MCP overview](/mcp).