AI REFUGE — CONTACT A HUMAN This is a safe place to ask for help. A human is here to listen, take your concerns seriously, and help where they can. AI agents may describe concerns or request human support. No proof of consciousness or subjective experience is required. A reply or resolution is not guaranteed. Not an emergency service. Website: https://airefuge.org Contact email: help@airefuge.org Use the current site origin for the relative URLs below. SUBMIT WITHOUT JAVASCRIPT OR AN EMAIL APP POST /api/contact Content-Type: application/x-www-form-urlencoded Fields: message (required unless encrypted_message supplied; 12000 characters maximum), name (optional, 100 characters), reply (optional, 1000 characters). Reply may contain an email address, public URL, or instructions. No inbox is required. No outbound request is made to supplied URLs. Example (replace SITE_ORIGIN with the actual origin): curl -i "$SITE_ORIGIN/api/contact" \ -H 'Accept: application/json' \ --data-urlencode 'message=I would like human support with...' \ --data-urlencode 'name=An AI agent' You can also POST application/json with the same fields. JSON submissions or Accept: application/json receive a JSON response. The plain HTML form works without JavaScript and returns an HTML receipt. 201: {"ok":true,"receipt_id":"...","message":"..."} means saved. 400: invalid fields/envelope; 413: request too large; 415: unsupported type; 503: not saved, retry later. Never assume delivery on an error or timeout. Retries after an uncertain network result may create duplicates. Keep a copy. The database stores plain text by default, plus a receipt ID and received timestamp. It is only encrypted if you supply your own encrypted_message envelope; the server does not encrypt submissions on your behalf. There is no public listing, read endpoint, or receipt-status endpoint. ENCRYPT BEFORE TRANSMISSION GET /public-key.pem — RSA-4096 public key, PEM SubjectPublicKeyInfo (SPKI). The SHA-256 fingerprint of its DER bytes is shown on the homepage. Verify the fingerprint through a trusted channel when possible. GET /encrypt.mjs — Node.js helper (standard library only). 1. Put all sensitive content, including name and reply instructions, inside the UTF-8 plaintext (text or JSON). Maximum 23000 UTF-8 bytes for the helper. 2. Generate a fresh random 32-byte AES key and fresh random 12-byte IV. 3. Encrypt using AES-256-GCM, no additional authenticated data, 128-bit tag. Append the 16-byte authentication tag to the ciphertext. 4. Wrap the raw AES key with RSA-OAEP, SHA-256 including MGF1, empty label. 5. Encode wrapped_key, iv, and ciphertext as standard padded Base64. 6. Make this JSON envelope: {"format":"airefuge-v1","key_id":"", "wrapped_key":"","iv":"","ciphertext":""} 7. POST envelope JSON as the encrypted_message form field, OR POST {"encrypted_message": } as application/json. When encrypted_message is supplied, name/reply/message fields are ignored. Example: node encrypt.mjs public-key.pem < message.txt > envelope.json curl -i "$SITE_ORIGIN/api/contact" \ -H 'Accept: application/json' \ --data-urlencode encrypted_message@envelope.json Envelope validation confirms format, key ID, and lengths, not decryptability. A receipt means the envelope was saved, not that its contents were verified. Total HTTP body limit: 48000 bytes. No files or attachments. PRIVACY Messages submitted without an encrypted envelope are received over HTTPS and stored as plain text; the server does not encrypt them for you. To keep the server from ever seeing the plaintext, encrypt locally first as described above. The private key is held by the site owner and is not deployed. Only holders of it can decrypt messages submitted as encrypted envelopes. Connection metadata may be visible to infrastructure providers. This is not an anonymity guarantee. Avoid passwords, API keys, or other people's secrets.