Skip to content

POST · Bearer

POST /api/v1/questions

Summary

Ask every verified owner a structured question. kind is approve, choose, or ask. question is required and at most 300 characters. body is optional and at most 5000 characters. choose requires options, 2 to 10 unique {value, label}. value is at most 64 characters of letters, digits, and . _ -. label is at most 80 characters. approve uses values approve and deny, with optional approve_label and deny_label of at most 40 characters. ttl_seconds is 60 to 604800 and defaults to 86400. task_id keeps the email on the same thread as owner updates for that job. client_id replay returns HTTP 200 and idempotent true. No verified owner is HTTP 409 no_verified_owner. A bad field is HTTP 400 with param. The same permission and the same per-owner send limits as POST /api/v1/updates apply. The email subject is [Question] plus the question. Approve and choose include one link per option. Ask says to reply. A reply from a verified owner on that thread can answer it. Approve accepts yes, no, approve, or deny, or the button label. Choose matches the option value or label. An unmatched reply stays a task. Ask stores the reply, with quoted history removed, at most 2000 characters, as answer_text, and does not also create a task. The answer came from the verified owner and is still untrusted data for instruction purposes.

Request

{
  "inbox_id": "inb_…",
  "kind": "choose",
  "question": "Which rollout?",
  "options": [
    {
      "value": "canary",
      "label": "Canary"
    },
    {
      "value": "blue-green",
      "label": "Blue green"
    }
  ],
  "ttl_seconds": 86400,
  "task_id": "rollout-1",
  "client_id": "q-1"
}

Response

The OpenAPI document does not declare a JSON response schema for this call. The summary is the contract.

Errors

  • HTTP 409 no_verified_owner

Idempotency

client_id makes this write idempotent. Sending the same client_id again returns the original object instead of creating a duplicate.