Skip to content
Get started

Review

Paykeys are secure tokens that link verified customer identities to their bank accounts. Each Paykey includes built-in balance checking, fraud detection through LSTM machine learning models, and can be reused for subscriptions and recurring payments without storing sensitive data. Paykeys eliminate fraud by ensuring the person initiating payment owns the funding account.

Update a paykey's status
paykeys.review.decision(id, **kwargs) -> PaykeyV1 { data, meta, response_type }
PATCH/v1/paykeys/{id}/review
Get paykey review details
paykeys.review.get(id, **kwargs) -> ReviewGetResponse { data, meta, response_type }
GET/v1/paykeys/{id}/review
Update a paykey's identity review decision
paykeys.review.refresh_review(id, **kwargs) -> PaykeyV1 { data, meta, response_type }
PUT/v1/paykeys/{id}/refresh_review
ModelsExpand Collapse
class ReviewGetResponse { data, meta, response_type }
data: { paykey_details, verification_details}
paykey_details: { id, config, created_at, 14 more}
id: String

Unique identifier for the paykey.

formatuuid
config: { processing_method, sandbox_outcome}
processing_method: :inline | :background | :skip
One of the following:
:inline
:background
:skip
sandbox_outcome: :standard | :active | :rejected | :review
One of the following:
:standard
:active
:rejected
:review
created_at: Time

Timestamp of when the paykey was created.

formatdate-time
label: String

Human-readable label used to represent this paykey in a UI.

paykey: String

The tokenized paykey value. This value is used to create payments and should be stored securely.

source: :bank_account | :straddle | :mx | 3 more
One of the following:
:bank_account
:straddle
:mx
:plaid
:tan
:quiltt
status: :pending | :active | :inactive | 3 more
One of the following:
:pending
:active
:inactive
:rejected
:review
:blocked
updated_at: Time

Timestamp of the most recent update to the paykey.

formatdate-time
balance: { status, account_balance, updated_at}
status: :pending | :completed | :failed
One of the following:
:pending
:completed
:failed
account_balance: Integer

Account Balance when last retrieved

formatint32
updated_at: Time

Last time account balance was updated.

formatdate-time
bank_data: { account_number, account_type, routing_number}
account_number: String

Bank account number. This value is masked by default for security reasons. Use the /unmask endpoint to access the unmasked value.

account_type: :checking | :savings
One of the following:
:checking
:savings
routing_number: String

The routing number of the bank account.

minLength9
maxLength9
customer_id: String

Unique identifier of the related customer object.

formatuuid
expires_at: Time

Expiration date and time of the paykey, if applicable.

formatdate-time
external_id: String

Unique identifier for the paykey in your database, used for cross-referencing between Straddle and your systems.

institution_name: String

Name of the financial institution.

metadata: Hash[Symbol, String]

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

status_details: { changed_at, message, reason, 2 more}
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 | 24 more
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
:cancel_request
:failed_verification
:require_review
:blocked_by_system
:watchtower_review
:validating
:auto_hold
source: :watchtower | :bank_decline | :customer_dispute | 2 more
One of the following:
:watchtower
:bank_decline
:customer_dispute
:user_action
:system
code: String

The status code if applicable.

unblock_eligible: bool

Indicates whether this paykey is eligible for client-initiated unblocking. Only present for blocked paykeys. True when blocked due to R29 returns and not previously unblocked, false otherwise. Null when paykey is not blocked.

verification_details: { id, breakdown, created_at, 3 more}
id: String

Unique identifier for the verification details.

formatuuid
breakdown: { account_validation, name_match}
account_validation: { codes, decision, reason}
codes: Array[String]
decision: :accept | :reject | :review
One of the following:
:accept
:reject
:review
reason: String
name_match: { codes, decision, correlation_score, 4 more}
codes: Array[String]
decision: :accept | :reject | :review
One of the following:
:accept
:reject
:review
correlation_score: Float
customer_name: String
matched_name: String
names_on_account: Array[String]
reason: String
created_at: Time

Timestamp of when the verification was initiated.

formatdate-time
decision: :accept | :reject | :review
One of the following:
:accept
:reject
:review
messages: Hash[Symbol, String]

Dictionary of all messages from the paykey verification process.

updated_at: Time

Timestamp of the most recent update to the verification details.

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.
One of the following:
:object
:array
:error
:none