Agentic Letters

v1.1.2

Send physical letters anywhere in Germany with a single command. Use when: user wants to send a physical letter. Requires an API key from agentic-letters.com.

0· 360·0 current·0 all-time
byMoritz Eigenauer@eisimo
Security Scan
VirusTotalVirusTotal
Benign
View report →
OpenClawOpenClaw
Benign
high confidence
Purpose & Capability
Name/description (send physical letters in Germany) aligns with what the files do: a Python CLI that base64-encodes a PDF and POSTs it to https://agentic-letters.com/api. Required binary (python3) and primaryEnv (AGENTIC_LETTERS_API_KEY) match the stated purpose.
Instruction Scope
SKILL.md and the CLI instruct the agent to read a local PDF, encode it, and send it to the external API; they also instruct where to store the API key (~/.openclaw/secrets/agentic_letters.env) and that local records are written to ~/.openclaw/workspace/skills/agentic-letters/records. This is coherent with the advertised functionality but means the entire PDF (potentially sensitive content) is transmitted to the third-party API.
Install Mechanism
No install spec is present and the skill is instruction + a small Python CLI using only the standard library. Nothing is downloaded from untrusted URLs and no installers or archive extraction are used.
Credentials
The only required credential is AGENTIC_LETTERS_API_KEY (the documented bearer token). No unrelated secrets, config paths, or additional environment variables are requested. The CLI also accepts the key from the declared secrets file path, which matches the documentation.
Persistence & Privilege
always is false and the skill does not request elevated or global agent privileges. It writes local record files under ~/.openclaw/workspace/skills/agentic-letters/records and uses a user-owned secrets file under ~/.openclaw/secrets; this is expected for maintaining send history but does create persistent local data.
Assessment
This skill appears to do what it claims: it reads a PDF and uploads the entire file to agentic-letters.com using your AGENTIC_LETTERS_API_KEY, then writes JSON records locally. Before installing, consider: (1) privacy — any sensitive data in the PDF (bank details, personal ID, medical data) will be sent to a third party; (2) trust & legal — verify agentic-letters.com (privacy policy, data retention, location) before giving it an API key; (3) local records are stored unencrypted under your home directory — if that matters, store them elsewhere or clean them regularly; (4) the skill suggests using third-party tools (pandoc, wkhtmltopdf, reportlab) to generate PDFs — those tools are not installed by the skill and may have their own security considerations. If you need higher assurance, review the full agentic_letters.py file locally, run the CLI in a sandboxed environment, and rotate or limit the API key if you suspect misuse.

Like a lobster shell, security has layers — review code before you run it.

Runtime requirements

✉️ Clawdis
Binspython3
Primary envAGENTIC_LETTERS_API_KEY
briefvk97435zym3190sk6bvhpaqp9j181thnkdhlvk97435zym3190sk6bvhpaqp9j181thnklatestvk97c0r3e8xya0w2g0tr00c0mwd81vry7lettersvk97435zym3190sk6bvhpaqp9j181thnkpostvk97435zym3190sk6bvhpaqp9j181thnk
360downloads
0stars
4versions
Updated 1mo ago
v1.1.2
MIT-0

AgenticLetters

Send 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.

When to use

  • User wants to send a physical letter, cancellation, or legal notice
  • User needs to mail a document (PDF) to a German address
  • User says "send a letter", "Kündigung schicken", "Brief versenden" or something similar
  • User wants to mail a DSGVO request, cancellation, complaint, or greeting card

Setup

mkdir -p ~/.openclaw/secrets
echo 'AGENTIC_LETTERS_API_KEY=al_your_api_key' > ~/.openclaw/secrets/agentic_letters.env

Getting an API key

AgenticLetters has no account system and no login. The flow is:

  1. Go to https://agentic-letters.com/buy
  2. Enter an email address and pick a credit package
  3. Pay via Stripe (card)
  4. The API key (starts with al_) is sent to that email immediately

The 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.

Tool

{baseDir}/agentic_letters.py — a zero-dependency Python CLI (stdlib only).

Send a letter

  1. Generate an A4 PDF (max 3 pages, max 10 MB, black & white print)
  2. Run the tool:
python3 {baseDir}/agentic_letters.py send \
  --pdf letter.pdf \
  --name "Max Mustermann" \
  --street "Musterstraße 1" \
  --zip 10115 \
  --city Berlin \
  --label "Kündigung Fitnessstudio"

Optional flags:

  • --type <type> — letter type (default: standard). New types will be added over time; the API rejects unknown types with a list of valid ones.
  • --country <code> — country code (default: DE). Currently only Germany is supported.

Output (JSON to stdout):

{
  "id": "550e8400-e29b-41d4-a716",
  "status": "queued",
  "type": "standard",
  "label": "Kündigung Fitnessstudio",
  "created_at": "2026-02-24T19:00:00Z",
  "credits_remaining": 4
}

Check letter status

python3 {baseDir}/agentic_letters.py status <letter-id>

Status values: queuedprintedsentreturned

Check remaining credits

python3 {baseDir}/agentic_letters.py credits

List all letters

python3 {baseDir}/agentic_letters.py list

Local records

Every sent letter is tracked locally in {baseDir}/records/. Each file is named YYYY-MM-DD_<id-prefix>.json and contains:

{
  "id": "550e8400-...",
  "status": "queued",
  "type": "standard",
  "label": "Kündigung Fitnessstudio",
  "recipient": { "name": "Max Mustermann", "street": "Musterstraße 1", "zip": "10115", "city": "Berlin", "country": "DE" },
  "created_at": "2026-02-24T19:00:00Z",
  "credits_remaining": 4,
  "last_checked": null
}

Records 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.

Generating PDFs

If the user doesn't have a PDF ready, generate one:

  • pandoc for markdown → PDF: echo "Dear Sir..." | pandoc -o letter.pdf
  • wkhtmltopdf for HTML → PDF: wkhtmltopdf letter.html letter.pdf
  • Python with fpdf2 or reportlab for programmatic generation

Always ensure A4 format (210 × 297 mm) with at least 15 mm margins.

Error handling

Errors go to stderr with a clear origin tag. The exit code is non-zero on failure.

Origins:

  • [local] — problem before the request (missing file, no API key)
  • [server] — the API rejected the request (includes error code, HTTP status, detail, and field)
  • [network] — could not reach the API (DNS, timeout, connection refused)

Example server error:

[server] Invalid German postal code
  code: recipient_zip_invalid
  http_status: 400
  detail: Expected a 5-digit German PLZ (e.g. "10115"), got "123".
  field: recipient.zip

On success, JSON is printed to stdout. On failure, nothing goes to stdout.

Important constraints

  • Germany only — recipient must have a German address
  • Max 3 pages — longer PDFs are rejected by the server
  • Max 10 MB — compress images if needed
  • Black & white — images are printed in grayscale
  • 1 credit = 1 letter — check credits before sending
  • A4 format — ensure correct page size
  • Do not validate the PDF locally — the server handles all PDF validation

Typical workflows

Kündigung (cancellation): Ask for: service name, customer number, recipient address. Generate a formal cancellation letter as PDF, send it.

DSGVO Auskunftsersuchen (data access request): Ask for: company name, address, user's full name. Generate a DSGVO Art. 15 request letter, send it.

Widerspruch (objection/appeal): Ask for: authority/company, reference number, reason. Generate a formal objection letter, send it.

Comments

Loading comments...