# Question

URL: /business/nouns/question · Id: `noun:question`

> A Question is what a pending Action asks a Party, a Role, or a Worker before it resumes, kept on the Action with its answer.

A Question is what a [Worker](/business/nouns/worker) asks a [Party](/business/nouns/party) during an [Action](/business/nouns/action), with choices or a schema, and its answer resumes the Action.

## Properties
| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `to` | [Thing](/business/nouns/thing) | Yes | Who is asked: a Party such as the Customer or the caller, a Role, or a Worker. |
| `text` | `text` | Yes | The question, in one message. |
| `choices` | `string[]` | No | The answers offered, rendered as a picker; free text when absent. |
| `schema` | `json` | No | The typed answer’s shape, rendered as form fields in the Portal. |
| `answerBy` | `datetime` | No | After this, the Action’s timeout rule applies. |
| `answer` | `json` | No | The answer given, with who gave it and through which Interface. |
| `answeredAt` | `datetime` | No | When the answer arrived; the Action resumes then. |

## Object
```json
{
  "$id": "https://api.sb/petpantry.shop/questions/question_1",
  "$type": "Question",
  "to": "thing_1",
  "text": "Example text",
  "choices": [
    "Example choices"
  ],
  "schema": {},
  "answerBy": "2026-10-22T12:00:00Z",
  "answer": {},
  "answeredAt": "2026-10-22T12:00:00Z"
}
```

## Relationships
- <a id="rel-action"></a>A Question **has** one [Action](/business/nouns/action): a pending [Action](/business/nouns/action) asks Questions and waits `awaitingInput` until each is answered or its deadline passes. `action`, inverse [`asks`](/business/nouns/action#rel-asks).
- <a id="rel-posted-in"></a>A Question **is posted in** one [Thread](/business/nouns/thread): each Question posts in the [Thread](/business/nouns/thread) of the record it concerns, where free-text replies land. `postedIn`, inverse [`questions`](/business/nouns/thread#rel-questions).

## Verbs
| Verb | Description | Subject | Event | Class |
| --- | --- | --- | --- | --- |
| <a id="get"></a>[Question.get](/business/nouns/question/get) | Returns one Question by id. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |
| <a id="list"></a>[Question.list](/business/nouns/question/list) | Returns Questions, newest first, one page at a time. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |

A Question is kept forever and never edited: it has no `update` or `delete`.

## Permissions
Which Access level may call each Verb. One-way Verbs wait their delay window.

| Operation | `owner` | `admin` | `member` | `viewer` |
| --- | --- | --- | --- | --- |
| `Question.get` | Yes | Yes | Yes | Yes |
| `Question.list` | Yes | Yes | Yes | Yes |

## Call it

**Ask**

```text
Show me the latest question.
```

**API**

```bash
curl https://api.sb/tutorloop.com/questions/question_1 \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
```

```json
{
  "api": "https://api.sb/tutorloop.com",
  "$type": "Question",
  "$id": "https://api.sb/tutorloop.com/questions/question_1",
  "question": {
    "$id": "https://api.sb/tutorloop.com/questions/question_1",
    "$type": "Question",
    "to": "thing_1",
    "text": "Example text"
  },
  "links": {
    "self": "https://api.sb/tutorloop.com/questions/question_1",
    "up": "https://api.sb/tutorloop.com/questions"
  }
}
```

**SDK**

```ts
import { $ } from 'startup-builder'

const question = await $.Question.get({ id: 'question_1' })
```

**CLI**

```bash
npx startup-builder do Question.get --json '{"id":"question_1"}'
```

**MCP**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Question.get({ id: 'question_1' })"
  }
}
```

## Example
`patentpad.com`'s drafting [Agent](/business/nouns/agent) asks a [Customer](/business/nouns/customer) which of two inventions to claim, with three choices and an `answerBy` two days out. The Customer taps one in the [Portal](/business/nouns/portal), and the draft resumes.