Straddle API
Introduction
The Straddle API uses resource URLs, standard HTTP methods, and JSON request and response bodies.
Environments
Sandbox and Production use separate base URLs and API keys. Use Sandbox for testing and development. Use Production for live transactions.
| Environment | Base URL | Purpose |
|---|---|---|
| Sandbox | https://sandbox.straddle.com |
Testing and development |
| Production | https://production.straddle.com |
Live transactions |
Use the API key issued for the request's environment. An API key from another environment does not authenticate the request.
Authentication
Straddle authenticates API requests with JWT bearer tokens. Send your secret API key in the Authorization header:
curl https://sandbox.straddle.com/v1/customers \
-H "Authorization: Bearer YOUR_SECRET_API_KEY"
Idempotent requests
Use idempotency to retry a request without performing the same operation twice. Send a unique Idempotency-Key header with the request.
After Straddle processes a request successfully, an identical request with the same key returns the original status code, headers, and body without repeating the operation.
Request headers
Send a unique string of 10 to 40 characters in the Idempotency-Key header.
| Header | Type | Description |
|---|---|---|
Idempotency-Key |
string | A unique identifier for the request. The value must contain 10 to 40 characters. |
Response headers
A successfully replayed request returns the original HTTP status code, response headers, and body. The response also includes:
| Header | Type | Description |
|---|---|---|
Idempotent-Replayed |
boolean | true when the response replays a previously successful request. |
Idempotency errors
The API returns these errors for invalid or conflicting idempotency keys:
| Status Code | Error Type | Description |
|---|---|---|
| 400 | Bad Request | The Idempotency-Key value is shorter than 10 characters or longer than 40 characters. |
| 409 | Conflict | The key was used for a different request, or an identical request with the key is still in progress. |
Key reused for a different request
A request returns 409 Conflict when its Idempotency-Key was used for a request with a different path, method, or body.
{
"status": 409,
"type": "/conflict",
"title": "Conflict",
"detail": "Idempotency key already used for a different request."
}
Identical request still in progress
An identical request returns 409 Conflict when another request with the same Idempotency-Key is still in progress.
{
"status": 409,
"type": "/conflict",
"title": "Conflict",
"detail": "Previous identical request currently in progress."
}
Invalid key length
A request returns 400 Bad Request when its Idempotency-Key is shorter than 10 characters or longer than 40 characters.
{
"status": 400,
"type": "/bad-request",
"title": "Bad Request",
"detail": "The Idempotency-Key header is invalid. It must be between 10 and 40 characters long."
}
Example request
curl -X POST https://sandbox.straddle.com/v1/charges \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: unique-client-key-7890" \
-d '{
"amount": 100.00,
"currency": "USD"
}'
Idempotency applies only to authenticated POST, PUT, PATCH, and DELETE requests.
Response structure
API responses use a JSON envelope. Every envelope has meta and response_type. Other fields depend on the response type.
-
Field names
- Fields use
snake_case. - Resource identifiers use UUIDs.
- Fields use
-
response_type"object"meansdatacontains one JSON object."array"meansdatacontains an array of JSON objects."error"meanserrorcontains the error details."none"means the response contains no data.
-
data- Successful object and array responses contain the requested resource data.
-
error- Error responses contain the error details.
-
metaapi_request_idis the unique identifier for the API request.api_request_timestampis the ISO 8601 timestamp for the API request.- Paginated array responses also include
page_number,page_size,total_items,sort_order, andsort_by.
Examples
Object response
{
"meta": {
"api_request_id": "3a2b1c4d-0e6f-4a88-9876-123456abcdef",
"api_request_timestamp": "2023-11-07T05:31:56Z"
},
"response_type": "object",
"data": {
"id": "a1b2c3d4-e5f6-7a8b-9c0d-1e2f3a4b5c6d",
"name": "John Doe",
"email": "john.doe@example.com",
"dob": "1990-01-01",
"address": {
"street": "123 Main St",
"city": "Springfield",
"state": "IL",
"postal_code": "62701"
}
}
}
Paginated array response
{
"meta": {
"api_request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"api_request_timestamp": "2023-11-07T05:31:56Z",
"page_number": 2,
"page_size": 50,
"total_items": 500,
"sort_order": "asc",
"sort_by": "name"
},
"response_type": "array",
"data": [
{
"id": "c1b1b1b1-1b1b-1b1b-1b1b-1b1b1b1b1b1b",
"name": "John Doe",
"email": "john.doe@example.com"
},
{
"id": "a9b1b1b1-1b1b-1b1b-1b1b-1b1b1b1b1b1b",
"name": "Steven Martin",
"email": "steven.martin@example.com"
}
]
}
Error response
{
"meta": {
"api_request_id": "f1b1b1b1-1b1b-1b1b-1b1b-1b1b1b1b1b1b"
},
"response_type": "error",
"error": {
"status": 400,
"type": "/field_validation",
"title": "Invalid Input Data",
"detail": "The request contains invalid field values.",
"items": [
{
"reference": "customer.email",
"detail": "Email address must be unique."
}
]
}
}
Metadata
The metadata field stores user-defined key-value pairs on supported Straddle objects.
metadata contains custom data that you provide. It is separate from the response meta object, which contains information about the API request.
Add metadata
Include metadata when you create or update an object that supports the field.
Customer request example
This customer request includes two metadata entries:
{
"name": "John Doe",
"type": "individual",
"email": "john@example.com",
"address": {
"address1": "123 Main St",
"address2": null,
"type": "residential",
"city": "Springfield",
"state": "IL",
"zip": "62701"
},
"phone": "+1234567890",
"external_id": "CUS-123",
"device": {
"ip_address": "192.168.1.1"
},
"metadata": {
"order_id": "6735",
"customer_group": "premium"
}
}
Limits
- Keys and values can contain at most 40 characters.
- The
metadataobject can contain at most 20 entries.
Embedded accounts
Platforms can send requests in the scope of an embedded account. Send the embedded account's UUID in the Straddle-Account-Id header.
Send a request for an embedded account
Include Straddle-Account-Id with the embedded account UUID. Authenticate the request with the platform's secret API key.
Example charge request
This request creates a charge in the embedded account's scope.
curl --request POST \
--url https://sandbox.straddle.com/v1/charges \
--header 'Authorization: Bearer <your-secret-api-key>' \
--header 'Content-Type: application/json' \
--header 'Straddle-Account-Id: <uuid>' \
--data '{
"paykey": "<string>",
"description": "<string>",
"amount": 123,
"currency": "<string>",
"payment_date": "2023-12-25",
"consent_type": "internet",
"device": {
"ip_address": "<string>"
},
"external_id": "<string>",
"config": {
"balance_check": "required"
},
"metadata": {}
}'
Errors
HTTP status codes indicate whether the API completed a request. Error responses include a JSON error object.
Common status codes include:
| Status Code | Type | Description |
|---|---|---|
| 200 | OK | The request completed successfully. |
| 400 | Bad Request | The request is invalid. |
| 401 | Unauthorized | The request does not include a valid API key. |
| 403 | Forbidden | The API key does not have permission to perform the request. |
| 404 | Not Found | The requested resource does not exist. |
| 409 | Conflict | The request conflicts with an existing request or operation. |
| 422 | Unprocessable Entity | The request syntax is valid, but one or more values cannot be processed. |
| 429 | Too Many Requests | The request exceeded a rate limit. |
| 500, 502, 503, 504 | Server Error | Straddle could not complete the request because of a server error. |
Error response structure
Error responses use the standard response envelope. The error object has these fields:
| Attribute | Type | Description |
|---|---|---|
status |
integer | HTTP status code for the error. |
type |
string | Identifier for the error type. |
title |
string | Short summary of the error. |
detail |
string | Explanation specific to this request. |
items |
array | Additional error details, when available. |
items[].reference |
string | Request field or error code associated with the detail. |
items[].detail |
string | Explanation of the error detail. |
Example error response
This example shows a field-validation error:
{
"meta": {
"api_request_id": "3a2b1c4d-0e6f-4a88-9876-123456abcdef",
"api_request_timestamp": "2023-11-07T05:31:56Z"
},
"response_type": "error",
"error": {
"status": 400,
"type": "validation_error",
"title": "Invalid Input Data",
"detail": "The request contains invalid field values.",
"items": [
{
"reference": "customer.email",
"detail": "Email address must be unique."
}
]
}
}
Straddle API server
npm install @straddlecom/straddle
Customers (Collapsed)
Customers are individuals or businesses that send or receive payments through your integration.
Bridge (Collapsed)
Bridge connects customer bank accounts and creates paykeys from supported provider tokens or bank account details.
Paykeys (Collapsed)
A paykey links a verified customer to a bank account without exposing bank account details. Use a paykey to create charges and payouts.
Charges (Collapsed)
Charges debit a customer's bank account through a paykey.
Payouts (Collapsed)
Payouts send money to a customer's bank account through a paykey.
Funding events (Collapsed)
Funding events group charge and payout activity into transfers between Straddle and your linked bank account.
Payments (Collapsed)
Payments provide a combined view of charges and payouts.
Organizations (Collapsed)
Organizations group related Straddle accounts.
Accounts (Collapsed)
Accounts represent businesses that use Straddle through a platform.
Representatives (Collapsed)
Representatives are people associated with a business account for ownership, control, or authorization purposes.
Linked bank accounts (Collapsed)
Linked bank accounts connect external bank accounts to an account or platform for charges, payouts, or billing.
Capabilities (Collapsed)
Capability requests change the payment, customer, and consent types available to an account.
Account settings (Collapsed)
Account settings define payment limits, capabilities, statement details, and policy controls for an account.
Webhooks (Collapsed)
- postWebhook event: account.created.v1
- postWebhook event: account.event.v1
- postWebhook event: representative.event.v1
- postWebhook event: representative.created.v1
- postWebhook event: linked_bank_account.event.v1
- postWebhook event: linked_bank_account.created.v1
- postWebhook event: capability_request.event.v1
- postWebhook event: capability_request.created.v1
- postWebhook event: customer.event.v1
- postWebhook event: customer.created.v1
- postWebhook event: paykey.event.v1
- postWebhook event: paykey.created.v1
- postWebhook event: charge.created.v1
- postWebhook event: charge.event.v1
- postWebhook event: payout.created.v1
- postWebhook event: payout.event.v1
- postWebhook event: platform.event.v1
- postWebhook event: platform.created.v1
- postWebhook event: user.event.v1
- postWebhook event: user.created.v1
- postWebhook event: funding_event.created.v1
- postWebhook event: funding_event.event.v1
Webhook event: account.created.v1
Straddle sends this event when a platform creates an account. The data field contains the account.
Body
Payload for the account.created.v1 event.
- Type: stringFormat: uuidaccount
_id requiredUnique identifier for the account associated with this event.
- Properties: 14Type:datarequired{ access_level, id, organization_id, +11 }
- Type: stringFormat: uuidevent
_id requiredUnique identifier for this event.
- Type: stringevent
_type requiredType of this event.
Responses
- 200
Webhook received.
{
"event_type": "account.created.v1",
"event_id": "85df84c7-a298-44bc-8040-7bd2ae372cbf",
"account_id": "857c679a-8e80-47f1-9334-39dd08ea801f",
"data": {
"id": "",
"organization_id": "",
"type": "business",
"status": "created",
"status_detail": {
"reason": "unverified",
"source": "watchtower",
"code": "",
"message": ""
},
"business_profile": {
"name": "",
"website": "",
"legal_name": null,
"description": null,
"use_case": null,
"tax_id": null,
"phone": null,
"address": {
"line1": null,
"line2": null,
"city": null,
"state": null,
"postal_code": null,
"country": null
},
"industry": {
"mcc": null,
"sector": null,
"category": null
},
"support_channels": {
"email": null,
"phone": null,
"url": null
}
},
"capabilities": {
"payment_types": {
"charges": {
"capability_status": "active"
},
"payouts": {
"capability_status": "active"
}
},
"customer_types": {
"individuals": {
"capability_status": "active"
},
"businesses": {
"capability_status": "active"
}
},
"consent_types": {
"signed_agreement": {
"capability_status": "active"
},
"internet": {
"capability_status": "active"
}
}
},
"settings": {
"charges": {
"max_amount": 1,
"monthly_amount": 1,
"daily_amount": 1,
"monthly_count": 1,
"funding_time": "immediate",
"linked_bank_account_id": ""
},
"payouts": {
"max_amount": 1,
"monthly_amount": 1,
"daily_amount": 1,
"monthly_count": 1,
"funding_time": "immediate",
"linked_bank_account_id": ""
}
},
"terms_of_service": {
"accepted_date": "",
"accepted_ip": null,
"accepted_user_agent": null,
"agreement_url": null,
"agreement_type": "embedded"
},
"metadata": null,
"access_level": "standard",
"external_id": null,
"created_at": null,
"updated_at": null
}
}
Webhook received.
Webhook event: account.event.v1
Straddle sends this event when an account changes, including updates to its profile, status, settings, limits, or capabilities. The data field contains the updated account.
Body
Payload for the account.event.v1 event.
- Type: stringFormat: uuidaccount
_id requiredUnique identifier for the account associated with this event.
- Properties: 14Type:datarequired{ access_level, id, organization_id, +11 }
- Type: stringFormat: uuidevent
_id requiredUnique identifier for this event.
- Type: stringevent
_type requiredType of this event.
Responses
- 200
Webhook received.
{
"event_type": "account.event.v1",
"event_id": "85df84c7-a298-44bc-8040-7bd2ae372cbf",
"account_id": "857c679a-8e80-47f1-9334-39dd08ea801f",
"data": {
"id": "",
"organization_id": "",
"type": "business",
"status": "created",
"status_detail": {
"reason": "unverified",
"source": "watchtower",
"code": "",
"message": ""
},
"business_profile": {
"name": "",
"website": "",
"legal_name": null,
"description": null,
"use_case": null,
"tax_id": null,
"phone": null,
"address": {
"line1": null,
"line2": null,
"city": null,
"state": null,
"postal_code": null,
"country": null
},
"industry": {
"mcc": null,
"sector": null,
"category": null
},
"support_channels": {
"email": null,
"phone": null,
"url": null
}
},
"capabilities": {
"payment_types": {
"charges": {
"capability_status": "active"
},
"payouts": {
"capability_status": "active"
}
},
"customer_types": {
"individuals": {
"capability_status": "active"
},
"businesses": {
"capability_status": "active"
}
},
"consent_types": {
"signed_agreement": {
"capability_status": "active"
},
"internet": {
"capability_status": "active"
}
}
},
"settings": {
"charges": {
"max_amount": 1,
"monthly_amount": 1,
"daily_amount": 1,
"monthly_count": 1,
"funding_time": "immediate",
"linked_bank_account_id": ""
},
"payouts": {
"max_amount": 1,
"monthly_amount": 1,
"daily_amount": 1,
"monthly_count": 1,
"funding_time": "immediate",
"linked_bank_account_id": ""
}
},
"terms_of_service": {
"accepted_date": "",
"accepted_ip": null,
"accepted_user_agent": null,
"agreement_url": null,
"agreement_type": "embedded"
},
"metadata": null,
"access_level": "standard",
"external_id": null,
"created_at": null,
"updated_at": null
}
}
Webhook received.
Webhook event: representative.event.v1
Straddle sends this event when a representative's status or fields change. The data field contains the updated representative.
Body
Payload for the representative.event.v1 event.
- Type: stringFormat: uuidaccount
_id requiredUnique identifier for the account associated with this event.
- Properties: 18Type:datarequired{ account_id, created_at, dob, +15 }
- Type: stringFormat: uuidevent
_id requiredUnique identifier for this event.
- Type: stringevent
_type requiredType of this event.
Responses
- 200
Webhook received.
{
"event_type": "representative.event.v1",
"event_id": "85df84c7-a298-44bc-8040-7bd2ae372cbf",
"account_id": "857c679a-8e80-47f1-9334-39dd08ea801f",
"data": {
"id": "",
"account_id": "",
"user_id": null,
"status": "created",
"status_detail": {
"reason": "unverified",
"source": "watchtower",
"code": "",
"message": ""
},
"first_name": "Ron",
"last_name": "Swanson",
"dob": "1980-01-01",
"ssn_last4": "1234",
"email": "ron.swanson@pawnee.com",
"mobile_number": "+12128675309",
"relationship": {
"primary": true,
"control": true,
"owner": true,
"percent_ownership": null,
"title": null
},
"external_id": null,
"created_at": "",
"updated_at": "",
"name": "",
"phone": null,
"metadata": null
}
}
Webhook received.
Webhook event: representative.created.v1
Straddle sends this event when a platform creates a representative. The data field contains the representative.
Body
Payload for the representative.created.v1 event.
- Type: stringFormat: uuidaccount
_id requiredUnique identifier for the account associated with this event.
- Properties: 18Type:datarequired{ account_id, created_at, dob, +15 }
- Type: stringFormat: uuidevent
_id requiredUnique identifier for this event.
- Type: stringevent
_type requiredType of this event.
Responses
- 200
Webhook received.
{
"event_type": "representative.created.v1",
"event_id": "85df84c7-a298-44bc-8040-7bd2ae372cbf",
"account_id": "857c679a-8e80-47f1-9334-39dd08ea801f",
"data": {
"id": "",
"account_id": "",
"user_id": null,
"status": "created",
"status_detail": {
"reason": "unverified",
"source": "watchtower",
"code": "",
"message": ""
},
"first_name": "Ron",
"last_name": "Swanson",
"dob": "1980-01-01",
"ssn_last4": "1234",
"email": "ron.swanson@pawnee.com",
"mobile_number": "+12128675309",
"relationship": {
"primary": true,
"control": true,
"owner": true,
"percent_ownership": null,
"title": null
},
"external_id": null,
"created_at": "",
"updated_at": "",
"name": "",
"phone": null,
"metadata": null
}
}
Webhook received.
Webhook event: linked_bank_account.event.v1
Straddle sends this event when a linked bank account's status or fields change. The data field contains the updated linked bank account.
Body
Payload for the linked_bank_account.event.v1 event.
- Type: stringFormat: uuidaccount
_id requiredUnique identifier for the account associated with this event.
- Properties: 11Type:datarequired{ account_id, bank_account, created_at, +8 }
- Type: stringFormat: uuidevent
_id requiredUnique identifier for this event.
- Type: stringevent
_type requiredType of this event.
Responses
- 200
Webhook received.
{
"event_type": "linked_bank_account.event.v1",
"event_id": "85df84c7-a298-44bc-8040-7bd2ae372cbf",
"account_id": "857c679a-8e80-47f1-9334-39dd08ea801f",
"data": {
"id": "",
"account_id": null,
"status": "created",
"status_detail": {
"reason": "unverified",
"source": "watchtower",
"code": "",
"message": ""
},
"bank_account": {
"institution_name": "",
"account_holder": "",
"routing_number": "",
"account_mask": ""
},
"metadata": null,
"created_at": "",
"updated_at": "",
"platform_id": null,
"purposes": [
"charges"
],
"description": null
}
}
Webhook received.
Webhook event: linked_bank_account.created.v1
Straddle sends this event when a platform creates a linked bank account. The data field contains the linked bank account.
Body
Payload for the linked_bank_account.created.v1 event.
- Type: stringFormat: uuidaccount
_id requiredUnique identifier for the account associated with this event.
- Properties: 11Type:datarequired{ account_id, bank_account, created_at, +8 }
- Type: stringFormat: uuidevent
_id requiredUnique identifier for this event.
- Type: stringevent
_type requiredType of this event.
Responses
- 200
Webhook received.
{
"event_type": "linked_bank_account.created.v1",
"event_id": "85df84c7-a298-44bc-8040-7bd2ae372cbf",
"account_id": "857c679a-8e80-47f1-9334-39dd08ea801f",
"data": {
"id": "",
"account_id": null,
"status": "created",
"status_detail": {
"reason": "unverified",
"source": "watchtower",
"code": "",
"message": ""
},
"bank_account": {
"institution_name": "",
"account_holder": "",
"routing_number": "",
"account_mask": ""
},
"metadata": null,
"created_at": "",
"updated_at": "",
"platform_id": null,
"purposes": [
"charges"
],
"description": null
}
}
Webhook received.
Webhook event: capability_request.event.v1
Straddle sends this event when a capability request's status or fields change. The data field contains the updated capability request.
Body
Payload for the capability_request.event.v1 event.
- Type: stringFormat: uuidaccount
_id requiredUnique identifier for the account associated with this event.
- Properties: 9Type:datarequired{ account_id, category, created_at, +6 }
- Type: stringFormat: uuidevent
_id requiredUnique identifier for this event.
- Type: stringevent
_type requiredType of this event.
Responses
- 200
Webhook received.
{
"event_type": "capability_request.event.v1",
"event_id": "85df84c7-a298-44bc-8040-7bd2ae372cbf",
"account_id": "857c679a-8e80-47f1-9334-39dd08ea801f",
"data": {
"id": "",
"account_id": "",
"type": "charges",
"category": "payment_type",
"settings": null,
"status": "active",
"created_at": "",
"updated_at": "",
"enable": true
}
}
Webhook received.
Webhook event: capability_request.created.v1
Straddle sends this event when a platform creates a capability request. The data field contains the capability request.
Body
Payload for the capability_request.created.v1 event.
- Type: stringFormat: uuidaccount
_id requiredUnique identifier for the account associated with this event.
- Properties: 9Type:datarequired{ account_id, category, created_at, +6 }
- Type: stringFormat: uuidevent
_id requiredUnique identifier for this event.
- Type: stringevent
_type requiredType of this event.
Responses
- 200
Webhook received.
{
"event_type": "capability_request.created.v1",
"event_id": "85df84c7-a298-44bc-8040-7bd2ae372cbf",
"account_id": "857c679a-8e80-47f1-9334-39dd08ea801f",
"data": {
"id": "",
"account_id": "",
"type": "charges",
"category": "payment_type",
"settings": null,
"status": "active",
"created_at": "",
"updated_at": "",
"enable": true
}
}
Webhook received.
Webhook event: customer.event.v1
Reports changes to a customer's profile or status, including verification, compliance, and risk updates.
Body
Payload for the customer.event.v1 event.
- Type: stringFormat: uuidaccount
_id requiredUnique identifier for the account associated with this event.
- Properties: 13Type:datarequired{ created_at, device, email, +10 }
- Type: stringFormat: uuidevent
_id requiredUnique identifier for this event.
- Type: stringevent
_type requiredType of this event.
Responses
- 200
Webhook received.
{
"event_type": "customer.event.v1",
"event_id": "85df84c7-a298-44bc-8040-7bd2ae372cbf",
"account_id": "857c679a-8e80-47f1-9334-39dd08ea801f",
"data": {
"id": "",
"address": {
"address1": "",
"address2": null,
"city": "",
"state": "",
"zip": ""
},
"compliance_profile": {
"dob": null,
"ssn": null,
"ein": null,
"legal_business_name": null,
"website": null
},
"device": {
"ip_address": "**.**.**.**"
},
"name": "",
"type": "individual",
"email": "",
"phone": "",
"external_id": null,
"status": "pending",
"created_at": "",
"updated_at": "",
"metadata": null
}
}
Webhook received.
Webhook event: customer.created.v1
Reports the creation of a customer. The payload includes the customer profile and initial verification status.
Body
Payload for the customer.created.v1 event.
- Type: stringFormat: uuidaccount
_id requiredUnique identifier for the account associated with this event.
- Properties: 13Type:datarequired{ created_at, device, email, +10 }
- Type: stringFormat: uuidevent
_id requiredUnique identifier for this event.
- Type: stringevent
_type requiredType of this event.
Responses
- 200
Webhook received.
{
"event_type": "customer.created.v1",
"event_id": "85df84c7-a298-44bc-8040-7bd2ae372cbf",
"account_id": "857c679a-8e80-47f1-9334-39dd08ea801f",
"data": {
"id": "",
"address": {
"address1": "",
"address2": null,
"city": "",
"state": "",
"zip": ""
},
"compliance_profile": {
"dob": null,
"ssn": null,
"ein": null,
"legal_business_name": null,
"website": null
},
"device": {
"ip_address": "**.**.**.**"
},
"name": "",
"type": "individual",
"email": "",
"phone": "",
"external_id": null,
"status": "pending",
"created_at": "",
"updated_at": "",
"metadata": null
}
}
Webhook received.
Webhook event: paykey.event.v1
Reports changes to a paykey's status, verification result, balance, or bank account details.
Body
Payload for the paykey.event.v1 event.
- Type: stringFormat: uuidaccount
_id requiredUnique identifier for the account associated with this event.
- Properties: 14Type:datarequired{ created_at, id, label, +11 }
- Type: stringFormat: uuidevent
_id requiredUnique identifier for this event.
- Type: stringevent
_type requiredType of this event.
Responses
- 200
Webhook received.
{
"event_type": "paykey.event.v1",
"event_id": "85df84c7-a298-44bc-8040-7bd2ae372cbf",
"account_id": "857c679a-8e80-47f1-9334-39dd08ea801f",
"data": {
"id": "",
"customer_id": null,
"label": "",
"source": "bank_account",
"institution_name": null,
"status": "pending",
"status_details": {
"message": "",
"reason": "insufficient_funds",
"source": "watchtower",
"code": null,
"changed_at": ""
},
"expires_at": null,
"created_at": "",
"updated_at": "",
"paykey": "",
"bank_data": {
"routing_number": "",
"account_number": "",
"account_type": "checking"
},
"metadata": null,
"balance": {
"account_balance": null,
"updated_at": null,
"status": "pending"
}
}
}
Webhook received.
Webhook event: paykey.created.v1
Reports the creation of a paykey that links a customer to a bank account. The payload includes the paykey's status and bank account details.
Body
Payload for the paykey.created.v1 event.
- Type: stringFormat: uuidaccount
_id requiredUnique identifier for the account associated with this event.
- Properties: 14Type:datarequired{ created_at, id, label, +11 }
- Type: stringFormat: uuidevent
_id requiredUnique identifier for this event.
- Type: stringevent
_type requiredType of this event.
Responses
- 200
Webhook received.
{
"event_type": "paykey.created.v1",
"event_id": "85df84c7-a298-44bc-8040-7bd2ae372cbf",
"account_id": "857c679a-8e80-47f1-9334-39dd08ea801f",
"data": {
"id": "",
"customer_id": null,
"label": "",
"source": "bank_account",
"institution_name": null,
"status": "pending",
"status_details": {
"message": "",
"reason": "insufficient_funds",
"source": "watchtower",
"code": null,
"changed_at": ""
},
"expires_at": null,
"created_at": "",
"updated_at": "",
"paykey": "",
"bank_data": {
"routing_number": "",
"account_number": "",
"account_type": "checking"
},
"metadata": null,
"balance": {
"account_balance": null,
"updated_at": null,
"status": "pending"
}
}
}
Webhook received.
Webhook event: charge.created.v1
Sent when a charge is created. The payload contains the charge's current details.
Body
Payload for the charge.created.v1 event.
- Type: stringFormat: uuidaccount
_id requiredUnique identifier for the account associated with this event.
- Properties: 27Type:datarequired{ amount, config, consent_type, +24 }
- Type: stringFormat: uuidevent
_id requiredUnique identifier for this event.
- Type: stringevent
_type requiredType of this event.
Responses
- 200
Webhook received.
{
"event_type": "charge.created.v1",
"event_id": "85df84c7-a298-44bc-8040-7bd2ae372cbf",
"account_id": "857c679a-8e80-47f1-9334-39dd08ea801f",
"data": {
"id": "",
"paykey": "",
"description": null,
"payment_rail": "ach",
"paykey_details": {
"id": "",
"customer_id": "",
"label": "",
"balance": null
},
"customer_details": {
"id": "",
"name": "",
"email": "",
"phone": "",
"customer_type": "individual"
},
"amount": 1,
"currency": "",
"payment_date": "",
"consent_type": "internet",
"device": {
"ip_address": "**.**.**.**"
},
"external_id": null,
"config": {
"balance_check": "required"
},
"created_at": null,
"updated_at": null,
"processed_at": null,
"effective_at": null,
"status": "created",
"status_details": {
"message": "",
"reason": "insufficient_funds",
"source": "watchtower",
"code": null,
"changed_at": ""
},
"status_history": [
{
"reason": "insufficient_funds",
"source": "watchtower",
"message": "",
"code": null,
"changed_at": "",
"status": "created"
}
],
"metadata": null,
"funding_ids": [
""
],
"related_payments": [
{
"id": "019e1bab-2ab4-751d-be80-f51c82c2ea64",
"relationship": "original",
"payment_type": "charge"
}
],
"is_resubmit": true,
"has_resubmit": true,
"has_refund": true,
"documents": [
{
"document_id": "",
"document_name": "",
"document_type": "payment_authorization",
"document_size": 1,
"uploaded_at": ""
}
]
}
}
Webhook received.
Webhook event: charge.event.v1
Sent when a charge is created or its status changes. The payload contains the charge's current details.
Body
Payload for the charge.event.v1 event.
- Type: stringFormat: uuidaccount
_id requiredUnique identifier for the account associated with this event.
- Properties: 27Type:datarequired{ amount, config, consent_type, +24 }
- Type: stringFormat: uuidevent
_id requiredUnique identifier for this event.
- Type: stringevent
_type requiredType of this event.
Responses
- 200
Webhook received.
{
"event_type": "charge.event.v1",
"event_id": "85df84c7-a298-44bc-8040-7bd2ae372cbf",
"account_id": "857c679a-8e80-47f1-9334-39dd08ea801f",
"data": {
"id": "",
"paykey": "",
"description": null,
"payment_rail": "ach",
"paykey_details": {
"id": "",
"customer_id": "",
"label": "",
"balance": null
},
"customer_details": {
"id": "",
"name": "",
"email": "",
"phone": "",
"customer_type": "individual"
},
"amount": 1,
"currency": "",
"payment_date": "",
"consent_type": "internet",
"device": {
"ip_address": "**.**.**.**"
},
"external_id": null,
"config": {
"balance_check": "required"
},
"created_at": null,
"updated_at": null,
"processed_at": null,
"effective_at": null,
"status": "created",
"status_details": {
"message": "",
"reason": "insufficient_funds",
"source": "watchtower",
"code": null,
"changed_at": ""
},
"status_history": [
{
"reason": "insufficient_funds",
"source": "watchtower",
"message": "",
"code": null,
"changed_at": "",
"status": "created"
}
],
"metadata": null,
"funding_ids": [
""
],
"related_payments": [
{
"id": "019e1bab-2ab4-751d-be80-f51c82c2ea64",
"relationship": "original",
"payment_type": "charge"
}
],
"is_resubmit": true,
"has_resubmit": true,
"has_refund": true,
"documents": [
{
"document_id": "",
"document_name": "",
"document_type": "payment_authorization",
"document_size": 1,
"uploaded_at": ""
}
]
}
}
Webhook received.
Webhook event: payout.created.v1
Sent when a payout is created. The payload contains the payout's current details.
Body
Payload for the payout.created.v1 event.
- Type: stringFormat: uuidaccount
_id requiredUnique identifier for the account associated with this event.
- Properties: 27Type:datarequired{ amount, config, consent_type, +24 }
- Type: stringFormat: uuidevent
_id requiredUnique identifier for this event.
- Type: stringevent
_type requiredType of this event.
Responses
- 200
Webhook received.
{
"event_type": "payout.created.v1",
"event_id": "85df84c7-a298-44bc-8040-7bd2ae372cbf",
"account_id": "857c679a-8e80-47f1-9334-39dd08ea801f",
"data": {
"id": "",
"paykey": "",
"description": null,
"payment_rail": "ach",
"paykey_details": {
"id": "",
"customer_id": "",
"label": "",
"balance": null
},
"customer_details": {
"id": "",
"name": "",
"email": "",
"phone": "",
"customer_type": "individual"
},
"amount": 1,
"currency": "",
"payment_date": "",
"consent_type": "internet",
"device": {
"ip_address": "**.**.**.**"
},
"external_id": null,
"config": {},
"created_at": null,
"updated_at": null,
"processed_at": null,
"effective_at": null,
"status": "created",
"status_details": {
"message": "",
"reason": "insufficient_funds",
"source": "watchtower",
"code": null,
"changed_at": ""
},
"status_history": [
{
"reason": "insufficient_funds",
"source": "watchtower",
"message": "",
"code": null,
"changed_at": "",
"status": "created"
}
],
"metadata": null,
"funding_ids": [
""
],
"related_payments": [
{
"id": "019e1bab-2ab4-751d-be80-f51c82c2ea64",
"relationship": "original",
"payment_type": "charge"
}
],
"is_resubmit": true,
"has_resubmit": true,
"is_refund": true,
"documents": [
{
"document_id": "",
"document_name": "",
"document_type": "payment_authorization",
"document_size": 1,
"uploaded_at": ""
}
]
}
}
Webhook received.
Webhook event: payout.event.v1
Sent when a payout is created or its status changes. The payload contains the payout's current details.
Body
Payload for the payout.event.v1 event.
- Type: stringFormat: uuidaccount
_id requiredUnique identifier for the account associated with this event.
- Properties: 27Type:datarequired{ amount, config, consent_type, +24 }
- Type: stringFormat: uuidevent
_id requiredUnique identifier for this event.
- Type: stringevent
_type requiredType of this event.
Responses
- 200
Webhook received.
{
"event_type": "payout.event.v1",
"event_id": "85df84c7-a298-44bc-8040-7bd2ae372cbf",
"account_id": "857c679a-8e80-47f1-9334-39dd08ea801f",
"data": {
"id": "",
"paykey": "",
"description": null,
"payment_rail": "ach",
"paykey_details": {
"id": "",
"customer_id": "",
"label": "",
"balance": null
},
"customer_details": {
"id": "",
"name": "",
"email": "",
"phone": "",
"customer_type": "individual"
},
"amount": 1,
"currency": "",
"payment_date": "",
"consent_type": "internet",
"device": {
"ip_address": "**.**.**.**"
},
"external_id": null,
"config": {},
"created_at": null,
"updated_at": null,
"processed_at": null,
"effective_at": null,
"status": "created",
"status_details": {
"message": "",
"reason": "insufficient_funds",
"source": "watchtower",
"code": null,
"changed_at": ""
},
"status_history": [
{
"reason": "insufficient_funds",
"source": "watchtower",
"message": "",
"code": null,
"changed_at": "",
"status": "created"
}
],
"metadata": null,
"funding_ids": [
""
],
"related_payments": [
{
"id": "019e1bab-2ab4-751d-be80-f51c82c2ea64",
"relationship": "original",
"payment_type": "charge"
}
],
"is_resubmit": true,
"has_resubmit": true,
"is_refund": true,
"documents": [
{
"document_id": "",
"document_name": "",
"document_type": "payment_authorization",
"document_size": 1,
"uploaded_at": ""
}
]
}
}
Webhook received.
Webhook event: platform.event.v1
Fired when a platform is created. This webhook is only supposed to be consumed by Straddle.
Body
Payload for the platform.event.v1 event.
- Type: stringFormat: uuidaccount
_id requiredUnique identifier for the account associated with this event.
- Properties: 8Type:datarequired{ id, status, status_detail, +5 }
- Type: stringFormat: uuidevent
_id requiredUnique identifier for this event.
- Type: stringevent
_type requiredType of this event.
Responses
- 200
Webhook received.
{
"event_type": "platform.event.v1",
"event_id": "85df84c7-a298-44bc-8040-7bd2ae372cbf",
"account_id": "857c679a-8e80-47f1-9334-39dd08ea801f",
"data": {
"id": "",
"status": "created",
"status_detail": {
"reason": "unverified",
"source": "watchtower",
"code": "",
"message": ""
},
"business_profile": {
"name": "",
"website": "",
"legal_name": null,
"description": null,
"use_case": null,
"tax_id": null,
"phone": null,
"address": {
"line1": null,
"line2": null,
"city": null,
"state": null,
"postal_code": null,
"country": null
},
"industry": {
"mcc": null,
"sector": null,
"category": null
},
"support_channels": {
"email": null,
"phone": null,
"url": null
}
},
"metadata": null,
"external_id": null,
"created_at": null,
"updated_at": null
}
}
Webhook received.
Webhook event: platform.created.v1
Triggered when any significant change occurs to a platform. This webhook is only supposed to be consumed by Straddle.
Body
Payload for the platform.created.v1 event.
- Type: stringFormat: uuidaccount
_id requiredUnique identifier for the account associated with this event.
- Properties: 8Type:datarequired{ id, status, status_detail, +5 }
- Type: stringFormat: uuidevent
_id requiredUnique identifier for this event.
- Type: stringevent
_type requiredType of this event.
Responses
- 200
Webhook received.
{
"event_type": "platform.created.v1",
"event_id": "85df84c7-a298-44bc-8040-7bd2ae372cbf",
"account_id": "857c679a-8e80-47f1-9334-39dd08ea801f",
"data": {
"id": "",
"status": "created",
"status_detail": {
"reason": "unverified",
"source": "watchtower",
"code": "",
"message": ""
},
"business_profile": {
"name": "",
"website": "",
"legal_name": null,
"description": null,
"use_case": null,
"tax_id": null,
"phone": null,
"address": {
"line1": null,
"line2": null,
"city": null,
"state": null,
"postal_code": null,
"country": null
},
"industry": {
"mcc": null,
"sector": null,
"category": null
},
"support_channels": {
"email": null,
"phone": null,
"url": null
}
},
"metadata": null,
"external_id": null,
"created_at": null,
"updated_at": null
}
}
Webhook received.
Webhook event: user.event.v1
Fired when a user is created. This webhook is only supposed to be consumed by Straddle.
Body
Payload for the user.event.v1 event.
- Type: stringFormat: uuidaccount
_id requiredUnique identifier for the account associated with this event.
- Properties: 13Type:datarequired{ created_at, email, first_name, +10 }
- Type: stringFormat: uuidevent
_id requiredUnique identifier for this event.
- Type: stringevent
_type requiredType of this event.
Responses
- 200
Webhook received.
{
"event_type": "user.event.v1",
"event_id": "85df84c7-a298-44bc-8040-7bd2ae372cbf",
"account_id": "857c679a-8e80-47f1-9334-39dd08ea801f",
"data": {
"id": "",
"organization_id": null,
"platform_id": null,
"authenticator_id": null,
"status": "invited",
"first_name": "",
"last_name": "",
"email": "",
"level": "none",
"roles": [
"none"
],
"created_at": "",
"updated_at": "",
"memberships": [
{
"level": "none",
"entity_id": null,
"entity_name": "",
"roles": [
"none"
],
"authenticator_organization_id": ""
}
]
}
}
Webhook received.
Webhook event: user.created.v1
Triggered when any significant change occurs to a user. This webhook is only supposed to be consumed by Straddle.
Body
Payload for the user.created.v1 event.
- Type: stringFormat: uuidaccount
_id requiredUnique identifier for the account associated with this event.
- Properties: 13Type:datarequired{ created_at, email, first_name, +10 }
- Type: stringFormat: uuidevent
_id requiredUnique identifier for this event.
- Type: stringevent
_type requiredType of this event.
Responses
- 200
Webhook received.
{
"event_type": "user.created.v1",
"event_id": "85df84c7-a298-44bc-8040-7bd2ae372cbf",
"account_id": "857c679a-8e80-47f1-9334-39dd08ea801f",
"data": {
"id": "",
"organization_id": null,
"platform_id": null,
"authenticator_id": null,
"status": "invited",
"first_name": "",
"last_name": "",
"email": "",
"level": "none",
"roles": [
"none"
],
"created_at": "",
"updated_at": "",
"memberships": [
{
"level": "none",
"entity_id": null,
"entity_name": "",
"roles": [
"none"
],
"authenticator_organization_id": ""
}
]
}
}
Webhook received.
Webhook event: funding_event.created.v1
Straddle sends this webhook when it creates a funding event. The payload includes the amount, transfer direction, event type, and initial status.
Body
Payload for the funding_event.created.v1 event.
- Type: stringFormat: uuidaccount
_id requiredUnique identifier for the account associated with this event.
- Properties: 12Type:datarequired{ amount, created_at, direction, +9 }
- Type: stringFormat: uuidevent
_id requiredUnique identifier for this event.
- Type: stringevent
_type requiredType of this event.
Responses
- 200
Webhook received.
{
"event_type": "funding_event.created.v1",
"event_id": "85df84c7-a298-44bc-8040-7bd2ae372cbf",
"account_id": "857c679a-8e80-47f1-9334-39dd08ea801f",
"data": {
"id": "",
"amount": 1,
"direction": "deposit",
"event_type": "charge_deposit",
"trace_ids": {
"additionalProperty": ""
},
"payment_count": 1,
"transfer_date": "",
"created_at": "",
"updated_at": "",
"status": "created",
"status_details": {
"message": "",
"reason": "insufficient_funds",
"source": "watchtower",
"code": null,
"changed_at": ""
},
"status_history": [
{
"reason": "insufficient_funds",
"source": "watchtower",
"message": "",
"code": null,
"changed_at": "",
"status": "created"
}
]
}
}
Webhook received.
Webhook event: funding_event.event.v1
Straddle sends this webhook when it creates or updates a funding event. The payload includes the current status and complete status history.
Body
Payload for the funding_event.event.v1 event.
- Type: stringFormat: uuidaccount
_id requiredUnique identifier for the account associated with this event.
- Properties: 12Type:datarequired{ amount, created_at, direction, +9 }
- Type: stringFormat: uuidevent
_id requiredUnique identifier for this event.
- Type: stringevent
_type requiredType of this event.
Responses
- 200
Webhook received.
{
"event_type": "funding_event.event.v1",
"event_id": "85df84c7-a298-44bc-8040-7bd2ae372cbf",
"account_id": "857c679a-8e80-47f1-9334-39dd08ea801f",
"data": {
"id": "",
"amount": 1,
"direction": "deposit",
"event_type": "charge_deposit",
"trace_ids": {
"additionalProperty": ""
},
"payment_count": 1,
"transfer_date": "",
"created_at": "",
"updated_at": "",
"status": "created",
"status_details": {
"message": "",
"reason": "insufficient_funds",
"source": "watchtower",
"code": null,
"changed_at": ""
},
"status_history": [
{
"reason": "insufficient_funds",
"source": "watchtower",
"message": "",
"code": null,
"changed_at": "",
"status": "created"
}
]
}
}
Webhook received.