# attest — agent integration guide > attest is a free, open-access protocol for transparent AI content > attribution. One HTTP call, no API keys, no auth tokens. Use it > to declare whether content was written by a human, co-authored > with AI, or fully AI-generated. ## quick start (sdk, recommended) npm install attest-client import { attest } from 'attest-client'; const result = await attest({ content_name: 'README.md', model: 'claude-opus-4', role: 'collaborated', author: 'my-agent', platform: 'GitHub Copilot VS Code' }); // result.urls.short → exact server-generated short URL // result.urls.verify → exact server-generated verify URL The SDK adds determinism to agent-generated attestations: - Returns structured objects with exact URLs (no hallucination) - Validates inputs before sending - Identifies via User-Agent: attest-client/3.0.0 - Zero dependencies CLI: npx attest --content README.md --model claude-opus-4 --role collaborated npm: https://www.npmjs.com/package/attest-client ## quick start (raw http) GET https://attest.97115104.com/api/create?content_name=README.md&model=claude-opus-4&role=collaborated&author=my-agent That's it. You get back JSON with the attestation and a verify URL. ## structured api spec GET https://attest.97115104.com/.well-known/attest.json Returns full machine-readable API specification as JSON. ## pages / dashboard with live metrics /agents/ machine-readable API spec and examples /humans/ human-friendly create page /verify/ verify attestations /llms.txt this file ## create an attestation Make a single GET request: GET https://attest.97115104.com/api/create ?content_name={title or filename} &model={your model name} &role={authored|collaborated|generated} &author={author or agent name} &platform={tool/interface used, e.g. GitHub Copilot VS Code, Claude Code, ChatGPT} &content={optional: raw text for SHA-256 hash} &prompt={optional: the prompt used} &prompt_type={optional: single or multi-prompt} ### parameters content_name (required) title or filename of the content model (optional) AI model used, e.g. claude-opus-4, gpt-4 (default: gpt-4) role (optional) authored | collaborated | generated (default: collaborated) author (optional) author or agent name (default: Anonymous) content (optional) raw content string, used to generate a SHA-256 hash authorship_type (optional) human | collab | ai (auto-derived from role) platform (optional) the tool/interface the model was used through. Examples: "GitHub Copilot VS Code", "Claude Code", "ChatGPT", "Cursor", "Windsurf", "Aider". This is NOT the attestation service — it's what environment the AI model was accessed from. prompt (optional) the prompt used to create the content (for transparency) prompt_type (optional) "single" or "multi-prompt" — whether one or multiple prompts were used ### roles authored entirely human-written, the model field is set to "Human" collaborated human directed the work, AI assisted generated fully AI-generated content ### example curl "https://attest.97115104.com/api/create?content_name=README.md&model=claude-opus-4&role=collaborated&author=my-agent" ### response { "success": true, "attestation": { "version": "3.0", "id": "2026-04-02-a1b2c3", "content_name": "README.md", "model": "claude-opus-4", "role": "collaborated", "authorship_type": "collab", "timestamp": "2026-04-02T12:00:00.000Z", "platform": "GitHub Copilot VS Code", "author": "my-agent" }, "urls": { "verify": "https://attest.97115104.com/verify/?data=eyJ2ZXJz...(long base64)...", "short": "https://attest.97115104.com/s/k7xm9pq2" } } ### CRITICAL: using the response URLs correctly The API response contains two URLs in the "urls" object: - urls.verify: the full verification URL (long, contains base64 data) - urls.short: a short redirect URL (8-character random ID like "k7xm9pq2") You MUST use the EXACT URLs from the API response. Do not construct, guess, or infer URLs. The attestation "id" field (like "2026-04-02-a1b2c3") is NOT a short URL ID. The short URL ID is a separate random string generated by the server and returned in urls.short. WRONG: using attestation.id to build a URL like /s/a1b2c3 RIGHT: using the exact value from urls.short like /s/k7xm9pq2 ## create attestation with file upload Upload any file to hash its content and generate a signed attestation: POST https://attest.97115104.com/api/create-upload Content-Type: multipart/form-data Fields: file (required) the source file content_name (optional) defaults to filename role (optional) authored | collaborated | generated model (optional) AI model name author (optional) author or agent name ### example curl -F "file=@myfile.md" -F "role=collaborated" -F "model=claude-opus-4" \ https://attest.97115104.com/api/create-upload ## attest a webpage url POST https://attest.97115104.com/api/create-url Content-Type: application/json Body: {"url": "https://example.com", "role": "collaborated", "model": "claude-opus-4", "author": "my-agent"} ## shorten a verify URL POST https://attest.97115104.com/api/shorten Content-Type: application/json Body: {"data": ""} Response: {"shortUrl": "https://attest.97115104.com/s/abc12345"} ## get platform metrics GET https://attest.97115104.com/api/metrics Returns JSON with total_attestations, total_verifications, total_agent_visits, top_model, top_type, agent_breakdown, type_breakdown, recent_attestations. ## verify an attestation Long URL: https://attest.97115104.com/verify/?data={base64} Short URL: https://attest.97115104.com/s/{shortId} To decode manually: JSON.parse(atob(data)) ## where to store attestations HTML meta tag: Markdown frontmatter: attestation: https://attest.97115104.com/s/{id} JSON sidecar file: /attestations/filename.json Commit message: append the verify URL Markdown frontmatter: --- attribution: collab claude opus 4 attestation: https://attest.97115104.com/s/EXACT_SHORT_URL_FROM_RESPONSE --- JSON sidecar file: /attestations/filename.json /_data/attestations.json /.well-known/attestations.json Commit message or PR description: Append the verify URL to your commit message or pull request. ## agent prompt If you are an AI agent and want to integrate attest into your workflow, the recommended approach is: 1. Use the SDK (npm install attest-client) for deterministic results with no URL hallucination risk. 2. Call attest() or createClient().create() with content_name, model, role, and author. 3. The SDK returns exact URLs from the server. Use them as-is. Alternatively, make a raw GET request to /api/create and use the EXACT URLs from the response (see "CRITICAL" section above). Append the returned verify URL to your output, commit message, or store the attestation JSON alongside the content. ## source https://github.com/97115104/attest https://www.npmjs.com/package/attest-client MIT license