Skip to content
  • Auto
  • Light
  • Dark
Get started
View as Markdown
Copy Markdown

Open in Claude
Open in ChatGPT

Release a charge

charges.release(id, **kwargs) -> ChargeV1 { data, meta, response_type }
put/v1/charges/{id}/release

Release a charge from an on_hold status to allow it to be rescheduled for processing.

ParametersExpand Collapse
id: String
reason: String

Details about why the charge status was updated.

correlation_id: String
idempotency_key: String
request_id: String
straddle_account_id: String
ReturnsExpand Collapse
class ChargeV1 { data, meta, response_type }
data: { id, amount, config, 19 more}
id: String

Unique identifier for the charge.

formatuuid
amount: Integer

The amount of the charge in cents.

formatint32
config: { balance_check, sandbox_outcome}

Configuration options for the charge.

balance_check: :required | :enabled | :disabled

Defines whether to check the customer's balance before processing the charge.

Accepts one of the following:
:required
:enabled
:disabled
sandbox_outcome: :standard | :paid | :on_hold_daily_limit | 8 more

Payment will simulate processing if not Standard.

Accepts one of the following:
:standard
:paid
:on_hold_daily_limit
:cancelled_for_fraud_risk
:cancelled_for_balance_check
:failed_insufficient_funds
:reversed_insufficient_funds
:failed_customer_dispute
:reversed_customer_dispute
:failed_closed_bank_account
:reversed_closed_bank_account

The channel or mechanism through which the payment was authorized. Use internet for payments made online or through a mobile app and signed for signed agreements where there is a consent form or contract. Use signed for PDF signatures.

Accepts one of the following:
created_at: Time

Timestamp of when the charge was created.

formatdate-time
currency: String

The currency of the charge. Only USD is supported.

description: String

An arbitrary description for the charge.

device: DeviceInfoV1 { ip_address }

Information about the device used when the customer authorized the payment.

ip_address: String

The IP address of the device used when the customer authorized the charge or payout. Use 0.0.0.0 to represent an offline consent interaction.

formatipv4
external_id: String

Unique identifier for the charge in your database. This value must be unique across all charges.

funding_ids: Array[String]

Funding Ids

paykey: String

Value of the paykey used for the charge.

payment_date: Date

The desired date on which the payment should be occur. For charges, this means the date you want the customer to be debited on.

formatdate
status: :created | :scheduled | :failed | 5 more

The current status of the charge.

Accepts one of the following:
:created
:scheduled
:failed
:cancelled
:on_hold
:pending
:paid
:reversed
status_details: StatusDetailsV1 { changed_at, message, reason, 2 more }

Additional details about the current status of the charge.

changed_at: Time

The time the status change occurred.

formatdate-time
message: String

A human-readable description of the current status.

reason: :insufficient_funds | :closed_bank_account | :invalid_bank_account | 17 more

A machine-readable identifier for the specific status, useful for programmatic handling.

Accepts one of the following:
:insufficient_funds
:closed_bank_account
:invalid_bank_account
:invalid_routing
:disputed
:payment_stopped
:owner_deceased
:frozen_bank_account
:risk_review
:fraudulent
:duplicate_entry
:invalid_paykey
:payment_blocked
:amount_too_large
:too_many_attempts
:internal_system_error
:user_request
:ok
:other_network_return
:payout_refused
source: :watchtower | :bank_decline | :customer_dispute | 2 more

Identifies the origin of the status change (e.g., bank_decline, watchtower). This helps in tracking the cause of status updates.

Accepts one of the following:
:watchtower
:bank_decline
:customer_dispute
:user_action
:system
code: String

The status code if applicable.

status_history: Array[{ changed_at, message, reason, 3 more}]

Status history.

changed_at: Time

The time the status change occurred.

formatdate-time
message: String

A human-readable description of the status.

reason: :insufficient_funds | :closed_bank_account | :invalid_bank_account | 17 more

A machine-readable identifier for the specific status, useful for programmatic handling.

Accepts one of the following:
:insufficient_funds
:closed_bank_account
:invalid_bank_account
:invalid_routing
:disputed
:payment_stopped
:owner_deceased
:frozen_bank_account
:risk_review
:fraudulent
:duplicate_entry
:invalid_paykey
:payment_blocked
:amount_too_large
:too_many_attempts
:internal_system_error
:user_request
:ok
:other_network_return
:payout_refused
source: :watchtower | :bank_decline | :customer_dispute | 2 more

Identifies the origin of the status change (e.g., bank_decline, watchtower). This helps in tracking the cause of status updates.

Accepts one of the following:
:watchtower
:bank_decline
:customer_dispute
:user_action
:system
status: :created | :scheduled | :failed | 5 more

The current status of the charge or payout.

Accepts one of the following:
:created
:scheduled
:failed
:cancelled
:on_hold
:pending
:paid
:reversed
code: String

The status code if applicable.

updated_at: Time

Timestamp of when the charge was last updated.

formatdate-time
customer_details: CustomerDetailsV1 { id, customer_type, email, 2 more }

Information about the customer associated with the charge.

id: String

Unique identifier for the customer

formatuuid
customer_type: :individual | :business

The type of customer

Accepts one of the following:
:individual
:business
email: String

The customer's email address

name: String

The name of the customer

phone: String

The customer's phone number in E.164 format

effective_at: Time

Timestamp of when the charge was effective in the customer's bank account, otherwise known as the date on which the customer is debited.

formatdate-time
metadata: Hash[Symbol, String]

Up to 20 additional user-defined key-value pairs. Useful for storing additional information about the charge in a structured format.

paykey_details: PaykeyDetailsV1 { id, customer_id, label, balance }

Information about the paykey used for the charge.

id: String

Unique identifier for the paykey.

formatuuid
customer_id: String

Unique identifier for the customer associated with the paykey.

formatuuid
label: String

Human-readable label that combines the bank name and masked account number to help easility represent this paykey in a UI

balance: Integer

The most recent balance of the bank account associated with the paykey in dollars.

formatint32
payment_rail: :ach

The payment rail that the charge will be processed through.

Accepts one of the following:
:ach
processed_at: Time

Timestamp of when the charge was processed by Straddle and originated to the payment rail.

formatdate-time
meta: ResponseMetadata { api_request_id, api_request_timestamp }

Metadata about the API request, including an identifier and timestamp.

api_request_id: String

Unique identifier for this API request, useful for troubleshooting.

formatuuid
api_request_timestamp: Time

Timestamp for this API request, useful for troubleshooting.

formatdate-time
response_type: :object | :array | :error | :none

Indicates the structure of the returned content.

  • "object" means the data field contains a single JSON object.
  • "array" means the data field contains an array of objects.
  • "error" means the data field contains an error object with details of the issue.
  • "none" means no data is returned.
Accepts one of the following:
:object
:array
:error
:none
Release a charge
require "straddle"

straddle = Straddle::Client.new(
  api_key: "My API Key",
  environment: "production" # defaults to "sandbox"
)

charge_v1 = straddle.charges.release("182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e")

puts(charge_v1)
{
  "data": {
    "id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
    "amount": 10000,
    "config": {
      "balance_check": "required",
      "sandbox_outcome": "standard"
    },
    "consent_type": "internet",
    "created_at": "2019-12-27T18:11:19.117Z",
    "currency": "currency",
    "description": "Monthly subscription fee",
    "device": {
      "ip_address": "192.168.1.1"
    },
    "external_id": "external_id",
    "funding_ids": [
      "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"
    ],
    "paykey": "paykey",
    "payment_date": "2019-12-27",
    "status": "created",
    "status_details": {
      "changed_at": "2019-12-27T18:11:19.117Z",
      "message": "Payment successfully created and awaiting validation.",
      "reason": "insufficient_funds",
      "source": "system",
      "code": null
    },
    "status_history": [
      {
        "changed_at": "2019-12-27T18:11:19.117Z",
        "message": "Payment successfully created and awaiting validation.",
        "reason": "insufficient_funds",
        "source": "watchtower",
        "status": "created",
        "code": null
      }
    ],
    "updated_at": "2019-12-27T18:11:19.117Z",
    "customer_details": {
      "id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
      "customer_type": "individual",
      "email": "ron@swanson.com",
      "name": "Ron Swanson",
      "phone": "+1234567890"
    },
    "effective_at": "2019-12-27T18:11:19.117Z",
    "metadata": {
      "foo": "string"
    },
    "paykey_details": {
      "id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
      "customer_id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
      "label": "Bank of America ****1234",
      "balance": 0
    },
    "payment_rail": "ach",
    "processed_at": "2019-12-27T18:11:19.117Z"
  },
  "meta": {
    "api_request_id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
    "api_request_timestamp": "2019-12-27T18:11:19.117Z"
  },
  "response_type": "object"
}
Returns Examples
{
  "data": {
    "id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
    "amount": 10000,
    "config": {
      "balance_check": "required",
      "sandbox_outcome": "standard"
    },
    "consent_type": "internet",
    "created_at": "2019-12-27T18:11:19.117Z",
    "currency": "currency",
    "description": "Monthly subscription fee",
    "device": {
      "ip_address": "192.168.1.1"
    },
    "external_id": "external_id",
    "funding_ids": [
      "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"
    ],
    "paykey": "paykey",
    "payment_date": "2019-12-27",
    "status": "created",
    "status_details": {
      "changed_at": "2019-12-27T18:11:19.117Z",
      "message": "Payment successfully created and awaiting validation.",
      "reason": "insufficient_funds",
      "source": "system",
      "code": null
    },
    "status_history": [
      {
        "changed_at": "2019-12-27T18:11:19.117Z",
        "message": "Payment successfully created and awaiting validation.",
        "reason": "insufficient_funds",
        "source": "watchtower",
        "status": "created",
        "code": null
      }
    ],
    "updated_at": "2019-12-27T18:11:19.117Z",
    "customer_details": {
      "id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
      "customer_type": "individual",
      "email": "ron@swanson.com",
      "name": "Ron Swanson",
      "phone": "+1234567890"
    },
    "effective_at": "2019-12-27T18:11:19.117Z",
    "metadata": {
      "foo": "string"
    },
    "paykey_details": {
      "id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
      "customer_id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
      "label": "Bank of America ****1234",
      "balance": 0
    },
    "payment_rail": "ach",
    "processed_at": "2019-12-27T18:11:19.117Z"
  },
  "meta": {
    "api_request_id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
    "api_request_timestamp": "2019-12-27T18:11:19.117Z"
  },
  "response_type": "object"
}