Core Fields
| Field | What it means in the implementation |
|---|---|
caseId | A random UUID generated when the case is created. |
clientReferenceId | Your own identifier. Offload stores it and echoes it in GET /cases/{id} and webhook payloads. |
channel | Validated as EMAIL or SMS, but the workflow is currently email-based. Use EMAIL. |
goal | The business outcome Offload is trying to achieve. objective is required. knowledge can be a string or an object. |
counterparty | The person or team Offload contacts. address and name are required. |
senderPersona | How Offload should represent your side of the conversation. name is required. |
constraints | Extra instructions the worker passes into the LLM prompt. |
resultSchema | An optional object describing the shape of the final result. The API only validates that it is an object. |
metadata | Opaque JSON stored on the case and echoed in webhook payloads. It is not currently returned by GET /cases/{id}. |
clientWebhookUrl | Optional URL for outbound webhook delivery. |
Runtime Fields
| Field | Runtime meaning |
|---|---|
status | One of CREATED, RUNNING, INPUT_NEEDED, COMPLETED, FAILED. |
attemptCount | Number of outbound messages sent so far. After the initial outreach succeeds, this becomes 1. |
maxAttempts | Maximum number of automated follow-up attempts after the initial outreach. |
nextActionAt | Unix timestamp in milliseconds for the next scheduled check or follow-up. When nothing is scheduled, the implementation uses 253402300799999. |
attachments | Inbound attachments seen on the case thread. Each entry is metadata only. Download URLs are minted separately. |
resultStatus | A workflow outcome string such as goal_achieved, max_retries, failed_rejected, BOUNCED, COMPLAINED, or REJECTED. Treat this as an open set. |
result | Structured JSON extracted when the case completes successfully. |
failureReason | Present on some failures, especially provider delivery failures or explicit rejection-style outcomes. |
inputRequest | Active human-in-the-loop question, if the case is paused. |
inputRequestId | Stable identifier for the active input request. |
inputRequestStatus | PENDING, RESOLVED, or NONE. |
Defaults
If you omit them at creation time:maxAttemptsdefaults to3followUpDelayHoursdefaults to72
- 1 initial outreach
- up to 3 automated follow-ups
Attachments
Attachments are tracked separately fromresult:
- they come from inbound reply events
- they are stored as metadata on the case
- they appear in webhook payloads and
GET /cases/{id} - you fetch a fresh
downloadUrlwithGET /cases/{id}/attachments/{attachmentId}
Usage Limits
POST /cases checks monthly usage before creating a new case:
SANDBOX:100PAYG:100BASE_PRO:500
- created cases in the current UTC month
- billable finished cases in the current UTC month
resultStatus is BOUNCED, REJECTED, or COMPLAINED.
Design Advice
Good cases are:- specific
- bounded to one outcome
- easy to verify from the conversation
- “Collect a signed W-9 from the vendor.”
- “Confirm whether the Tuesday delivery window works.”
- “Get the corrected March invoice.”
- “Handle vendor onboarding.”
- “Figure out what to do.”
- “Manage all communication with this account forever.”