{
  "schemaVersion": "1.0",
  "item": {
    "slug": "agentic-letters",
    "name": "Agentic Letters",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/EiSiMo/agentic-letters",
    "canonicalUrl": "https://clawhub.ai/EiSiMo/agentic-letters",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/agentic-letters",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=agentic-letters",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "_meta.json",
      "agentic_letters.py"
    ],
    "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/agentic-letters"
    },
    "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/agentic-letters",
    "agentPageUrl": "https://openagent3.xyz/skills/agentic-letters/agent",
    "manifestUrl": "https://openagent3.xyz/skills/agentic-letters/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/agentic-letters/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": "AgenticLetters",
        "body": "Send physical letters anywhere in Germany via the agentic-letters.com API.\nYour PDF gets printed, put in an envelope, and mailed — one API call, one real letter."
      },
      {
        "title": "When to use",
        "body": "User wants to send a physical letter, cancellation, or legal notice\nUser needs to mail a document (PDF) to a German address\nUser says \"send a letter\", \"Kündigung schicken\", \"Brief versenden\" or something similar\nUser wants to mail a DSGVO request, cancellation, complaint, or greeting card"
      },
      {
        "title": "Setup",
        "body": "mkdir -p ~/.openclaw/secrets\necho 'AGENTIC_LETTERS_API_KEY=al_your_api_key' > ~/.openclaw/secrets/agentic_letters.env"
      },
      {
        "title": "Getting an API key",
        "body": "AgenticLetters has no account system and no login. The flow is:\n\nGo to https://agentic-letters.com/buy\nEnter an email address and pick a credit package\nPay via Stripe (card)\nThe API key (starts with al_) is sent to that email immediately\n\nThe key is a Bearer token used in every request. If the user buys more credits later with the same email, the existing key gets topped up — no new key issued. If the user doesn't have a key yet, guide them to https://agentic-letters.com/buy."
      },
      {
        "title": "Tool",
        "body": "{baseDir}/agentic_letters.py — a zero-dependency Python CLI (stdlib only)."
      },
      {
        "title": "Send a letter",
        "body": "Generate an A4 PDF (max 3 pages, max 10 MB, black & white print)\nRun the tool:\n\npython3 {baseDir}/agentic_letters.py send \\\n  --pdf letter.pdf \\\n  --name \"Max Mustermann\" \\\n  --street \"Musterstraße 1\" \\\n  --zip 10115 \\\n  --city Berlin \\\n  --label \"Kündigung Fitnessstudio\"\n\nOptional flags:\n\n--type <type> — letter type (default: standard). New types will be added over time; the API rejects unknown types with a list of valid ones.\n--country <code> — country code (default: DE). Currently only Germany is supported.\n\nOutput (JSON to stdout):\n\n{\n  \"id\": \"550e8400-e29b-41d4-a716\",\n  \"status\": \"queued\",\n  \"type\": \"standard\",\n  \"label\": \"Kündigung Fitnessstudio\",\n  \"created_at\": \"2026-02-24T19:00:00Z\",\n  \"credits_remaining\": 4\n}"
      },
      {
        "title": "Check letter status",
        "body": "python3 {baseDir}/agentic_letters.py status <letter-id>\n\nStatus values: queued → printed → sent → returned"
      },
      {
        "title": "Check remaining credits",
        "body": "python3 {baseDir}/agentic_letters.py credits"
      },
      {
        "title": "List all letters",
        "body": "python3 {baseDir}/agentic_letters.py list"
      },
      {
        "title": "Local records",
        "body": "Every sent letter is tracked locally in {baseDir}/records/. Each file is named YYYY-MM-DD_<id-prefix>.json and contains:\n\n{\n  \"id\": \"550e8400-...\",\n  \"status\": \"queued\",\n  \"type\": \"standard\",\n  \"label\": \"Kündigung Fitnessstudio\",\n  \"recipient\": { \"name\": \"Max Mustermann\", \"street\": \"Musterstraße 1\", \"zip\": \"10115\", \"city\": \"Berlin\", \"country\": \"DE\" },\n  \"created_at\": \"2026-02-24T19:00:00Z\",\n  \"credits_remaining\": 4,\n  \"last_checked\": null\n}\n\nRecords are created automatically on send and updated on status. The date prefix lets agents quickly find recent letters without scanning old files. To check on pending letters, look at recent record files and call status for any that aren't sent yet."
      },
      {
        "title": "Generating PDFs",
        "body": "If the user doesn't have a PDF ready, generate one:\n\npandoc for markdown → PDF: echo \"Dear Sir...\" | pandoc -o letter.pdf\nwkhtmltopdf for HTML → PDF: wkhtmltopdf letter.html letter.pdf\nPython with fpdf2 or reportlab for programmatic generation\n\nAlways ensure A4 format (210 × 297 mm) with at least 15 mm margins."
      },
      {
        "title": "Error handling",
        "body": "Errors go to stderr with a clear origin tag. The exit code is non-zero on failure.\n\nOrigins:\n\n[local] — problem before the request (missing file, no API key)\n[server] — the API rejected the request (includes error code, HTTP status, detail, and field)\n[network] — could not reach the API (DNS, timeout, connection refused)\n\nExample server error:\n\n[server] Invalid German postal code\n  code: recipient_zip_invalid\n  http_status: 400\n  detail: Expected a 5-digit German PLZ (e.g. \"10115\"), got \"123\".\n  field: recipient.zip\n\nOn success, JSON is printed to stdout. On failure, nothing goes to stdout."
      },
      {
        "title": "Important constraints",
        "body": "Germany only — recipient must have a German address\nMax 3 pages — longer PDFs are rejected by the server\nMax 10 MB — compress images if needed\nBlack & white — images are printed in grayscale\n1 credit = 1 letter — check credits before sending\nA4 format — ensure correct page size\nDo not validate the PDF locally — the server handles all PDF validation"
      },
      {
        "title": "Typical workflows",
        "body": "Kündigung (cancellation):\nAsk for: service name, customer number, recipient address. Generate a formal cancellation letter as PDF, send it.\n\nDSGVO Auskunftsersuchen (data access request):\nAsk for: company name, address, user's full name. Generate a DSGVO Art. 15 request letter, send it.\n\nWiderspruch (objection/appeal):\nAsk for: authority/company, reference number, reason. Generate a formal objection letter, send it."
      }
    ],
    "body": "AgenticLetters\n\nSend physical letters anywhere in Germany via the agentic-letters.com API. Your PDF gets printed, put in an envelope, and mailed — one API call, one real letter.\n\nWhen to use\nUser wants to send a physical letter, cancellation, or legal notice\nUser needs to mail a document (PDF) to a German address\nUser says \"send a letter\", \"Kündigung schicken\", \"Brief versenden\" or something similar\nUser wants to mail a DSGVO request, cancellation, complaint, or greeting card\nSetup\nmkdir -p ~/.openclaw/secrets\necho 'AGENTIC_LETTERS_API_KEY=al_your_api_key' > ~/.openclaw/secrets/agentic_letters.env\n\nGetting an API key\n\nAgenticLetters has no account system and no login. The flow is:\n\nGo to https://agentic-letters.com/buy\nEnter an email address and pick a credit package\nPay via Stripe (card)\nThe API key (starts with al_) is sent to that email immediately\n\nThe key is a Bearer token used in every request. If the user buys more credits later with the same email, the existing key gets topped up — no new key issued. If the user doesn't have a key yet, guide them to https://agentic-letters.com/buy.\n\nTool\n\n{baseDir}/agentic_letters.py — a zero-dependency Python CLI (stdlib only).\n\nSend a letter\nGenerate an A4 PDF (max 3 pages, max 10 MB, black & white print)\nRun the tool:\npython3 {baseDir}/agentic_letters.py send \\\n  --pdf letter.pdf \\\n  --name \"Max Mustermann\" \\\n  --street \"Musterstraße 1\" \\\n  --zip 10115 \\\n  --city Berlin \\\n  --label \"Kündigung Fitnessstudio\"\n\n\nOptional flags:\n\n--type <type> — letter type (default: standard). New types will be added over time; the API rejects unknown types with a list of valid ones.\n--country <code> — country code (default: DE). Currently only Germany is supported.\n\nOutput (JSON to stdout):\n\n{\n  \"id\": \"550e8400-e29b-41d4-a716\",\n  \"status\": \"queued\",\n  \"type\": \"standard\",\n  \"label\": \"Kündigung Fitnessstudio\",\n  \"created_at\": \"2026-02-24T19:00:00Z\",\n  \"credits_remaining\": 4\n}\n\nCheck letter status\npython3 {baseDir}/agentic_letters.py status <letter-id>\n\n\nStatus values: queued → printed → sent → returned\n\nCheck remaining credits\npython3 {baseDir}/agentic_letters.py credits\n\nList all letters\npython3 {baseDir}/agentic_letters.py list\n\nLocal records\n\nEvery sent letter is tracked locally in {baseDir}/records/. Each file is named YYYY-MM-DD_<id-prefix>.json and contains:\n\n{\n  \"id\": \"550e8400-...\",\n  \"status\": \"queued\",\n  \"type\": \"standard\",\n  \"label\": \"Kündigung Fitnessstudio\",\n  \"recipient\": { \"name\": \"Max Mustermann\", \"street\": \"Musterstraße 1\", \"zip\": \"10115\", \"city\": \"Berlin\", \"country\": \"DE\" },\n  \"created_at\": \"2026-02-24T19:00:00Z\",\n  \"credits_remaining\": 4,\n  \"last_checked\": null\n}\n\n\nRecords are created automatically on send and updated on status. The date prefix lets agents quickly find recent letters without scanning old files. To check on pending letters, look at recent record files and call status for any that aren't sent yet.\n\nGenerating PDFs\n\nIf the user doesn't have a PDF ready, generate one:\n\npandoc for markdown → PDF: echo \"Dear Sir...\" | pandoc -o letter.pdf\nwkhtmltopdf for HTML → PDF: wkhtmltopdf letter.html letter.pdf\nPython with fpdf2 or reportlab for programmatic generation\n\nAlways ensure A4 format (210 × 297 mm) with at least 15 mm margins.\n\nError handling\n\nErrors go to stderr with a clear origin tag. The exit code is non-zero on failure.\n\nOrigins:\n\n[local] — problem before the request (missing file, no API key)\n[server] — the API rejected the request (includes error code, HTTP status, detail, and field)\n[network] — could not reach the API (DNS, timeout, connection refused)\n\nExample server error:\n\n[server] Invalid German postal code\n  code: recipient_zip_invalid\n  http_status: 400\n  detail: Expected a 5-digit German PLZ (e.g. \"10115\"), got \"123\".\n  field: recipient.zip\n\n\nOn success, JSON is printed to stdout. On failure, nothing goes to stdout.\n\nImportant constraints\nGermany only — recipient must have a German address\nMax 3 pages — longer PDFs are rejected by the server\nMax 10 MB — compress images if needed\nBlack & white — images are printed in grayscale\n1 credit = 1 letter — check credits before sending\nA4 format — ensure correct page size\nDo not validate the PDF locally — the server handles all PDF validation\nTypical workflows\n\nKündigung (cancellation): Ask for: service name, customer number, recipient address. Generate a formal cancellation letter as PDF, send it.\n\nDSGVO Auskunftsersuchen (data access request): Ask for: company name, address, user's full name. Generate a DSGVO Art. 15 request letter, send it.\n\nWiderspruch (objection/appeal): Ask for: authority/company, reference number, reason. Generate a formal objection letter, send it."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/EiSiMo/agentic-letters",
    "publisherUrl": "https://clawhub.ai/EiSiMo/agentic-letters",
    "owner": "EiSiMo",
    "version": "1.1.2",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/agentic-letters",
    "downloadUrl": "https://openagent3.xyz/downloads/agentic-letters",
    "agentUrl": "https://openagent3.xyz/skills/agentic-letters/agent",
    "manifestUrl": "https://openagent3.xyz/skills/agentic-letters/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/agentic-letters/agent.md"
  }
}