## Hold a payout `payouts.hold(id, **kwargs) -> PayoutV1` **put** `/v1/payouts/{id}/hold` Hold a payout to prevent it from being processed. The status of the payout must be `created`, `scheduled`, or `on_hold`. ### Parameters - `id: String` - `reason: String` Details about why the payout status was updated. - `correlation_id: String` - `idempotency_key: String` - `request_id: String` - `straddle_account_id: String` ### Returns - `class PayoutV1` - `data: { id, amount, config, 20 more}` - `id: String` Unique identifier for the payout. - `amount: Integer` The amount of the payout in cents. - `config: { auto_hold, auto_hold_message, sandbox_outcome}` Configuration for the payout. - `auto_hold: bool` Defines whether to automatically place this charge on hold after being created. - `auto_hold_message: String` The reason the payout is being automatically held on creation. - `sandbox_outcome: :standard | :paid | :on_hold_daily_limit | 8 more` Payment will simulate processing if not Standard. - `: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` - `currency: String` The currency of the payout. Only USD is supported. - `description: String` An arbitrary description for the payout. - `device: DeviceInfoV1` Information about the device used when the customer authorized the payout. - `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. - `external_id: String` Unique identifier for the payout in your database. This value must be unique across all payouts. - `funding_ids: Array[String]` Funding Ids - `paykey: String` Value of the `paykey` used for the payout. - `payment_date: Date` The desired date on which the payment should be occur. For payouts, this means the date you want the funds to be sent from your bank account. - `status: :created | :scheduled | :failed | 6 more` The current status of the payout. - `:created` - `:scheduled` - `:failed` - `:cancelled` - `:on_hold` - `:pending` - `:paid` - `:reversed` - `:validating` - `status_details: StatusDetailsV1` Details about the current status of the payout. - `changed_at: Time` The time the status change occurred. - `message: String` A human-readable description of the current status. - `reason: :insufficient_funds | :closed_bank_account | :invalid_bank_account | 24 more` A machine-readable identifier for the specific status, useful for programmatic handling. - `: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` - `:cancel_request` - `:failed_verification` - `:require_review` - `:blocked_by_system` - `:watchtower_review` - `:validating` - `:auto_hold` - `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. - `:watchtower` - `:bank_decline` - `:customer_dispute` - `:user_action` - `:system` - `code: String` The status code if applicable. - `status_history: Array[{ changed_at, message, reason, 3 more}]` History of the status changes for the payout. - `changed_at: Time` The time the status change occurred. - `message: String` A human-readable description of the status. - `reason: :insufficient_funds | :closed_bank_account | :invalid_bank_account | 24 more` A machine-readable identifier for the specific status, useful for programmatic handling. - `: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` - `:cancel_request` - `:failed_verification` - `:require_review` - `:blocked_by_system` - `:watchtower_review` - `:validating` - `:auto_hold` - `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. - `:watchtower` - `:bank_decline` - `:customer_dispute` - `:user_action` - `:system` - `status: :created | :scheduled | :failed | 6 more` The current status of the `charge` or `payout`. - `:created` - `:scheduled` - `:failed` - `:cancelled` - `:on_hold` - `:pending` - `:paid` - `:reversed` - `:validating` - `code: String` The status code if applicable. - `trace_ids: Hash[Symbol, String]` Trace Ids. - `created_at: Time` The time the payout was created. - `customer_details: CustomerDetailsV1` Information about the customer associated with the payout. - `id: String` Unique identifier for the customer - `customer_type: :individual | :business` The type of customer - `: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` The actual date on which the payment occurred. For payouts, this is the date the funds were sent from your bank account. - `metadata: Hash[Symbol, String]` Up to 20 additional user-defined key-value pairs. Useful for storing additional information about the payout in a structured format. - `paykey_details: PaykeyDetailsV1` Information about the paykey used for the payout. - `id: String` Unique identifier for the paykey. - `customer_id: String` Unique identifier for the customer associated with the paykey. - `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. - `payment_rail: :ach` The payment rail used for the payout. - `:ach` - `processed_at: Time` The time the payout was processed by Straddle and originated to the payment rail. - `related_payments: Hash[Symbol, :original | :resubmit | :refund]` Related payments. - `:original` - `:resubmit` - `:refund` - `updated_at: Time` The time the payout was last updated. - `meta: ResponseMetadata` Metadata about the API request, including an identifier and timestamp. - `api_request_id: String` Unique identifier for this API request, useful for troubleshooting. - `api_request_timestamp: Time` Timestamp for this API request, useful for troubleshooting. - `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. - `:object` - `:array` - `:error` - `:none` ### Example ```ruby require "straddle" straddle = Straddle::Client.new( api_key: "My API Key", environment: "production" # defaults to "sandbox" ) payout_v1 = straddle.payouts.hold("182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e", reason: "reason") puts(payout_v1) ``` #### Response ```json { "data": { "id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e", "amount": 10000, "config": { "auto_hold": true, "auto_hold_message": "auto_hold_message", "sandbox_outcome": "standard" }, "currency": "currency", "description": "description", "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 } ], "trace_ids": { "foo": "string" }, "created_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", "related_payments": { "foo": "original" }, "updated_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" } ```