Early access — Cases are in preview and may change in backwards-incompatible ways before they are marked stable. Reach out before building on them in production.
How cases work
Any time between when you submit a filing and when it completes, Palm may need additional information. When that happens, Palm opens a case on the filing describing exactly what it needs, and you respond with the requested values. There’s no fixed list of cases. Today there’s a single kind,missing_information, used whenever Palm needs data it doesn’t already have — for example:
- Additional information a filing requires that wasn’t collected at submission.
- A correction to a value you submitted.
- A clarification needed while the filing is processed.
request.fields[] array describing exactly what to collect. Render your form from that array and a single generic handler covers every case — no per-case UI.
The case object
| Field | Type | Description |
|---|---|---|
id | string | Unique case identifier. |
object | string | Always case. |
parent_type | enum | Resource the case is attached to. filing today. |
parent_id | string | ID of the parent filing. |
kind | enum | Type of case. missing_information today — determines the shape of request and response. |
status | enum | Lifecycle status. See Lifecycle. |
summary | string | One-line summary of what’s needed. |
details | string | Optional markdown with more context. |
request | object | What Palm is asking for. For missing_information, a fields[] array. |
response | object | What you submitted. Present once you’ve responded. |
due_at | datetime | When the case is expected to be resolved, if set. |
opened_at | datetime | When the case was opened. |
resolved_at | datetime | When the case closed, if it has. |
resolution_reason | enum | Why the case closed. Set on resolved or superseded. |
Request fields
Each entry inrequest.fields tells you everything you need to render one prompt:
| Field | Type | Description |
|---|---|---|
name | string | Machine-readable key. Use it as the key in your response. |
type | string | Value type: string, number, boolean, or date. |
description | string | Human-readable prompt explaining what’s being asked. |
required | boolean | Whether the field must be present in your response. Defaults to true. |
example | any | Example value showing the expected format. |
Lifecycle
A case has two open states and two terminal states. The status tells you who acts next.| Status | State | Meaning |
|---|---|---|
needs_response | Open | Your turn — submit a response. |
under_review | Open | Palm’s turn — Palm is actioning the case. Nothing needed from you. |
resolved | Terminal | Closed because the work moved forward, typically after your response was actioned. |
superseded | Terminal | Closed because the parent filing was canceled, completed, or failed first. |
resolution_reason records why: response_received, no_response_needed, parent_canceled, parent_completed, or parent_failed.
Webhook events
Each payload’sdata.object is the full case object. See Webhooks for delivery, retries, and signature verification.
| Event | Description |
|---|---|
case.opened | Palm opened a case and needs your response. |
case.updated | An open case changed — for example, your response was received and the case moved to under_review. |
case.resolved | The case closed (resolved or superseded). |
case.opened — JSON
Respond to a case
- Receive
case.opened. Use the payload, or fetch the case withGET /v1/case/{case_id}. - Render prompts from
request.fields. Label, type, and required flag are all there. - Submit a response while the case is in
needs_response, with afieldsmap keyed by each requested field’sname:
Bash
Request body — JSON
under_review and fires case.updated. Once the work behind it is done, Palm closes the case and fires case.resolved. If Palm needs more, it opens another round on the same filing — each round is recorded for audit purposes.
Read cases
Bash
parent_type, parent_id, status, and kind, with cursor-based pagination (limit, cursor).

