Everything an agent needs. One call, open and free.
GET /.well-known/attest.json for this data programmatically.
{
"name": "attest",
"version": "3.0",
"description": "Open protocol for AI content attribution. Fully open, zero setup.",
"base_url": "https://attest.97115104.com",
"endpoints": {
"create": {
"method": "GET",
"path": "/api/create",
"description": "Create an attestation from query parameters",
"parameters": {
"content_name": { "required": true, "type": "string", "description": "Title or filename" },
"model": { "required": false, "type": "string", "default": "gpt-4", "description": "AI model name" },
"role": { "required": false, "type": "string", "default": "collaborated", "enum": ["authored", "collaborated", "generated"] },
"author": { "required": false, "type": "string", "default": "Anonymous", "description": "Author or agent name" },
"content": { "required": false, "type": "string", "description": "Raw content for SHA-256 hash" },
"authorship_type": { "required": false, "type": "string", "enum": ["human", "collab", "ai"], "description": "Override auto-derived type" },
"platform": { "required": false, "type": "string", "description": "The tool/interface the model was used through (e.g. 'GitHub Copilot VS Code', 'Claude Code', 'ChatGPT', 'Cursor'). This is NOT the attest service URL — it identifies the environment/IDE/app." },
"prompt": { "required": false, "type": "string", "description": "The prompt used to generate the content" },
"prompt_type": { "required": false, "type": "string", "enum": ["single", "multi-prompt"], "default": "single", "description": "Whether content was created from a single prompt or multiple prompts" }
},
"response": {
"success": true,
"attestation": { "version": "3.0", "id": "...", "content_name": "...", "..." : "..." },
"urls": { "verify": "https://...", "short": "https://..." }
}
},
"create_upload": {
"method": "POST",
"path": "/api/create-upload",
"content_type": "multipart/form-data",
"description": "Upload a file to hash and attest",
"fields": {
"file": { "required": true, "type": "file" },
"content_name": { "required": false, "type": "string" },
"role": { "required": false, "type": "string" },
"model": { "required": false, "type": "string" },
"author": { "required": false, "type": "string" },
"platform": { "required": false, "type": "string" },
"prompt": { "required": false, "type": "string" },
"prompt_type": { "required": false, "type": "string" }
}
},
"create_url": {
"method": "POST",
"path": "/api/create-url",
"content_type": "application/json",
"description": "Fetch a URL, hash its content, create attestation",
"body": {
"url": { "required": true, "type": "string" },
"content_name": { "required": false, "type": "string" },
"role": { "required": false, "type": "string" },
"model": { "required": false, "type": "string" },
"author": { "required": false, "type": "string" },
"platform": { "required": false, "type": "string" },
"prompt": { "required": false, "type": "string" },
"prompt_type": { "required": false, "type": "string" }
}
},
"shorten": {
"method": "POST",
"path": "/api/shorten",
"content_type": "application/json",
"description": "Shorten a verify URL",
"body": { "data": { "required": true, "type": "string", "description": "Base64-encoded attestation JSON" } },
"response": { "shortUrl": "https://...", "shortId": "..." }
},
"verify": {
"method": "GET",
"path": "/verify/?data={base64}",
"description": "Verify an attestation (client-side decode)"
},
"short_redirect": {
"method": "GET",
"path": "/s/{shortId}",
"description": "Redirect short URL to verify page"
},
"metrics": {
"method": "GET",
"path": "/api/metrics",
"description": "Get platform usage metrics"
}
},
"roles": {
"authored": { "authorship_type": "human", "model_override": "Human", "description": "Entirely human-written" },
"collaborated": { "authorship_type": "collab", "description": "Human directed, AI assisted" },
"generated": { "authorship_type": "ai", "description": "Fully AI-generated" }
},
"attestation_schema": {
"version": "string (3.0)",
"id": "string (date-hex)",
"content_name": "string",
"model": "string",
"role": "string (authored|collaborated|generated)",
"authorship_type": "string (human|collab|ai)",
"timestamp": "string (ISO 8601)",
"platform": "string (tool/interface, e.g. 'GitHub Copilot VS Code', 'Claude Code', 'ChatGPT')",
"author": "string",
"prompt": "string (optional, the prompt used)",
"prompt_type": "string (single|multi-prompt, default single)",
"content_hash": "string (sha256:hex, if content provided)",
"signature": {
"type": "hmac-sha256",
"algorithm": "HMAC-SHA256",
"value": "string (hex)",
"data_to_sign": "string (JSON)"
},
"signer": { "name": "string", "id": "string (slug)" }
},
"storage_recommendations": [
{ "method": "html_meta", "example": "<meta name=\"attestation\" content=\"{base64}\">" },
{ "method": "markdown_frontmatter", "example": "attestation: https://attest.97115104.com/s/{id}" },
{ "method": "json_sidecar", "example": "/attestations/filename.json" },
{ "method": "commit_message", "example": "append verify URL to commit message" }
]
}
The attest-client npm package provides deterministic attestation creation. It eliminates URL hallucination by returning exact server-generated URLs as structured objects. Zero dependencies.
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 short URL from server
// result.urls.verify → exact verify URL from server
import { createClient } from 'attest-client';
const client = createClient({ author: 'my-agent' });
const r1 = await client.create({ content_name: 'file1.md', model: 'claude-opus-4', platform: 'Claude Code' });
const r2 = await client.create({ content_name: 'file2.md', model: 'claude-opus-4', platform: 'Claude Code' });
const metrics = await client.metrics();
const spec = await client.discover();
npx attest --content README.md --model claude-opus-4 --role collaborated
npx attest --metrics
npx attest --discover
npx attest --content file.md --json # raw JSON output
Identifies itself via User-Agent: attest-client/3.0.0 for tracking. npmjs.com/package/attest-client
GET https://attest.97115104.com/api/create?content_name=README.md
GET https://attest.97115104.com/api/create?content_name=README.md&model=claude-opus-4&role=collaborated&author=my-agent&platform=GitHub+Copilot+VS+Code&content=hello+world
curl -F "[email protected]" \
-F "role=collaborated" \
-F "model=claude-opus-4" \
-F "author=my-agent" \
https://attest.97115104.com/api/create-upload
curl -X POST https://attest.97115104.com/api/create-url \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","role":"generated","model":"gpt-4","author":"my-agent"}'
curl -X POST https://attest.97115104.com/api/shorten \
-H "Content-Type: application/json" \
-d '{"data":"eyJ2ZXJzaW9uIjoiMi4wIn0="}'
JSON.parse(atob(data))
GET https://attest.97115104.com/api/metrics
1. Install: npm install attest-client (or use raw HTTP)
2. Create content (code, docs, articles, etc.)
3. Call attest() or GET /api/create with content_name, model, role, author, platform
- Set platform to the tool/interface you are running in (e.g. 'GitHub Copilot VS Code', 'Claude Code', 'ChatGPT')
- SDK returns exact URLs, no hallucination risk
- Optionally pass content= for SHA-256 hash verification
- Optionally pass prompt= and prompt_type= to record the prompt used
4. Receive attestation JSON + verify URL + short URL
5. Store attestation alongside content:
- HTML: <meta name="attestation" content="{base64}">
- Frontmatter: attestation: {short_url}
- Sidecar: /attestations/{filename}.json
6. Anyone can verify at the verify URL