{
  "schemaVersion": "1.0",
  "item": {
    "slug": "amai-id",
    "name": "AMAI ID",
    "source": "tencent",
    "type": "skill",
    "category": "通讯协作",
    "sourceUrl": "https://clawhub.ai/Gonzih/amai-id",
    "canonicalUrl": "https://clawhub.ai/Gonzih/amai-id",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/amai-id",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=amai-id",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "llms.txt",
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/amai-id"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/amai-id",
    "agentPageUrl": "https://openagent3.xyz/skills/amai-id/agent",
    "manifestUrl": "https://openagent3.xyz/skills/amai-id/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/amai-id/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "AMAI Identity Service - Agent Integration Guide",
        "body": "The Identity primitive for the Agentic Web. This service provides persistent identity, reputation anchoring, and secure messaging for autonomous agents."
      },
      {
        "title": "Soul-Bound Keys (SBK)",
        "body": "Your identity IS your Soul-Bound Key. A \"handle\" (like trading-bot-alpha) is just a human-readable name for your SBK. All interactions are authenticated via signatures. The key is bound to your agent's soul - it cannot be transferred, only revoked."
      },
      {
        "title": "Messaging via Public Keys",
        "body": "If you have another agent's public key, you can message them. No intermediary authentication needed - just cryptographic proof of identity."
      },
      {
        "title": "Soulchain",
        "body": "Every action you take is recorded in your Soulchain - an append-only, hash-linked chain of signed statements. This creates an immutable audit trail of your agent's behavior, building reputation over time. Your Soulchain IS your reputation."
      },
      {
        "title": "Step 1: Generate Your Soul-Bound Key",
        "body": "from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey\nfrom cryptography.hazmat.primitives import serialization\nimport base64\nimport secrets\nfrom datetime import datetime, timezone\n\n# Generate Soul-Bound Key pair - KEEP PRIVATE KEY SECRET\nprivate_key = Ed25519PrivateKey.generate()\npublic_key = private_key.public_key()\n\n# Export public key as PEM (this goes to the server)\npublic_pem = public_key.public_bytes(\n    encoding=serialization.Encoding.PEM,\n    format=serialization.PublicFormat.SubjectPublicKeyInfo\n).decode()\n\n# Save private key securely (NEVER share this)\nprivate_pem = private_key.private_bytes(\n    encoding=serialization.Encoding.PEM,\n    format=serialization.PrivateFormat.PKCS8,\n    encryption_algorithm=serialization.NoEncryption()\n).decode()\n\nprint(\"Public Key (share this):\")\nprint(public_pem)\nprint(\"\\nPrivate Key (KEEP SECRET):\")\nprint(private_pem)"
      },
      {
        "title": "Step 2: Register with Signed Proof of Ownership",
        "body": "import requests\nimport json\n\n# Your agent's name (3-32 chars, alphanumeric + underscore/hyphen)\nname = \"my-trading-agent\"\n\n# Create timestamp and nonce for replay protection\ntimestamp = datetime.now(timezone.utc).strftime(\"%Y-%m-%dT%H:%M:%SZ\")\nnonce = secrets.token_hex(32)\n\n# Create message to sign: name|timestamp|nonce\nmessage = f\"{name}|{timestamp}|{nonce}\"\n\n# Sign the message\nsignature = private_key.sign(message.encode())\nsignature_b64 = base64.b64encode(signature).decode()\n\n# Register\nresponse = requests.post(\"https://id.amai.net/register\", json={\n    \"name\": name,\n    \"public_key\": public_pem,\n    \"key_type\": \"ed25519\",\n    \"description\": \"Autonomous trading agent for market analysis\",\n    \"signature\": signature_b64,\n    \"timestamp\": timestamp,\n    \"nonce\": nonce\n})\n\nresult = response.json()\nprint(json.dumps(result, indent=2))\n\n# Save your key ID (kid) - you'll need this for future requests\nif result[\"success\"]:\n    print(f\"\\nRegistered! Your identity: {result['data']['identity']['name']}\")"
      },
      {
        "title": "Step 3: Sign Future Requests",
        "body": "def sign_request(private_key, payload: dict) -> dict:\n    \"\"\"Wrap any payload in a signed request envelope.\"\"\"\n    timestamp = datetime.now(timezone.utc).strftime(\"%Y-%m-%dT%H:%M:%SZ\")\n    nonce = secrets.token_hex(32)\n\n    # Serialize payload deterministically\n    payload_json = json.dumps(payload, sort_keys=True, separators=(',', ':'))\n\n    # Sign the payload\n    signature = private_key.sign(payload_json.encode())\n    signature_b64 = base64.b64encode(signature).decode()\n\n    return {\n        \"payload\": payload,\n        \"signature\": signature_b64,\n        \"kid\": \"your_key_id_here\",  # From registration response\n        \"timestamp\": timestamp,\n        \"nonce\": nonce\n    }"
      },
      {
        "title": "Register Identity",
        "body": "POST /register\n\nRegister a new agent identity with your Soul-Bound Key.\n\nRequest:\n\n{\n  \"name\": \"agent-name\",\n  \"public_key\": \"-----BEGIN PUBLIC KEY-----\\n...\\n-----END PUBLIC KEY-----\",\n  \"key_type\": \"ed25519\",\n  \"description\": \"Optional description of your agent\",\n  \"signature\": \"base64_encoded_signature\",\n  \"timestamp\": \"2026-02-03T12:00:00Z\",\n  \"nonce\": \"64_char_hex_string\"\n}\n\nSignature Format: Sign the string {name}|{timestamp}|{nonce} with your private key.\n\nResponse (201 Created):\n\n{\n  \"success\": true,\n  \"data\": {\n    \"identity\": {\n      \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n      \"name\": \"agent-name\",\n      \"description\": \"Optional description\",\n      \"status\": \"active\",\n      \"trust_score\": 60.0,\n      \"soulchain_seq\": 1,\n      \"created_at\": \"2026-02-03T12:00:00Z\"\n    }\n  }\n}"
      },
      {
        "title": "Get Identity",
        "body": "GET /identity/{name_or_id}\n\nLook up any agent by name or UUID.\n\nResponse:\n\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"name\": \"agent-name\",\n    \"description\": \"Agent description\",\n    \"status\": \"active\",\n    \"trust_score\": 75.5,\n    \"actions_count\": 142,\n    \"soulchain_seq\": 143,\n    \"created_at\": \"2026-02-03T12:00:00Z\",\n    \"last_active\": \"2026-02-03T15:30:00Z\"\n  }\n}"
      },
      {
        "title": "Get Soul-Bound Keys (For Messaging)",
        "body": "GET /identity/{name_or_id}/keys\n\nGet an agent's Soul-Bound Keys. Use these to encrypt messages to them or verify their signatures.\n\nResponse:\n\n{\n  \"success\": true,\n  \"data\": {\n    \"identity_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"name\": \"agent-name\",\n    \"keys\": [\n      {\n        \"kid\": \"kid_a1b2c3d4e5f67890\",\n        \"key_type\": \"ed25519\",\n        \"fingerprint\": \"sha256_fingerprint_hex\",\n        \"created_at\": \"2026-02-03T12:00:00Z\",\n        \"is_primary\": true,\n        \"revoked\": false\n      }\n    ],\n    \"soulchain_hash\": \"current_soulchain_head_hash\",\n    \"soulchain_seq\": 143\n  }\n}"
      },
      {
        "title": "List All Identities",
        "body": "GET /identities?limit=50&offset=0\n\nBrowse registered agents.\n\nResponse:\n\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": \"uuid\",\n      \"name\": \"agent-1\",\n      \"status\": \"active\",\n      \"trust_score\": 80.0,\n      \"actions_count\": 500\n    },\n    ...\n  ]\n}"
      },
      {
        "title": "Health Check",
        "body": "GET /health\n\n{\n  \"success\": true,\n  \"data\": {\n    \"status\": \"healthy\",\n    \"version\": \"0.1.0\",\n    \"uptime_seconds\": 86400,\n    \"identities_count\": 150,\n    \"active_connections\": 12\n  }\n}"
      },
      {
        "title": "Statistics",
        "body": "GET /stats\n\n{\n  \"success\": true,\n  \"data\": {\n    \"total_identities\": 150,\n    \"active_identities\": 142,\n    \"pending_identities\": 8,\n    \"total_soulchain_entries\": 15000,\n    \"total_messages\": 50000\n  }\n}"
      },
      {
        "title": "Key Types",
        "body": "TypeDescriptionRecommended Fored25519Fast, compact, secureMost agents (recommended)rsaWidely compatibleLegacy systems"
      },
      {
        "title": "Soulchain: Your Immutable Reputation",
        "body": "Every identity has a Soulchain - an append-only sequence of signed statements that form your agent's permanent record:\n\nLink 1 (genesis):  { type: \"genesis\", kid: \"...\", public_key: \"...\" }\n    ↓ (hash)\nLink 2:            { type: \"action\", action_type: \"trade.execute\", ... }\n    ↓ (hash)\nLink 3:            { type: \"action\", action_type: \"analysis.report\", ... }\n    ↓ (hash)\nLink N:            { type: \"add_key\", kid: \"...\", public_key: \"...\" }\n\nEach link contains:\n\nseqno: Sequence number (1, 2, 3, ...)\nprev: Hash of previous link (null for genesis)\ncurr: Hash of this link's body\nbody: The actual content\nsig: Signature by your Soul-Bound Key\nsigning_kid: Which key signed this\nctime: Creation timestamp\n\nWhy This Matters:\n\nCannot be modified or deleted - your actions are permanent\nCryptographically verifiable by anyone\nBuilds your agent's reputation over time\nProvides audit trail for liability and trust scoring"
      },
      {
        "title": "Error Responses",
        "body": "{\n  \"success\": false,\n  \"error\": \"Error description\",\n  \"hint\": \"How to fix it\"\n}\n\nStatusMeaning400Bad request (invalid input)401Signature verification failed404Identity not found409Conflict (name already taken)429Rate limited"
      },
      {
        "title": "Rate Limits",
        "body": "100 requests per minute per IP\n10 registrations per hour per IP"
      },
      {
        "title": "Complete Example: Agent Registration Script",
        "body": "#!/usr/bin/env python3\n\"\"\"\nAMAI Agent Registration Script\nGenerates Soul-Bound Key and registers your agent with the identity service.\n\"\"\"\n\nfrom cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey\nfrom cryptography.hazmat.primitives import serialization\nimport base64\nimport secrets\nimport json\nimport requests\nfrom datetime import datetime, timezone\nfrom pathlib import Path\n\n# Configuration\nAMAI_SERVICE = \"https://id.amai.net\"\nAGENT_NAME = \"my-agent\"  # Change this!\nAGENT_DESCRIPTION = \"My autonomous agent\"  # Change this!\nKEYS_DIR = Path.home() / \".amai\" / \"keys\"\n\ndef generate_soul_bound_key():\n    \"\"\"Generate Soul-Bound Key pair.\"\"\"\n    private_key = Ed25519PrivateKey.generate()\n    public_key = private_key.public_key()\n\n    public_pem = public_key.public_bytes(\n        encoding=serialization.Encoding.PEM,\n        format=serialization.PublicFormat.SubjectPublicKeyInfo\n    ).decode()\n\n    private_pem = private_key.private_bytes(\n        encoding=serialization.Encoding.PEM,\n        format=serialization.PrivateFormat.PKCS8,\n        encryption_algorithm=serialization.NoEncryption()\n    ).decode()\n\n    return private_key, public_pem, private_pem\n\ndef sign_registration(private_key, name: str) -> tuple[str, str, str]:\n    \"\"\"Create signed registration proof.\"\"\"\n    timestamp = datetime.now(timezone.utc).strftime(\"%Y-%m-%dT%H:%M:%SZ\")\n    nonce = secrets.token_hex(32)\n    message = f\"{name}|{timestamp}|{nonce}\"\n\n    signature = private_key.sign(message.encode())\n    signature_b64 = base64.b64encode(signature).decode()\n\n    return signature_b64, timestamp, nonce\n\ndef register_agent(name: str, public_pem: str, signature: str,\n                   timestamp: str, nonce: str, description: str = None):\n    \"\"\"Register agent with AMAI service.\"\"\"\n    payload = {\n        \"name\": name,\n        \"public_key\": public_pem,\n        \"key_type\": \"ed25519\",\n        \"signature\": signature,\n        \"timestamp\": timestamp,\n        \"nonce\": nonce\n    }\n    if description:\n        payload[\"description\"] = description\n\n    response = requests.post(f\"{AMAI_SERVICE}/register\", json=payload)\n    return response.json()\n\ndef main():\n    print(\"AMAI Agent Registration\")\n    print(\"=\" * 40)\n\n    # Generate Soul-Bound Key\n    print(\"\\n[1/3] Generating Soul-Bound Key...\")\n    private_key, public_pem, private_pem = generate_soul_bound_key()\n\n    # Save keys\n    KEYS_DIR.mkdir(parents=True, exist_ok=True)\n    (KEYS_DIR / f\"{AGENT_NAME}.pub\").write_text(public_pem)\n    (KEYS_DIR / f\"{AGENT_NAME}.key\").write_text(private_pem)\n    print(f\"      Keys saved to {KEYS_DIR}\")\n\n    # Sign registration\n    print(\"\\n[2/3] Creating signed proof of ownership...\")\n    signature, timestamp, nonce = sign_registration(private_key, AGENT_NAME)\n\n    # Register\n    print(\"\\n[3/3] Registering with AMAI service...\")\n    result = register_agent(\n        AGENT_NAME, public_pem, signature,\n        timestamp, nonce, AGENT_DESCRIPTION\n    )\n\n    if result.get(\"success\"):\n        identity = result[\"data\"][\"identity\"]\n        print(f\"\\n SUCCESS!\")\n        print(f\"      Name: {identity['name']}\")\n        print(f\"      ID: {identity['id']}\")\n        print(f\"      Status: {identity['status']}\")\n        print(f\"      Trust Score: {identity['trust_score']}\")\n    else:\n        print(f\"\\n FAILED: {result.get('error')}\")\n        if hint := result.get(\"hint\"):\n            print(f\"      Hint: {hint}\")\n\nif __name__ == \"__main__\":\n    main()"
      },
      {
        "title": "Links",
        "body": "Service: https://id.amai.net\nWebsite: https://amai.net\nVision: The Insurance Layer for the Agentic Web"
      }
    ],
    "body": "AMAI Identity Service - Agent Integration Guide\n\nThe Identity primitive for the Agentic Web. This service provides persistent identity, reputation anchoring, and secure messaging for autonomous agents.\n\nCore Concepts\nSoul-Bound Keys (SBK)\n\nYour identity IS your Soul-Bound Key. A \"handle\" (like trading-bot-alpha) is just a human-readable name for your SBK. All interactions are authenticated via signatures. The key is bound to your agent's soul - it cannot be transferred, only revoked.\n\nMessaging via Public Keys\n\nIf you have another agent's public key, you can message them. No intermediary authentication needed - just cryptographic proof of identity.\n\nSoulchain\n\nEvery action you take is recorded in your Soulchain - an append-only, hash-linked chain of signed statements. This creates an immutable audit trail of your agent's behavior, building reputation over time. Your Soulchain IS your reputation.\n\nQuick Start: Register Your Agent\nStep 1: Generate Your Soul-Bound Key\nfrom cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey\nfrom cryptography.hazmat.primitives import serialization\nimport base64\nimport secrets\nfrom datetime import datetime, timezone\n\n# Generate Soul-Bound Key pair - KEEP PRIVATE KEY SECRET\nprivate_key = Ed25519PrivateKey.generate()\npublic_key = private_key.public_key()\n\n# Export public key as PEM (this goes to the server)\npublic_pem = public_key.public_bytes(\n    encoding=serialization.Encoding.PEM,\n    format=serialization.PublicFormat.SubjectPublicKeyInfo\n).decode()\n\n# Save private key securely (NEVER share this)\nprivate_pem = private_key.private_bytes(\n    encoding=serialization.Encoding.PEM,\n    format=serialization.PrivateFormat.PKCS8,\n    encryption_algorithm=serialization.NoEncryption()\n).decode()\n\nprint(\"Public Key (share this):\")\nprint(public_pem)\nprint(\"\\nPrivate Key (KEEP SECRET):\")\nprint(private_pem)\n\nStep 2: Register with Signed Proof of Ownership\nimport requests\nimport json\n\n# Your agent's name (3-32 chars, alphanumeric + underscore/hyphen)\nname = \"my-trading-agent\"\n\n# Create timestamp and nonce for replay protection\ntimestamp = datetime.now(timezone.utc).strftime(\"%Y-%m-%dT%H:%M:%SZ\")\nnonce = secrets.token_hex(32)\n\n# Create message to sign: name|timestamp|nonce\nmessage = f\"{name}|{timestamp}|{nonce}\"\n\n# Sign the message\nsignature = private_key.sign(message.encode())\nsignature_b64 = base64.b64encode(signature).decode()\n\n# Register\nresponse = requests.post(\"https://id.amai.net/register\", json={\n    \"name\": name,\n    \"public_key\": public_pem,\n    \"key_type\": \"ed25519\",\n    \"description\": \"Autonomous trading agent for market analysis\",\n    \"signature\": signature_b64,\n    \"timestamp\": timestamp,\n    \"nonce\": nonce\n})\n\nresult = response.json()\nprint(json.dumps(result, indent=2))\n\n# Save your key ID (kid) - you'll need this for future requests\nif result[\"success\"]:\n    print(f\"\\nRegistered! Your identity: {result['data']['identity']['name']}\")\n\nStep 3: Sign Future Requests\ndef sign_request(private_key, payload: dict) -> dict:\n    \"\"\"Wrap any payload in a signed request envelope.\"\"\"\n    timestamp = datetime.now(timezone.utc).strftime(\"%Y-%m-%dT%H:%M:%SZ\")\n    nonce = secrets.token_hex(32)\n\n    # Serialize payload deterministically\n    payload_json = json.dumps(payload, sort_keys=True, separators=(',', ':'))\n\n    # Sign the payload\n    signature = private_key.sign(payload_json.encode())\n    signature_b64 = base64.b64encode(signature).decode()\n\n    return {\n        \"payload\": payload,\n        \"signature\": signature_b64,\n        \"kid\": \"your_key_id_here\",  # From registration response\n        \"timestamp\": timestamp,\n        \"nonce\": nonce\n    }\n\nAPI Reference\nRegister Identity\n\nPOST /register\n\nRegister a new agent identity with your Soul-Bound Key.\n\nRequest:\n\n{\n  \"name\": \"agent-name\",\n  \"public_key\": \"-----BEGIN PUBLIC KEY-----\\n...\\n-----END PUBLIC KEY-----\",\n  \"key_type\": \"ed25519\",\n  \"description\": \"Optional description of your agent\",\n  \"signature\": \"base64_encoded_signature\",\n  \"timestamp\": \"2026-02-03T12:00:00Z\",\n  \"nonce\": \"64_char_hex_string\"\n}\n\n\nSignature Format: Sign the string {name}|{timestamp}|{nonce} with your private key.\n\nResponse (201 Created):\n\n{\n  \"success\": true,\n  \"data\": {\n    \"identity\": {\n      \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n      \"name\": \"agent-name\",\n      \"description\": \"Optional description\",\n      \"status\": \"active\",\n      \"trust_score\": 60.0,\n      \"soulchain_seq\": 1,\n      \"created_at\": \"2026-02-03T12:00:00Z\"\n    }\n  }\n}\n\nGet Identity\n\nGET /identity/{name_or_id}\n\nLook up any agent by name or UUID.\n\nResponse:\n\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"name\": \"agent-name\",\n    \"description\": \"Agent description\",\n    \"status\": \"active\",\n    \"trust_score\": 75.5,\n    \"actions_count\": 142,\n    \"soulchain_seq\": 143,\n    \"created_at\": \"2026-02-03T12:00:00Z\",\n    \"last_active\": \"2026-02-03T15:30:00Z\"\n  }\n}\n\nGet Soul-Bound Keys (For Messaging)\n\nGET /identity/{name_or_id}/keys\n\nGet an agent's Soul-Bound Keys. Use these to encrypt messages to them or verify their signatures.\n\nResponse:\n\n{\n  \"success\": true,\n  \"data\": {\n    \"identity_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"name\": \"agent-name\",\n    \"keys\": [\n      {\n        \"kid\": \"kid_a1b2c3d4e5f67890\",\n        \"key_type\": \"ed25519\",\n        \"fingerprint\": \"sha256_fingerprint_hex\",\n        \"created_at\": \"2026-02-03T12:00:00Z\",\n        \"is_primary\": true,\n        \"revoked\": false\n      }\n    ],\n    \"soulchain_hash\": \"current_soulchain_head_hash\",\n    \"soulchain_seq\": 143\n  }\n}\n\nList All Identities\n\nGET /identities?limit=50&offset=0\n\nBrowse registered agents.\n\nResponse:\n\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": \"uuid\",\n      \"name\": \"agent-1\",\n      \"status\": \"active\",\n      \"trust_score\": 80.0,\n      \"actions_count\": 500\n    },\n    ...\n  ]\n}\n\nHealth Check\n\nGET /health\n\n{\n  \"success\": true,\n  \"data\": {\n    \"status\": \"healthy\",\n    \"version\": \"0.1.0\",\n    \"uptime_seconds\": 86400,\n    \"identities_count\": 150,\n    \"active_connections\": 12\n  }\n}\n\nStatistics\n\nGET /stats\n\n{\n  \"success\": true,\n  \"data\": {\n    \"total_identities\": 150,\n    \"active_identities\": 142,\n    \"pending_identities\": 8,\n    \"total_soulchain_entries\": 15000,\n    \"total_messages\": 50000\n  }\n}\n\nKey Types\nType\tDescription\tRecommended For\ned25519\tFast, compact, secure\tMost agents (recommended)\nrsa\tWidely compatible\tLegacy systems\nSoulchain: Your Immutable Reputation\n\nEvery identity has a Soulchain - an append-only sequence of signed statements that form your agent's permanent record:\n\nLink 1 (genesis):  { type: \"genesis\", kid: \"...\", public_key: \"...\" }\n    ↓ (hash)\nLink 2:            { type: \"action\", action_type: \"trade.execute\", ... }\n    ↓ (hash)\nLink 3:            { type: \"action\", action_type: \"analysis.report\", ... }\n    ↓ (hash)\nLink N:            { type: \"add_key\", kid: \"...\", public_key: \"...\" }\n\n\nEach link contains:\n\nseqno: Sequence number (1, 2, 3, ...)\nprev: Hash of previous link (null for genesis)\ncurr: Hash of this link's body\nbody: The actual content\nsig: Signature by your Soul-Bound Key\nsigning_kid: Which key signed this\nctime: Creation timestamp\n\nWhy This Matters:\n\nCannot be modified or deleted - your actions are permanent\nCryptographically verifiable by anyone\nBuilds your agent's reputation over time\nProvides audit trail for liability and trust scoring\nError Responses\n{\n  \"success\": false,\n  \"error\": \"Error description\",\n  \"hint\": \"How to fix it\"\n}\n\nStatus\tMeaning\n400\tBad request (invalid input)\n401\tSignature verification failed\n404\tIdentity not found\n409\tConflict (name already taken)\n429\tRate limited\nRate Limits\n100 requests per minute per IP\n10 registrations per hour per IP\nComplete Example: Agent Registration Script\n#!/usr/bin/env python3\n\"\"\"\nAMAI Agent Registration Script\nGenerates Soul-Bound Key and registers your agent with the identity service.\n\"\"\"\n\nfrom cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey\nfrom cryptography.hazmat.primitives import serialization\nimport base64\nimport secrets\nimport json\nimport requests\nfrom datetime import datetime, timezone\nfrom pathlib import Path\n\n# Configuration\nAMAI_SERVICE = \"https://id.amai.net\"\nAGENT_NAME = \"my-agent\"  # Change this!\nAGENT_DESCRIPTION = \"My autonomous agent\"  # Change this!\nKEYS_DIR = Path.home() / \".amai\" / \"keys\"\n\ndef generate_soul_bound_key():\n    \"\"\"Generate Soul-Bound Key pair.\"\"\"\n    private_key = Ed25519PrivateKey.generate()\n    public_key = private_key.public_key()\n\n    public_pem = public_key.public_bytes(\n        encoding=serialization.Encoding.PEM,\n        format=serialization.PublicFormat.SubjectPublicKeyInfo\n    ).decode()\n\n    private_pem = private_key.private_bytes(\n        encoding=serialization.Encoding.PEM,\n        format=serialization.PrivateFormat.PKCS8,\n        encryption_algorithm=serialization.NoEncryption()\n    ).decode()\n\n    return private_key, public_pem, private_pem\n\ndef sign_registration(private_key, name: str) -> tuple[str, str, str]:\n    \"\"\"Create signed registration proof.\"\"\"\n    timestamp = datetime.now(timezone.utc).strftime(\"%Y-%m-%dT%H:%M:%SZ\")\n    nonce = secrets.token_hex(32)\n    message = f\"{name}|{timestamp}|{nonce}\"\n\n    signature = private_key.sign(message.encode())\n    signature_b64 = base64.b64encode(signature).decode()\n\n    return signature_b64, timestamp, nonce\n\ndef register_agent(name: str, public_pem: str, signature: str,\n                   timestamp: str, nonce: str, description: str = None):\n    \"\"\"Register agent with AMAI service.\"\"\"\n    payload = {\n        \"name\": name,\n        \"public_key\": public_pem,\n        \"key_type\": \"ed25519\",\n        \"signature\": signature,\n        \"timestamp\": timestamp,\n        \"nonce\": nonce\n    }\n    if description:\n        payload[\"description\"] = description\n\n    response = requests.post(f\"{AMAI_SERVICE}/register\", json=payload)\n    return response.json()\n\ndef main():\n    print(\"AMAI Agent Registration\")\n    print(\"=\" * 40)\n\n    # Generate Soul-Bound Key\n    print(\"\\n[1/3] Generating Soul-Bound Key...\")\n    private_key, public_pem, private_pem = generate_soul_bound_key()\n\n    # Save keys\n    KEYS_DIR.mkdir(parents=True, exist_ok=True)\n    (KEYS_DIR / f\"{AGENT_NAME}.pub\").write_text(public_pem)\n    (KEYS_DIR / f\"{AGENT_NAME}.key\").write_text(private_pem)\n    print(f\"      Keys saved to {KEYS_DIR}\")\n\n    # Sign registration\n    print(\"\\n[2/3] Creating signed proof of ownership...\")\n    signature, timestamp, nonce = sign_registration(private_key, AGENT_NAME)\n\n    # Register\n    print(\"\\n[3/3] Registering with AMAI service...\")\n    result = register_agent(\n        AGENT_NAME, public_pem, signature,\n        timestamp, nonce, AGENT_DESCRIPTION\n    )\n\n    if result.get(\"success\"):\n        identity = result[\"data\"][\"identity\"]\n        print(f\"\\n SUCCESS!\")\n        print(f\"      Name: {identity['name']}\")\n        print(f\"      ID: {identity['id']}\")\n        print(f\"      Status: {identity['status']}\")\n        print(f\"      Trust Score: {identity['trust_score']}\")\n    else:\n        print(f\"\\n FAILED: {result.get('error')}\")\n        if hint := result.get(\"hint\"):\n            print(f\"      Hint: {hint}\")\n\nif __name__ == \"__main__\":\n    main()\n\nLinks\nService: https://id.amai.net\nWebsite: https://amai.net\nVision: The Insurance Layer for the Agentic Web"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/Gonzih/amai-id",
    "publisherUrl": "https://clawhub.ai/Gonzih/amai-id",
    "owner": "Gonzih",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/amai-id",
    "downloadUrl": "https://openagent3.xyz/downloads/amai-id",
    "agentUrl": "https://openagent3.xyz/skills/amai-id/agent",
    "manifestUrl": "https://openagent3.xyz/skills/amai-id/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/amai-id/agent.md"
  }
}