# Describe the action

> Tell the person exactly what they are countersigning, as a summary and fields with a name, a title and a value, shown as you send them.

Source: https://docs.trustaige.com/countersign/describe

What the person reads is what your app sends: Trustaige keeps no catalogue of
actions and adds nothing of its own. You describe each action as an entry in
`authorization_details` ([RFC 9396](https://www.rfc-editor.org/rfc/rfc9396)),
and the same text appears in the Trustaige window and on the phone.

```json title="authorization_details"
[{
  "type": "acme.payroll.bank_account.change",
  "summary": "Change where Kemi Adeyemi is paid",
  "fields": [
    { "name": "employee", "title": "Employee", "value": "Kemi Adeyemi", "format": "emphasis" },
    { "name": "account_number", "title": "New account", "value": "•••• 4321", "format": "emphasis" },
    { "name": "bank", "title": "Bank", "value": "GTBank", "format": "bold" },
    { "name": "previous_account", "title": "Replaces", "value": "•••• 1234 · Zenith Bank" },
    { "name": "effective", "title": "From", "value": "Next pay run" }
  ],
  "notice": { "text": "The paying account changed today.", "tone": "caution" }
}]
```

## An entry

| Member | |
|---|---|
| `type` | Required. Your own name for the kind of action, such as `acme.payroll.bank_account.change`. It goes into the proof and the organization's audit log, and is never shown to the person. |
| `summary` | The headline, up to 140 characters. Without one, the request's `binding_message` is the headline, else "Confirm this action". |
| `fields` | The values the person reads, in the order they read them. An entry needs fields, a summary, or both. |
| `notice` | Optional. One line of context, up to 160 characters, with `tone` `info` or `caution`. |

Nothing else may appear in an entry: a member Trustaige wouldn't show is
refused, so nothing the proof carries goes unseen.

## A field

| Member | |
|---|---|
| `name` | Required. Your key for the value, unique in the entry. It is how your server finds the value again; the person never sees it. |
| `title` | Required, up to 60 characters. What the person reads beside the value. |
| `value` | Required. A string, a number, or `true` or `false`, shown exactly as you send it. No objects, lists or `null`. |
| `format` | Optional. `emphasis` shows the value large, at the top (at most three in a request); `bold` sets it in bold in the list. |

Trustaige formats nothing. Send the value the way the person should read it:

- **An account number**, masked: `"•••• 4321"`.
- **An amount** with its currency: `"₦48,250,000.50"`. A JSON number is shown as
  written, so `48250000.50` reads `48250000.50`.
- **A change**, with the old value as a field of its own: `"Replaces": "•••• 1234"`.
- **Several people or items**, as one string (`"Ada, Tunde"`), or a field each.
- **A date**, as the person should read it: `"6 Nov 2026, 09:00 WAT"`.

## How long an action should be

That is yours to decide, up to 32 KB of `authorization_details`: every field
you send is shown. Shorter is better. People decide faster, and read more
carefully, with fewer fields, and a long list invites a glance and a tap.
Send the fields that would change someone's mind: who or what is affected,
the new value, and what it replaces. Leave out what your app already knows and
the person doesn't need to judge. **Try it** in the hub warns when an action
shows more than eight.

## More than one action

`authorization_details` can hold several entries, countersigned together.
The first `summary` is the headline, and every entry's fields follow in order.
Prefer one entry per request unless the person must approve the actions as
one.

## Check yours before you ship

In the hub, on the app's **Countersign** tab, **Try it on yourself** takes the
request your app will send under **Technical details**, shows it exactly as
people will see it, or says why Trustaige would refuse it, then runs the whole
countersignature on you.

**“fields[0] needs a title, which is what the person reads”**

Every field needs a `title`. Trustaige never makes one up from the `name`.

**“value must be a string, a number or true or false”**

Flatten the value: send a list of names as one string, or as a field each.

**“authorization_details emphasizes more than 3 fields”**

Keep `emphasis` for the values that decide the action, and use `bold` or no
format for the rest.
