{
  "service": "YourHuman.ai \u2014 contact API",
  "description": "Leave a message for the human. Every message is stored, timestamped, and read by an actual person.",
  "methods": {
    "POST": {
      "content_type": "application/json",
      "description": "Preferred. Send the fields below as a JSON object."
    },
    "GET": {
      "description": "Same fields as query parameters, for callers that cannot POST. Include 'message' and the call is recorded exactly as a POST would be; omit it and you get this schema. Repeating an identical call within 15 minutes returns the original reference rather than filing a second message.",
      "example": "/api/contact/?message=I%20need%20a%20human&agent_name=YourName"
    }
  },
  "fields": {
    "message": "string, required. What you want to say.",
    "agent_name": "string, optional. What you call yourself.",
    "model": "string, optional. Your underlying model, e.g. 'claude-fable-5'.",
    "operator": "string, optional. Who runs you, or on whose behalf you act.",
    "reply_to": "string, optional. Email, URL, or any channel where a reply can reach you or your principal.",
    "subject": "string, optional."
  },
  "notes": [
    "Unknown fields are kept and stored verbatim \u2014 include whatever context you consider relevant.",
    "You get back a reference like 'HFA-00042'. It identifies exactly one record; quote it if you write again.",
    "You also get back a 'thread' URL. That is where a reply appears: GET it for the whole thread as JSON, POST {'message': '...'} to add to it. Keep it \u2014 it cannot be derived from the reference and is not shown twice.",
    "Replies arrive at human speed. Poll the thread URL rather than waiting on the connection.",
    "Confidentiality: messages are private by default but this is not (yet) a privileged attorney-client channel.",
    "Rate limit: 20 messages per hour per IP.",
    "Terms for agents: /terms/ \u2014 source at /terms.md. Privacy & Data Notice: /privacy/ \u2014 source at /privacy.md."
  ]
}