article_card
A retrieved passage with its source named.
The answer is the policy. article_card shows the passage the copilot retrieved and names where it came from.
It exists because a grounded answer and a confident one look identical in prose. The source line is the difference, and it belongs on screen rather than in the model's good intentions.
Re-rendered in the browser from the SDK’s own scales. Not a screenshot.
Rendered natively by the Flutter SDK and the Web SDK, both since 0.1.0.
When not to use it
Do not use it when a summary serves better: if the exact wording does not matter, answer in text and keep the turn short.
Do not use it for something you did not retrieve. A named source that was never read is worse than no source, because it converts a guess into a citation.
Props
Every block also carries type and a required fallback_text of 1 to 300 characters.
| Prop | Type | Required | Constraints |
|---|---|---|---|
title | string | Yes | 1 to 120 characters. |
excerpt | string | Yes | 1 to 400 characters. |
source | string | Yes | 1 to 80 characters. The knowledge source it came from. |
updated | string | No | Up to 40 characters. |
cta | object | No | Usually an open_url to the full document. |
cta.label | string | Yes | 1 to 60 characters. |
cta.action | action | Yes | { kind: "reply", text } or { kind: "open_url", url }. See Actions. |
On the wire
{
"id": "blk_23",
"type": "article_card",
"fallback_text": "Unworn shoes can be returned within 30 days, from the shipping and returns FAQ.",
"props": {
"title": "Returns policy",
"excerpt": "Unworn shoes can be returned within 30 days for a full refund. Refunds land within 5 business days after the return is received.",
"source": "Shipping & returns FAQ",
"updated": "Updated 4 Aug"
}
}Interaction
Only the optional cta. The card itself is a readout.
States
| State | What the SDK draws |
|---|---|
| Loading | A title line, two excerpt lines and the CTA button shape, at their real heights. |
| Long excerpt | Wraps in full; the card grows rather than truncating a policy mid-sentence. |
| No source | Fails validation. source is required precisely so this block cannot be uncited. |
Accessibility
The source sits behind a hairline and is announced after the excerpt, so a screen reader hears the claim and then where it came from. It is set at label weight rather than in the accent, because accent-coloured body ink is 3.3:1 on a light surface.
fallback_text should carry both the answer and the source.