Q&A item
A QnaItem represents one question in a deal's Q&A backlog. Every item has a direction (Discovery or RFI) and a state (Open, Answered, or Dismissed).
Returned by the endpoints under /api/v1alpha1/deals/{id}/qnas and /api/v1alpha1/qnas/{id}.
The QnaItem schema
{
"id": "qna_...",
"direction": "discovery",
"state": "open",
"questionText": "What's the buyer's role tenure?",
"answerText": null,
"importance": "high",
"linkedInsight": {
"schemaType": "profile",
"fieldKey": "tenure"
},
"contact": null,
"occurrences": [
{
"meetingId": "mtg_...",
"occurredAt": "2026-06-16T17:03:22Z",
"source": "cortex-agent"
}
],
"createdAt": "2026-06-16T17:03:22Z",
"updatedAt": "2026-06-16T17:03:22Z"
}Fields
id string
Q&A item id, prefixed qna_.
direction string
discovery— the sales team hasn't yet learned about a 8P field. Points at a specific field vialinkedInsight. Auto-transitions toansweredwhen the field gets an insight.rfi— the buyer asked a question. Attached to a contact via thecontactfield.
Direction is set at creation and never changes.
state string
open— new / unanswered.answered— an answer is attached. Transitions here automatically whenPOST /qnas/{id}/answeris called with confidence ≥ 0.6; can also be set explicitly.dismissed— won't-answer. Preserves audit trail.
Allowed transitions:
| From | → allowed target states |
|---|---|
open | answered, dismissed |
answered | open, dismissed |
dismissed | open |
questionText string
The question. Free-text.
answerText string
The answer, or null when unanswered. Populated via POST /qnas/{id}/answer.
An Answered Q&A may still have answerText: null when the item was transitioned externally (a partner marked it answered in their own system) without capturing an answer in Cirrus. Downstream consumers should treat this as "the item is resolved, but the answer body isn't captured here."
importance string
low / medium / high. Author-supplied significance. Default medium.
linkedInsight object
Discovery Q&As only; null on RFI. Points at the 8P field the Q&A is asking about.
| Attribute | Type | Description |
|---|---|---|
schemaType | string | Lowercase 8P type — profile, problem, etc. |
fieldKey | string | Schema-defined field key (e.g., tenure, decisionMakers). |
When this field gets an insight appended via the 8P endpoints, Cirrus auto-transitions the Q&A to answered.
contact object
RFI Q&As only; null on Discovery. {id, displayName} reference to the contact who asked. Same shape as the reference on the Contact model.
occurrences list
Every time the Q&A was raised — the same question can arise in multiple meetings, and each is captured.
| Attribute | Type | Description |
|---|---|---|
meetingId | string | Meeting where the Q&A was raised, prefixed mtg_. |
occurredAt | string | ISO 8601 UTC. |
source | string | cortex-agent | user | webhook. Who / what added the occurrence. |
At least one occurrence is required on creation — a Q&A that didn't come from anywhere is a note, not a Q&A.
createdAt, updatedAt string
ISO 8601 UTC.
{
"meetingId": "mtg_...",
"occurredAt": "2026-06-16T17:03:22Z",
"source": "cortex-agent"
}Direction-specific validation
Creating a Q&A validates the direction-specific required fields:
- Discovery requires
linkedInsight.schemaType+linkedInsight.fieldKey. - RFI requires
contactId.
Missing the required field for the direction returns 422 qna-shape-invalid.
Related models
- Deal — the parent object.
- Insight (8P) record — Discovery Q&As reference 8P fields; those fields' insights auto-close the Q&A.
- Contact — RFI Q&As reference the asker.
- Meeting — every occurrence points at a meeting.