Sophtron-Api V2 endpoints OAS 3.0
Authentication is unchanged: send the same Authorization header you use for existing v2 endpoints. Action endpoints additionally require the action scope on your API key.
Customers
existing▾| Name | Description |
|---|---|
customerID* string (path) | Your Sophtron customer identifier. |
| Code | Description |
|---|---|
| 200 | Customer record Example Value {
"CustomerID": "cus_01HQ\u2026",
"Name": "Acme Agent Co.",
"Members": 3,
"CreatedAt": "2025-11-04T09:12:00Z"
} |
| 404 | Customer not found |
Members
existing · link an institution with consent▾ConsentToken from the Sophtron widget, or supply credentials directly for server-side flows. A member created this way carries both access and action capabilities when the institution supports actions.| Name | Description |
|---|---|
customerID* string (path) | Your Sophtron customer identifier. |
{
"InstitutionID": "inst_duke_energy",
"ConsentToken": "cst_2f9a\u2026",
"UserName": "optional-if-using-widget",
"Password": "optional-if-using-widget"
}| Code | Description |
|---|---|
| 201 | Member created Example Value {
"MemberID": "mbr_5c10",
"CustomerID": "cus_01HQ\u2026",
"InstitutionID": "inst_duke_energy",
"InstitutionName": "Duke Energy",
"Status": "Linked",
"MFARequired": false,
"Capabilities": [
"access",
"action"
],
"CreatedAt": "2026-10-02T14:01:08Z"
} |
| 202 | MFA required — poll the member until Status is LinkedExample Value {
"MemberID": "mbr_5c10",
"Status": "MFAPending",
"MFAPrompt": "Enter the 6-digit code sent to \u2022\u2022\u2022\u20221234"
} |
| 400 | Invalid request |
access, action) available for this member.| Name | Description |
|---|---|
customerID* string (path) | Your Sophtron customer identifier. |
memberID* string (path) | Member (institution connection) identifier. |
| Code | Description |
|---|---|
| 200 | Member record Example Value {
"MemberID": "mbr_5c10",
"CustomerID": "cus_01HQ\u2026",
"InstitutionID": "inst_duke_energy",
"InstitutionName": "Duke Energy",
"Status": "Linked",
"MFARequired": false,
"Capabilities": [
"access",
"action"
],
"CreatedAt": "2026-10-02T14:01:08Z"
} |
| 404 | Member not found |
Accounts
Access · read data (unchanged)▾AccountID values.| Name | Description |
|---|---|
customerID* string (path) | Your Sophtron customer identifier. |
memberID* string (path) | Member (institution connection) identifier. |
| Code | Description |
|---|---|
| 200 | Array of accounts Example Value [
{
"AccountID": "acct_8f2a",
"MemberID": "mbr_5c10",
"AccountName": "Electric Service \u2022\u20227731",
"AccountType": "Utility",
"Balance": 142.18,
"Currency": "USD",
"DueDate": "2026-10-15",
"Status": "Active",
"LastUpdated": "2026-10-02T14:03:21Z"
},
{
"AccountID": "acct_9b11",
"MemberID": "mbr_5c10",
"AccountName": "Gas Service \u2022\u20222209",
"AccountType": "Utility",
"Balance": 38.4,
"Currency": "USD",
"DueDate": "2026-10-20",
"Status": "Active",
"LastUpdated": "2026-10-02T14:03:21Z"
}
] |
| 401 | Unauthorized |
| 404 | Member not found |
| Name | Description |
|---|---|
customerID* string (path) | Your Sophtron customer identifier. |
memberID* string (path) | Member (institution connection) identifier. |
accountID* string (path) | Account identifier. |
startDate date (query) | ISO date (inclusive). |
endDate date (query) | ISO date (inclusive). |
| Code | Description |
|---|---|
| 200 | Array of transactions Example Value [
{
"TransactionID": "txn_4a\u2026",
"Date": "2026-09-15",
"Description": "Payment - Thank You",
"Amount": -139.9,
"Currency": "USD"
}
] |
Actions
Action · free-form instructionNEW▾Instruction field is free-form natural language: describe what you want done, the way you would brief a human assistant. Sophtron's engine turns the instruction into a concrete plan, classifies each step as reversible or irreversible, and either executes it or pauses for a human decision.
Mode—planreturns the plan without executing anything;executeruns it.Parameters— optional structured guardrails (MaxAmount,Currency,NotAfter, …) the engine must respect.RequireApproval—auto(default) pauses only when a step is irreversible;alwayspauses on every action;neveris rejected if the plan contains an irreversible step.IdempotencyKey— retries with the same key never create a second action.
Reversible: false. When a plan contains such a step the action stops in awaiting_approval and an approval request is created automatically. It only proceeds after an explicit allow from the account holder; a deny or expiry ends the action. This cannot be bypassed with RequireApproval: never.| Name | Description |
|---|---|
customerID* string (path) | Your Sophtron customer identifier. |
memberID* string (path) | Member (institution connection) identifier. |
{
"AccountID": "acct_8f2a",
"Instruction": "Pay the current electricity bill in full before the due date, using my saved checking account ending in 4821.",
"Parameters": {
"MaxAmount": 250.0,
"Currency": "USD",
"NotAfter": "2026-10-15"
},
"Mode": "execute",
"RequireApproval": "auto",
"ApprovalChannel": "widget",
"IdempotencyKey": "7d3e9c2a-4b1f-4d6e-9a0c-1f2e3d4c5b6a",
"CallbackURL": "https://yourapp.com/hooks/sophtron"
}| Code | Description |
|---|---|
| 202 | Action accepted. If an irreversible step was planned, Status is awaiting_approval and an Approval object is included.Example Value {
"ActionID": "act_01J9X7KQ2M",
"MemberID": "mbr_5c10",
"AccountID": "acct_8f2a",
"Status": "awaiting_approval",
"Plan": {
"Summary": "Pay $142.18 to Duke Energy from Checking \u2022\u20224821 on or before 2026-10-15",
"Steps": [
{
"Step": 1,
"Description": "Sign in to Duke Energy",
"Reversible": true
},
{
"Step": 2,
"Description": "Open current bill ($142.18, due 2026-10-15)",
"Reversible": true
},
{
"Step": 3,
"Description": "Submit one-time payment of $142.18 from Checking \u2022\u20224821",
"Reversible": false
}
],
"Irreversible": true,
"RiskLevel": "medium",
"EstimatedEffects": [
{
"Type": "payment",
"Amount": 142.18,
"Currency": "USD",
"Payee": "Duke Energy"
}
]
},
"Approval": {
"ApprovalID": "apr_01J9X7KR8Z",
"Status": "pending",
"Channel": "widget",
"PromptURL": "https://widget.sophtron.com/approve/apr_01J9X7KR8Z",
"ExpiresAt": "2026-10-02T14:20:00Z"
},
"CreatedAt": "2026-10-02T14:10:00Z"
} |
| 200 | Mode=plan: plan returned, nothing executedExample Value {
"ActionID": "act_01J9X7KQ2M",
"Status": "planned",
"Plan": {
"Summary": "Pay $142.18 to Duke Energy from Checking \u2022\u20224821 on or before 2026-10-15",
"Steps": [
{
"Step": 1,
"Description": "Sign in to Duke Energy",
"Reversible": true
},
{
"Step": 2,
"Description": "Open current bill ($142.18, due 2026-10-15)",
"Reversible": true
},
{
"Step": 3,
"Description": "Submit one-time payment of $142.18 from Checking \u2022\u20224821",
"Reversible": false
}
],
"Irreversible": true,
"RiskLevel": "medium",
"EstimatedEffects": [
{
"Type": "payment",
"Amount": 142.18,
"Currency": "USD",
"Payee": "Duke Energy"
}
]
},
"Note": "Mode=plan: nothing was executed. Re-submit with Mode=execute to run."
} |
| 409 | Idempotency conflict: an action with this key already exists |
| 422 | Instruction could not be planned safely (e.g. exceeds MaxAmount, unsupported action for this institution)Example Value {
"Error": "PlanRejected",
"Reason": "Bill total $342.18 exceeds Parameters.MaxAmount 250.00"
} |
completed, failed, denied, cancelled, expired.| Name | Description |
|---|---|
customerID* string (path) | Your Sophtron customer identifier. |
memberID* string (path) | Member (institution connection) identifier. |
actionID* string (path) | Action identifier returned when the action was created. |
| Code | Description |
|---|---|
| 200 | Action with plan, approval and timeline Example Value {
"ActionID": "act_01J9X7KQ2M",
"Status": "completed",
"Result": {
"ConfirmationNumber": "DE-8827731",
"AmountPaid": 142.18,
"Currency": "USD",
"PaidAt": "2026-10-02T14:21:36Z",
"Receipt": "https://api.sophtron.com/v2/files/rcpt_01J9\u2026"
},
"Approval": {
"ApprovalID": "apr_01J9X7KR8Z",
"Status": "approved",
"DecidedAt": "2026-10-02T14:19:12Z",
"DecidedBy": "user"
},
"Timeline": [
{
"At": "14:10:00Z",
"Status": "queued"
},
{
"At": "14:10:03Z",
"Status": "planning"
},
{
"At": "14:10:09Z",
"Status": "awaiting_approval"
},
{
"At": "14:19:12Z",
"Status": "approved"
},
{
"At": "14:19:13Z",
"Status": "running"
},
{
"At": "14:21:36Z",
"Status": "completed"
}
]
} |
| 404 | Action not found |
| Name | Description |
|---|---|
customerID* string (path) | Your Sophtron customer identifier. |
memberID* string (path) | Member (institution connection) identifier. |
status string (query) | Filter by status, e.g. awaiting_approval. |
limit integer (query) | Default 25, max 100. |
| Code | Description |
|---|---|
| 200 | Array of actions Example Value [
{
"ActionID": "act_01J9X7KQ2M",
"Status": "completed",
"Summary": "Pay $142.18 to Duke Energy",
"CreatedAt": "2026-10-02T14:10:00Z"
}
] |
queued, planning or awaiting_approval. Running actions past an irreversible step cannot be cancelled.| Name | Description |
|---|---|
customerID* string (path) | Your Sophtron customer identifier. |
memberID* string (path) | Member (institution connection) identifier. |
actionID* string (path) | Action identifier returned when the action was created. |
| Code | Description |
|---|---|
| 200 | Action cancelled Example Value {
"ActionID": "act_01J9X7KQ2M",
"Status": "cancelled",
"CancelledAt": "2026-10-02T14:12:40Z"
} |
| 409 | Action can no longer be cancelled |
Approvals
Human-in-the-loop · prompt the user to allow or denyNEW▾PromptURL, SMS, email or push. An approval that expires is treated as denied.| Name | Description |
|---|---|
customerID* string (path) | Your Sophtron customer identifier. |
memberID* string (path) | Member (institution connection) identifier. |
actionID* string (path) | Action identifier returned when the action was created. |
{
"Channel": "sms",
"Message": "Sophtron is about to pay $142.18 to Duke Energy from Checking \u2022\u20224821. Reply ALLOW or DENY.",
"ExpiresIn": 600,
"Locale": "en-US"
}| Code | Description |
|---|---|
| 201 | Approval request created and prompt delivered Example Value {
"ApprovalID": "apr_01J9X7KR8Z",
"ActionID": "act_01J9X7KQ2M",
"Status": "pending",
"Channel": "sms",
"PromptURL": "https://widget.sophtron.com/approve/apr_01J9X7KR8Z",
"ExpiresAt": "2026-10-02T14:20:00Z"
} |
| 409 | An approval is already pending for this action |
pending, approved, denied or expired.| Name | Description |
|---|---|
customerID* string (path) | Your Sophtron customer identifier. |
memberID* string (path) | Member (institution connection) identifier. |
approvalID* string (path) | Approval request identifier. |
| Code | Description |
|---|---|
| 200 | Approval record Example Value {
"ApprovalID": "apr_01J9X7KR8Z",
"ActionID": "act_01J9X7KQ2M",
"Status": "approved",
"Decision": "allow",
"DecidedBy": "user",
"DecidedAt": "2026-10-02T14:19:12Z",
"Channel": "sms"
} |
| 404 | Approval not found |
ProofToken (widget session or one-time code) is required so a decision cannot be submitted on the user's behalf by the agent itself.| Name | Description |
|---|---|
customerID* string (path) | Your Sophtron customer identifier. |
memberID* string (path) | Member (institution connection) identifier. |
approvalID* string (path) | Approval request identifier. |
{
"Decision": "allow",
"DecidedBy": "user",
"ProofToken": "otp_6-digit-or-widget-session",
"Reason": "Confirmed by account holder"
}| Code | Description |
|---|---|
| 200 | Decision recorded; on allow the action resumesExample Value {
"ApprovalID": "apr_01J9X7KR8Z",
"Status": "approved",
"ActionID": "act_01J9X7KQ2M",
"ActionStatus": "running"
} |
| 401 | Invalid or missing ProofToken |
| 410 | Approval expired |
Webhooks
events for actions & approvalsNEW▾Secret (header X-Sophtron-Signature).{
"Event": "action.awaiting_approval",
"At": "2026-10-02T14:10:09Z",
"Data": {
"ActionID": "act_01J9X7KQ2M",
"ApprovalID": "apr_01J9X7KR8Z",
"PromptURL": "https://widget.sophtron.com/approve/apr_01J9X7KR8Z",
"Summary": "Pay $142.18 to Duke Energy from Checking \u2022\u20224821",
"Irreversible": true
}
}| Name | Description |
|---|---|
customerID* string (path) | Your Sophtron customer identifier. |
{
"URL": "https://yourapp.com/hooks/sophtron",
"Events": [
"action.planned",
"action.awaiting_approval",
"approval.decided",
"action.completed",
"action.failed"
],
"Secret": "whsec_\u2026"
}| Code | Description |
|---|---|
| 201 | Webhook registered Example Value {
"WebhookID": "wh_01J9\u2026",
"URL": "https://yourapp.com/hooks/sophtron",
"Events": 5
} |
Schemas
▾| AccountID | string | |
| MemberID | string | |
| AccountName | string | |
| AccountType | string | Checking, Savings, CreditCard, Loan, Utility, Telecom, Insurance, Payroll, Brokerage… |
| Balance | number | |
| Currency | string | ISO 4217 |
| DueDate | date | Billing accounts only |
| Status | string | Active | Closed | Pending |
| AccountID | string | optional — scope the instruction to one account |
| Instruction | string | required — free-form natural language |
| Parameters | object | optional guardrails: MaxAmount, Currency, NotAfter, Payee, … |
| Mode | enum | plan | execute (default execute) |
| RequireApproval | enum | auto | always | never (never is rejected for irreversible plans) |
| ApprovalChannel | enum | widget | sms | email | push |
| IdempotencyKey | string | recommended |
| CallbackURL | string | optional per-action webhook |
| ActionID | string | |
| Status | enum | queued | planning | planned | awaiting_approval | approved | running | completed | failed | denied | cancelled | expired |
| Plan | ActionPlan | |
| Approval | Approval | present when approval was required |
| Result | object | institution-specific result, e.g. ConfirmationNumber, Receipt |
| Timeline | array | status transitions with timestamps |
| CreatedAt | datetime |
| Summary | string | one-line human-readable description |
| Steps[] | array | Step, Description, Reversible (bool) |
| Irreversible | boolean | true if any step is irreversible |
| RiskLevel | enum | low | medium | high |
| EstimatedEffects[] | array | Type (payment, transfer, update, cancel, submit), Amount, Currency, Payee… |
| ApprovalID | string | |
| ActionID | string | |
| Status | enum | pending | approved | denied | expired |
| Channel | enum | widget | sms | email | push |
| PromptURL | string | hosted allow/deny page |
| Decision | enum | allow | deny |
| DecidedBy | string | user |
| ExpiresAt | datetime |
| Decision | enum | allow | deny |
| DecidedBy | string | must be user |
| ProofToken | string | widget session or one-time code; prevents agent self-approval |
| Reason | string | optional |