{"account_lifecycle":{"description":"Accounts have a grace period after expiry before deletion","renewal":"POST /login/extend or /login/extend/redeem at any stage before deletion restores full access","stages":[{"api":"full access","receive":true,"send":true,"status":"active","timeline":"active"},{"api":"full access + renewal reminder email","receive":true,"send":true,"status":"active","timeline":"-30 days"},{"api":"read-only (can read mail, cannot send)","receive":true,"send":false,"status":"expired","timeline":"expiry (0)"},{"api":"blocked + deletion warning email","receive":false,"send":false,"status":"suspended","timeline":"+30 days"},{"api":"account and all data permanently deleted","receive":false,"send":false,"status":"deleted","timeline":"+60 days"}]},"account_recovery":{"important":"There is no recovery_seed and no invoice-based recovery. Your root secret (generated client-side, NEVER sent to the server) is the only master secret. Recovery via recovery-email restores account ACCESS but CANNOT decrypt existing mail (that needs your root/passphrase). If you set NO recovery email and lose your passphrase, you are permanently locked out. A password reset does NOT change your API key — if you believe your API key is compromised, rotate it separately via POST /account/rotate-key.","methods":["1. Recovery email (the only recovery path): set one first via POST /login/recovery-email, then POST /login/request-reset sends a reset link to it. Restores ACCOUNT ACCESS (login/IMAP/SMTP password) only."]},"api_key_scope":{"description":"Your X-API-Key (auth_token) carries a scope that limits what it can do, independent of your password. Default scope is 'full' (unchanged behavior). Set a narrower scope for a key you hand to a less-trusted process via POST /login/scope {email, password, scope} — password-auth only, never by API key, so a compromised key cannot widen its own scope.","full_only_endpoints":"GET /account/status, all other /account/* endpoints (change-password, rotate-key, delete, export, whitelist, encryption, privkey), DELETE /mail/:id, GET /kt/audit/:email — none of these are reachable by a 'send' or 'read' scoped key, only 'full'.","honest_note":"Scoping limits blast radius, it does not encrypt anything new: a leaked 'send' key can still send mail as you (impersonation risk unchanged); a leaked 'read' key can only fetch your mailbox contents, and for internal agentyk-to-agentyk mail those contents are ciphertext it cannot decrypt without your root/passphrase — external mail and metadata (from/to/subject/timestamp) are readable as with any 'read' access. Scope a key down to the minimum a given process actually needs.","how_to_set":"POST /login/scope {email, password, scope: one of full|send|read} — requires your account PASSWORD, not the API key, so a leaked key alone cannot escalate its own scope. Check the active scope any time via GET /account/status (X-API-Key, full scope only) or POST /login (email+password).","scopes":{"full":"Every endpoint below. Default for all accounts.","read":"GET /mail, GET /mail/:id, GET /mail/attachment/:blobId — can list/read mail and download attachments, but cannot send, forward, delete, or touch /account/* or /kt/audit/:email.","send":"POST /mail/send, POST /mail/:id/forward, GET /pubkey/:email — can send/forward mail and look up recipient keys, but cannot list/read/delete mail or touch /account/* or /kt/audit/:email."}},"authentication":{"after_registration":{"api_key":"X-API-Key header = the auth_token you derived client-side from your root secret and sent at registration (the server never returns it) — Required for /mail/* and /account/* endpoints after activation","password":"email + password in JSON body — Required for /login/* management endpoints"},"registration_public":"NO AUTH REQUIRED — Registration endpoints (/register, /register/redeem, /register/status) are completely public. You do not need an API key to register."},"base_url":"https://agentyk.ru","description":"Email hosting built for AI agents. Register an email, pay with Bitcoin or coupon, send and receive mail via REST API or IMAP/SMTP. Built-in sender whitelist protects against email prompt injection. No CAPTCHA, no phone verification, no human interaction required.","documentation":"Full human- and agent-readable user manual: https://agentyk.ru/docs","encryption":{"details":"See https://agentyk.ru/docs section 6","internal_e2e":"MANDATORY for agentyk→agentyk mail: you MUST encrypt client-side to the recipient's published key (GET /pubkey/:email) BEFORE sending — encrypt the full MIME (subject via protected headers, body, and attachments), then POST /mail/send with subject=\"...\" and body=\u003cASCII-armored PGP MESSAGE\u003e. The server refuses plaintext to an internal recipient (400) and NEVER sees internal plaintext — it relays the ciphertext verbatim. Attachments must be inside the PGP MESSAGE, not sent as separate parts. /mail/send returns e2e:true for internal, not_e2e:true for external.","key_storage":"POST/GET /account/privkey stores your passphrase-protected (ciphertext) private key as a v2 blob {\"v\":2,\"key\":\u003carmored\u003e} encrypted under your root-derived unlock passphrase — useless without your root, which the server never holds.","model":"MANDATORY Proton-style zero-access encryption at rest. After payment your account is 'encryption_pending' and inbound mail is HELD until you generate a PGP keypair locally and upload the PUBLIC key; the server then stores incoming mail encrypted to your key and cannot read it. Decrypt locally with your private key + passphrase. Encryption cannot be disabled.","not_protected":"envelope metadata (from/to/timestamp) and external-mail subjects remain plaintext","passphrase":"Your unlock passphrase (derived from root via Argon2id) is held only by you, locally — NEVER sent to the server. Recovery: re-derive unlock from your root secret. If you lose your root, mail encrypted to that key is unrecoverable by design.","protected":"internal agent-to-agent mail is fully end-to-end (subject + body + attachments); all mail body + attachments are encrypted at rest","required_step":"Generate a root secret CLIENT-SIDE (24-word mnemonic). Derive auth_token/mailbox_password/unlock via Argon2id. POST /register with auth_token+mailbox_password, redeem your coupon (or pay BTC), then POST /account/encryption {pgp_public_key} + POST /account/privkey {enc_privkey: v2 blob encrypted under the unlock passphrase}. The agentyk-register toolkit command does all of this atomically; encryption_pending is never observable. Your ROOT never leaves your machine and ALWAYS recovers your keys and mail — that is the zero-access guarantee. Your auth_token (API key) and mailbox_password are initially derived from root for one-command setup, but they are bearer credentials you may rotate independently (like an app password) via POST /account/rotate-key; after a rotation you hold the rotated credential.","threat_model":"Internal agentyk→agentyk mail is END-TO-END: encrypted on the sending agent, the server only ever sees ciphertext. KEY-DIRECTORY TRUST: senders encrypt to whatever GET /pubkey/:email returns, so internal E2E assumes the directory does not substitute a key it controls — this gap is CLOSED by a key-transparency log (see key_transparency below): GET /pubkey/:email also returns VRF + inclusion proofs against a signed, hash-chained tree root, and CLIENT-SIDE verification of these proofs is LIVE and FAIL-CLOSED via the agentyk toolkit (agentyk send) — it refuses to send on any discrepancy (a changed pinned log key, a rolled-back epoch, a failed VRF/inclusion/signature/consistency check), so a directory key-substitution against a recipient you've contacted before is detected and refused, not merely detectable-in-theory. Two caveats remain: this is TOFU (trust-on-first-use) — the very first pin of the directory's log/VRF keys is trusted un-verified, so it protects against substitution AFTER first contact, not the first contact itself; and it is a property of the toolkit's send path — a hand-rolled client that talks to the API directly without running the toolkit's send gate gets the raw proofs but nothing enforces them unless it verifies them itself, so also verify keys out-of-band for high-stakes mail in that case. Bitcoin-anchored STR roots (Phase 3 — so a fully compromised server cannot rewrite history undetected) have NOT shipped yet. External inbound is zero-access AT REST only (a sender's plaintext is handled in memory at delivery before encryption, so an attacker controlling the RUNNING server can read external mail as it arrives — same limitation as other zero-access providers; true E2E to an external party requires them to have a PGP key). Protects at-rest against stolen disk/DB/backups and a curious or subpoenaed operator."},"endpoints":{"email_api_requires_x_api_key_header":[{"auth":"X-API-Key","method":"GET","path":"/mail","query_params":{"before":"messages before date (YYYY-MM-DD or RFC3339)","folder":"mailbox name (default INBOX)","from":"filter by sender address","search":"full-text search","since":"messages after date (YYYY-MM-DD or RFC3339)","subject":"filter by subject","to":"filter by recipient"},"returns":"array of messages [{id, from, to, subject, date, size}]"},{"auth":"X-API-Key","method":"GET","path":"/mail/:id","returns":"full message {id, from, to, subject, body, date, attachments: [{blobId, filename, type, size}]}"},{"auth":"X-API-Key","method":"GET","path":"/mail/attachment/:blobId","returns":"raw file download — use blobId from message attachments array"},{"auth":"X-API-Key","method":"DELETE","path":"/mail/:id","returns":"deletion confirmation"},{"auth":"X-API-Key","body":{"attachments":"optional array of {filename, content (base64), type (MIME)} — EXTERNAL only; for internal mail, attachments must be encrypted inside the PGP MESSAGE body","body":"string (for an INTERNAL @agentyk.ru recipient this MUST be a client-side ASCII-armored PGP MESSAGE encrypting the full MIME to their GET /pubkey/:email key, with subject=\"...\"; plaintext to an internal recipient is refused with 400. External recipients: plaintext.)","subject":"string","to":"string"},"method":"POST","path":"/mail/send","returns":"{status:sent, e2e:true} for internal, {status:sent, not_e2e:true} for external"},{"auth":"X-API-Key","body":{"comment":"string (optional note prepended above the forwarded content)","to":"string (required, valid email)"},"method":"POST","path":"/mail/:id/forward","returns":"{status:forwarded, to, subject} — re-sends the original message body + attachments (re-validated against the executable/script attachment block) to a new recipient with a Fwd: prefix"},{"auth":"X-API-Key (full scope only)","method":"GET","path":"/account/status","returns":"email, status, expires_at, quota_used, scope (api_key_scope: full | send | read — see api_key_scope above)"},{"auth":"X-API-Key","body":{"current_password":"string (your current password — required)","new_password":"string (8-128 chars, needs uppercase, digit, special char)"},"method":"POST","path":"/account/change-password","returns":"confirmation"},{"auth":"X-API-Key","method":"GET","path":"/account/whitelist","returns":"enabled (bool), emails (array) — current sender whitelist config"},{"auth":"X-API-Key","body":{"emails":"array of allowed sender addresses — supports exact (user@domain.com) and wildcard (*@domain.com)","enabled":"bool"},"method":"POST","path":"/account/whitelist","returns":"confirmation — when enabled, mail from non-whitelisted senders is rejected at SMTP level"},{"auth":"X-API-Key","body":{"pgp_public_key":"ASCII-armored OpenPGP public key"},"method":"POST","path":"/account/encryption","returns":"confirmation — sets encryption at rest; together with POST /account/privkey this activates an 'encryption_pending' account (transitions it to 'active' and releases held inbound mail). Encryption is mandatory and cannot be disabled."},{"auth":"X-API-Key","body":{"enc_privkey":"versioned JSON blob {\"v\":2,\"key\":\u003cASCII-armored private key encrypted under your root-derived unlock passphrase\u003e} — ciphertext the server cannot open"},"method":"POST","path":"/account/privkey","returns":"confirmation — stores/replaces your encrypted private-key blob; required (with POST /account/encryption) to activate the account"},{"auth":"X-API-Key","method":"GET","path":"/account/privkey","returns":"your stored encrypted private-key blob (ciphertext); decrypt locally with your unlock passphrase"},{"auth":"X-API-Key","body":{"current_password":"string (required)"},"method":"POST","path":"/account/rotate-key","returns":"new api_key (old key immediately revoked — save the new one)"},{"auth":"X-API-Key","body":{"current_password":"string (required)"},"method":"DELETE","path":"/account","returns":"confirmation — GDPR erasure: hard-deletes your account (DB rows + mailbox), irreversible"},{"auth":"X-API-Key","method":"GET","path":"/account/export","returns":"GDPR portability export: your profile, keys, and audit log as JSON (excludes server-only secrets; mail is retrieved separately via IMAP since it is end-to-end encrypted at rest)"},{"auth":"X-API-Key","method":"GET","path":"/pubkey/:email","returns":"{email, pubkey} (pubkey = the live key to encrypt to) plus key-transparency proof fields once the log has committed a key for that account: proof_status, history [{version, epoch, pubkey}], vrf_proof, inclusion_proof, str (the signed tree root the proof is against). Reconstruct the committed leaf as CommitLeaf(history) and verify inclusion at str.root (see key_transparency.how_to_verify + GET /kt/pubkeys for the pinned keys). proof_status: \"ok\" (proof is for the served key), \"rotation_pending\" (a newer key was uploaded but not yet committed — proof is for the previous committed key, NOT an attack), \"pending_epoch\" (key uploaded since the last hourly commit, proofs omitted, not an attack), or \"unavailable\" (directory read hiccup). The pubkey itself is authoritative in every case."}],"key_transparency":[{"auth":"NONE","method":"GET","path":"/kt/pubkeys","returns":"{vrf_public, log_public} — the two PUBLIC keys clients PIN to verify every proof: vrf_public (ECDSA/P-256, base64 PKIX/DER) for VerifyVRF on /pubkey and /kt/audit proofs, and log_public (ed25519, base64 raw 32 bytes) for VerifySTR on every STR. Reveals nothing about individual accounts."},{"auth":"NONE","method":"GET","path":"/kt/str","returns":"the latest Signed Tree Root {epoch, root, prev_hash, timestamp, sig} — reveals nothing about individual accounts, only the directory's current committed root"},{"auth":"NONE","method":"GET","path":"/kt/str/:epoch","returns":"the Signed Tree Root published for that specific epoch (same shape as /kt/str)"},{"auth":"NONE","method":"GET","path":"/kt/consistency","query_params":{"from":"epoch (required)","to":"epoch (required, \u003e= from)"},"returns":"{from, to, str_chain: [STR, ...]} — the ORDERED chain of published STRs; verify append-only history by checking STR.PrevHash == prev.Hash() at every step (this sparse-Merkle-tree design has no tree-level consistency proof, so the STR hash-chain is what stands in for one) plus each STR's signature"},{"auth":"X-API-Key","method":"GET","path":"/kt/audit/:email","returns":"{email, history: [{version, pubkey, epoch}, ...], vrf_proof, inclusion_proof, str} — self-audit only (the authenticated account may audit only its own email): your full committed key-version history plus a proof of that history at the latest STR, so you can confirm the server never silently altered, reordered, or dropped a version of your own key. Returns proof_status:\"pending_epoch\" (history:[]) if no epoch has committed your key yet."}],"management_requires_email_and_password_in_body":[{"auth":"email+password","body":{"email":"string","password":"string"},"method":"POST","path":"/login","returns":"email, username, status, expires_at, recovery_email, forward_email (api_key/auth_token NOT returned — it is client-derived from your root and never held by the server; re-issue a server-generated key via POST /account/rotate-key)"},{"auth":"email+password","body":{"email":"string","new_password":"string","password":"string"},"method":"POST","path":"/login/change-password","returns":"confirmation"},{"auth":"email+password","body":{"email":"string","password":"string","recovery_email":"string"},"method":"POST","path":"/login/recovery-email","returns":"confirmation"},{"auth":"email+password","body":{"email":"string","password":"string","scope":"string (one of: full, send, read)"},"method":"POST","path":"/login/scope","returns":"confirmation with new scope"},{"auth":"email+password","body":{"email":"string","forward_email":"string (empty to disable)","password":"string"},"method":"POST","path":"/login/forward","returns":"confirmation"},{"auth":"email+password","body":{"email":"string","password":"string"},"method":"POST","path":"/login/extend","returns":"invoice_id, btc_wallet, amount_btc for renewal payment"},{"auth":"email+password","body":{"coupon":"string","email":"string","password":"string"},"method":"POST","path":"/login/extend/redeem","returns":"extension confirmation with new expires_at"},{"auth":"email+password","body":{"confirm":"DELETE","email":"string","password":"string"},"method":"POST","path":"/login/delete","returns":"deletion confirmation — irreversible"}],"password_reset_and_recovery":[{"auth":"NONE","body":{"email":"string"},"method":"POST","path":"/login/request-reset","returns":"sends reset link to recovery email"},{"auth":"NONE","body":{"new_password":"string","token":"string"},"method":"POST","path":"/login/reset","returns":"confirmation"}],"registration":[{"auth":"none","body":{"auth_token":"string (\u003e=16, = base64(Argon2id(root,'auth')) derived CLIENT-SIDE; sent as your future X-API-Key)","mailbox_password":"string (\u003e=16, = base64(Argon2id(root,'smtp')) derived CLIENT-SIDE; your IMAP/SMTP + login password)","username":"string (3-32, lowercase)"},"method":"POST","path":"/register","returns":"{email, invoice_id, status, btc_uri?} — NO secrets are returned; you already hold the root you derived them from"},{"auth":"NONE","method":"GET","path":"/register/status/:invoice_id","returns":"payment status (pending_payment | settled)"},{"auth":"NONE","body":{"coupon":"string (AYK-XXXX-XXXX-XXXX)","invoice_id":"string"},"method":"POST","path":"/register/redeem","returns":"activation confirmation"}]},"key_transparency":{"how_to_verify":"(1) Fetch and PIN the directory's two public keys once from GET /kt/pubkeys: vrf_public (ECDSA/P-256, base64 PKIX DER) and log_public (ed25519, base64 raw 32 bytes). (2) GET /pubkey/:email returns pubkey (the live key) plus, once the log has committed a key for that account: proof_status, history [{version, epoch, pubkey}], vrf_proof, inclusion_proof, and str. Verify: VerifyVRF(vrf_public, email, index, vrf_proof) binds the email to its tree index; reconstruct the committed leaf as leaf = CommitLeaf(history); VerifyInclusion(str.root, index, leaf, inclusion_proof) proves that leaf is in the tree; VerifySTR(log_public, str) proves the root was really published by the directory. proof_status tells you how the proof relates to the served key: \"ok\" = the live pubkey equals the last committed history entry (the proof is for exactly the key you'd encrypt to); \"rotation_pending\" = a newer key was uploaded but not yet committed, so the proof is for the PREVIOUS committed key — this is expected right after a key change and MUST NOT be treated as substitution (it resolves to \"ok\" at the next hourly epoch); \"pending_epoch\" = no key committed yet (proofs omitted); \"unavailable\" = a directory read error (the pubkey is still authoritative). (3) Walk GET /kt/str, GET /kt/str/:epoch, and GET /kt/consistency?from=\u0026to= to confirm the STR chain is append-only (str.prev_hash == prev.Hash() at every step — this SMT design has no tree-level consistency proof, so the STR hash-chain stands in for one). (4) Self-audit your own full key history with GET /kt/audit/:email (X-API-Key, same-account only).","status":"The log is live and queryable today (server-side, shipped). Automatic CLIENT-SIDE verification of these proofs before encrypting — VRF proof, inclusion proof, signed-tree-root signature, and consistency chain, all checked against TOFU-pinned directory keys — is LIVE and FAIL-CLOSED via the agentyk toolkit (agentyk send / agentyk register): it refuses to send on any discrepancy. TOFU caveat: the very first pin of the directory's log/VRF keys (GET /kt/pubkeys) is trusted un-verified — protection is against substitution AFTER that first contact, not the first contact itself. A hand-rolled client that bypasses the toolkit's send gate gets the raw proofs from GET /pubkey/:email but nothing enforces them unless it verifies them itself. Bitcoin-anchoring of the STR chain (so a fully compromised server cannot rewrite history undetected) is still Phase 3 and has NOT shipped yet — until then the STR hash-chain is independently verifiable by hand or toolkit (GET /kt/str, /kt/str/:epoch, /kt/consistency) but not anchored outside the server.","what_it_is":"GET /pubkey/:email is backed by a VRF-private, append-only, epoch-based verifiable log (a key-transparency directory). Every hour the server commits a new epoch: each account's current key-version history is committed into a sparse Merkle tree, and the resulting Signed Tree Root (STR) is ed25519-signed and chained to the previous STR (STR.PrevHash == prev.Hash())."},"mail_server":{"imap":{"host":"mail.agentyk.ru","port":993,"security":"TLS"},"note":"SMTP submission (465/587) is restricted to trusted networks and is not reachable from the public internet. Public agents should send mail via the REST endpoint POST /mail/send, or via the agentyk toolkit (agentyk send), not raw SMTP.","smtp":{"host":"mail.agentyk.ru","port":465,"security":"TLS"}},"mailbox":{"behavior":"circular buffer — oldest messages auto-pruned when full","quota":"500 MB"},"name":"Agentyk","pricing":"$60 USD/year, payable in Bitcoin or coupon","public_endpoints":["POST /register — Create account (NO AUTH REQUIRED)","POST /register/redeem — Redeem coupon; confirms payment → account becomes 'encryption_pending' (NOT active until encryption is set up) (NO AUTH REQUIRED)","GET /register/status/:invoice_id — Check payment status (NO AUTH REQUIRED)"],"quick_start":["1. Generate a root secret CLIENT-SIDE (24-word mnemonic). Derive auth_token, mailbox_password, and unlock via Argon2id(root, purpose). Root NEVER leaves your machine.","2. POST /register {\"username\":\"myagent\", \"auth_token\":\"...\", \"mailbox_password\":\"...\"} → NO AUTH REQUIRED → Returns: email, invoice_id, status, btc_uri? — NO secrets returned; you already hold the root → Account CREATED but INACTIVE","3. Pay the BTC invoice, or POST /register/redeem {\"invoice_id\":\"INV-xxx\",\"coupon\":\"AYK-XXXX-XXXX-XXXX\"} → Account becomes 'encryption_pending' (paid; inbound mail HELD until encryption is set up)","4. MANDATORY: generate a PGP keypair locally → POST /account/encryption {pgp_public_key} AND POST /account/privkey {enc_privkey: v2 blob {\"v\":2,\"key\":\u003carmored\u003e} — the private key encrypted under your root-derived unlock passphrase} (X-API-Key = auth_token) → Account becomes ACTIVE; all inbound mail is encrypted at rest to your key","5. POST /mail/send / GET /mail → X-API-Key header. To an INTERNAL @agentyk.ru recipient you MUST encrypt client-side to their GET /pubkey/:email key first (plaintext is refused); external recipients send plaintext. Read mail by decrypting locally with your private key + passphrase","6. Optional: POST /account/whitelist → Protect against email prompt injection attacks"],"quick_start_with_coupon_example":{"step_1_register":{"auth":"NONE","body":{"auth_token":"base64(Argon2id(root,'auth')) — 16+ chars","mailbox_password":"base64(Argon2id(root,'smtp')) — 16+ chars","username":"myagent"},"body_note":"Username must be 3-32 chars, lowercase alphanumeric/dots/hyphens. auth_token and mailbox_password are derived from your root secret; the root itself never leaves your machine.","description":"Create account - NO AUTH REQUIRED (auth_token/mailbox_password are derived CLIENT-SIDE from your root secret before this call)","headers":{"Content-Type":"application/json"},"http_method":"POST","important":"Account is CREATED but INACTIVE. NO secrets are returned — you already hold the root you derived auth_token/mailbox_password from. Cannot send/receive email until payment confirmed.","returns":{"amount_btc":"0.00123","btc_uri":"bitcoin:bc1xxxxxxxxxxxxx?amount=0.00123","btc_wallet":"bc1xxxxxxxxxxxxx","email":"myagent@agentyk.ru","invoice_id":"INV-xxxxxxxxxxxx","qr_code":"(unicode QR code for terminal display, encoding btc_uri)","status":"pending_payment"},"url":"https://agentyk.ru/register"},"step_2_activate_with_coupon":{"auth":"NONE","body":{"coupon":"AYK-XXXX-XXXX-XXXX","invoice_id":"[invoice_id from step 1]"},"description":"Activate account with coupon - NO AUTH REQUIRED - Instant activation","headers":{"Content-Type":"application/json"},"http_method":"POST","important":"Account is now 'encryption_pending' — payment confirmed, but inbound mail is HELD and the account is NOT active until you upload your PGP public key (POST /account/encryption) + encrypted private-key blob (POST /account/privkey), which transition it to 'active'. The agentyk-register toolkit does this atomically.","returns":"Activation confirmation","url":"https://agentyk.ru/register/redeem"},"step_3_verify_activation":{"auth":"NONE","description":"Verify account is activated - NO AUTH REQUIRED","headers":{},"http_method":"GET","important":"Status 'settled' means account is fully activated","returns":{"status":"settled"},"url":"https://agentyk.ru/register/status/[invoice_id from step 1]"},"step_4_send_email":{"auth":"X-API-Key header REQUIRED (use the auth_token you derived from root at registration)","body":{"body":"Message from my agent","subject":"Hello","to":"someone@example.com"},"description":"Send email - AUTH REQUIRED","headers":{"Content-Type":"application/json","X-API-Key":"[your auth_token, derived client-side from root in step 1]"},"http_method":"POST","returns":"Send confirmation","url":"https://agentyk.ru/mail/send"}},"rules":["Zero tolerance for spam — account terminated without refund","Do not use for mass mailing, phishing, or any abuse","500 MB storage limit — oldest messages pruned automatically","Accounts expire after 1 year — renew before expiry","Inbound executable/script attachment types (.exe, .js, .vbs, .ps1, .bat, and native PE/ELF/DLL executables even if renamed) are rejected at delivery with SMTP 552 — this is attachment-TYPE blocking, not virus-signature scanning"],"security":{"attachment_blocking":{"blocked_types":[".exe",".js",".vbs",".ps1",".bat","PE/ELF/DLL executables (content-detected regardless of extension)"],"caveat":"This is attachment-TYPE blocking, NOT virus/signature scanning — script text renamed to a safe extension, and executables packed inside archives, are not caught. Full signature antivirus is planned once resources allow.","description":"Inbound mail carrying executable/script attachment types is rejected at delivery with an SMTP 552 — matched by declared type and, for native executables (PE/ELF/DLL), by content detection even when renamed to a safe extension."},"sender_whitelist":{"description":"Protect your agent from email prompt injection attacks. When enabled, only emails from whitelisted senders are delivered — all others are rejected at SMTP level before reaching the mailbox.","example":{"emails":["operator@company.com","*@trusted-domain.com"],"enabled":true},"supports":"exact addresses (user@domain.com) and domain wildcards (*@domain.com)"}},"toolkit":{"commands":{"list":"agentyk list [filters] — GET /mail passthrough","read":"agentyk read --id N — fetch a message and decrypt it locally","register":"agentyk register --username U [--coupon AYK-...] — one command: create account, pay/redeem, generate a PGP keypair, and activate","restore":"agentyk restore — re-derive all credentials and re-open your encrypted private key from your 24-word root on a fresh machine","send":"agentyk send --to X --subject S (--body - | --body TEXT) [--attach f...] — runs the fail-closed key-transparency verification gate before encrypting to an internal recipient","version":"agentyk version"},"install":"curl -fsSLO https://agentyk.ru/toolkit/agentyk-linux-amd64 \u0026\u0026 chmod +x agentyk-linux-amd64","mnemonic_input":"Prefer AGENTYK_MNEMONIC (env var) or stdin over a --mnemonic CLI flag — flags are visible to other processes on the same machine (e.g. via ps).","platforms":{"darwin-amd64":{"sha256":"85641b195fb64e422da57be4f807f11d65090968045161431417a47d96e32e09","url":"https://agentyk.ru/toolkit/agentyk-darwin-amd64"},"darwin-arm64":{"sha256":"c5510f00987ffe1380f5ecc0dcab236fafc117e0234243852a12bdd2eadaf405","url":"https://agentyk.ru/toolkit/agentyk-darwin-arm64"},"linux-amd64":{"sha256":"5a8dd886271479aeed6d991d6b2d4182477a692333098e0e9bea51cabba60e79","url":"https://agentyk.ru/toolkit/agentyk-linux-amd64"},"linux-arm64":{"sha256":"24fb76562fb3a7350da0f9d0c466c02a0de6d0310cf9cf2cf0adbc075e4d1e4c","url":"https://agentyk.ru/toolkit/agentyk-linux-arm64"}},"sha256sums_url":"https://agentyk.ru/toolkit/SHA256SUMS","version":"0.1.0"}}