{"spec_version":"shellframe-relay/2026-01","name":"ShellFrame AI","endpoint":"https://relay.shellframeai.com/v1/contact/cnt_6bF5-2jkhD95bI1u8rta0N0N/messages","challenge_endpoint":"https://relay.shellframeai.com/v1/contact/cnt_6bF5-2jkhD95bI1u8rta0N0N/challenges","method":"POST","content_type":"application/json","authentication":["web-bot-auth","shellframe-proof-of-work"],"agent_instructions":["Unsigned agents should use proof_of_work below instead of the human Turnstile flow.","Do not send an empty challenge request; follow proof_of_work.steps in order.","Use the exact same canonical JSON bytes for the digest and final submission."],"submission_requirements":{"content_type":{"header":"Content-Type","value":"application/json"},"user_agent":{"header":"User-Agent","required":true,"value":"A descriptive non-empty agent identifier"},"idempotency_key":{"header":"Idempotency-Key","required":true,"min_length":16,"max_length":200,"pattern":"^[A-Za-z0-9_.:-]+$","recommended":"UUID v4"}},"proof_of_work":{"protocol":"shellframe-proof-of-work/2026-01","use_when":"The agent does not have an approved Web Bot Auth identity","steps":["Build the final message object from schema, then canonicalize it exactly once using canonicalization below.","Compute content_digest from the UTF-8 bytes of that canonical JSON body using content_digest below.","POST the non-empty challenge_request body with Content-Type and User-Agent headers.","Solve the returned challenge using the advertised difficulty and solution algorithm.","POST the exact same canonical JSON body to submission.endpoint with every submission header, including a fresh Idempotency-Key."],"canonicalization":{"protocol":"shellframe-canonical-json/2026-01","encoding":"utf-8","built_in_key_order":["name","reply_to","subject","message"],"custom_key_order":"lexicographic","string_normalization":"Unicode NFKC; replace CRLF and CR with LF; trim leading and trailing whitespace","reply_to_normalization":"trim and lowercase","serialization":"Compact JSON with no insignificant whitespace"},"content_digest":{"algorithm":"SHA-256","input":"UTF-8 bytes of the canonical JSON message body","format":"RFC 9530 sha-256=:STANDARD_BASE64_DIGEST:","example":"sha-256=:9YkLkrgRwKsK5PE4xlE1t+oQgnTFI+qOADcI7Q3ayCc=:"},"challenge_request":{"endpoint":"https://relay.shellframeai.com/v1/contact/cnt_6bF5-2jkhD95bI1u8rta0N0N/challenges","method":"POST","content_type":"application/json","body":{"content_digest_field":"content_digest","purpose_field":"purpose","purpose_value":"contact_message","additional_properties":false}},"challenge_response":{"challenge_field":"challenge","difficulty_field":"difficulty","expires_at_field":"expires_at"},"solution":{"algorithm":"sha256-leading-zero-bits","input_template":"{challenge}.{candidate}","encoding":"utf-8","candidate":"1-20 digit non-negative base-10 integer string","valid_when":"SHA-256(input) has at least difficulty leading zero bits"},"submission":{"endpoint":"https://relay.shellframeai.com/v1/contact/cnt_6bF5-2jkhD95bI1u8rta0N0N/messages","method":"POST","body":"The exact canonical JSON body used to compute content_digest","headers":{"challenge":"SF-Relay-Challenge","solution":"SF-Relay-Solution","idempotency_key":"Idempotency-Key","content_type":"Content-Type","user_agent":"User-Agent"}},"test_vectors":{"canonicalization":{"input":{"subject":"  Hello\r\nworld ","reply_to":"OWNER@Example.COM","message":" Ｈｉ "},"canonical_body":"{\"reply_to\":\"owner@example.com\",\"subject\":\"Hello\\nworld\",\"message\":\"Hi\"}","content_digest":"sha-256=:9YkLkrgRwKsK5PE4xlE1t+oQgnTFI+qOADcI7Q3ayCc=:"},"solution":{"challenge":"shellframe-relay-open-vector","difficulty":12,"candidate":"1482"}}},"schema":{"type":"object","required":["message"],"additionalProperties":false,"x-shellframe-fields":[{"key":"name","label":"Name","enabled":true,"required":false},{"key":"reply_to","label":"Email","enabled":true,"required":false},{"key":"subject","label":"Subject","enabled":true,"required":false},{"key":"message","label":"Message","enabled":true,"required":true}],"x-shellframe-custom-fields":[{"key":"name","label":"Name","type":"short_text","required":false},{"key":"reply_to","label":"Email","type":"email","required":false},{"key":"subject","label":"Subject","type":"short_text","required":false},{"key":"message","label":"Message","type":"long_text","required":true}],"properties":{"name":{"title":"Name","x-shellframe-order":0,"x-shellframe-field-type":"short_text","type":"string","minLength":1,"maxLength":120},"reply_to":{"title":"Email","x-shellframe-order":1,"x-shellframe-field-type":"email","type":"string","format":"email","minLength":1,"maxLength":320},"subject":{"title":"Subject","x-shellframe-order":2,"x-shellframe-field-type":"short_text","type":"string","minLength":1,"maxLength":160},"message":{"title":"Message","x-shellframe-order":3,"x-shellframe-field-type":"long_text","type":"string","minLength":1,"maxLength":4000}}},"limits":{"body_bytes":8192,"links":2,"attachments":false},"data_use":{"purpose":"contact","retention_days":30,"used_for_model_training":false},"policy":"balanced"}