Download OpenAPI specification:Download
The JustiFi API is a REST-based payment processing API. Our API has predictable, resource-oriented URLs, accepts JSON, and returns JSON. We use HTTP status codes and supply detailed error codes whenever possible. We'll provide you with both a test and live account with which to use our API. Each account will have its own API key, and the key you use to authenticate each request will determine whether to use your test or live account. When you use your test account, it won't affect your live data or move any real money.
To process a payment with JustiFi, follow these steps
Our customer onboarding team will work with you to create your test and live accounts. For platforms, our team will also guide you through setting up your sub accounts onboarding. Once you're up and running, you'll have access to the JustiFi API as well as the admin features at https://app.justifi.ai where you can see your account overview, payments, payouts, issue refunds, etc.
Once your test and live accounts have been created, you'll have access to generate your API keys in the Developer Tools section of the app. You'll need a test key and a live key. Each key will provide you with a client id and a client secret, which you'll use to authenticate your API requests. Requests authenticated with your test key will use your test account; requests authenticated with your live key will use your live account. Make sure to store your client secrets somewhere secure (like a password manager) because this is the only time they'll display in the UI.
Additionally, we can provide access to a sandbox environment upon request.
curl -X POST https://api.justifi.ai/oauth/token \
-H 'Content-Type: application/json' \
--data '{"client_id":"[your client id]","client_secret":"[your client secret]"}'
{
"access_token": "... this will be a very long string and is valid for 24 hours"
}
curl -X POST https://api.justifi.ai/v1/payments \
-H 'Authorization: Bearer [access_token]' \
-H 'Content-Type: application/json'
-H 'Idempotency-Key: a-unique-string-for-the-transaction'
JustiFi uses the OAuth Client Credentials authentication flow. To access, use your JustiFi client id and client secret to POST to https://api.justifi.ai/oauth/token. These are valid for 24 hours. The test key is prepended with test_ and the live key is prepended with live_.
Next, take the access token in that response and pass it in all subsequent requests as the Authorization header.
This token is valid for 24 hours, so be sure to handle a 401 - Unauthorized response by getting a new access token via the client credentials grant API.
curl -X POST https://api.justifi.ai/v1/payments \
-H 'Authorization: Bearer [access_token]' \
-H 'Accept: application/json'
-H 'Idempotency-Key: a-unique-string-for-the-transaction'
In order to guarantee that payments and other important transactions are only ever processed a single time, we leverage the Idempotency-Key header in our payments APIs. This means that you MUST provide an Idempotency-Key header along with your request, otherwise you'll receive an error. If a second request with same idempotent key is processed concurrently, it will result in a 409 error instead of double processing.
If these requests fail with a network timeout or a 5XX error, they should be retried with the same exact parameters. Once they're fully successful, you'll receive a 2XX response. If you POST the same request and Idempotency-Key again, you'll get the response you originally received back. If you receive a 4XX error, do not retry the request, unless the response code is a 409.
If you try the same Idempotency-Key with different parameters, your request will error and won't be possible to process. The Idempotency-Key header is only meant for a single transaction; it's there to protect against processing the same exact thing more than once. Once the parameters change, a request is considered distinct from the original request.
You may use any string to identify your Idempotency-Key; we generally recommend using a generated uuid, but you may use any unique string.
curl -X GET https://api.justifi.ai/v1/payments?limit=25&after_cursor=token-from-page-info \
-H 'Authorization: Bearer [access_token]' \
-H 'Accept: application/json'
{
"id": null,
"type": "array",
"data":[
{ "id":"py_438xBom2Drh55kE1WfyGLg",
"amount": 1000,
... additional response attributes based on resource schema
}
],
"page_info": {
"has_previous": false,
"has_next": true,
"start_cursor": "WyIyMDIyLTAxLTExIDE1OjI3OjM2LjAyNzc3MDAwMCIsImNhNjQwMTk1LTEzYzMtNGJlZi1hZWQyLTU3ZjA1MzhjNjNiYSJd",
"end_cursor": "WyIyMDIyLTAxLTExIDEyOjU5OjQwLjAwNTkxODAwMCIsImQ0Njg5MGE2LTJhZDItNGZjNy1iNzdkLWFiNmE3MDJhNTg3YSJd"
}
}
array API Request Parameters| Parameter | Description |
|---|---|
limit |
The number of resources to retrieve. type: integerdefault: 25minimum: 1maximum: 100
|
after_cursor |
Token to fetch the next page of a list. type: string |
before_cursor |
Token to fetch the previous page of a list. type: string |
The after_cursor/before_cursor parameter determines which page of results will be returned.
If after_cursor is the encoded id of the last record in the collection has_next will be false and you'll get an empty array response. If before_cursor is the encoded id of the first record in the collection has_previous will be false and you'll get an empty array response.
The limit parameter determines the maximum number of results included in each response. If there are fewer
records available than the limit value, the response will include all available records. The maximum value
allowed is 100 with a default value of 25. If the limit value is an invalid type, the default value of 25 is used.
All of our responses are contained in the same envelope, for arrays the id field will be null and the object will be an array.
| Attribute | Description |
|---|---|
id |
The id of the object returned. Will be null for arrays. type: stringdefault: "a uuid"
|
type |
The type of object returned. type: stringdefault: "array"
|
data |
The resource OR an array of the requested resources. type: array | objectNotes: May be an empty array [] if no resources are available. |
page_info |
The object containing pagination information. type: objectNotes: Contains has_previous, has_next, start_cursor and end_cursor
|
Use these card numbers to test successful transactions as well as various error scenarios. Make sure to authenticate your requests using your test API key (these cards won't work for live payments).
| Number | Brand | CVC | Date |
|---|---|---|---|
4242424242424242 |
Visa | Any 3 digits | Any future date |
4000056655665556 |
Visa (debit) | Any 3 digits | Any future date |
5555555555554444 |
Mastercard | Any 3 digits | Any future date |
2223003122003222 |
Mastercard (2-series) | Any 3 digits | Any future date |
5200828282828210 |
Mastercard (debit) | Any 3 digits | Any future date |
5105105105105100 |
Mastercard (prepaid) | Any 3 digits | Any future date |
378282246310005 |
American Express | Any 4 digits | Any future date |
371449635398431 |
American Express | Any 4 digits | Any future date |
6011000990139424 |
Discover | Any 3 digits | Any future date |
| Number | Description | Tokenization Succeeds |
|---|---|---|
4000000000000101 |
If a CVC number is provided, the cvc_check fails. | true |
4000000000000341 |
Tokenizing this card succeeds, but attempts to make a payment fail. | true |
4000000000000002 |
Payment is declined with a card_declined code. | true |
4000000000009995 |
Payment is declined with a card_declined code. The decline_code attribute is insufficient_funds. | true |
4000000000009987 |
Payment is declined with a card_declined code. The decline_code attribute is lost_card. | true |
4000000000009979 |
Payment is declined with a card_declined code. The decline_code attribute is stolen_card. | true |
4000000000000069 |
Payment is declined with an expired_card code. | true |
4000000000000127 |
Payment is declined with an invalid_cvc code. | true |
4000000000000119 |
Payment is declined with a gateway_error code. | true |
4242424242424241 |
Payment is declined with an card_number_invalid code as the card number fails the Luhn check. | false |
| Routing Number | Account Number |
|---|---|
110000000 |
000123456789 |
| Routing Number | Account Number | Payment Error |
|---|---|---|
110000000 |
000222222227 |
Insufficient Funds |
110000000 |
000333333335 |
The account doesn't support debits |
110000000 |
000111111113 |
The account is closed |
110000000 |
000111111116 |
The account doesn't exist |
The JustiFi API may return a number of standard HTTP errors due to invalid requests. Some common errors are described below to help you build with JustiFi.
The server cannot process the request. This error is most likely due to malformed request syntax.
400Bad RequestSimilar to a 403 Forbidden, but specifically when authentication is provided and has failed, or has not been provided.
This error is most likely due to not including your API key in the request header.
401UnauthorizedThere was an error processing the payment. This response is returned when errors occur while tokenizing the payment method, such as an invalid cvc or an expiration date in the past. This can also occur when making a payment and the card is declined. In that case, the error message will provide more specific information about why the request was declined.
402Payment RequiredThe request was valid, but you are unable to execute the request. This error is most likely due to the API key that was used not having the necessary permissions, or attempting a prohibited action such as creating a duplicate record where one already exists.
403ForbiddenThe requested resource could not be found, but may be available in the future. This error is most likely due to
requesting a resource by id that doesn't exist. You'll want to double check that you're referencing the correct
id and that it exists on your account.
404Not FoundThe request has an identical Idempotency-Key header for another request which either failed OR is processing at the same time. You can retry these requests without risk of double processing.
409ConflictThe request was well-formed, but was unable to be processed due to semantic errors. This error is most likely due to
including invalid data in POST, PATCH, and PUT requests. Double check the request documentation to make sure
you're supplying the required attributes, and that the attribute types are correct.
422Unprocessable EntityAn internal server error occurred due to an unexpected condition. This error is most likely due to an issue with our servers.
500Internal Server ErrorMany of our 4XX errors will provide an error code in addition to their HTTP status. Here is a list of our error codes and a brief description of the error to provide more context when applicable.
| Error Code | Description |
|---|---|
acct_last_four_required |
Missing required parameter: acct_last_four |
amount_below_minimum |
Amount must be greater than 50 |
amount_must_be_an_integer |
Amount must be an integer |
amount_required |
Missing required parameter: amount |
amount_above_maximum |
Amount must be lower than 100000000 ($1,000,000.00) |
amount_below_minimum |
Amount must be greater than 50 |
application_fee_rate_id_required |
Missing required parameter: application_fee_rate_id |
application_fee_required |
Missing required parameter: application_fee |
brand_required |
Missing required parameter: brand |
capture_strategy_invalid |
Format is invalid for parameter: capture_strategy |
card_decline_rate_limit_exceeded |
This card has been declined too many times. You can try to charge this card again after 24 hours. We suggest reaching out to your customer to make sure they have entered all of their information correctly and that there are no issues with their card. |
card_declined |
The card has been declined. When a card is declined, the error includes a decline_code attribute specifying the reason for the decline, and a network_decline_code provided by the card network, if available. |
card_name_required |
Missing required parameter: card_name |
card_number_invalid |
Format is invalid for parameter: card_number |
card_number_required |
Missing required parameter: card_number |
charge_expired_for_capture |
The charge cannot be captured as the authorization has expired. Auth and capture charges must be captured within 7 days. |
country_invalid |
Format is invalid for parameter: country |
currency_invalid |
Format is invalid for parameter: currency |
currency_required |
Missing required parameter: currency |
customer_id_required |
Missing required parameter: customer_id |
customer_max_payment_methods |
The maximum number of PaymentMethods for this Customer has been reached. Either detach some PaymentMethods from this Customer or proceed with a different Customer. |
email_invalid |
The email address is invalid (e.g., not properly formatted). Check that the email address is properly formatted and only includes allowed characters. |
email_required |
Missing required parameter: email |
expired_card |
The card has expired. Please check the expiration date or try a different card or payment method. |
gateway_account_id_required |
Missing required parameter: gateway_account_id |
gateway_authentication_error |
The payment network returned an authentication error |
gateway_error |
There was an issue processing your payment with the gateway. Please try again later. |
gateway_idempotency_error |
The gateway detected concurrent requests using this idempotency key |
gateway_rate_limit_error |
Too many requests hit the API too quickly. We recommend an exponential back-off of your requests. |
gateway_ref_id_required |
Missing required parameter: gateway_ref_id |
gateway_timeout_error |
There was a timeout with the gateway, we recommend retrying using the Should-Retry header |
idempotency_concurrent_request |
We detected concurrent requests using this idempotency key |
idempotency_key_required |
Idempotency-Key is a required header |
idempotency_params_mismatch |
The request parameters do not match those of a previous request using this idempotency key |
idempotency_request_in_progress |
Another request using this idempotency key is currently in progress |
internal_server_error |
An unexpected error has occurred. JustiFi engineers will investigate the error and contact you if any remediation steps are necessary. |
invalid_address |
The card’s address is incorrect. Please check the address or try a different card or payment method. |
invalid_card_number |
The card’s number is incorrect. Please check the number or try a different card or payment method. |
invalid_card_brand |
The card’s brand is not supported. Please use Visa, Mastercard, American Express, or Discover, or try a different payment method. |
invalid_characters |
This value provided to the field contains characters that are unsupported by the field. |
invalid_charge_amount |
Your transaction was declined because the payment amount is outside the limits set by your card issuer. Please try a different card or payment method. |
invalid_cvc |
The card’s security code is incorrect. Please check the security code or try a different card or payment method. |
invalid_expiry_month |
The card’s expiration month is incorrect. Please check the expiration date or try a different card or payment method. |
invalid_expiry_year |
The card’s expiration year is incorrect. Please check the expiration date or try a different card or payment method. |
invalid_expiry_date |
The provided expiration date is invalid. Please check the expiration date or try a different card or payment method. |
invalid_zip_code |
The card’s postal code is incorrect. Please check the postal code or try a different card or payment method. |
month_invalid |
Format is invalid for parameter: month |
not_authenticated |
Not authenticated |
not_authorized |
Not authorized |
parameter_missing |
Missing required parameter |
payment_fully_refunded |
The refund cannot be processed because the associated payment is fully refunded |
payment_intent_cannot_be_captured |
Payment Intent status is '%{status}' so it cannot be captured |
payment_intent_not_found |
Payment intent not found |
payment_intent_unexpected_state |
You cannot provide a new payment method to a PaymentIntent when it has a status of requires_capture, canceled, or succeeded |
payment_method_not_found |
Payment method not found |
payment_method_required |
Missing required parameter: payment_method |
payment_method_token_required |
Missing required parameter: payment_method_token |
payment_outside_refund_window |
The refund cannot be processed because the associated payment is outside the refund window |
postal_code_invalid |
Format is invalid for parameter: postal_code |
refund_error |
An error occurred during refunding your payment, JustiFi engineers have been alerted and are working on a solution |
refund_exceeds_amount_available |
The refund cannot be processed because the refund amount exceeds the available funds |
refund_exceeds_payment_amount |
The refund cannot be processed because the refund amount exceeds the associated payment amount |
refund_reason_invalid |
Refund reason must be one of the following: %{Refund::REASONS} |
resource_not_found |
Resource not found |
state_invalid |
Format is invalid for parameter: state |
token_already_used |
The token provided has already been used. You must create a new token before you can retry this request. |
token_in_use |
The token provided is currently being used in another request. This occurs if your integration is making duplicate requests simultaneously. |
transfer_required |
Missing required parameter: transfer |
unexpected_parameter |
Unexpected parameter for this request |
verification_invalid |
Format is invalid for parameter: verification |
year_invalid |
Format is invalid for parameter: year |
service_not_allowed |
This account is not permitted to process the type of transaction being requested, or the surcharge amount is invalid |
do_not_honor |
This card has been rejected by the issuing bank. Please try a different card or payment method. |
do_not_retry |
This card has been rejected. Please try a different card or payment method. |
refund_in_progress |
A refund for this payment is already in progress |
invalid_sub_account |
The sub account cannot process a payment for this card. Please contact customer support. |
new_card_issued |
The transaction was denied because the issuing bank has issued a new card. Please try a different card or payment method. |
account_closed |
The account associated with this payment method is been closed. Please try a different card or payment method. |
restricted_card |
This card has a restriction preventing approval for this transaction. Please try a different card or payment method. |
restricted_card |
This card has a restriction preventing approval for this transaction. Please try a different card or payment method. |
insufficient_funds |
This card has insufficient funds. Please try a different card or payment method. |
exceeds_card_limit |
The payment amount would exceed a limit placed on this card. |
pin_tries_exceeded |
The number of PIN retries has been exceeded. |
incorrect_pin |
The entered PIN is incorrect. |
pin_required |
A PIN is required. |
payment_outside_void_window |
The void cannot be processed because the associated payment is outside the void window. Try a refund instead. |
issuer_not_available |
The card issuer is not available. Please try again later. |
amount_too_small |
The specified amount is less than the minimum amount allowed. Use a higher amount and try again. |
amount_too_large |
The specified amount is less than the minimum amount allowed. Use a higher amount and try again. |
gateway_error_please_retry |
There was a temporary issue processing this payment. Please try again. |
checkout_invalid_currency |
The currency parameter does not match the currency this account is configured to process. |
We provide the network error code, and the network error category to help inform you how to handle a decline. These are only returned when a transaction fails while trying to process on the card network. Please take a look at each section. The network error category is especially relevant for recurring payments. It can reduce retries on transactions which will never succeed.
In addition to the standard error codes provided by JustiFi, some errors may include a network_error_code that provides more specific information about the error from the payment network. Here's a list of common network_error_code values and their meanings:
| Code | Description | Customer Impact & Suggested Actions |
|---|---|---|
| 005 | Do not honor (Declined by card association) | The payment was declined by the card association. The customer should try a different payment method or contact the card issuer for more information. |
| 100 | Do not honor (Declined by card association) | The payment was declined by the card association. The customer should try a different payment method or contact the card issuer for more information. |
| 101 | Expired card | The provided card has expired. The customer needs to update with a new, non-expired card or provide a different payment method. |
| 102 | Suspected Fraud | The payment was flagged as potentially fraudulent activity. The customer should contact the card issuer to verify the transaction. |
| 104 | Restricted card | The provided card is restricted and cannot be used for this transaction type. The customer needs to use a different payment method or contact the card issuer. |
| 106 | Allowable PIN tries exceeded | The maximum allowable PIN entry attempts have been exceeded. The customer should verify the PIN and try again, or use a different payment method. |
| 110 | Invalid amount | The payment amount entered is invalid. The customer needs to recheck the amount and retry the transaction. |
| 116 | Not sufficient funds | There are insufficient funds in the account to cover this payment. The customer should add funds to the account or use a different payment method. |
| 117 | Incorrect PIN or PIN length error | The entered PIN is incorrect or has an invalid length. The customer should re-enter the correct PIN and try again. |
| 119 | Transaction not permitted to cardholder | This transaction is not permitted for the provided card/account. The customer should contact the card issuer or use a different payment method. |
| 121 | Exceeds withdrawal amount limit | The payment amount exceeds the maximum allowed withdrawal limit. The customer should try a smaller amount or use a different payment method. |
| 122 | Security violation | A security violation was detected with this payment. The customer should contact the card issuer for assistance. |
| 123 | Exceeds withdrawal frequency limit | The maximum number of allowed withdrawals within the set time period has been exceeded. The customer should try again later or use a different payment method. |
| 124 | Violation of law | This payment violates applicable laws or regulations and cannot be processed. The customer needs to use a different payment method. |
| 129 | Suspected counterfeit card | The card has been flagged as potentially counterfeit. The customer should contact the card issuer immediately. |
| 131 | Invalid account number | The provided account number is invalid. The customer needs to verify the account details and try again with the correct information. |
| 132 | Unmatched card expiry date | The provided expiration date does not match the card issuer's records. The customer should confirm the correct expiry date and retry. |
| 134 | Not sufficient funds | There are insufficient funds in the account to cover this payment. The customer should add funds to the account or use a different payment method. |
| 152 | Exceeds limit | The payment amount exceeds the maximum limit allowed. The customer should try a smaller amount or use a different payment method. |
| 154 | Over monthly limit | The maximum monthly payment limit has been exceeded. The customer should try again next month or use a different payment method. |
| 208 | Lost Card / Lost Check | The card or check was reported as lost. The customer needs to use a different, valid payment method. |
| 209 | Stolen card | The card was reported as stolen. The customer should contact the card issuer immediately and use a different payment method. |
| 213 | Invalid account number for card type | The provided account number is invalid for the specified card type. The customer needs to verify the account details and retry with the correct information. |
| 231 | Stop payment requested for all payments | A stop payment has been requested on this account, so no payments can be processed. The customer should contact the card issuer for assistance. |
| 232 | Stop all payments – account closed | This account has been closed, so no payments can be processed. The customer needs to use a different payment method or contact support to update the account details. |
| 237 | Deny – new card issued | A new card has been issued for this account. The customer needs to update the payment method with the new card details and retry. |
| 302 | Account closed | The account the customer is trying to pay from is closed and cannot be used. The customer needs to update with a different, valid payment method. |
| 317 | Max balance exceeded | This payment would cause the account balance to exceed the maximum allowed limit. The customer should try a smaller amount or use a different payment method. |
| 351 | Customer PIN authentication required | The customer must authenticate this payment by entering the PIN. The customer should follow the prompts to complete PIN authentication. |
| 414 | Void/Full Reversal request unable to process due to network cut-off window elapsed | The void or reversal request could not be processed because the network cut-off time has passed. A refund may be required instead. |
| 503 | New Account Information | New account information is available for this payment method. The customer needs to update the account details and retry the payment. |
| 504 | Do not try again | This payment was declined and should not be retried with this payment method. The customer needs to use an alternative method. |
| 505 | Please retry | There was a temporary issue processing this payment. The customer should retry the same payment again. |
| 512 | Service not allowed or invalid surcharge amount | This service or surcharge amount is not permitted for the account. The customer needs to verify the account details or try a different payment type. |
| 516 | Please retry – Reasons include: Format Error, Unable to route transaction, Switch or issuer unavailable, System Busy, Timeout | A temporary issue caused this payment to fail, the customer should retry. If it continues to fail, the card issuer should be contacted. |
| 517 | CVV2 Declined | The entered CVV2/CVC security code was declined. The customer should verify the code and retry with the correct information. |
| 531 | Retry with 3DS data - 3D Secure authentication is required for this transaction, but not supported at this time | This card requires 3D Secure authentication which is not currently supported. The customer should use an alternative payment method or contact the card issuer. |
| 528 | Debit/EBT transaction count exceeds pre-determined limit in specified time/ Withdrawal limit exceeded | The maximum allowed debit/EBT transaction count or withdrawal limit for the given time period has been exceeded. The customer should try again later or use a different payment method. |
| 902 | Invalid Transaction | The payment transaction data was invalid and could not be processed. The customer needs to verify the payment details and retry. |
| 907 | Card issuer or switch inoperative or processor not available | There was an issue with the card issuer's systems or payment processor during this transaction. The customer should retry later or use another payment method. |
Both Visa and Mastercard send additional information about how to handle a declined payment for recurring payments. Effective May 30th, 2025 we pass through this information to help handle failures. We have added the network and network_error_category attributes to declined payments, when we get the additional information from the card networks. We are working on further classification of errors, for now please only respond to those documented here.
| network | network_error_category | Definition |
|---|---|---|
| VISA | 1 | Issuer will never approve. Do not attempt again. This indicates the card is invalid, never existed or block. Cardholders can contact their bank for more information. |
| VISA | 2 | Issuer cannot approve at this time. They may try again at another time. This could be related to credit risk, velocity controls, or system issues. |
| VISA | 3 | Issuer cannot approve based on the details provided. This might be an invalid cvv, expiration date, etc. Do not try again without attempting to obtain additional information. |
| VISA | R00/R01 | Recurring payment not allowed on card. Do not attempt again. |
| MASTERCARD | 01 | Updated information needed. Similar to Visa code 3. |
| MASTERCARD | 02 | Try again later. Similar to Visa code 2. |
| MASTERCARD | 03 | Do not try again. Do not attempt again. Similar to Visa code 1. |
JustiFi's enhanced fee management gives platforms granular control over how fees are charged and—importantly—how they are returned when processing refunds.
New Integrations: If you're building a new integration, use the
feesarray described below. This is the recommended approach for all new implementations.Existing Integrations: The
application_fee_amountfield continues to work unchanged. You can migrate to the new structure at your own pace—we'll provide migration support in a future release.
The enhanced fee structure separates your fees into distinct types, each tracked independently:
| Fee Type | Description |
|---|---|
processing_fee |
Fees related to payment processing costs |
platform_fee |
Fees for your platform's services |
This separation enables:
| Endpoint | Request Field | Description |
|---|---|---|
| Create Payment | fees |
Specify fees when creating a payment |
| Refund a Payment | fees |
Choose which fees to return to the merchant |
| Create Checkout | payment.fees |
Specify fees for the checkout |
| Refund a Checkout | fees |
Choose which fees to return |
Request:
POST /v1/payments
{
"amount": 10000,
"currency": "usd",
"capture_strategy": "automatic",
"fees": [
{ "type": "processing_fee", "amount": 350 },
{ "type": "platform_fee", "amount": 500 }
],
"payment_method": { "token": "pm_xyz" }
}
Response (Create):
{
"id": "py_123xyz",
"type": "payment",
"data": {
"id": "py_123xyz",
"amount": 10000,
"fee_amount": 850,
"fees": [
{ "type": "processing_fee", "amount": 350 },
{ "type": "platform_fee", "amount": 500 }
]
}
}
Response (Get Payment):
When fetching a payment, you'll see additional tracking fields:
{
"fees": [
{ "id": "pyfee_abc", "type": "processing_fee", "amount": 350, "remaining_amount": 350, "currency": "usd" },
{ "id": "pyfee_xyz", "type": "platform_fee", "amount": 500, "remaining_amount": 500, "currency": "usd" }
]
}
You control exactly which fees are returned to the merchant. This enables flexible refund policies.
Request:
POST /v1/payments/{id}/refunds
{
"amount": 5000,
"reason": "customer_request",
"fees": [
{ "type": "processing_fee", "amount": 175 }
]
}
In this example:
Response:
{
"id": "re_xyz",
"type": "refund",
"data": {
"id": "re_xyz",
"amount": 5000,
"status": "succeeded",
"returned_fees": [
{
"id": "rtfee_xyz",
"payment_fee_id": "pyfee_abc",
"type": "processing_fee",
"returned_amount": 175,
"original_amount": 350,
"remaining_amount": 175,
"currency": "usd"
}
]
}
}
After this refund, fetching the payment shows the updated remaining_amount:
{
"fees": [
{ "id": "pyfee_abc", "type": "processing_fee", "amount": 350, "remaining_amount": 175, "currency": "usd" },
{ "id": "pyfee_xyz", "type": "platform_fee", "amount": 500, "remaining_amount": 500, "currency": "usd" }
]
}
Note: If no
feesarray is provided in the refund request, no fees are returned to the merchant.
For checkouts, use the payment.fees field:
Request:
POST /v1/checkouts
{
"amount": 10000,
"description": "Order #12345",
"payment": {
"fees": [
{ "type": "processing_fee", "amount": 295 },
{ "type": "platform_fee", "amount": 150 }
]
}
}
Response:
{
"id": "cho_xyz",
"type": "checkout",
"data": {
"id": "cho_xyz",
"payment_amount": 10000,
"status": "created",
"payment": {
"fees": [
{ "type": "processing_fee", "amount": 295 },
{ "type": "platform_fee", "amount": 150 }
]
}
}
}
When the checkout is completed, the fees are passed to the payment and tracked with remaining_amount.
Request:
POST /v1/checkouts/{id}/refunds
{
"amount": 5000,
"fees": [
{ "type": "processing_fee", "amount": 147 }
]
}
Response:
{
"id": "chr_xyz",
"type": "checkout_refund",
"data": {
"id": "chr_xyz",
"checkout_id": "cho_xyz",
"status": "succeeded",
"refund_amount": 5000,
"returned_fees": [
{ "type": "processing_fee", "amount": 147 }
]
}
}
| Rule | Error Code | Description |
|---|---|---|
| Fee type required | fees_invalid |
Fee type must be processing_fee or platform_fee |
| Amount required | fee_amount_greater_than_zero |
Fee amount must be an integer greater than 0 |
| No duplicate types | multiple_of_same_fee_type |
Only one fee per type is allowed |
| Fees within limit | fee_amount_greater_than_payment_amount |
Total fees cannot exceed the payment amount |
| No mixing fee types | fee_and_application_fee_declared |
Cannot use both fees and application_fee_amount |
| Fee type exists | fee_type_must_exist_on_payment_fees |
Refund fee type must exist on the original payment |
| Within remaining | returned_fee_exceeds_remaining_amount |
Refund amount cannot exceed the fee's remaining amount |
When using the enhanced fee structure (fees array), fees are handled as follows throughout the payment lifecycle:
| Event | Fee Behavior |
|---|---|
| Payment captured | Fees are charged and appear as separate balance transactions by type |
| Refund | You control which fees (if any) to return via the fees array in the refund request |
| ACH return | All fees are automatically returned to the merchant |
| Void | All fees are automatically returned to the merchant |
For refunds, if no fees array is provided in the refund request, no fees are returned—giving you full control over your refund policy. For ACH returns and voids, fee returns happen automatically since the original payment is reversed.
Note: Payments created with
application_fee_amount(legacy structure) continue to behave as before—this fee lifecycle applies only to payments using thefeesarray.
Each fee type creates separate balance transaction entries for clear tracking:
When a payment is captured:
| Transaction Type | Account | Description |
|---|---|---|
seller_payment |
Merchant | Payment amount credited |
processing_fee |
Merchant | Processing fee deducted |
processing_fee_credit |
Platform | Processing fee credited |
platform_fee |
Merchant | Platform fee deducted |
platform_fee_credit |
Platform | Platform fee credited |
When fees are returned (refund/ACH return/void):
| Transaction Type | Account | Description |
|---|---|---|
processing_fee_return |
Merchant | Processing fee returned (credit) |
processing_fee_return |
Platform | Processing fee return (debit) |
platform_fee_return |
Merchant | Platform fee returned (credit) |
platform_fee_return |
Platform | Platform fee return (debit) |
Each fee type appears as a separate line item in:
This gives merchants clear visibility into their true processing costs versus platform charges, and gives platforms detailed revenue breakdowns by fee type.
The application_fee_amount field continues to work unchanged for existing integrations. When you're ready to adopt the enhanced fee structure:
application_fee_amount with the fees arrayprocessing_fee and platform_feeYou cannot use both application_fee_amount and fees in the same request.
Coming Soon: We'll be providing migration tooling and support to help existing integrations transition to the enhanced fee structure.
To get an access token, post your client_id and client_secret.
The request responds with an access token, which is valid for 24 hours. Pass the token as the Authorization
header with Bearer appended before the token, e.g. Bearer {access_token}.
Note: These access tokens are meant only for backend-to-backend calls. If you are looking to authorize a web component, please see the Web Component Token API
| client_id | string the client id for your (live or test) account |
| client_secret | string the client secret for your (live or test) account |
{- "client_id": "test_clientId",
- "client_secret": "test_clientSecret"
}{- "access_token": "string"
}The web component token provides permission to render a web component on your frontend.
To get a web component token post your access token in the header and the business_id or account_id as part of the resources array in the body.
For a list of resources needed for each web component please refer to Roles need for each component.
The token will be valid for 60 minutes.
| Authorization required | string Example: Bearer {access_token} the |
| resources | Array of strings Build an array of concatenated role (read/write), resource (account/business) and resource id which you need the web component to access. For example ["write:business:biz_123"] |
{- "resources": [
- "write:business:biz_abc",
- "write:account:account_123"
]
}{- "access_token": "string",
- "expires_in": 0,
- "token_type": "string"
}Sub Accounts are the representation of your platform's customers for payment processing in JustiFi and are associated with your platform account.
To gain approval for payment processing each of your customers need to be onboarded as a business via web compoenent, hosted onboarding or API.
During the onboarding process a sub account is automatically created for each business and updated along the way.
Payments can be processed through a sub account once it's status is enabled.
| Status | Description |
|---|---|
| created | this sub account has been created (via Sub Accounts API), but we haven't received their onboarding entry yet |
| submitted | we've received this sub account's onboarding entry (via hosted onboarding or API) and we're reviewing their information |
| information_needed | we reviewed this sub account's onboarding entry and found an issue; we need more information before we can enable this account |
| enabled | this sub account is approved to process payments note: test accounts are automatically enabled |
| rejected | this sub account didn't pass approval, so they won't be able to process payments |
| disabled | this sub account was previously approved, but has since become ineligible to process payments (e.g. due to fraud) |
| archived | this sub account has been archived; they won't be able to process payments (but their record will remain for historical reasons) |
We no longer allow new platforms to use this API. To onboard a customer so they can process payments use Hosted Onboarding or Onboarding via API instead. During the onboarding process a sub account will automatically created for your customer.
Create a JustiFi account for your customer, so they can process payments (once approved by JustiFi). The sub account will be created as part of your platform. If you use your test credentials, the sub account you create will have one account with the account_type of test. If you use your live credentials, the sub account you create will have two accounts -- one with the account_type of test and another with the account_type of live. This allows you to perform test operations on your real accounts by using their test account. When viewing the data payload for any sub account, you can reference the related_accounts attribute to get the test_account_id and live_account_id (if present) for that sub account.
| Authorization required | string Example: Bearer {access_token} the |
| name required | string name for the sub account note: the name must be unique in your platform |
{- "name": "Sub account name"
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "sub_account",
- "data": {
- "id": "acc_xyz",
- "name": "The Shire Haberdashery",
- "account_type": "live",
- "status": "enabled",
- "currency": "usd",
- "platform_account_id": "acc_xyz",
- "payout_account_id": "ba_xyz",
- "business_id": "biz_xyz",
- "application_fee_rates": [ ],
- "processing_ready": false,
- "payout_ready": false,
- "related_accounts": {
- "live_account_id": "acc_xyz",
- "test_account_id": "acc_xyz"
}, - "payments_activated_on": "2021-01-15T12:00:00Z",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}List the sub accounts for your platform. This endpoint supports pagination.
Note: By default, all sub accounts which are not archived will be returned. To list archived sub accounts, use the optional status parameter set to archived
| status | string Enum: "created" "submitted" "information_needed" "rejected" "enabled" "disabled" "archived" Example: status=archived Return accounts with specific status |
| business_id | string Example: business_id=biz_123abc Filter accounts associated with a business record |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": 1,
- "type": "array",
- "data": [
- {
- "id": "acc_xyz",
- "name": "The Shire Haberdashery",
- "account_type": "live",
- "status": "enabled",
- "currency": "usd",
- "platform_account_id": "acc_xyz",
- "payout_account_id": "ba_xyz",
- "business_id": "biz_xyz",
- "application_fee_rates": [ ],
- "processing_ready": false,
- "payout_ready": false,
- "related_accounts": {
- "live_account_id": "acc_xyz",
- "test_account_id": "acc_xyz"
}, - "payments_activated_on": "2021-01-15T12:00:00Z",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "page_info": {
- "end_cursor": "WyIyMDIyLTAyLTA4IDE5OjUyOjM3LjEwNDE3MzAwMCIsIjY4MDliYTU5LTYxYjctNDg3MS05YWFiLWE2Y2MyNmY3M2M1ZCJd",
- "has_next": false,
- "has_previous": false,
- "start_cursor": "WyIyMDIyLTAyLTA4IDIwOjAxOjU4LjEyMDIzMjAwMCIsIjU5ZTFjNGI1LWFlOWQtNDIyZC04MTVkLWNjNzQ5NzdlYmFjYSJd"
}
}Get information about a sub account.
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "sub_account",
- "data": {
- "id": "acc_xyz",
- "name": "The Shire Haberdashery",
- "account_type": "live",
- "status": "enabled",
- "currency": "usd",
- "platform_account_id": "acc_xyz",
- "payout_account_id": "ba_xyz",
- "business_id": "biz_xyz",
- "application_fee_rates": [ ],
- "processing_ready": false,
- "payout_ready": false,
- "related_accounts": {
- "live_account_id": "acc_xyz",
- "test_account_id": "acc_xyz"
}, - "payments_activated_on": "2021-01-15T12:00:00Z",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}Get information about the currently active payout bank account of a sub account.
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "payout_bank_account",
- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "full_name": "string",
- "bank_name": "string",
- "account_number_last4": 1111,
- "routing_number": "string",
- "country": "US",
- "currency": "usd",
- "nickname": "string",
- "account_type": "checking"
}, - "page_info": null
}Get information about sub account settings.
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "sub_account_settings",
- "data": {
- "payments": {
- "id": "stpy_7KRQzIYhUGxNscgLJP0Aum",
- "account_id": "acc_123xyz",
- "mcc_code": "5045",
- "credit_card_payments": true,
- "ach_payments": true,
- "card_present": false,
- "bnpl_payments": false,
- "apple_payments": false,
- "google_payments": false,
- "bank_account_verification": false,
- "insurance_payments": false,
- "platform_wallet_account": false
}, - "payouts": {
- "id": "stpo_1FrQmV9ByJEKjpKf5diaA4",
- "enabled": true,
- "statement_descriptor": "JustiFi",
- "settlement_priority": "standard"
}
}, - "page_info": null
}A Platform Wallet Account allows you to store payment methods centrally and use them across multiple sub accounts within your platform. This feature enables you to maintain a single source of stored payment methods while processing payments through different sub accounts.
Note: You can choose a sub account as your platform_wallet_account once it is underwritten and enabled for payments.
Contact us at customer_success@justifi.tech to enable the platform_wallet_account setting for your designated platform wallet account.
Once enabled, you can:
Note: While the PaymentMethods and Payments API allow you to tokenize a payment method we strongly suggest using the Unified Fintech Checkout or Tokenize Payment Method web components instead to avoid PCI scope
Create and organize payment methods in your platform wallet account. All payment method operations require the platform wallet account ID in the Sub-Account header.
// Example: Create payment method group
const group = await fetch('https://api.justifi.ai/v1/payment_method_groups', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Sub-Account': platformWalletAccountId, // Platform wallet account
'Content-Type': 'application/json'
}
});
// Example: Add payment methods to group
const updatedGroup = await fetch(`https://api.justifi.ai/v1/payment_method_groups/${groupId}`, {
method: 'PATCH',
headers: {
'Authorization': `Bearer ${token}`,
'Sub-Account': platformWalletAccountId, // Platform wallet account
'Content-Type': 'application/json'
},
body: JSON.stringify({
"payment_method_ids": ["pm_walletaccxyz", "pm_walletaccabc"]
})
});
You can process payments using wallet payment methods either through the Unified Fintech Checkout web component or via API
Checkout via Component Walkthrough
// Create checkout
const checkout = await fetch('https://api.justifi.ai/v1/checkouts', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Sub-Account': processingSubAccountId, // Processing sub account
'Content-Type': 'application/json'
},
body: JSON.stringify({
"amount": 1799,
"description": "Example item",
"payment_method_group_id": "pmg_walletGroupId", // Group from wallet account
"origin_url": "http://localhost:3000" // Required for component
})
});
// Render component
<justifi-checkout
auth-token="${webComponentToken}"
checkout-id="${checkout.id}">
</justifi-checkout>
// Create checkout
const checkout = await fetch('https://api.justifi.ai/v1/checkouts', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Sub-Account': processingSubAccountId, // Processing sub account
'Content-Type': 'application/json'
},
body: JSON.stringify({
"amount": 1799,
"description": "Example item",
"payment_method_group_id": "pmg_walletGroupId" // Group from wallet account
})
});
// Complete checkout with wallet payment method
const completion = await fetch(`https://api.justifi.ai/v1/checkouts/${checkoutId}/complete`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Sub-Account': processingSubAccountId, // Processing sub account
'Content-Type': 'application/json'
},
body: JSON.stringify({
"payment_token": "pm_walletPaymentMethodToken"
})
});
For complete details on specific endpoints, see:
In order to process payments, each of your customers must be onboarded on the JustiFi platform. Once they are added they go through an approval process. JustiFi's PaymentProvisioning web component allows you to collect the required business and financial information from each of your customers. Once approved, your customer can process payments through JustiFi.
To onboard a new business via PaymentProvisioning web component
On your backend, using your client id and client secret from the Developer > API keys section of the JustiFi dashboard, generate an access token.
function getToken() {
return fetch('https://api.justifi.ai/oauth/token', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
"client_id": "YOUR CLIENT ID",
"client_secret": "YOUR CLIENT SECRET"
})
})
.then(response => response.json())
.then(data => data.access_token);
}
const token = await getToken();
From your backend create a business using the Business API. A business only requires one parameter (e.g. legal_name) but you can pass as much information about your customer as you have. When you render the web component all the data you passed to the business will be pre-filled in the form and can be updated by your customer.
async function createBusiness(token) {
const response = await fetch('https://api.justifi.ai/v1/entities/business', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify({
"legal_name": "First Business"
})
});
const data = await response.json();
return data;
}
const business = await createBusiness(token);
To render the PaymentProvisioning web component, you must generate a web component token. This is a short lived token which is meant to grant short term, fine grained access. The web component requires the role of write:business:${businessId} with the id of the business you created in the previous step.
async function getWebComponentToken(token, businessId) {
const response = await fetch('https://api.justifi.ai/v1/web_component_tokens', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify({
"resources": [`write:business:${businessId}`]
})
});
const data = await response.json();
return data.access_token;
}
const webComponentToken = await getWebComponentToken(token, business.id);
Using the web component token generated above and the business id, render the PaymentProvisioning web component. This will allow your customer to provide all business information required for payment processing
<justifi-payment-provisioning auth-token="${webComponentToken}" business-id="${business.id}"></justifi-payment-provisioning>
The web component makes an API request every time the user moves to a Next step and when the user submits the form. Whenever the web component receives an API response it emits a submitted event that contains the API response.
When the form is submitted we provision the business and create a sub account for the business. The submitted event data will contain the response from the Provisioning API request. If the provisioning request was successful the response will include the sub_account_id attribute of that newly created sub account. Otherwise, an error message can be presented to the user. Our example below covers both.
The error event means there was an issue with the PaymentProvisioning form connecting to the network, etc.
<script>
const justifiPaymentProvisioning = document.querySelector('justifi-payment-provisioning');
justifiPaymentProvisioning.addEventListener('submit-event', (event) => {
if (event.details.data) {
console.log("Form sumbission succeeded!");
} else {
console.log("An error occured")
}
});
justifiPaymentProvisioning.addEventListener('error-event', (event) => {
console.log(event);
});
</script>
Once your business submits the onboarding form
sub account for this business as mentioned above. This sub account is the representation of your business for payment processing.enabled and payments can be processed.In order to check the account's onboarding status, call the Get a Sub Account endpoint or use an event publisher to subscribe to the sub_account.updated events
async function getBusiness(token, accountId) {
const response = await fetch(`https://api.justifi.ai/v1/sub_accounts/${accountId}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
}
});
const data = await response.json();
return data;
}
const business = await getBusiness(toke, account.id);
In order to process payments, each of your customers (whom we refer to as businesses) will have to be onboarded on our platform. Once they are added they go through an approval process. JustiFi's hosted onboarding provides you with an easy-to-implement, user-friendly way to collect the required business and financial information from each business within your platform. Once approved, your business can process payments through JustiFi.
To onboard a new business via hosted onboarding:
On your backend, using your client id and client secret from the Developer > API keys section of the JustiFi dashboard, generate an access token.
function getToken() {
return fetch('https://api.justifi.ai/oauth/token', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
"client_id": "YOUR CLIENT ID",
"client_secret": "YOUR CLIENT SECRET"
})
})
.then(response => response.json())
.then(data => data.access_token);
}
const token = await getToken();
From your backend create a business using the Business API. A business only requires one parameter (e.g. legal_name) but you can pass as much information about your customer as you have. When you render the web component all the data you passed to the business will be pre-filled in the form and can be updated by your customer.
async function createBusiness(token) {
const response = await fetch('https://api.justifi.ai/v1/entities/business', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify({
"legal_name": "First Business"
})
});
const data = await response.json();
return data;
}
const business = await createBusiness(token);
To render the Hosted Onboarding form, you must generate a web component token. This is a short-lived token intended to grant temporary, fine-grained access. The web component requires the role write:business:${businessId}, with the ID of the business created in the previous step.
Note:The web component token expires after 60 minutes. If the onboarding flow takes longer than that to complete, you’ll need to generate a new web component token and reinitialize the component with the refreshed token.
async function getWebComponentToken(token, businessId) {
const response = await fetch('https://api.justifi.ai/v1/web_component_tokens', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify({
"resources": [`write:business:${businessId}`]
})
});
const data = await response.json();
return data.access_token;
}
const webComponentToken = await getWebComponentToken(token, business.id);
To present the JustiFi hosted onboarding form to your user, create an iframe with with the following source:https://components.justifi.ai/onboarding?business_id=BUSINESS_ID&web_component_token=WEB_COMPONENT_TOKEN,
where BUSINESS_ID is the business_id that was created in step 2 and WEB_COMPONENT_TOKEN is the access_token that was created in step 3.
This iframe will present your user with a multi-step form where they can enter the business and financial information needed for approval. Upon submission, a success message will display.
const handleOnboardingCompletion = (e) => {
const { eventType } = e.data;
if (eventType === 'submitSuccess') {
// Handle successful onboarding
}
if (eventType === 'submitFailure') {
// Handle failed onboarding
}
};
window.addEventListener('message', handleOnboardingCompletion);
When the onboarding is completed, success or failure, the JustiFi iframe will send a postMessage. This allows your platform to take a next step, for example closing a modal, or redirecting to another page.
Once your business submits the onboarding form
sub account for this business. This sub account is the representation of your business for payment processing.sub_account.updated eventscurl -X GET https://api.justifi.ai/v1/sub_accounts/ACCOUNT_ID \
-H 'Authorization: Bearer [access_token]' \
-H 'Accept: application/json'
In order to process payments, each of your customers (whom we refer to as businesses) will have to be onboarded on the JustiFi platform. Once they are added they go through an approval process. JustiFi's onboarding API allows you to utilize your own onboarding frontend to collect the required business and financial information from each of your businesses. Once approved, your business can process payments through JustiFi.
To onboard a new business via the API
curl -X POST \
https://api.justifi.ai/v1/entities/business \
-H 'Authorization: Bearer {access_token}' \
-H 'Content-Type: application/json' \
-d '{
"legal_name": "Business name"
}'
Use the business API to create a business on JustiFi that is associated with your platform. The create business API endpoint does not require any parameters but they will be required when the business is provisioned (see step 5). You will need the ID from the business you create for the next steps.
Use the bank account API to create a bank account. This bank account will be used to pay out earnings for payment processing to the business.
Use the document API to upload a document. The minimum document requirement (for small businesses and sole proprietors) is a voided check.
Use the terms and conditions API to accept terms for payment processing.
curl -X POST \
https://api.justifi.ai/v1/entities/provisioning \
-H 'Authorization: Bearer {access_token}' \
-H 'Content-Type: application/json' \
-d '{
"business_id": "biz_123",
"product_category": "payment"
}'
Once you have submitted all business related information use the provisioning API to provision the business for payment processing. At this point all required parameters for payment processing are validated. An error is returned if any fields are missing. If successful, the product provisioning request will create a sub account associated with the business. The response will include the ID of that associated sub account. It is required for any payment processing related API requests.
curl -X GET https://api.justifi.ai/v1/sub_accounts/ACCOUNT_ID \
-H 'Authorization: Bearer [access_token]' \
-H 'Accept: application/json'
Once you have provisioned the busiess, we'll review their information. This approval process can take up to a few business days. In order to check the associated sub account's onboarding status, call the Get a Sub Account endpoint or use an event publisher to subscribe to the sub_account.updated events.
Proceeds represent your platform's take-home portion of the fees from your sub account's financial transactions. Proceeds are batched together according to the payout schedule configured on your account, then transferred to your active bank account.
List the proceeds payouts for your account. This endpoint supports pagination.
| created_before | string <date-time> Example: created_before=2022-01-01T00:00:00Z filter records which were created before the date and time (UTC) specified. Dates without time specified will default to 00:00:00 |
| created_after | string <date-time> Example: created_after=2022-01-01T00:00:00Z filter records which were created after the date and time (UTC) specified. Dates without time specified will default to 00:00:00 |
| deposits_before | string <date-time> Example: deposits_before=2022-01-01T00:00:00Z filter records which deposit before the date and time (UTC) specified. Dates without time specified will default to 00:00:00 |
| deposits_after | string <date-time> Example: deposits_after=2022-01-01T00:00:00Z filter records which deposit after the date and time (UTC) specified. Dates without time specified will default to 00:00:00 |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": 1,
- "type": "array",
- "data": [
- {
- "id": "po_xyz",
- "account_id": "449e7a5c-69d3-4b8a-aaaf-5c9b713ebc65",
- "amount": 100000,
- "bank_account": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "full_name": "string",
- "bank_name": "string",
- "account_number_last4": 1111,
- "routing_number": "string",
- "country": "US",
- "currency": "usd",
- "nickname": "string",
- "account_type": "checking"
}, - "currency": "usd",
- "delivery_method": "standard",
- "description": "string",
- "deposits_at": "2021-01-01T12:00:00Z",
- "refunds_count": 5,
- "refunds_total": 10000,
- "payments_count": 50,
- "payments_total": 110000,
- "payout_type": "proceeds",
- "other_total": 100,
- "status": "scheduled",
- "metadata": {
- "platform_payout_id": "cp_12345"
}, - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "page_info": {
- "end_cursor": "WyIyMDIyLTAyLTA4IDE5OjUyOjM3LjEwNDE3MzAwMCIsIjY4MDliYTU5LTYxYjctNDg3MS05YWFiLWE2Y2MyNmY3M2M1ZCJd",
- "has_next": false,
- "has_previous": false,
- "start_cursor": "WyIyMDIyLTAyLTA4IDIwOjAxOjU4LjEyMDIzMjAwMCIsIjU5ZTFjNGI1LWFlOWQtNDIyZC04MTVkLWNjNzQ5NzdlYmFjYSJd"
}
}Get information about a proceeds payout.
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": 1,
- "type": "payout",
- "data": [
- {
- "id": "po_xyz",
- "account_id": "449e7a5c-69d3-4b8a-aaaf-5c9b713ebc65",
- "amount": 100000,
- "bank_account": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "full_name": "string",
- "bank_name": "string",
- "account_number_last4": 1111,
- "routing_number": "string",
- "country": "US",
- "currency": "usd",
- "nickname": "string",
- "account_type": "checking"
}, - "currency": "usd",
- "delivery_method": "standard",
- "description": "string",
- "deposits_at": "2021-01-01T12:00:00Z",
- "refunds_count": 5,
- "refunds_total": 10000,
- "payments_count": 50,
- "payments_total": 110000,
- "payout_type": "proceeds",
- "other_total": 100,
- "status": "scheduled",
- "metadata": {
- "platform_payout_id": "cp_12345"
}, - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "page_info": {
- "end_cursor": "WyIyMDIyLTAyLTA4IDE5OjUyOjM3LjEwNDE3MzAwMCIsIjY4MDliYTU5LTYxYjctNDg3MS05YWFiLWE2Y2MyNmY3M2M1ZCJd",
- "has_next": false,
- "has_previous": false,
- "start_cursor": "WyIyMDIyLTAyLTA4IDIwOjAxOjU4LjEyMDIzMjAwMCIsIjU5ZTFjNGI1LWFlOWQtNDIyZC04MTVkLWNjNzQ5NzdlYmFjYSJd"
}
}[DEPRECATION WARNING] This endpoint will be deprecated, please use Reports API.
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "procceds",
- "data": {
- "id": "po_xyz",
}, - "page_info": null
}Reports can be used to pull data for various different resources. They are CSV format, and can be filtered by date and sub account.
Once a the create endpoint is called via POST, a report will be in created status. The report will move to processing status once it is being generated.
Finally, when the report is generated, and the CSV file is available, the report will be in completed status.
To download a report, you can use the download_url provided in the response when retrieving a report. We use presigned URLs to allow you to download the report directly
from our S3 bucket.
Contains balance transaction data for payouts.
| Column | Description |
|---|---|
| id | Balance transaction ID |
| type | Transaction type |
| currency | Currency |
| amount | Amount in cents |
| fee | Fee amount in cents |
| net | Net amount in cents |
| source_id | Source object ID |
| source_account_id | Source account ID |
| source_type | Source object type |
| source_amount | Source amount in cents |
| available_on | When funds become available |
| payment_id | Associated payment ID |
| created_at | Creation timestamp |
| payment_method_name | Payment method name |
| source_payment_id | Payment ID associated with the source |
| payout_id | Associated payout ID |
| payout_created_at | Payout creation timestamp |
| payout_deposits_at | Expected payout deposit date |
Contains platform proceeds data.
| Column | Description |
|---|---|
| id | Balance transaction ID |
| type | Transaction type |
| currency | Currency code |
| amount | Amount in cents |
| fee | Fee amount in cents |
| net | Net amount in cents |
| source_id | Source object ID |
| source_account_id | Source account ID |
| source_type | Source object type |
| source_amount | Source amount in cents |
| application_fee_amount | Application fee in cents |
| platform_fee_amount | Platform fee in cents |
| proceeds | Calculated proceeds in cents |
| available_on | When funds become available |
| created_at | Creation timestamp |
| fee_major_category | Fee major category |
| fee_minor_category | Fee minor category |
| fee_description | Fee description |
| fee_product_code | Fee product code |
| fee_batch_date | Fee batch date |
| payment_method_type | Payment method type |
| payment_method_brand | Payment method brand |
| source_payment_id | Payment ID associated with the source |
| payout_id | Associated payout ID |
| payout_created_at | Payout creation timestamp |
| payout_deposits_at | Expected payout deposit date |
Create a report for any of the available report types
| Authorization required | string Example: Bearer {access_token} the |
| Sub-Account |
| report_type required | string Value: "interchange_fee" |
| start_date | string <date> Start date to filter by. Maximum allowed date rage is 1 month |
| end_date | string <date> End date to filter by. Maximum allowed date rage is 1 month |
| nickname | string the report nickname |
{- "report_type": "interchange_fee",
- "start_date": "2025-12-25",
- "end_date": "2025-12-30",
- "nickname": "My Report"
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "report",
- "data": {
- "id": "rpt_xyz",
- "report_type": "proceeds",
- "nickname": "My Report",
- "status": "scheduled",
- "scheduled_at": "2025-12-25T14:44:45.026Z",
- "run_at": "2025-12-30T14:44:45.026Z",
- "created_at": "2025-12-31T14:44:45.026Z",
- "error_description": "string",
- "account_id": "acc_xyz",
- "presigned_url": "string",
- "platform_account_id": "acc_xyz",
- "parameters": {
- "report_type": "proceeds",
- "start_date": "2025-12-25",
- "end_date": "2025-12-30",
- "nickname": "My Report",
- "account_id": "acc_xyz",
- "platform_account_id": "acc_xyz"
}
}, - "page_info": null
}List all generated reports
| nickname | string Example: nickname="My Report" the nickname of the report |
| Authorization required | string Example: Bearer {access_token} the |
| Sub-Account |
{- "id": 1,
- "type": "array",
- "data": [
- {
- "id": "rpt_xyz",
- "report_type": "proceeds",
- "nickname": "My Report",
- "status": "scheduled",
- "scheduled_at": "2025-12-25T14:44:45.026Z",
- "run_at": "2025-12-30T14:44:45.026Z",
- "created_at": "2025-12-31T14:44:45.026Z",
- "error_description": "string",
- "account_id": "acc_xyz",
- "presigned_url": "string",
- "platform_account_id": "acc_xyz",
- "parameters": {
- "report_type": "proceeds",
- "start_date": "2025-12-25",
- "end_date": "2025-12-30",
- "nickname": "My Report",
- "account_id": "acc_xyz",
- "platform_account_id": "acc_xyz"
}
}
], - "page_info": {
- "end_cursor": "WyIyMDIyLTAyLTA4IDE5OjUyOjM3LjEwNDE3MzAwMCIsIjY4MDliYTU5LTYxYjctNDg3MS05YWFiLWE2Y2MyNmY3M2M1ZCJd",
- "has_next": false,
- "has_previous": false,
- "start_cursor": "WyIyMDIyLTAyLTA4IDIwOjAxOjU4LjEyMDIzMjAwMCIsIjU5ZTFjNGI1LWFlOWQtNDIyZC04MTVkLWNjNzQ5NzdlYmFjYSJd"
}
}Get and generate the download url for a report
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
| Sub-Account |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "refund",
- "data": {
- "id": "rpt_xyz",
- "report_type": "proceeds",
- "nickname": "My Report",
- "status": "scheduled",
- "scheduled_at": "2025-12-25T14:44:45.026Z",
- "run_at": "2025-12-30T14:44:45.026Z",
- "created_at": "2025-12-31T14:44:45.026Z",
- "error_description": "string",
- "account_id": "acc_xyz",
- "presigned_url": "string",
- "platform_account_id": "acc_xyz",
- "parameters": {
- "report_type": "proceeds",
- "start_date": "2025-12-25",
- "end_date": "2025-12-30",
- "nickname": "My Report",
- "account_id": "acc_xyz",
- "platform_account_id": "acc_xyz"
}
}, - "page_info": null
}To charge a payment method the desired amount, you'll use a payment. You can choose whether to charge a payment method that's already been tokenized or tokenize a new one when you create the payment. If a payment fails, the status will reflect it and an error code will be returned. You can retrieve information about your payments and refund them if needed.
Authorize, capture, and charge a payment method. We limit concurrency to 10 concurrent requests per platform. This is due to the nature of the payments API, to reduce rejections, and false positive fraud detection during bulk payment processing.
Note: If the sub account status is not enabled, 400 will be returned.
| Idempotency-Key required | string <uuid> Example: my-request-123abc a string to identify your request (we recommend using a generated uuid, but you may use any unique string) see Idempotent Requests |
| Authorization required | string Example: Bearer {access_token} the |
| Sub-Account required |
| amount required | number amount to charge in cents |
| currency required | string Value: "usd" |
| capture_strategy required | string Enum: "automatic" "manual" automatic will authorize and capture the payment in the same request, manual will only authorize the payment (which will need to be captured in a subsequent request). Not supported by bank account (ACH) payment methods. |
string <email> email address to associate with payment method | |
required | object |
| application_fee_amount | integer Sets a custom application fee amount that applies to this payment, instead of relying on application fee rates configured at the platform account level (only Platforms may set application_fee_amount). Must be greater than zero. New integrations should use the Cannot be used together with |
Array of objects (Fee) Array of fee objects to charge on this payment. See Enhanced Fee Management for full documentation. Each fee object specifies:
Benefits over
Cannot be used together with | |
| description | string your meaningful description of the payment (e.g. an order number or other value from your system) |
| statement_descriptor | string description of the payment that will be available on the account's bank statement, must have between 5-22 alphanumeric characters and can include dash or underscore |
| metadata | object <json> Any useful information you'd like to store alongside this payment. Testing Disputes: Include
|
| expedited | boolean or null settlement priority of the payment, only applies to ACH payments |
{- "amount": 1000,
- "currency": "usd",
- "capture_strategy": "automatic",
- "email": "example@test.com",
- "description": "Charging $10 to the test card",
- "payment_method": {
- "card": {
- "name": "Sylvia Fowles",
- "number": "4111111111111111",
- "verification": "123",
- "month": "3",
- "year": "2040",
- "address_postal_code": "55555"
}
}
}{- "id": "py_123xyz",
- "type": "payment",
- "data": {
- "id": "py_123xyz",
- "account_id": "acc_123xyz",
- "amount_disputed": 0,
- "amount_refunded": 0,
- "amount_returned": 0,
- "amount": 10000,
- "amount_refundable": 10000,
- "application_fee_rate_id": "afr_123xyz",
- "balance": 99850,
- "capture_strategy": "automatic",
- "captured": true,
- "created_at": "2021-01-01T12:00:00Z",
- "currency": "usd",
- "description": "my order xyz",
- "disputed": false,
- "error_code": null,
- "error_description": null,
- "fee_amount": 150,
- "financial_transaction_id": "ft_123xyz",
- "is_test": true,
- "metadata": { },
- "payment_intent_id": "pi_xyz",
- "checkout_id": "cho_123",
- "refunded": false,
- "returned": false,
- "status": "succeeded",
- "payment_mode": "ecom",
- "terminal_id": "trm_123_xyz",
- "updated_at": "2021-01-01T12:00:00Z",
- "payment_method": {
- "card": {
- "id": "pm_123xyz",
- "acct_last_four": "4242",
- "brand": "visa",
- "digital_wallet": null,
- "name": "Sylvia Fowles",
- "token": "pm_123xyz",
- "metadata": { },
- "bin_details": {
- "type": "Debit",
- "card_brand": "Visa",
- "card_class": "Consumer",
- "country": "United States of America",
- "issuer": "WELLS FARGO BANK",
- "funding_source": "Debit"
}, - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "customer_id": "null",
- "signature": "123abc"
}, - "application_fee": {
- "id": "fee_123xyz",
- "amount": 150,
- "currency": "usd",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "transaction_hold": {
- "id": "th_123xyz",
- "financial_transaction_id": "ft_123xyz"
}, - "refunds": [ ],
- "disputes": [ ]
}, - "page_info": null
}List the payments for your account. This endpoint supports pagination.
| payment_method_id | string Example: payment_method_id=pm_123xyz filter records which are associated with a payment method. |
| void_id | string Example: void_id=vo_123xyz filter records which are associated with a void. |
| created_before | string <date-time> Example: created_before=2022-01-01T00:00:00Z filter records which were created before the date and time (UTC) specified. Dates without time specified will default to 00:00:00 |
| created_after | string <date-time> Example: created_after=2022-01-01T00:00:00Z filter records which were created after the date and time (UTC) specified. Dates without time specified will default to 00:00:00 |
| payment_status | string Enum: "succeeded" "failed" "pending" "authorized" "refunded" "disputed" Example: payment_status=refunded filter to payments which have request payment_status |
| Authorization required | string Example: Bearer {access_token} the |
| Sub-Account |
{- "id": 1,
- "type": "array",
- "data": [
- {
- "id": "py_xyz",
- "account_id": "acc_xyz",
- "amount": 10000,
- "amount_disputed": 0,
- "amount_refunded": 0,
- "amount_refundable": 10000,
- "balance": 99850,
- "fee_amount": 150,
- "financial_transaction_id": "ft_123xyz",
- "captured": true,
- "capture_strategy": "automatic",
- "currency": "usd",
- "description": "my_order_xyz",
- "disputed": false,
- "disputes": [ ],
- "error_code": "credit_card_number_invalid",
- "error_description": "Credit Card Number Invalid (Failed LUHN checksum)",
- "is_test": true,
- "metadata": { },
- "payment_intent_id": "pi_123xyz",
- "checkout_id": "cho_123xyz",
- "payment_method": {
- "card": {
- "id": "pm_123xyz",
- "acct_last_four": 4242,
- "brand": "Visa",
- "digital_wallet": "apple_pay",
- "name": "Amanda Kessel",
- "token": "pm_123xyz",
- "month": "5",
- "year": "2042",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z",
- "address_line1_check": "unchecked",
- "address_postal_code_check": "unchecked"
}, - "customer_id": "cust_xyz",
- "signature": "4guAJNkVA3lRLVlanNVoBK",
- "account_id": "acc_123"
}, - "application_fee": {
- "id": "fee_123xyz",
- "amount": 150,
- "currency": "usd",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "application_fee_rate_id": "afr_123xyz",
- "fees": [
- {
- "id": "pyfee_abc",
- "type": "processing_fee",
- "amount": 350,
- "currency": "usd",
- "remaining_amount": 350
}, - {
- "id": "pyfee_xyz",
- "type": "platform_fee",
- "amount": 500,
- "currency": "usd",
- "remaining_amount": 500
}
], - "refunded": false,
- "status": "pending",
- "payment_mode": "ecom",
- "terminal_id": "trm_123xyz",
- "transaction_hold": {
- "id": "th_123xyz",
- "financial_transaction_id": "ft_123xyz"
}, - "expedited": null,
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - {
- "id": "py_xyz",
- "account_id": "acc_xyz",
- "amount": 10000,
- "amount_disputed": 0,
- "amount_refunded": 0,
- "amount_refundable": 10000,
- "balance": 99850,
- "fee_amount": 150,
- "financial_transaction_id": "ft_123xyz",
- "captured": true,
- "capture_strategy": "automatic",
- "currency": "usd",
- "description": "my_order_xyz",
- "disputed": false,
- "disputes": [ ],
- "error_code": "credit_card_number_invalid",
- "error_description": "Credit Card Number Invalid (Failed LUHN checksum)",
- "is_test": true,
- "metadata": { },
- "payment_intent_id": "pi_123xyz",
- "checkout_id": "cho_123",
- "payment_method": {
- "bank_account": {
- "id": "pm_123xyz",
- "account_owner_name": "Lindsay Whalen",
- "account_type": "checking",
- "bank_name": "Wells Fargo",
- "account_number_last4": 1111,
- "token": "pm_123xyz",
- "metadata": {
- "new": "info"
}
}, - "customer_id": "cust_xyz",
- "signature": "4guAJNkVA3lRLVlanNVoBK",
- "account_id": "acc_123"
}, - "application_fee": {
- "id": "fee_123xyz",
- "amount": 150,
- "currency": "usd",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "application_fee_rate_id": "afr_123xyz",
- "fees": [
- {
- "id": "pyfee_abc",
- "type": "processing_fee",
- "amount": 50,
- "currency": "usd",
- "remaining_amount": 50
}, - {
- "id": "pyfee_xyz",
- "type": "platform_fee",
- "amount": 150,
- "currency": "usd",
- "remaining_amount": 150
}
], - "refunded": false,
- "status": "pending",
- "payment_mode": "ecom",
- "terminal_id": "trm_123xyz",
- "transaction_hold": {
- "id": "th_123xyz",
- "financial_transaction_id": "ft_123xyz"
}, - "expedited": true,
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "page_info": {
- "end_cursor": "WyIyMDIyLTAyLTA4IDE5OjUyOjM3LjEwNDE3MzAwMCIsIjY4MDliYTU5LTYxYjctNDg3MS05YWFiLWE2Y2MyNmY3M2M1ZCJd",
- "has_next": false,
- "has_previous": false,
- "start_cursor": "WyIyMDIyLTAyLTA4IDIwOjAxOjU4LjEyMDIzMjAwMCIsIjU5ZTFjNGI1LWFlOWQtNDIyZC04MTVkLWNjNzQ5NzdlYmFjYSJd"
}
}Get information about a payment.
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "py_123xyz",
- "type": "payment",
- "data": {
- "id": "py_123xyz",
- "account_id": "acc_123xyz",
- "amount_disputed": 0,
- "amount_refunded": 0,
- "amount_returned": 0,
- "amount": 10000,
- "amount_refundable": 10000,
- "application_fee_rate_id": "afr_123xyz",
- "balance": 99850,
- "capture_strategy": "automatic",
- "captured": true,
- "created_at": "2021-01-01T12:00:00Z",
- "currency": "usd",
- "description": "my order xyz",
- "disputed": false,
- "error_code": null,
- "error_description": null,
- "fee_amount": 150,
- "financial_transaction_id": "ft_123xyz",
- "is_test": true,
- "metadata": { },
- "payment_intent_id": "pi_xyz",
- "checkout_id": "cho_123",
- "refunded": false,
- "returned": false,
- "status": "succeeded",
- "payment_mode": "ecom",
- "terminal_id": "trm_123_xyz",
- "updated_at": "2021-01-01T12:00:00Z",
- "payment_method": {
- "card": {
- "id": "pm_123xyz",
- "acct_last_four": "4242",
- "brand": "visa",
- "name": "Sylvia Fowles",
- "token": "pm_123xyz",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "customer_id": null,
- "signature": "123abc"
}, - "application_fee": {
- "id": "fee_123xyz",
- "amount": 150,
- "currency": "usd",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "transaction_hold": {
- "id": "th_123xyz",
- "financial_transaction_id": "ft_123xyz"
}, - "refunds": [ ],
- "disputes": [ ]
}, - "page_info": null
}Change a payment's description or metadata.
| id required | string <uuid> |
| Idempotency-Key required | string <uuid> Example: my-request-123abc a string to identify your request (we recommend using a generated uuid, but you may use any unique string) see Idempotent Requests |
| Authorization required | string Example: Bearer {access_token} the |
| description | string your meaningful description of the payment (e.g. an order number or other value from your system) |
| metadata | object <json> any useful information you'd like to store alongside this payment; when you update metadata, any previous metadata will be overwritten |
{- "description": "order_xyz new description",
- "metadata": { }
}{- "id": "py_123xyz",
- "type": "payment",
- "data": {
- "id": "py_123xyz",
- "account_id": "acc_123xyz",
- "amount_refunded": 0,
- "amount_disputed": 0,
- "amount_returned": 0,
- "amount": 10000,
- "amount_refundable": 10000,
- "application_fee_rate_id": "afr_123xyz",
- "balance": 99850,
- "capture_strategy": "automatic",
- "captured": true,
- "created_at": "2021-01-01T12:00:00Z",
- "currency": "usd",
- "description": "order xyz new description",
- "disputed": false,
- "error_code": null,
- "error_description": null,
- "fee_amount": 150,
- "financial_transaction_id": "ft_123xyz",
- "is_test": true,
- "metadata": { },
- "payment_intent_id": "pi_xyz",
- "checkout_id": "cho_123",
- "refunded": false,
- "returned": false,
- "status": "succeeded",
- "payment_mode": "ecom",
- "updated_at": "2021-01-01T12:00:00Z",
- "payment_method": {
- "card": {
- "id": "pm_123xyz",
- "acct_last_four": "4242",
- "brand": "visa",
- "name": "Sylvia Fowles",
- "token": "pm_123xyz",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "customer_id": null,
- "signature": "123abc"
}, - "application_fee": {
- "id": "fee_123xyz",
- "amount": 150,
- "currency": "usd",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "refunds": [ ],
- "disputes": [ ]
}, - "page_info": null
}To charge a payment method and capture a previously authorized payment. Returns a payment_already_captured error if the payment is in a captured state.
Note: If the sub account status is not enabled, 400 will be returned.
| id required | string <uuid> |
| Idempotency-Key required | string <uuid> Example: my-request-123abc a string to identify your request (we recommend using a generated uuid, but you may use any unique string) see Idempotent Requests |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "py_123xyz",
- "type": "payment",
- "data": {
- "id": "py_123xyz",
- "account_id": "acc_123xyz",
- "amount_disputed": 0,
- "amount_refunded": 0,
- "amount_returned": 0,
- "amount": 10000,
- "amount_refundable": 10000,
- "application_fee_rate_id": "afr_123xyz",
- "balance": 99850,
- "capture_strategy": "automatic",
- "captured": true,
- "created_at": "2021-01-01T12:00:00Z",
- "currency": "usd",
- "description": "order xyz",
- "disputed": false,
- "error_code": null,
- "error_description": null,
- "fee_amount": 150,
- "financial_transaction_id": "ft_123xyz",
- "is_test": true,
- "metadata": { },
- "payment_intent_id": "pi_xyz",
- "checkout_id": "cho_123",
- "refunded": false,
- "returned": false,
- "status": "succeeded",
- "payment_mode": "ecom",
- "terminal_id": "trm_123_xyz",
- "updated_at": "2021-01-01T12:00:00Z",
- "payment_method": {
- "card": {
- "id": "pm_123xyz",
- "acct_last_four": "4242",
- "brand": "visa",
- "name": "Sylvia Fowles",
- "token": "pm_123xyz",
- "metadata": { },
- "bin_details": {
- "type": "Debit",
- "card_brand": "Visa",
- "card_class": "Consumer",
- "country": "United States of America",
- "issuer": "WELLS FARGO BANK",
- "funding_source": "Debit"
}, - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "customer_id": null,
- "signature": "123abc"
}, - "application_fee": {
- "id": "fee_123xyz",
- "amount": 150,
- "currency": "usd",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "transaction_hold": {
- "id": "th_123xyz",
- "financial_transaction_id": "ft_123xyz"
}, - "refunds": [ ],
- "disputes": [ ]
}, - "page_info": null
}Issue a refund for a payment. You may refund the full payment amount or just a portion. When refunding a portion, multiple refunds are supported up until the full payment amount has been refunded.
Note: If the sub account status is not enabled, 400 will be returned.
| id required | string <uuid> |
| Idempotency-Key required | string <uuid> Example: my-request-123abc a string to identify your request (we recommend using a generated uuid, but you may use any unique string) see Idempotent Requests |
| Authorization required | string Example: Bearer {access_token} the |
| amount | number amount to refund; must be less than or equal to the |
| description | string an optional note about this refund |
| reason | string Enum: "duplicate" "fraudulent" "customer_request" the reason this refund is being issued |
Array of objects Array of fee objects to return to the merchant as part of this refund. If omitted, no fees are returned (current behavior preserved). Each fee object specifies:
Validation:
See Enhanced Fee Management for full documentation. | |
| metadata | object <json> any useful information you'd like to store alongside this refund |
{- "amount": 10000,
- "reason": "customer_request",
- "description": "Customer requested full refund"
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "refund",
- "data": {
- "id": "re_xyz",
- "payment_id": "py_xyz",
- "amount": 100,
- "description": "customer canceled their order",
- "reason": "duplicate",
- "status": "succeeded",
- "metadata": { },
- "returned_fees": [
- {
- "id": "rtfee_xyz",
- "payment_fee_id": "pyfee_abc",
- "type": "processing_fee",
- "returned_amount": 175,
- "original_amount": 350,
- "currency": "usd",
- "remaining_amount": 175
}
], - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}Void a payment transaction to cancel a payment before it reaches settlement. Payment transactions are voidable within 25 minutes of the original transaction.
| id required | string <uuid> |
| Idempotency-Key required | string <uuid> Example: my-request-123abc a string to identify your request (we recommend using a generated uuid, but you may use any unique string) see Idempotent Requests |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "py_123xyz",
- "type": "payment",
- "data": {
- "id": "py_123xyz",
- "account_id": "acc_123xyz",
- "amount_disputed": 0,
- "amount_refunded": 0,
- "amount_returned": 0,
- "amount": 10000,
- "amount_refundable": 10000,
- "application_fee_rate_id": "afr_123xyz",
- "balance": 99850,
- "capture_strategy": "automatic",
- "captured": true,
- "created_at": "2021-01-01T12:00:00Z",
- "currency": "usd",
- "description": "order xyz",
- "disputed": false,
- "error_code": null,
- "error_description": null,
- "fee_amount": 150,
- "financial_transaction_id": "ft_123xyz",
- "is_test": true,
- "metadata": { },
- "payment_intent_id": "pi_xyz",
- "refunded": false,
- "returned": false,
- "status": "canceled",
- "payment_mode": "ecom",
- "updated_at": "2021-01-01T12:00:00Z",
- "payment_method": {
- "card": {
- "id": "pm_123xyz",
- "acct_last_four": 4242,
- "brand": "visa",
- "name": "Sylvia Fowles",
- "token": "pm_123xyz",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "customer_id": null,
- "signature": "123abc"
}, - "application_fee": {
- "id": "fee_123xyz",
- "amount": 150,
- "currency": "usd",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "refunds": [ ],
- "disputes": [ ]
}, - "page_info": null
}Get information about the payment-balance-transactions associated with a payment.
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": 1,
- "type": "array",
- "data": [
- {
- "id": "pbt_123xyz",
- "amount": 40145,
- "balance": 53550,
- "currency": "usd",
- "financial_transaction_id": "ft_123xyz",
- "payment_id": "py_123xyz",
- "payment_balance_txn_type": "fee_refund",
- "source_id": "fee_123xyz",
- "source_type": "ApplicationFee",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "page_info": {
- "end_cursor": "WyIyMDIyLTAyLTA4IDE5OjUyOjM3LjEwNDE3MzAwMCIsIjY4MDliYTU5LTYxYjctNDg3MS05YWFiLWE2Y2MyNmY3M2M1ZCJd",
- "has_next": false,
- "has_previous": false,
- "start_cursor": "WyIyMDIyLTAyLTA4IDIwOjAxOjU4LjEyMDIzMjAwMCIsIjU5ZTFjNGI1LWFlOWQtNDIyZC04MTVkLWNjNzQ5NzdlYmFjYSJd"
}
}We no longer allow new platforms to use this API. Use the Checkout API instead. This API will be retired in the future as existing integrators migrate.
Note: Payment Intents do NOT support dynamic fees. A platform may set a custom application fee amount that applies to a payment using Create a Payment directly.
Create a payment intent if you'd like a place to track the payment method along with all payment attempts for a payment.
Note: If the sub account status is not enabled, 400 will be returned.
| Idempotency-Key required | string <uuid> Example: my-request-123abc a string to identify your request (we recommend using a generated uuid, but you may use any unique string) see Idempotent Requests |
| Authorization required | string Example: Bearer {access_token} the |
| Sub-Account required |
| amount required | number amount to charge in cents |
| currency required | string Value: "usd" |
| description | string your meaningful description of the payment intent (e.g. an order number or other value from your system) |
| metadata | object <json> any useful information you'd like to store alongside this payment intent |
{- "amount": 1000,
- "currency": "usd",
- "description": "ORDER 1235ABC: Charging $10 to the test card",
- "metadata": {
- "order_number": "12345ABC"
}
}{- "id": "pi_xyz",
- "account_id": "acc_xyz",
- "amount": 10000,
- "currency": "usd",
- "description": "my_order_xyz",
- "metadata": { },
- "payment_method": {
- "status": "valid",
- "invalid_reason": "nil",
- "card": {
- "id": "pm_123xyz",
- "acct_last_four": 4242,
- "brand": "Visa",
- "digital_wallet": "apple_pay",
- "name": "Amanda Kessel",
- "token": "pm_123xyz",
- "month": "5",
- "year": "2042",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z",
- "address_line1_check": "unchecked",
- "address_postal_code_check": "unchecked",
- "bin_details": {
- "type": "Credit",
- "card_brand": "Visa",
- "card_class": "Consumer",
- "country": "United States of America",
- "issuer": "WELLS FARGO BANK, N.A.",
- "funding_source": "Credit"
}
}, - "customer_id": "cust_xyz",
- "signature": "4guAJNkVA3lRLVlanNVoBK",
- "account_id": "acc_123"
}, - "status": "requires_payment_method",
- "successful_payment_id": "py_xyz",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}List the payment intents for your account. This endpoint supports pagination.
| Authorization required | string Example: Bearer {access_token} the |
| Sub-Account |
{- "id": 1,
- "type": "array",
- "data": [
- {
- "id": "pi_xyz",
- "account_id": "acc_xyz",
- "amount": 10000,
- "currency": "usd",
- "description": "my_order_xyz",
- "metadata": { },
- "payment_method": {
- "status": "valid",
- "invalid_reason": "nil",
- "card": {
- "id": "pm_123xyz",
- "acct_last_four": 4242,
- "brand": "Visa",
- "digital_wallet": "apple_pay",
- "name": "Amanda Kessel",
- "token": "pm_123xyz",
- "month": "5",
- "year": "2042",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z",
- "address_line1_check": "unchecked",
- "address_postal_code_check": "unchecked",
- "bin_details": {
- "type": "Credit",
- "card_brand": "Visa",
- "card_class": "Consumer",
- "country": "United States of America",
- "issuer": "WELLS FARGO BANK, N.A.",
- "funding_source": "Credit"
}
}, - "customer_id": "cust_xyz",
- "signature": "4guAJNkVA3lRLVlanNVoBK",
- "account_id": "acc_123"
}, - "status": "requires_payment_method",
- "successful_payment_id": "py_xyz",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - {
- "id": "pi_xyz",
- "account_id": "acc_xyz",
- "amount": 10000,
- "currency": "usd",
- "description": "my_order_xyz",
- "metadata": { },
- "payment_method": {
- "status": "valid",
- "invalid_reason": "nil",
- "bank_account": {
- "id": "pm_123xyz",
- "account_owner_name": "Lindsay Whalen",
- "account_type": "checking",
- "bank_name": "Wells Fargo",
- "account_number_last4": 1111,
- "token": "pm_123xyz",
- "metadata": {
- "new": "info"
}
}, - "customer_id": "cust_xyz",
- "signature": "4guAJNkVA3lRLVlanNVoBK",
- "account_id": "acc_123"
}, - "status": "requires_payment_method",
- "successful_payment_id": "py_xyz",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "page_info": {
- "end_cursor": "WyIyMDIyLTAyLTA4IDE5OjUyOjM3LjEwNDE3MzAwMCIsIjY4MDliYTU5LTYxYjctNDg3MS05YWFiLWE2Y2MyNmY3M2M1ZCJd",
- "has_next": false,
- "has_previous": false,
- "start_cursor": "WyIyMDIyLTAyLTA4IDIwOjAxOjU4LjEyMDIzMjAwMCIsIjU5ZTFjNGI1LWFlOWQtNDIyZC04MTVkLWNjNzQ5NzdlYmFjYSJd"
}
}Get information about a payment intent.
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "pi_xyz",
- "account_id": "acc_xyz",
- "amount": 10000,
- "currency": "usd",
- "description": "my_order_xyz",
- "metadata": { },
- "payment_method": {
- "status": "valid",
- "invalid_reason": "nil",
- "card": {
- "id": "pm_123xyz",
- "acct_last_four": 4242,
- "brand": "Visa",
- "digital_wallet": "apple_pay",
- "name": "Amanda Kessel",
- "token": "pm_123xyz",
- "month": "5",
- "year": "2042",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z",
- "address_line1_check": "unchecked",
- "address_postal_code_check": "unchecked",
- "bin_details": {
- "type": "Credit",
- "card_brand": "Visa",
- "card_class": "Consumer",
- "country": "United States of America",
- "issuer": "WELLS FARGO BANK, N.A.",
- "funding_source": "Credit"
}
}, - "customer_id": "cust_xyz",
- "signature": "4guAJNkVA3lRLVlanNVoBK",
- "account_id": "acc_123"
}, - "status": "requires_payment_method",
- "successful_payment_id": "py_xyz",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}Change a payment intent's description or metadata; attach a payment method.
| id required | string <uuid> |
| Idempotency-Key required | string <uuid> Example: my-request-123abc a string to identify your request (we recommend using a generated uuid, but you may use any unique string) see Idempotent Requests |
| Authorization required | string Example: Bearer {access_token} the |
| description | string your meaningful description of the payment intent (e.g. an order number or other value from your system) |
| metadata | object <json> any useful information you'd like to store alongside this payment intent; when you update metadata, any previous metadata will be overwritten |
object can be updated if the payment intent status is | |
| amount | integer payment intent amount, in cents; can be updated if the payment intent status is |
{- "description": "order_xyz",
- "metadata": { },
- "payment_method": {
- "card": {
- "name": "Kevin Garnett",
- "number": 4242424242424242,
- "verification": 123,
- "month": 5,
- "year": 2042,
- "address_line1": "123 Fake St",
- "address_line2": "Suite 101",
- "address_city": "Cityville",
- "address_state": "MN",
- "address_postal_code": 55555,
- "address_country": "US",
- "brand": "Visa",
- "metadata": { }
}, - "token": "pm_xyz"
}, - "amount": 10000
}{- "id": "pi_xyz",
- "account_id": "acc_xyz",
- "amount": 10000,
- "currency": "usd",
- "description": "my_order_xyz",
- "metadata": { },
- "payment_method": {
- "status": "valid",
- "invalid_reason": "nil",
- "card": {
- "id": "pm_123xyz",
- "acct_last_four": 4242,
- "brand": "Visa",
- "digital_wallet": "apple_pay",
- "name": "Amanda Kessel",
- "token": "pm_123xyz",
- "month": "5",
- "year": "2042",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z",
- "address_line1_check": "unchecked",
- "address_postal_code_check": "unchecked",
- "bin_details": {
- "type": "Credit",
- "card_brand": "Visa",
- "card_class": "Consumer",
- "country": "United States of America",
- "issuer": "WELLS FARGO BANK, N.A.",
- "funding_source": "Credit"
}
}, - "customer_id": "cust_xyz",
- "signature": "4guAJNkVA3lRLVlanNVoBK",
- "account_id": "acc_123"
}, - "status": "requires_payment_method",
- "successful_payment_id": "py_xyz",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}Capturing a payment intent lets JustiFi know you intend to process a payment. JustiFi will charge the attached payment method and create a payment.
Note: If the sub account status is not enabled, 400 will be returned.
| id required | string <uuid> |
| Idempotency-Key required | string <uuid> Example: my-request-123abc a string to identify your request (we recommend using a generated uuid, but you may use any unique string) see Idempotent Requests |
| Authorization required | string Example: Bearer {access_token} the |
object | |||||
One of
| |||||
{- "payment_method": {
- "card": {
- "name": "Kevin Garnett",
- "number": 4242424242424242,
- "verification": 123,
- "month": 5,
- "year": 2042,
- "address_line1": "123 Fake St",
- "address_line2": "Suite 101",
- "address_city": "Cityville",
- "address_state": "MN",
- "address_postal_code": 55555,
- "address_country": "US",
- "brand": "Visa",
- "metadata": { }
}, - "token": "pm_xyz"
}
}{- "id": "pi_xyz",
- "account_id": "acc_xyz",
- "amount": 10000,
- "currency": "usd",
- "description": "my_order_xyz",
- "metadata": { },
- "payment_method": {
- "status": "valid",
- "invalid_reason": "nil",
- "card": {
- "id": "pm_123xyz",
- "acct_last_four": 4242,
- "brand": "Visa",
- "digital_wallet": "apple_pay",
- "name": "Amanda Kessel",
- "token": "pm_123xyz",
- "month": "5",
- "year": "2042",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z",
- "address_line1_check": "unchecked",
- "address_postal_code_check": "unchecked",
- "bin_details": {
- "type": "Credit",
- "card_brand": "Visa",
- "card_class": "Consumer",
- "country": "United States of America",
- "issuer": "WELLS FARGO BANK, N.A.",
- "funding_source": "Credit"
}
}, - "customer_id": "cust_xyz",
- "signature": "4guAJNkVA3lRLVlanNVoBK",
- "account_id": "acc_123"
}, - "status": "requires_payment_method",
- "successful_payment_id": "py_xyz",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}Get information about the payments associated with a payment intent.
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": 1,
- "type": "array",
- "data": [
- {
- "id": "py_xyz",
- "account_id": "acc_xyz",
- "amount": 10000,
- "amount_disputed": 0,
- "amount_refunded": 0,
- "amount_refundable": 10000,
- "balance": 99850,
- "fee_amount": 150,
- "financial_transaction_id": "ft_123xyz",
- "captured": true,
- "capture_strategy": "automatic",
- "currency": "usd",
- "description": "my_order_xyz",
- "disputed": false,
- "disputes": [ ],
- "error_code": "credit_card_number_invalid",
- "error_description": "Credit Card Number Invalid (Failed LUHN checksum)",
- "is_test": true,
- "metadata": { },
- "payment_intent_id": "pi_123xyz",
- "checkout_id": "cho_123xyz",
- "payment_method": {
- "card": {
- "id": "pm_123xyz",
- "acct_last_four": 4242,
- "brand": "Visa",
- "digital_wallet": "apple_pay",
- "name": "Amanda Kessel",
- "token": "pm_123xyz",
- "month": "5",
- "year": "2042",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z",
- "address_line1_check": "unchecked",
- "address_postal_code_check": "unchecked"
}, - "customer_id": "cust_xyz",
- "signature": "4guAJNkVA3lRLVlanNVoBK",
- "account_id": "acc_123"
}, - "application_fee": {
- "id": "fee_123xyz",
- "amount": 150,
- "currency": "usd",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "application_fee_rate_id": "afr_123xyz",
- "fees": [
- {
- "id": "pyfee_abc",
- "type": "processing_fee",
- "amount": 350,
- "currency": "usd",
- "remaining_amount": 350
}, - {
- "id": "pyfee_xyz",
- "type": "platform_fee",
- "amount": 500,
- "currency": "usd",
- "remaining_amount": 500
}
], - "refunded": false,
- "status": "pending",
- "payment_mode": "ecom",
- "terminal_id": "trm_123xyz",
- "transaction_hold": {
- "id": "th_123xyz",
- "financial_transaction_id": "ft_123xyz"
}, - "expedited": null,
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - {
- "id": "py_xyz",
- "account_id": "acc_xyz",
- "amount": 10000,
- "amount_disputed": 0,
- "amount_refunded": 0,
- "amount_refundable": 10000,
- "balance": 99850,
- "fee_amount": 150,
- "financial_transaction_id": "ft_123xyz",
- "captured": true,
- "capture_strategy": "automatic",
- "currency": "usd",
- "description": "my_order_xyz",
- "disputed": false,
- "disputes": [ ],
- "error_code": "credit_card_number_invalid",
- "error_description": "Credit Card Number Invalid (Failed LUHN checksum)",
- "is_test": true,
- "metadata": { },
- "payment_intent_id": "pi_123xyz",
- "checkout_id": "cho_123",
- "payment_method": {
- "bank_account": {
- "id": "pm_123xyz",
- "account_owner_name": "Lindsay Whalen",
- "account_type": "checking",
- "bank_name": "Wells Fargo",
- "account_number_last4": 1111,
- "token": "pm_123xyz",
- "metadata": {
- "new": "info"
}
}, - "customer_id": "cust_xyz",
- "signature": "4guAJNkVA3lRLVlanNVoBK",
- "account_id": "acc_123"
}, - "application_fee": {
- "id": "fee_123xyz",
- "amount": 150,
- "currency": "usd",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "application_fee_rate_id": "afr_123xyz",
- "fees": [
- {
- "id": "pyfee_abc",
- "type": "processing_fee",
- "amount": 50,
- "currency": "usd",
- "remaining_amount": 50
}, - {
- "id": "pyfee_xyz",
- "type": "platform_fee",
- "amount": 150,
- "currency": "usd",
- "remaining_amount": 150
}
], - "refunded": false,
- "status": "pending",
- "payment_mode": "ecom",
- "terminal_id": "trm_123xyz",
- "transaction_hold": {
- "id": "th_123xyz",
- "financial_transaction_id": "ft_123xyz"
}, - "expedited": true,
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "page_info": {
- "end_cursor": "WyIyMDIyLTAyLTA4IDE5OjUyOjM3LjEwNDE3MzAwMCIsIjY4MDliYTU5LTYxYjctNDg3MS05YWFiLWE2Y2MyNmY3M2M1ZCJd",
- "has_next": false,
- "has_previous": false,
- "start_cursor": "WyIyMDIyLTAyLTA4IDIwOjAxOjU4LjEyMDIzMjAwMCIsIjU5ZTFjNGI1LWFlOWQtNDIyZC04MTVkLWNjNzQ5NzdlYmFjYSJd"
}
}Payment methods refer to the specific form of payment each customer uses (e.g. their credit card). Payment methods are tokenized, then charged at time of payment.
You can create payment methods ahead of time, then pass their existing tokens to payments. Alternatively, you can create and tokenize payment methods inline when processing payments.
Note: If the sub account status is not enabled, 400 will be returned.
| Idempotency-Key required | string <uuid> Example: my-request-123abc a string to identify your request (we recommend using a generated uuid, but you may use any unique string) see Idempotent Requests |
| Authorization required | string Example: Bearer {access_token} the |
| Sub-Account required |
required | object |
string <email> email address to associate with the payment method | |
| force_tokenize | boolean Optional. If set to true in the request payload, allows for tokenization even if validations and authorization fail during the creation of the payment method |
{- "payment_method": {
- "payment_method_group_id": "pmg_123xyz",
- "card": {
- "name": "Lindsay Whalen",
- "number": 4242424242421111,
- "verification": 123,
- "month": 5,
- "year": 2042,
- "address_postal_code": 55555,
- "metadata": {
- "new": "info"
}
}
}
}{- "id": "pm_123xyz",
- "type": "payment_method",
- "data": {
- "signature": "3aGWnUznQ",
- "customer_id": "cust_123abc",
- "account_id": "acc_123",
- "status": "valid",
- "invalid_reason": "INVALID_ACCOUNT_NUMBER",
- "card": {
- "id": "pm_123xyz",
- "name": "Lindsay Whalen",
- "acct_last_four": 1111,
- "brand": "visa",
- "digital_wallet": "apple_pay",
- "token": "pm_123xyz",
- "month": "5",
- "year": "2042",
- "metadata": {
- "new": "info"
}, - "address_line1_check": "pass",
- "address_postal_code_check": "pass",
- "bin_details": {
- "type": "Credit",
- "card_brand": "Visa",
- "card_class": "Consumer",
- "country": "United States of America",
- "issuer": "WELLS FARGO BANK, N.A.",
- "funding_source": "Credit"
}
}
}, - "page_info": "string"
}List the payment methods for your account. This endpoint supports pagination.
| customer_id | string Example: customer_id=cust_123xyz Note: customer_id is a deprecated field. Please use our payment method groups instead. filter records which are associated with a customer. |
| payment_method_group_id | string Example: payment_method_group_id=pmg_123xyz filter records which are associated with a payment method group. |
| Authorization required | string Example: Bearer {access_token} the |
| Sub-Account |
{- "id": 1,
- "type": "array",
- "data": [
- {
- "status": "valid",
- "invalid_reason": "nil",
- "card": {
- "id": "pm_123xyz",
- "acct_last_four": 4242,
- "brand": "Visa",
- "digital_wallet": "apple_pay",
- "name": "Amanda Kessel",
- "token": "pm_123xyz",
- "month": "5",
- "year": "2042",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z",
- "address_line1_check": "unchecked",
- "address_postal_code_check": "unchecked",
- "bin_details": {
- "type": "Credit",
- "card_brand": "Visa",
- "card_class": "Consumer",
- "country": "United States of America",
- "issuer": "WELLS FARGO BANK, N.A.",
- "funding_source": "Credit"
}
}, - "customer_id": "cust_xyz",
- "signature": "4guAJNkVA3lRLVlanNVoBK",
- "account_id": "acc_123"
}
], - "page_info": {
- "end_cursor": "WyIyMDIyLTAyLTA4IDE5OjUyOjM3LjEwNDE3MzAwMCIsIjY4MDliYTU5LTYxYjctNDg3MS05YWFiLWE2Y2MyNmY3M2M1ZCJd",
- "has_next": false,
- "has_previous": false,
- "start_cursor": "WyIyMDIyLTAyLTA4IDIwOjAxOjU4LjEyMDIzMjAwMCIsIjU5ZTFjNGI1LWFlOWQtNDIyZC04MTVkLWNjNzQ5NzdlYmFjYSJd"
}
}Get information about a payment method.
Note: This is the primary endpoint recommended for retrieving bin_details related to a card payment method
| token required | string |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "pm_123xyz",
- "type": "payment_method",
- "data": {
- "signature": "3aGWnUznQ",
- "customer_id": "cust_123abc",
- "account_id": "acc_123",
- "status": "valid",
- "invalid_reason": "INVALID_ACCOUNT_NUMBER",
- "card": {
- "id": "pm_123xyz",
- "name": "Lindsay Whalen",
- "acct_last_four": 1111,
- "brand": "visa",
- "digital_wallet": "apple_pay",
- "token": "pm_123xyz",
- "month": "5",
- "year": "2042",
- "metadata": {
- "new": "info"
}, - "address_line1_check": "pass",
- "address_postal_code_check": "pass",
- "bin_details": {
- "type": "Credit",
- "card_brand": "Visa",
- "card_class": "Consumer",
- "country": "United States of America",
- "issuer": "WELLS FARGO BANK, N.A.",
- "funding_source": "Credit"
}
}
}, - "page_info": "string"
}Change a payment method's expiration date, address, or metadata.
| token required | string |
| Idempotency-Key required | string <uuid> Example: my-request-123abc a string to identify your request (we recommend using a generated uuid, but you may use any unique string) see Idempotent Requests |
| Authorization required | string Example: Bearer {access_token} the |
object (UpdateCard) | |
object (UpdateBankAccount) Bank Account |
{- "card": {
- "month": 5,
- "year": 2042,
- "address_line1": "123 Fake St",
- "address_line2": "Suite 101",
- "address_city": "Cityville",
- "address_state": "MN",
- "address_postal_code": 55555,
- "address_country": "US",
- "metadata": {
- "new": "info"
}
}, - "bank_account": {
- "metadata": {
- "new": "info"
}
}
}{- "id": "pm_123xyz",
- "type": "payment_method",
- "data": {
- "signature": "3aGWnUznQ",
- "customer_id": "cust_123abc",
- "account_id": "acc_123",
- "status": "valid",
- "invalid_reason": "INVALID_ACCOUNT_NUMBER",
- "card": {
- "id": "pm_123xyz",
- "name": "Lindsay Whalen",
- "acct_last_four": 1111,
- "brand": "visa",
- "digital_wallet": "apple_pay",
- "token": "pm_123xyz",
- "month": "5",
- "year": "2042",
- "metadata": {
- "new": "info"
}, - "address_line1_check": "pass",
- "address_postal_code_check": "pass",
- "bin_details": {
- "type": "Credit",
- "card_brand": "Visa",
- "card_class": "Consumer",
- "country": "United States of America",
- "issuer": "WELLS FARGO BANK, N.A.",
- "funding_source": "Credit"
}
}
}, - "page_info": "string"
}Copy a payment method from one sub account to another sub account. This allows one to share payment methods between accounts without having to collect the card information again. The original payment method's id / token should be provided in the path.
| token required | string |
| Idempotency-Key required | string <uuid> Example: my-request-123abc a string to identify your request (we recommend using a generated uuid, but you may use any unique string) see Idempotent Requests |
| Authorization required | string Example: Bearer {access_token} the |
| destination_account_id | string The sub account id to which the payment method should be cloned |
{- "destination_account_id": "acc_xyz123"
}{- "id": "pm_123xyz",
- "type": "payment_method",
- "data": {
- "signature": "3aGWnUznQ",
- "customer_id": "cust_123abc",
- "account_id": "acc_123",
- "status": "valid",
- "invalid_reason": "INVALID_ACCOUNT_NUMBER",
- "card": {
- "id": "pm_123xyz",
- "name": "Lindsay Whalen",
- "acct_last_four": 1111,
- "brand": "visa",
- "digital_wallet": "apple_pay",
- "token": "pm_123xyz",
- "month": "5",
- "year": "2042",
- "metadata": {
- "new": "info"
}, - "address_line1_check": "pass",
- "address_postal_code_check": "pass",
- "bin_details": {
- "type": "Credit",
- "card_brand": "Visa",
- "card_class": "Consumer",
- "country": "United States of America",
- "issuer": "WELLS FARGO BANK, N.A.",
- "funding_source": "Credit"
}
}
}, - "page_info": "string"
}The Tokenize Payment Method web component allows you to securely collect your customers' credit card and ACH (bank accout) payment methods without any sensitive data entering your system.
The following guide takes you through the few simple steps of integrating the Tokenize Payment Method web component on your platform. We assume you have an activated sub account for payment processing.
Note: If you want to charge a payment at time of payment method tokenization consider using the Unified Fintech Checkout™ web component instead.
On your backend, using your client id and client secret from the Developer > API keys section of the JustiFi dashboard, generate an access token.
function getToken() {
return fetch('https://api.justifi.ai/oauth/token', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
"client_id": "YOUR CLIENT ID",
"client_secret": "YOUR CLIENT SECRET"
})
})
.then(response => response.json())
.then(data => data.access_token);
}
const token = await getToken();
To render the web component you need to generate a web component token. This is a short lived token which is meant to grant short term, fine grained access. The Tokenize Payment Method web component requires the role of write:tokenize:{accountId} with the sub account id you are saving the payment method for.
Note: Consider setting up a Platform Wallet Account if your customers will use payment methods accross different sub accounts on your platform.
async function getWebComponentToken(token, accountId) {
const response = await fetch('https://api.justifi.ai/v1/web_component_tokens', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify({
"resources": [`write:tokenize:${accountId}]
})
});
const data = await response.json();
return data.access_token;
}
const webComponentToken = await getWebComponentToken(token, subAccountId);
Use the web component token generated above and the sub account id passed to the web component token API to render the Tokenize Payment Method web component. This will allow you to collect a customer's credit card or ACH payment method. It will not process a payment.
<justifi-tokenize-payment-method auth-token="${webComponentToken}" account-id="${subAccountId}"></justifi-tokenize-payment-method>
The web component will emit a submitted event when a payment method is submitted. This event will contain the response of the Create Payment Method API which includes the payment method token attribute.
To charge a payment to the newly tokenized payment method pass this token as payment method token to the Payments API.
An error event means there was an issue with the Tokenize Payment Method web component, connecting to the network, etc.
<script>
const justifiTokenizePaymentMethod = document.querySelector('justifi-tokenize-payment-method');
justifiTokenizePaymentMethod.addEventListener('submit-event', (event) => {
console.log('Submitted data:', event.detail);
});
justifiTokenizePaymentMethod.addEventListener('error-event', (event) => {
console.error('error-event:', event.detail);
});
</script>
At this point, the payment method has been tokenized and can be used for future payments!
In addition to the web component events you can listen to payment method specific events via event publisher. To set up an event publisher go to the Developer > Event Pubslisher section of the JustiFi dashboard.
Payment method groups are a way to associate payment methods to a single group for easy access.
You can create payment methods groups ahead of time, then associate payment methods and easily filter them.
| Authorization required | string Example: Bearer {access_token} the |
| Sub-Account required |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "payment_method_group",
- "data": {
- "id": "pm_123xyz",
- "account_id": "acc_123xyz",
- "platform_account_id": "acc_321abc"
}, - "page_info": null
}List payment method groups associated to an account
| Authorization required | string Example: Bearer {access_token} the |
| Sub-Account |
{- "id": 1,
- "type": "array",
- "data": [
- {
- "id": "pm_123xyz",
- "account_id": "acc_123xyz",
- "platform_account_id": "acc_321abc"
}
], - "page_info": {
- "end_cursor": "WyIyMDIyLTAyLTA4IDE5OjUyOjM3LjEwNDE3MzAwMCIsIjY4MDliYTU5LTYxYjctNDg3MS05YWFiLWE2Y2MyNmY3M2M1ZCJd",
- "has_next": false,
- "has_previous": false,
- "start_cursor": "WyIyMDIyLTAyLTA4IDIwOjAxOjU4LjEyMDIzMjAwMCIsIjU5ZTFjNGI1LWFlOWQtNDIyZC04MTVkLWNjNzQ5NzdlYmFjYSJd"
}
}Get payment method group associated to an account
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
| Sub-Account |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "payment_method_group",
- "data": {
- "id": "pm_123xyz",
- "account_id": "acc_123xyz",
- "platform_account_id": "acc_321abc"
}, - "page_info": null
}Updates a payment method group to associate payment methods
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
| Sub-Account |
| payment_method_ids | Array of uuid Payment method ids to be associated with the payment method group |
{- "payment_method_ids": [
- "pm_123xyz",
- "pm_456abc"
]
}Removes a payment method from a payment method group
| id required | string <uuid> |
| payment_method_id required | string <uuid> Example: pm_123xyz ID of the payment method to remove |
| Authorization required | string Example: Bearer {access_token} the |
| Sub-Account |
When you refund a payment, a refund object is created. You can retrieve information about the refunds you've issued.
Issue a refund for a payment. You may refund the full payment amount or just a portion. When refunding a portion, multiple refunds are supported up until the full payment amount has been refunded.
Note: If the sub account status is not enabled, 400 will be returned.
| id required | string <uuid> |
| Idempotency-Key required | string <uuid> Example: my-request-123abc a string to identify your request (we recommend using a generated uuid, but you may use any unique string) see Idempotent Requests |
| Authorization required | string Example: Bearer {access_token} the |
| amount | number amount to refund; must be less than or equal to the |
| description | string an optional note about this refund |
| reason | string Enum: "duplicate" "fraudulent" "customer_request" the reason this refund is being issued |
Array of objects Array of fee objects to return to the merchant as part of this refund. If omitted, no fees are returned (current behavior preserved). Each fee object specifies:
Validation:
See Enhanced Fee Management for full documentation. | |
| metadata | object <json> any useful information you'd like to store alongside this refund |
{- "amount": 10000,
- "reason": "customer_request",
- "description": "Customer requested full refund"
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "refund",
- "data": {
- "id": "re_xyz",
- "payment_id": "py_xyz",
- "amount": 100,
- "description": "customer canceled their order",
- "reason": "duplicate",
- "status": "succeeded",
- "metadata": { },
- "returned_fees": [
- {
- "id": "rtfee_xyz",
- "payment_fee_id": "pyfee_abc",
- "type": "processing_fee",
- "returned_amount": 175,
- "original_amount": 350,
- "currency": "usd",
- "remaining_amount": 175
}
], - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}List the refunds for your account. This endpoint supports pagination.
| Authorization required | string Example: Bearer {access_token} the |
| Sub-Account |
{- "id": 1,
- "type": "array",
- "data": [
- {
- "id": "re_xyz",
- "payment_id": "py_xyz",
- "amount": 100,
- "description": "customer canceled their order",
- "reason": "duplicate",
- "status": "succeeded",
- "metadata": { },
- "returned_fees": [
- {
- "id": "rtfee_xyz",
- "payment_fee_id": "pyfee_abc",
- "type": "processing_fee",
- "returned_amount": 175,
- "original_amount": 350,
- "currency": "usd",
- "remaining_amount": 175
}
], - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "page_info": {
- "end_cursor": "WyIyMDIyLTAyLTA4IDE5OjUyOjM3LjEwNDE3MzAwMCIsIjY4MDliYTU5LTYxYjctNDg3MS05YWFiLWE2Y2MyNmY3M2M1ZCJd",
- "has_next": false,
- "has_previous": false,
- "start_cursor": "WyIyMDIyLTAyLTA4IDIwOjAxOjU4LjEyMDIzMjAwMCIsIjU5ZTFjNGI1LWFlOWQtNDIyZC04MTVkLWNjNzQ5NzdlYmFjYSJd"
}
}Get information about a refund.
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "refund",
- "data": {
- "id": "re_xyz",
- "payment_id": "py_xyz",
- "amount": 100,
- "description": "customer canceled their order",
- "reason": "duplicate",
- "status": "succeeded",
- "metadata": { },
- "returned_fees": [
- {
- "id": "rtfee_xyz",
- "payment_fee_id": "pyfee_abc",
- "type": "processing_fee",
- "returned_amount": 175,
- "original_amount": 350,
- "currency": "usd",
- "remaining_amount": 175
}
], - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}Update the refund metadata.
| id required | string <uuid> |
| Idempotency-Key required | string <uuid> Example: my-request-123abc a string to identify your request (we recommend using a generated uuid, but you may use any unique string) see Idempotent Requests |
| Authorization required | string Example: Bearer {access_token} the |
| metadata | object <json> any useful information you'd like to store alongside this refund; when you update metadata, any previous metadata will be overwritten |
{- "metadata": { }
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "refund",
- "data": {
- "id": "re_xyz",
- "payment_id": "py_xyz",
- "amount": 100,
- "description": "customer canceled their order",
- "reason": "duplicate",
- "status": "succeeded",
- "metadata": { },
- "returned_fees": [
- {
- "id": "rtfee_xyz",
- "payment_fee_id": "pyfee_abc",
- "type": "processing_fee",
- "returned_amount": 175,
- "original_amount": 350,
- "currency": "usd",
- "remaining_amount": 175
}
], - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}A customer may dispute their payment with the card issuer/bank if they believe the charge is erroneous. When this happens, a dispute record is created and associated with their original payment.
Any disputes associated with a payment are also included in the response of the get payment API and the list payments API response
| Authorization required | string Example: Bearer {access_token} the |
| Sub-Account |
{- "id": 1,
- "type": "array",
- "data": [
- {
- "id": "dp_xyz",
- "payment_id": "py_xyz",
- "account_id": "acc_xyz",
- "amount": 100,
- "currency": "usd",
- "reason": "fraudulent",
- "due_date": "2025-02-23",
- "status": "won",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z",
- "dispute_response": {
- "additional_statement": "string",
- "cancellation_policy_disclosure": "string",
- "cancellation_rebuttal": "string",
- "customer_billing_address": "string",
- "customer_email_address": "string",
- "customer_name": "string",
- "customer_purchase_ip_address": "string",
- "duplicate_charge_explanation": "string",
- "product_description": "string",
- "refund_policy_disclosure": "string",
- "refund_refusal_explanation": "string",
- "service_date": "2024-10-31",
- "shipping_address": "string",
- "shipping_carrier": "string",
- "shipping_date": "2024-10-31",
- "shipping_tracking_number": "string",
- "duplicate_charge_original_payment_id": "string"
}, - "dispute_reversal": {
- "description": "Dispute was reversed",
- "created_at": "2021-01-01T12:00:00Z"
}
}
], - "page_info": {
- "end_cursor": "WyIyMDIyLTAyLTA4IDE5OjUyOjM3LjEwNDE3MzAwMCIsIjY4MDliYTU5LTYxYjctNDg3MS05YWFiLWE2Y2MyNmY3M2M1ZCJd",
- "has_next": false,
- "has_previous": false,
- "start_cursor": "WyIyMDIyLTAyLTA4IDIwOjAxOjU4LjEyMDIzMjAwMCIsIjU5ZTFjNGI1LWFlOWQtNDIyZC04MTVkLWNjNzQ5NzdlYmFjYSJd"
}
}Get information about a dispute.
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "dispute",
- "data": {
- "id": "dp_xyz",
- "payment_id": "py_xyz",
- "account_id": "acc_xyz",
- "amount": 100,
- "currency": "usd",
- "reason": "fraudulent",
- "due_date": "2025-02-23",
- "status": "won",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z",
- "dispute_response": {
- "additional_statement": "string",
- "cancellation_policy_disclosure": "string",
- "cancellation_rebuttal": "string",
- "customer_billing_address": "string",
- "customer_email_address": "string",
- "customer_name": "string",
- "customer_purchase_ip_address": "string",
- "duplicate_charge_explanation": "string",
- "product_description": "string",
- "refund_policy_disclosure": "string",
- "refund_refusal_explanation": "string",
- "service_date": "2024-10-31",
- "shipping_address": "string",
- "shipping_carrier": "string",
- "shipping_date": "2024-10-31",
- "shipping_tracking_number": "string",
- "duplicate_charge_original_payment_id": "string"
}, - "dispute_reversal": {
- "description": "Dispute was reversed",
- "created_at": "2021-01-01T12:00:00Z"
}
}, - "page_info": null
}Change a dispute's metadata.
| id required | string <uuid> |
| Idempotency-Key required | string <uuid> Example: my-request-123abc a string to identify your request (we recommend using a generated uuid, but you may use any unique string) see Idempotent Requests |
| Authorization required | string Example: Bearer {access_token} the |
| metadata | object <json> any useful information you'd like to store alongside this dispute; when you update metadata, any previous metadata will be overwritten |
{- "metadata": { }
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "dispute",
- "data": {
- "id": "dp_xyz",
- "payment_id": "py_xyz",
- "account_id": "acc_xyz",
- "amount": 100,
- "currency": "usd",
- "reason": "fraudulent",
- "due_date": "2025-02-23",
- "status": "won",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z",
- "dispute_response": {
- "additional_statement": "string",
- "cancellation_policy_disclosure": "string",
- "cancellation_rebuttal": "string",
- "customer_billing_address": "string",
- "customer_email_address": "string",
- "customer_name": "string",
- "customer_purchase_ip_address": "string",
- "duplicate_charge_explanation": "string",
- "product_description": "string",
- "refund_policy_disclosure": "string",
- "refund_refusal_explanation": "string",
- "service_date": "2024-10-31",
- "shipping_address": "string",
- "shipping_carrier": "string",
- "shipping_date": "2024-10-31",
- "shipping_tracking_number": "string",
- "duplicate_charge_original_payment_id": "string"
}, - "dispute_reversal": {
- "description": "Dispute was reversed",
- "created_at": "2021-01-01T12:00:00Z"
}
}, - "page_info": null
}Creates dispute evidence and generate presigned url
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
| file_name required | string dispute evidence file name |
| file_type required | string Enum: "image/jpeg" "image/png" "application/pdf" "application/zip" "application/x-zip-compressed" dispute evidence file type |
| dispute_evidence_type required | string Enum: "cancellation_policy" "customer_communication" "customer_signature" "duplicate_charge_documentation" "receipt" "refund_policy" "service_documentation" "shipping_documentation" "uncategorized_file" dispute evidence type matching the file that will be uploaded |
| description | string description of the dispute evidence file that will be uploaded |
| metadata | object <json> any useful information you'd like to store alongside the dispute evidence |
{- "file_name": "receipt.pdf",
- "file_type": "application/pdf",
- "dispute_evidence_type": "receipt",
- "description": "string",
- "metadata": { }
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "dispute evidence",
- "data": {
- "id": "dpe_xyz",
- "file_name": "receipt.pdf",
- "file_type": "application/pdf",
- "dispute_evidence_type": "receipt",
- "status": "pending",
- "description": "string",
- "presigned_url": "string"
}, - "page_info": null
}Updates the dispute response
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
| additional_statement | string any additional evidence or statements |
| cancellation_policy_disclosure | string an explanation of how and when the customer was shown your cancellation policy prior to purchase |
| cancellation_rebuttal | string a justification for why the customer’s subscription was not canceled |
| customer_billing_address | string the billing address provided by the customer |
| customer_email_address | string the email address of the customer |
| customer_name | string the name of the customer |
| customer_purchase_ip_address | string the IP address that the customer used when making the purchase |
| duplicate_charge_explanation | string an explanation of the difference between the disputed charge versus the prior charge that appears to be a duplicate |
| product_description | string a description of the product or service that was sold |
| refund_policy_disclosure | string documentation demonstrating that the customer was shown your refund policy prior to purchase |
| refund_refusal_explanation | string justification for why the customer is not entitled to a refund |
| service_date | string the date on which the customer received or began receiving the purchased service |
| shipping_address | string the address to which a physical product was shipped |
| shipping_carrier | string the delivery service that shipped a physical product, such as Fedex, UPS, USPS, etc. If multiple carriers were used for this purchase, please separate them with commas |
| shipping_date | string the date on which a physical product began its route to the shipping address |
| shipping_tracking_number | string the tracking number for a physical product. If multiple tracking numbers were generated for this purchase, please separate them with commas |
| duplicate_charge_original_payment_id | string the payment id for the prior charge which appears to be a duplicate of the disputed charge |
{- "additional_statement": "string",
- "cancellation_policy_disclosure": "string",
- "cancellation_rebuttal": "string",
- "customer_billing_address": "string",
- "customer_email_address": "string",
- "customer_name": "string",
- "customer_purchase_ip_address": "string",
- "duplicate_charge_explanation": "string",
- "product_description": "string",
- "refund_policy_disclosure": "string",
- "refund_refusal_explanation": "string",
- "service_date": "2024-10-31",
- "shipping_address": "string",
- "shipping_carrier": "string",
- "shipping_date": "2024-10-31",
- "shipping_tracking_number": "string",
- "duplicate_charge_original_payment_id": "string"
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "dispute response",
- "data": {
- "additional_statement": "string",
- "cancellation_policy_disclosure": "string",
- "cancellation_rebuttal": "string",
- "customer_billing_address": "string",
- "customer_email_address": "string",
- "customer_name": "string",
- "customer_purchase_ip_address": "string",
- "duplicate_charge_explanation": "string",
- "product_description": "string",
- "refund_policy_disclosure": "string",
- "refund_refusal_explanation": "string",
- "service_date": "2024-10-31",
- "shipping_address": "string",
- "shipping_carrier": "string",
- "shipping_date": "2024-10-31",
- "shipping_tracking_number": "string",
- "duplicate_charge_original_payment_id": "string"
}, - "page_info": null
}Submits the dispute response
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
| forfeit required | boolean when true forfeits the dispute and all other parameters passed in are ignored |
| additional_statement | string any additional evidence or statements |
| cancellation_policy_disclosure | string an explanation of how and when the customer was shown your cancellation policy prior to purchase |
| cancellation_rebuttal | string a justification for why the customer’s subscription was not canceled |
| customer_billing_address | string the billing address provided by the customer |
| customer_email_address | string the email address of the customer |
| customer_name | string the name of the customer |
| customer_purchase_ip_address | string the IP address that the customer used when making the purchase |
| duplicate_charge_explanation | string an explanation of the difference between the disputed charge versus the prior charge that appears to be a duplicate |
| product_description | string a description of the product or service that was sold |
| refund_policy_disclosure | string documentation demonstrating that the customer was shown your refund policy prior to purchase |
| refund_refusal_explanation | string justification for why the customer is not entitled to a refund |
| service_date | string the date on which the customer received or began receiving the purchased service |
| shipping_address | string the address to which a physical product was shipped |
| shipping_carrier | string the delivery service that shipped a physical product, such as Fedex, UPS, USPS, etc. If multiple carriers were used for this purchase, please separate them with commas |
| shipping_date | string the date on which a physical product began its route to the shipping address |
| shipping_tracking_number | string the tracking number for a physical product. If multiple tracking numbers were generated for this purchase, please separate them with commas |
| duplicate_charge_original_payment_id | string the payment id for the prior charge which appears to be a duplicate of the disputed charge |
{- "forfeit": true,
- "additional_statement": "string",
- "cancellation_policy_disclosure": "string",
- "cancellation_rebuttal": "string",
- "customer_billing_address": "string",
- "customer_email_address": "string",
- "customer_name": "string",
- "customer_purchase_ip_address": "string",
- "duplicate_charge_explanation": "string",
- "product_description": "string",
- "refund_policy_disclosure": "string",
- "refund_refusal_explanation": "string",
- "service_date": "2024-10-31",
- "shipping_address": "string",
- "shipping_carrier": "string",
- "shipping_date": "2024-10-31",
- "shipping_tracking_number": "string",
- "duplicate_charge_original_payment_id": "string"
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "dispute",
- "data": {
- "id": "dp_xyz",
- "payment_id": "py_xyz",
- "account_id": "acc_xyz",
- "amount": 100,
- "currency": "usd",
- "reason": "fraudulent",
- "due_date": "2025-02-23",
- "status": "won",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z",
- "dispute_response": {
- "additional_statement": "string",
- "cancellation_policy_disclosure": "string",
- "cancellation_rebuttal": "string",
- "customer_billing_address": "string",
- "customer_email_address": "string",
- "customer_name": "string",
- "customer_purchase_ip_address": "string",
- "duplicate_charge_explanation": "string",
- "product_description": "string",
- "refund_policy_disclosure": "string",
- "refund_refusal_explanation": "string",
- "service_date": "2024-10-31",
- "shipping_address": "string",
- "shipping_carrier": "string",
- "shipping_date": "2024-10-31",
- "shipping_tracking_number": "string",
- "duplicate_charge_original_payment_id": "string"
}, - "dispute_reversal": {
- "description": "Dispute was reversed",
- "created_at": "2021-01-01T12:00:00Z"
}
}, - "page_info": null
}Each day, a payout containing that day's funds is automatically created for the purpose of distributing those funds to the active bank account. Payout amounts are calculated by summing the associated balance transactions for that specific day.
Payouts are processed each day at 11:30am US/Central time. A Platform can also configure each sub account to have an expedited payout priority. If this is enabled, the payout will be settled on the day the payout is generated. Otherwise, standard payouts will settle the next business day.
| created_before | string <date-time> Example: created_before=2022-01-01T00:00:00Z filter records which were created before the date and time (UTC) specified. Dates without time specified will default to 00:00:00 |
| created_after | string <date-time> Example: created_after=2022-01-01T00:00:00Z filter records which were created after the date and time (UTC) specified. Dates without time specified will default to 00:00:00 |
| deposits_before | string <date-time> Example: deposits_before=2022-01-01T00:00:00Z filter records which deposit before the date and time (UTC) specified. Dates without time specified will default to 00:00:00 |
| deposits_after | string <date-time> Example: deposits_after=2022-01-01T00:00:00Z filter records which deposit after the date and time (UTC) specified. Dates without time specified will default to 00:00:00 |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": 1,
- "type": "array",
- "data": [
- {
- "id": "po_xyz",
- "account_id": "449e7a5c-69d3-4b8a-aaaf-5c9b713ebc65",
- "amount": 100000,
- "bank_account": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "full_name": "string",
- "bank_name": "string",
- "account_number_last4": 1111,
- "routing_number": "string",
- "country": "US",
- "currency": "usd",
- "nickname": "string",
- "account_type": "checking"
}, - "currency": "usd",
- "delivery_method": "standard",
- "description": "string",
- "deposits_at": "2021-01-01T12:00:00Z",
- "fees_total": 5000,
- "refunds_count": 5,
- "refunds_total": 10000,
- "payments_count": 50,
- "payments_total": 110000,
- "payout_type": "ach cc",
- "other_total": 100,
- "status": "paid",
- "settlement_priority": "standard",
- "metadata": {
- "customer_payout_id": "cp_12345"
}, - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "page_info": {
- "end_cursor": "WyIyMDIyLTAyLTA4IDE5OjUyOjM3LjEwNDE3MzAwMCIsIjY4MDliYTU5LTYxYjctNDg3MS05YWFiLWE2Y2MyNmY3M2M1ZCJd",
- "has_next": false,
- "has_previous": false,
- "start_cursor": "WyIyMDIyLTAyLTA4IDIwOjAxOjU4LjEyMDIzMjAwMCIsIjU5ZTFjNGI1LWFlOWQtNDIyZC04MTVkLWNjNzQ5NzdlYmFjYSJd"
}
}Get information about a payout.
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "payout",
- "data": {
- "id": "po_xyz",
- "account_id": "449e7a5c-69d3-4b8a-aaaf-5c9b713ebc65",
- "amount": 100000,
- "bank_account": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "full_name": "string",
- "bank_name": "string",
- "account_number_last4": 1111,
- "routing_number": "string",
- "country": "US",
- "currency": "usd",
- "nickname": "string",
- "account_type": "checking"
}, - "currency": "usd",
- "delivery_method": "standard",
- "description": "string",
- "deposits_at": "2021-01-01T12:00:00Z",
- "fees_total": 5000,
- "refunds_count": 5,
- "refunds_total": 10000,
- "payments_count": 50,
- "payments_total": 110000,
- "payout_type": "ach cc",
- "other_total": 100,
- "status": "paid",
- "settlement_priority": "standard",
- "metadata": {
- "customer_payout_id": "cp_12345"
}, - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}Change a payout's metadata.
| id required | string <uuid> |
| Idempotency-Key required | string <uuid> Example: my-request-123abc a string to identify your request (we recommend using a generated uuid, but you may use any unique string) see Idempotent Requests |
| Authorization required | string Example: Bearer {access_token} the |
| metadata | object <json> any useful information you'd like to store alongside this payout; when you update metadata, any previous metadata will be overwritten |
{- "metadata": {
- "customer_payout_id": "cp_12345"
}
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "payout",
- "data": {
- "id": "po_xyz",
- "account_id": "449e7a5c-69d3-4b8a-aaaf-5c9b713ebc65",
- "amount": 100000,
- "bank_account": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "full_name": "string",
- "bank_name": "string",
- "account_number_last4": 1111,
- "routing_number": "string",
- "country": "US",
- "currency": "usd",
- "nickname": "string",
- "account_type": "checking"
}, - "currency": "usd",
- "delivery_method": "standard",
- "description": "string",
- "deposits_at": "2021-01-01T12:00:00Z",
- "fees_total": 5000,
- "refunds_count": 5,
- "refunds_total": 10000,
- "payments_count": 50,
- "payments_total": 110000,
- "payout_type": "ach cc",
- "other_total": 100,
- "status": "paid",
- "settlement_priority": "standard",
- "metadata": {
- "customer_payout_id": "cp_12345"
}, - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}[DEPRECATION WARNING] This endpoint will be deprecated, please use Reports API.
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "payout",
- "data": {
- "id": "po_xyz",
}, - "page_info": null
}A payout hold is a resource that temporarily hold or pause payouts for a sub account. This feature is used for risk management, compliance, or business rule enforcement. Holds can be created automatically by the system (e.g., for first payments) or manually by JustiFi staff..
List the payout holds that belong to this account. This endpoint supports pagination.
| created_before | string <date-time> Example: created_before=2022-01-01T00:00:00Z filter records which were created before the date and time (UTC) specified. Dates without time specified will default to 00:00:00 |
| created_after | string <date-time> Example: created_after=2022-01-01T00:00:00Z filter records which were created after the date and time (UTC) specified. Dates without time specified will default to 00:00:00 |
| start_date_before | string <date> Example: start_date_before=2024-01-31 Filter by start date before the specified date (ISO 8601 format) |
| start_date_after | string <date> Example: start_date_after=2024-01-01 Filter by start date after the specified date (ISO 8601 format) |
| end_date_before | string <date> Example: end_date_before=2024-01-31 Filter by end date before the specified date (ISO 8601 format) |
| end_date_after | string <date> Example: end_date_after=2024-01-01 Filter by end date after the specified date (ISO 8601 format) |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": 1,
- "type": "array",
- "data": [
- {
- "id": "poh_abc123xyz",
- "account_id": "acc_sub123",
- "hold_type": "manual",
- "issued_by": "platform",
- "start_date": "2024-01-01",
- "end_date": "2024-01-31",
- "active": true,
- "created_at": "2024-01-01T10:00:00Z",
- "updated_at": "2024-01-01T10:00:00Z"
}
], - "page_info": {
- "end_cursor": "WyIyMDIyLTAyLTA4IDE5OjUyOjM3LjEwNDE3MzAwMCIsIjY4MDliYTU5LTYxYjctNDg3MS05YWFiLWE2Y2MyNmY3M2M1ZCJd",
- "has_next": false,
- "has_previous": false,
- "start_cursor": "WyIyMDIyLTAyLTA4IDIwOjAxOjU4LjEyMDIzMjAwMCIsIjU5ZTFjNGI1LWFlOWQtNDIyZC04MTVkLWNjNzQ5NzdlYmFjYSJd"
}
}Retrieve a specific payout hold by ID.
| payout_hold_id required | string Example: poh_abc123xyz Payout hold public ID with poh_ prefix |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "payout_hold",
- "data": {
- "id": "poh_abc123xyz",
- "account_id": "acc_sub123",
- "hold_type": "manual",
- "issued_by": "platform",
- "start_date": "2024-01-01",
- "end_date": "2024-01-31",
- "active": true,
- "created_at": "2024-01-01T10:00:00Z",
- "updated_at": "2024-01-01T10:00:00Z"
}, - "page_info": null
}Balance transactions are the reflection of any movement of funds that affects the balance of an account. Oftentimes, a single financial transaction (like a payment) will result in the creation of many balance transactions in order to document the flow of funds between multiple accounts. Other financial transactions that result in balance transactions include refunds, disputes, and payouts.
List the balance transactions for your account. This API is limited to a single sub account or payout. This endpoint supports pagination.
| payout_id | string Example: payout_id=po_123xyz Filter records which are part of the payout with the specified id |
| source_payment_id | string Example: source_payment_id=py_123xyz Filter records which are associated with the payment with the specified id |
| Authorization required | string Example: Bearer {access_token} the |
| Sub-Account |
{- "id": 1,
- "type": "array",
- "data": [
- {
- "id": "bt_xyz",
- "account_id": "acc_xyz",
- "amount": 100000,
- "available_on": "2021-01-01T12:00:00Z",
- "currency": "usd",
- "description": "string",
- "fee": 5000,
- "financial_transaction_id": "ft_xyz",
- "net": 600,
- "payout_id": "po_xyz",
- "source_id": "py_xyz",
- "source_type": "payment",
- "source_payment_id": "py_xyz",
- "txn_type": "seller_payment",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "page_info": {
- "end_cursor": "WyIyMDIyLTAyLTA4IDE5OjUyOjM3LjEwNDE3MzAwMCIsIjY4MDliYTU5LTYxYjctNDg3MS05YWFiLWE2Y2MyNmY3M2M1ZCJd",
- "has_next": false,
- "has_previous": false,
- "start_cursor": "WyIyMDIyLTAyLTA4IDIwOjAxOjU4LjEyMDIzMjAwMCIsIjU5ZTFjNGI1LWFlOWQtNDIyZC04MTVkLWNjNzQ5NzdlYmFjYSJd"
}
}Get information about a balance transaction.
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "balance_transaction",
- "data": {
- "id": "bt_xyz",
- "account_id": "acc_xyz",
- "amount": 100000,
- "available_on": "2021-01-01T12:00:00Z",
- "currency": "usd",
- "description": "string",
- "fee": 5000,
- "financial_transaction_id": "ft_xyz",
- "net": 600,
- "payout_id": "po_xyz",
- "source_id": "py_xyz",
- "source_type": "payment",
- "source_payment_id": "py_xyz",
- "txn_type": "seller_payment",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}ACH return fees are fees charged by financial institutions when an ACH (Automated Clearing House) transaction is returned due to insufficient funds or other reasons. If an ACH transaction is returned for any reason, the financial institution may charge a fee to the sender of the transaction. These fees can vary depending on the policies of the financial institution and the reason for the return.
Get information about ach return fee.
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "account_ach_return_fee",
- "data": {
- "id": "arf_123xyz",
- "payment_id": "py_123xyz",
- "amount": 150,
- "currency": "usd",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}JustiFi enables you to transfer your existing customer data and payment methods. Please contact our Customer Success Department to begin work with your existing processor to securely transfer your information.
Many processors utilize PGP to encrypt sensative data. You can find useful information about PGP by looking over the GPG documentation. Once you understand the basics, you will want to import a public key. Please contact our Customer Success Department if you have any questions.
| Key ID | A4546473910D638E |
| User ID | JustiFi Import Key (PCI) support-migrations@justifi.tech |
| Fingerprint | 0E7C 2E45 F62D 98D7 F7B8 776B A454 6473 910D 638E |
| Key Type | RSA |
| Key Size | 4096 |
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQINBGS+8MwBEACibKFR3bZb4huE7piU0fX3zbLpIq+Jnvs79v5ywVMYvu1kgzbb
XcA0Td2IO0PXuG/cgH4JxH1qVG+cSGjSQ0rOpoQWG5hwOrvRVH17SUQMkZxgDwQb
pCo1N44L+Ij23wW3JlyVb/FbVTK6uctjPmOoonFtzMG2ObKyeTqc1yWFqaIypjvG
AUG2SzgLVqTTLIE5AySyOIpHTnQUwky4J/yCaWhcEJcsQ9GFHx/e+gAlReydMxfa
WhTlMf9Cjm/WaOKVVKrTVicOtfVsFSWmxgtVMK5Smo0YGyF57Oz36Axy63g3QyYs
6XhWiuqCYpnH9EYHNDZaD6G1tZMyczon/rQNtCemUJeM96eyoVi8zK9wCDQT0fQ3
06JqqQtJqI3pAdzQ/VNYwm57XzZPXpFQ7ZGW+0JWb0UfGiwHgnOd/NHsy8imMQiK
FLQjsFnDKVpRgXjqiRUX2/2Qs22XKprKmr6ptNweFLwU1dW0qBkmeM2GBaq7hAdq
Kx6zoPwhYMe7ZxzKO2brvBcxMexhIBYAgdZR3AIdqLWnkGBHY4A3rXYAXqBOiryA
SFK9r6VKr8CihdF4sasdf0uALEOiSYzcXarc5k1rlPxD9ldXduv+RdoodoHVW//+
ID+kvQQSwVOMSF8In+9j+Hhu2Ma3BLDRAqz/Vip9vB9frUn/YyqxjoZQxQARAQAB
tDpKdXN0aUZpIEltcG9ydCBLZXkgKFBDSSkgPHN1cHBvcnQtbWlncmF0aW9uc0Bq
dXN0aWZpLnRlY2g+iQJXBBMBCABBAhsDBQsJCAcCAiICBhUKCQgLAgQWAgMBAh4H
AheAFiEEDnwuRfYtmNf3uHdrpFRkc5ENY44FAmiEAzcFCQlorOsACgkQpFRkc5EN
Y443phAAgqY1md2ygY4m/Sdrk/GaN82N7IQDx+okFrSKxtckSK2rcEz5m0GcB4fD
TWAgSCgEnUz391c/Cu0KA1/r3CdmGGrLMnUeNisCYH83i+dvCVqGBsZcWn3+04Il
MG14E1zgtrO3gP48sBowD8hrz1lSdz+YgfHcohrJvp7Dr/Wr78yyULcXeXZvLUsR
NhAczwpQlHJi/cpGSefUidpSbAMKmgC2NNS+LvazZBikgYIZ27hLqT0nVv2nY+wd
qWp4EkWNkVoNNkvpMYEzVEY7U1eb8rEH5hIibtdTPwfiaRJh0joUrAM2TjaVGzle
wKOHdTc9uWxb2IN/Nh2lT2CKdRWak33Jt5rWwOaLGpP+qD2FsU0CgibrO9qDDMYt
kjH8WDx78bXj9WHmvjolJT2pe6LELCxzUDPChlXmDu3jjdUYpESJdAvE17cGU28o
uLkU9QgFQY5TwKfFaIqrStuSwhc+7FTdLwDObpOqfoC98J47UebE7gtLmddif/0p
FLREzLdWE1sAQQnR+Ml8Vsb1+3vCE/vxusS8gx5pyscupE8H35OTe8MA36BmsQfM
fbcgtt7xJ+v3EKKeJf+SNEs8xXEw5lXxngMKUXC3f2KA/Lp3pY5HixN+moDi2AdF
c4Yr5B9veuHpVnCeuV64/Bzbr6OJRJYIaXON88WrRSI4uokq2V25Ag0EZL7wzAEQ
AMF7UzULBsQmK4LwiuwVOcrYnN0ORQ/AXqDt09cOksDON4UzPrZxvq0FTggi9mzj
U83onhtOv9mjoLYmgdaHUEhhzw167lmWbpwmD/w8PoLgmssrqUcnZH8nYsdYXpkR
ZCTsd68nJdhBQLHjpnH9Ok6nB3ApiPaktIF1Z5Lu8pdPKQVSVHsEUOJ+qZM4cGXk
WsqZLhmjycXnoF5ezSrUik8KwJL13fVFT7NCKagZazcCP57dNMF+sN6VZQSsvCOC
jGjErIGJ6jZ4Qwdd9XVgygxtT5AEj0UakLZJZJfvO9o1ssxQ0TqOQyIj4n/45fRQ
nNSWR03LubksurvduZxpaI1s8p5G3WH2mSVocV+AZV2vmcz/GAFLOS1Ik6EalRDh
DVfGy5o/0D+rURs1zpcCwn1C3bib+LES9S6rnahkhzfqn1J456CxXzVtaqKJrfYq
l2oYd7C18kbarzBLIlEsygWf3yJi/VnsE/2beV2fa7BtQwvdongq9w8IMPzNyXEU
I/7QycB6+YURvt51bhmulSDcFcy6zL1AphLcn/2HQcQs9CMTpwc6QxBuOevgd4Hx
zRIweYzwND+a8pEzIoHIsfpPkWNFOzGWTj5apE9IwbrQ4oVk+Yd7KrcbZHDLTmtd
/yfAQtgGeiO7ns6APdggzKhGMTuTsLPla9zrY1aLSVOLABEBAAGJAjwEGAEIACYC
GwwWIQQOfC5F9i2Y1/e4d2ukVGRzkQ1jjgUCaIQEhgUJCWiuOgAKCRCkVGRzkQ1j
jkEyD/95ukg4C3XHuNLnx6D4cvCa+MCMhKL4LXH4nhRf40ChJSt88OsImE9XOhwz
zWwsvfqvdzn4szitraUzK8AyYoJ5bQ4mw5KB0flw4qBbo7OZVKpLC9pP4ZDy3Z9D
bGQY17uz+KMtzdMdsSgewkYpVcxS9hAqmt4CaQ2X+CWf37c4U/ljs8AOWcUYZ/s+
s9IAP+7wYmIgToqizAfFOHFiFfRbLqA3wbCJD7fiMRJqMLWY4CuMVhRY8k6erDpr
HiuXBwb/f7y8Srdtq5kX5fEHw20DsVsSF5zB3rZ/smLeMTJmNWG55iLf7GPhTXA5
m36N+EhbjCYdoMPyEdBGbC2r1In/PgJuyeBX+kteD4aqY7W8QwEHFtCNVRuR3qB1
OA/fuJlKamN5N4OaCTDjNud/iWMeCi9BXdBOpGHf0iH3Un+ZyjicH2D0KaGA8FKX
v8oHgP4sTR4dwkHGibvPYKX+1RwQ5/9vkJ6OpqtyuPONAjWbkz7geXPRBtQw+yg9
8aNKlI3D1nLCxDBD5nvFrl7mkK1nh/IbdOw7adRYq+8qGSOBaWCRhBmdAhCf8nz8
yKo41dXUSqDDCGBdzkc4CMMSirF63SJI6qnlvof1apzbwN3JQGSmaL1ROcIviHjs
8M9w1S9P69JkFyMzGYZExD+cHWYA10DHjM4mSWCBxZ+tC3UirA==
=SSDk
-----END PGP PUBLIC KEY BLOCK-----
public.keygpg --import public.key
import_file.json.gpg.gpg --encrypt --recipient A4546473910D638E import_file.json
Checkouts can be used to collect payments directly via API, or using our Checkout component. You can use a checkout to complete a payment via JustiFi, via BNPL, via terminal, and to purchase insurance in a single transaction.
All attempts to complete a payment will be recorded, along with the outcome of a payment.
Create a checkout to initiate the collection of a Card Payment, ACH Payment, Insurance Quote Payment, BNPL Payment (not yet available via API),
or Card Reader payment in a single flow. Checkouts have the following statuses: created after creating a checkout, attempted when a checkout
payment is attempted, completed when a payment is collected for a checkout, expired when a checkout has not been completed after one week
since being created
| Authorization required | string Example: Bearer {access_token} the |
| Sub-Account required |
| amount required | number amount to charge in cents, must be an integer greater than 50 (equivalent to $0.50) |
| description required | string your meaningful description of the checkout (e.g. an order number or other value from your system) |
| origin_url | string the domain on which the web component will be rendered, required for web component usage only |
| payment_method_group_id | string payment method group to associate with the checkout |
| statement_descriptor | string description of the payment that will be available on the account's bank statement, must have between 5-22 alphanumeric characters and can include dash or underscore |
| metadata | object <json> any useful information you'd like to store alongside this checkout |
object Sets a custom application fee amount by payment method type. New integrations should use | |
object To override the information saved on the Payment when a checkout is paid via JustiFi card/ach payment, please use these attributes |
{- "amount": 10000,
- "description": "order_xyz",
- "payment_method_group_id": "pmg_xyz123",
- "statement_descriptor": "Big Business",
- "metadata": { },
- "application_fees": {
- "card": {
- "amount": 300
}, - "bank_account": {
- "amount": 150
}
}, - "payment": {
- "description": "Pay David for great work",
- "metadata": { },
- "expedited": true,
- "fees": [
- {
- "type": "processing_fee",
- "amount": 350
}, - {
- "type": "platform_fee",
- "amount": 500
}
]
}
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "checkout",
- "data": {
- "id": "cho_xyz",
- "account_id": "acc_xyz",
- "platform_account_id": "acc_xyz",
- "payment_intent_id": "pi_xyz",
- "payment_amount": 10000,
- "payment_currency": "USD",
- "payment_description": "my order xyz",
- "payment_methods": [
- {
- "id": "pm_123xyz",
- "type": "card",
- "status": "valid",
- "invalid_reason": null,
- "name": "John Doe",
- "brand": "visa",
- "acct_last_four": "4321",
- "month": "12",
- "year": "2031",
- "address_line1_check": "pass",
- "address_postal_code_check": "pass",
- "bin_details": { }
}, - {
- "id": "pm_789abc",
- "type": "bank_account",
- "status": "valid",
- "invalid_reason": null,
- "account_owner_name": "Mary Lane",
- "account_type": "checking",
- "bank_name": "Altra",
- "acct_last_four": "4512"
}
], - "payment_method_group_id": "pmg_xyz",
- "status": "created",
- "mode": "test",
- "successful_payment_id": "py_123xyz",
- "statement_descriptor": "Big Business",
- "metadata": { },
- "application_fees": {
- "card": {
- "amount": 300
}, - "bank_account": {
- "amount": 150
}
}, - "payment_settings": {
- "ach_payments": true,
- "bnpl_payments": false,
- "credit_card_payments": true,
- "insurance_payments": false,
- "bank_account_verification": false
}, - "payment": {
- "description": "my order xyz",
- "metadata": {
- "new": "info"
}, - "expedited": true,
- "fees": [
- {
- "type": "processing_fee",
- "amount": 295
}, - {
- "type": "platform_fee",
- "amount": 150
}
]
}, - "created_at": "2024-01-01T12:00:00Z",
- "updated_at": "2024-01-01T12:00:00Z",
- "completions": [
- {
- "id": "chc_xyz123",
- "payment_mode": "ecom",
- "payment_token": "pm_xyz123",
- "status": "succeeded",
- "payment_status": "succeeded",
- "payment_error_code": "card_declined",
- "payment_error_description": "Your card was declined",
- "payment_response": {
- "id": "py_xyz",
- "type": "payment",
- "data": {
- "id": "py_xyz",
- "account_id": "acc_xyz",
- "amount": 10000,
- "amount_disputed": 0,
- "amount_refunded": 0,
- "amount_refundable": 10000,
- "balance": 99850,
- "fee_amount": 150,
- "financial_transaction_id": "ft_123xyz",
- "captured": true,
- "capture_strategy": "automatic",
- "currency": "usd",
- "description": "my_order_xyz",
- "disputed": false,
- "disputes": [ ],
- "error_code": "credit_card_number_invalid",
- "error_description": "Credit Card Number Invalid (Failed LUHN checksum)",
- "is_test": true,
- "metadata": { },
- "payment_intent_id": "pi_123xyz",
- "checkout_id": "cho_123xyz",
- "payment_method": {
- "card": {
- "id": "pm_123xyz",
- "acct_last_four": 4242,
- "brand": "Visa",
- "digital_wallet": "apple_pay",
- "name": "Amanda Kessel",
- "token": "pm_123xyz",
- "month": "5",
- "year": "2042",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z",
- "address_line1_check": "unchecked",
- "address_postal_code_check": "unchecked"
}, - "customer_id": "cust_xyz",
- "signature": "4guAJNkVA3lRLVlanNVoBK",
- "account_id": "acc_123"
}, - "application_fee": {
- "id": "fee_123xyz",
- "amount": 150,
- "currency": "usd",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "application_fee_rate_id": "afr_123xyz",
- "fees": [
- {
- "id": "pyfee_abc",
- "type": "processing_fee",
- "amount": 350,
- "currency": "usd",
- "remaining_amount": 350
}, - {
- "id": "pyfee_xyz",
- "type": "platform_fee",
- "amount": 500,
- "currency": "usd",
- "remaining_amount": 500
}
], - "refunded": false,
- "status": "pending",
- "payment_mode": "ecom",
- "terminal_id": "trm_123xyz",
- "transaction_hold": {
- "id": "th_123xyz",
- "financial_transaction_id": "ft_123xyz"
}, - "expedited": null,
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}, - "checkout_id": "cho_xyz123",
- "additional_transactions": [ ],
- "payment_id": "py_xyz123",
- "payment_method_id": "pm_xyz123",
- "terminal_id": "trm_xyz123",
- "created_at": "2024-01-01T12:00:00Z",
- "updated_at": "2024-01-01T12:00:00Z"
}
]
}, - "page_info": null
}List Checkouts for your account. This endpoint supports pagination.
| payment_mode | string Enum: "bnpl" "ecom" "card_present" "apple_pay" Example: payment_mode=bnpl the mode in which the checkout was completed |
| status | string Enum: "created" "completed" "attempted" "expired" Example: status=completed the checkout status |
| payment_status | string Enum: "succeeded" "failed" "canceled" "skipped" "pending" Example: payment_status=succeeded the status of the payment which was use to complete the checkout |
| Authorization required | string Example: Bearer {access_token} the |
| Sub-Account |
{- "id": 1,
- "type": "array",
- "data": {
- "id": "cho_xyz",
- "account_id": "acc_xyz",
- "platform_account_id": "acc_xyz",
- "payment_intent_id": "pi_xyz",
- "payment_amount": 10000,
- "payment_currency": "USD",
- "payment_description": "my order xyz",
- "payment_methods": [
- {
- "id": "pm_123xyz",
- "type": "card",
- "status": "valid",
- "invalid_reason": null,
- "name": "John Doe",
- "brand": "visa",
- "acct_last_four": "4321",
- "month": "12",
- "year": "2031",
- "address_line1_check": "pass",
- "address_postal_code_check": "pass",
- "bin_details": { }
}, - {
- "id": "pm_789abc",
- "type": "bank_account",
- "status": "valid",
- "invalid_reason": null,
- "account_owner_name": "Mary Lane",
- "account_type": "checking",
- "bank_name": "Altra",
- "acct_last_four": "4512"
}
], - "payment_method_group_id": "pmg_xyz",
- "status": "created",
- "mode": "test",
- "successful_payment_id": "py_123xyz",
- "statement_descriptor": "Big Business",
- "metadata": { },
- "application_fees": {
- "card": {
- "amount": 300
}, - "bank_account": {
- "amount": 150
}
}, - "payment_settings": {
- "ach_payments": true,
- "bnpl_payments": false,
- "credit_card_payments": true,
- "insurance_payments": false,
- "bank_account_verification": false
}, - "payment": {
- "description": "my order xyz",
- "metadata": {
- "new": "info"
}, - "expedited": true,
- "fees": [
- {
- "type": "processing_fee",
- "amount": 295
}, - {
- "type": "platform_fee",
- "amount": 150
}
]
}, - "created_at": "2024-01-01T12:00:00Z",
- "updated_at": "2024-01-01T12:00:00Z",
- "completions": [
- {
- "id": "chc_xyz123",
- "payment_mode": "ecom",
- "payment_token": "pm_xyz123",
- "status": "succeeded",
- "payment_status": "succeeded",
- "payment_error_code": "card_declined",
- "payment_error_description": "Your card was declined",
- "payment_response": {
- "id": "py_xyz",
- "type": "payment",
- "data": {
- "id": "py_xyz",
- "account_id": "acc_xyz",
- "amount": 10000,
- "amount_disputed": 0,
- "amount_refunded": 0,
- "amount_refundable": 10000,
- "balance": 99850,
- "fee_amount": 150,
- "financial_transaction_id": "ft_123xyz",
- "captured": true,
- "capture_strategy": "automatic",
- "currency": "usd",
- "description": "my_order_xyz",
- "disputed": false,
- "disputes": [ ],
- "error_code": "credit_card_number_invalid",
- "error_description": "Credit Card Number Invalid (Failed LUHN checksum)",
- "is_test": true,
- "metadata": { },
- "payment_intent_id": "pi_123xyz",
- "checkout_id": "cho_123xyz",
- "payment_method": {
- "card": {
- "id": "pm_123xyz",
- "acct_last_four": 4242,
- "brand": "Visa",
- "digital_wallet": "apple_pay",
- "name": "Amanda Kessel",
- "token": "pm_123xyz",
- "month": "5",
- "year": "2042",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z",
- "address_line1_check": "unchecked",
- "address_postal_code_check": "unchecked"
}, - "customer_id": "cust_xyz",
- "signature": "4guAJNkVA3lRLVlanNVoBK",
- "account_id": "acc_123"
}, - "application_fee": {
- "id": "fee_123xyz",
- "amount": 150,
- "currency": "usd",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "application_fee_rate_id": "afr_123xyz",
- "fees": [
- {
- "id": "pyfee_abc",
- "type": "processing_fee",
- "amount": 350,
- "currency": "usd",
- "remaining_amount": 350
}, - {
- "id": "pyfee_xyz",
- "type": "platform_fee",
- "amount": 500,
- "currency": "usd",
- "remaining_amount": 500
}
], - "refunded": false,
- "status": "pending",
- "payment_mode": "ecom",
- "terminal_id": "trm_123xyz",
- "transaction_hold": {
- "id": "th_123xyz",
- "financial_transaction_id": "ft_123xyz"
}, - "expedited": null,
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}, - "checkout_id": "cho_xyz123",
- "additional_transactions": [ ],
- "payment_id": "py_xyz123",
- "payment_method_id": "pm_xyz123",
- "terminal_id": "trm_xyz123",
- "created_at": "2024-01-01T12:00:00Z",
- "updated_at": "2024-01-01T12:00:00Z"
}
]
}, - "page_info": {
- "end_cursor": "WyIyMDIyLTAyLTA4IDE5OjUyOjM3LjEwNDE3MzAwMCIsIjY4MDliYTU5LTYxYjctNDg3MS05YWFiLWE2Y2MyNmY3M2M1ZCJd",
- "has_next": false,
- "has_previous": false,
- "start_cursor": "WyIyMDIyLTAyLTA4IDIwOjAxOjU4LjEyMDIzMjAwMCIsIjU5ZTFjNGI1LWFlOWQtNDIyZC04MTVkLWNjNzQ5NzdlYmFjYSJd"
}
}Get information about a checkout
| Authorization required | string Example: Bearer {access_token} the |
| Sub-Account |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "checkout",
- "data": {
- "id": "cho_xyz",
- "account_id": "acc_xyz",
- "platform_account_id": "acc_xyz",
- "payment_intent_id": "pi_xyz",
- "payment_amount": 10000,
- "payment_currency": "USD",
- "payment_description": "my order xyz",
- "payment_methods": [
- {
- "id": "pm_123xyz",
- "type": "card",
- "status": "valid",
- "invalid_reason": null,
- "name": "John Doe",
- "brand": "visa",
- "acct_last_four": "4321",
- "month": "12",
- "year": "2031",
- "address_line1_check": "pass",
- "address_postal_code_check": "pass",
- "bin_details": { }
}, - {
- "id": "pm_789abc",
- "type": "bank_account",
- "status": "valid",
- "invalid_reason": null,
- "account_owner_name": "Mary Lane",
- "account_type": "checking",
- "bank_name": "Altra",
- "acct_last_four": "4512"
}
], - "payment_method_group_id": "pmg_xyz",
- "status": "created",
- "mode": "test",
- "successful_payment_id": "py_123xyz",
- "statement_descriptor": "Big Business",
- "metadata": { },
- "application_fees": {
- "card": {
- "amount": 300
}, - "bank_account": {
- "amount": 150
}
}, - "payment_settings": {
- "ach_payments": true,
- "bnpl_payments": false,
- "credit_card_payments": true,
- "insurance_payments": false,
- "bank_account_verification": false
}, - "payment": {
- "description": "my order xyz",
- "metadata": {
- "new": "info"
}, - "expedited": true,
- "fees": [
- {
- "type": "processing_fee",
- "amount": 295
}, - {
- "type": "platform_fee",
- "amount": 150
}
]
}, - "created_at": "2024-01-01T12:00:00Z",
- "updated_at": "2024-01-01T12:00:00Z",
- "completions": [
- {
- "id": "chc_xyz123",
- "payment_mode": "ecom",
- "payment_token": "pm_xyz123",
- "status": "succeeded",
- "payment_status": "succeeded",
- "payment_error_code": "card_declined",
- "payment_error_description": "Your card was declined",
- "payment_response": {
- "id": "py_xyz",
- "type": "payment",
- "data": {
- "id": "py_xyz",
- "account_id": "acc_xyz",
- "amount": 10000,
- "amount_disputed": 0,
- "amount_refunded": 0,
- "amount_refundable": 10000,
- "balance": 99850,
- "fee_amount": 150,
- "financial_transaction_id": "ft_123xyz",
- "captured": true,
- "capture_strategy": "automatic",
- "currency": "usd",
- "description": "my_order_xyz",
- "disputed": false,
- "disputes": [ ],
- "error_code": "credit_card_number_invalid",
- "error_description": "Credit Card Number Invalid (Failed LUHN checksum)",
- "is_test": true,
- "metadata": { },
- "payment_intent_id": "pi_123xyz",
- "checkout_id": "cho_123xyz",
- "payment_method": {
- "card": {
- "id": "pm_123xyz",
- "acct_last_four": 4242,
- "brand": "Visa",
- "digital_wallet": "apple_pay",
- "name": "Amanda Kessel",
- "token": "pm_123xyz",
- "month": "5",
- "year": "2042",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z",
- "address_line1_check": "unchecked",
- "address_postal_code_check": "unchecked"
}, - "customer_id": "cust_xyz",
- "signature": "4guAJNkVA3lRLVlanNVoBK",
- "account_id": "acc_123"
}, - "application_fee": {
- "id": "fee_123xyz",
- "amount": 150,
- "currency": "usd",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "application_fee_rate_id": "afr_123xyz",
- "fees": [
- {
- "id": "pyfee_abc",
- "type": "processing_fee",
- "amount": 350,
- "currency": "usd",
- "remaining_amount": 350
}, - {
- "id": "pyfee_xyz",
- "type": "platform_fee",
- "amount": 500,
- "currency": "usd",
- "remaining_amount": 500
}
], - "refunded": false,
- "status": "pending",
- "payment_mode": "ecom",
- "terminal_id": "trm_123xyz",
- "transaction_hold": {
- "id": "th_123xyz",
- "financial_transaction_id": "ft_123xyz"
}, - "expedited": null,
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}, - "checkout_id": "cho_xyz123",
- "additional_transactions": [ ],
- "payment_id": "py_xyz123",
- "payment_method_id": "pm_xyz123",
- "terminal_id": "trm_xyz123",
- "created_at": "2024-01-01T12:00:00Z",
- "updated_at": "2024-01-01T12:00:00Z"
}
]
}, - "page_info": null
}Change a checkout's amount or description
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
| amount | number amount to charge in cents, must be an integer greater than 50 (equivalent to $0.50) |
| description | string your meaningful description of the checkout (e.g. an order number or other value from your system) |
| statement_descriptor | string description of the payment that will be available on the account's bank statement, must have between 5-22 alphanumeric characters and can include dash or underscore |
| metadata | object <json> any useful information you'd like to store alongside this checkout; when you update metadata, any previous metadata will be overwritten |
object (card/ach and card present only, not available for bnpl) sets a custom application fee amount that applies to this payment, instead of relying on application fee rates configured at the platform account level. Must be greater than zero. |
{- "amount": 10000,
- "description": "order_xyz",
- "statement_descriptor": "Big Business",
- "metadata": { },
- "application_fees": {
- "card": {
- "amount": 300
}, - "bank_account": {
- "amount": 150
}
}
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "object",
- "data": {
- "id": "cho_xyz",
- "account_id": "acc_xyz",
- "platform_account_id": "acc_xyz",
- "payment_intent_id": "pi_xyz",
- "payment_amount": 10000,
- "payment_currency": "USD",
- "payment_description": "my order xyz",
- "payment_methods": [
- {
- "id": "pm_123xyz",
- "type": "card",
- "status": "valid",
- "invalid_reason": null,
- "name": "John Doe",
- "brand": "visa",
- "acct_last_four": "4321",
- "month": "12",
- "year": "2031",
- "address_line1_check": "pass",
- "address_postal_code_check": "pass",
- "bin_details": { }
}, - {
- "id": "pm_789abc",
- "type": "bank_account",
- "status": "valid",
- "invalid_reason": null,
- "account_owner_name": "Mary Lane",
- "account_type": "checking",
- "bank_name": "Altra",
- "acct_last_four": "4512"
}
], - "payment_method_group_id": "pmg_xyz",
- "status": "created",
- "mode": "test",
- "successful_payment_id": "py_123xyz",
- "statement_descriptor": "Big Business",
- "metadata": { },
- "application_fees": {
- "card": {
- "amount": 300
}, - "bank_account": {
- "amount": 150
}
}, - "payment_settings": {
- "ach_payments": true,
- "bnpl_payments": false,
- "credit_card_payments": true,
- "insurance_payments": false,
- "bank_account_verification": false
}, - "payment": {
- "description": "my order xyz",
- "metadata": {
- "new": "info"
}, - "expedited": true,
- "fees": [
- {
- "type": "processing_fee",
- "amount": 295
}, - {
- "type": "platform_fee",
- "amount": 150
}
]
}, - "created_at": "2024-01-01T12:00:00Z",
- "updated_at": "2024-01-01T12:00:00Z",
- "completions": [
- {
- "id": "chc_xyz123",
- "payment_mode": "ecom",
- "payment_token": "pm_xyz123",
- "status": "succeeded",
- "payment_status": "succeeded",
- "payment_error_code": "card_declined",
- "payment_error_description": "Your card was declined",
- "payment_response": {
- "id": "py_xyz",
- "type": "payment",
- "data": {
- "id": "py_xyz",
- "account_id": "acc_xyz",
- "amount": 10000,
- "amount_disputed": 0,
- "amount_refunded": 0,
- "amount_refundable": 10000,
- "balance": 99850,
- "fee_amount": 150,
- "financial_transaction_id": "ft_123xyz",
- "captured": true,
- "capture_strategy": "automatic",
- "currency": "usd",
- "description": "my_order_xyz",
- "disputed": false,
- "disputes": [ ],
- "error_code": "credit_card_number_invalid",
- "error_description": "Credit Card Number Invalid (Failed LUHN checksum)",
- "is_test": true,
- "metadata": { },
- "payment_intent_id": "pi_123xyz",
- "checkout_id": "cho_123xyz",
- "payment_method": {
- "card": {
- "id": "pm_123xyz",
- "acct_last_four": 4242,
- "brand": "Visa",
- "digital_wallet": "apple_pay",
- "name": "Amanda Kessel",
- "token": "pm_123xyz",
- "month": "5",
- "year": "2042",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z",
- "address_line1_check": "unchecked",
- "address_postal_code_check": "unchecked"
}, - "customer_id": "cust_xyz",
- "signature": "4guAJNkVA3lRLVlanNVoBK",
- "account_id": "acc_123"
}, - "application_fee": {
- "id": "fee_123xyz",
- "amount": 150,
- "currency": "usd",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "application_fee_rate_id": "afr_123xyz",
- "fees": [
- {
- "id": "pyfee_abc",
- "type": "processing_fee",
- "amount": 350,
- "currency": "usd",
- "remaining_amount": 350
}, - {
- "id": "pyfee_xyz",
- "type": "platform_fee",
- "amount": 500,
- "currency": "usd",
- "remaining_amount": 500
}
], - "refunded": false,
- "status": "pending",
- "payment_mode": "ecom",
- "terminal_id": "trm_123xyz",
- "transaction_hold": {
- "id": "th_123xyz",
- "financial_transaction_id": "ft_123xyz"
}, - "expedited": null,
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}, - "checkout_id": "cho_xyz123",
- "additional_transactions": [ ],
- "payment_id": "py_xyz123",
- "payment_method_id": "pm_xyz123",
- "terminal_id": "trm_xyz123",
- "created_at": "2024-01-01T12:00:00Z",
- "updated_at": "2024-01-01T12:00:00Z"
}
]
}, - "page_info": null
}Use to complete a checkout and capture a payment, requires an idempotency key for payment processing
| Idempotency-Key required | string <uuid> Example: my-request-123abc a string to identify your request (we recommend using a generated uuid, but you may use any unique string) see Idempotent Requests |
| Authorization required | string Example: Bearer {access_token} the |
| payment_token required | string Payment Method token which you want to use to complete the payment |
| payment_mode | string Enum: "ecom" "bnpl" "card_present" "apple_pay" The mode in which the checkout is being completed. If not provided, defaults to |
{- "payment_token": "pm_asdfakjsd23",
- "payment_mode": "ecom"
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "checkout_completion",
- "data": {
- "id": "chc_xyz",
- "payment_mode": "ecom",
- "payment_token": "pm_xyz123",
- "status": "succeeded",
- "payment_status": "succeeded",
- "payment_error_code": "card_declined",
- "payment_error_description": "Your card was declined",
- "payment_response": {
- "id": "py_xyz",
- "type": "payment",
- "data": {
- "id": "py_xyz",
- "account_id": "acc_xyz",
- "amount": 10000,
- "amount_disputed": 0,
- "amount_refunded": 0,
- "amount_refundable": 10000,
- "balance": 99850,
- "fee_amount": 150,
- "financial_transaction_id": "ft_123xyz",
- "captured": true,
- "capture_strategy": "automatic",
- "currency": "usd",
- "description": "my_order_xyz",
- "disputed": false,
- "disputes": [ ],
- "error_code": "credit_card_number_invalid",
- "error_description": "Credit Card Number Invalid (Failed LUHN checksum)",
- "is_test": true,
- "metadata": { },
- "payment_intent_id": "pi_123xyz",
- "checkout_id": "cho_123xyz",
- "payment_method": {
- "card": {
- "id": "pm_123xyz",
- "acct_last_four": 4242,
- "brand": "Visa",
- "digital_wallet": "apple_pay",
- "name": "Amanda Kessel",
- "token": "pm_123xyz",
- "month": "5",
- "year": "2042",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z",
- "address_line1_check": "unchecked",
- "address_postal_code_check": "unchecked"
}, - "customer_id": "cust_xyz",
- "signature": "4guAJNkVA3lRLVlanNVoBK",
- "account_id": "acc_123"
}, - "application_fee": {
- "id": "fee_123xyz",
- "amount": 150,
- "currency": "usd",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "application_fee_rate_id": "afr_123xyz",
- "fees": [
- {
- "id": "pyfee_abc",
- "type": "processing_fee",
- "amount": 350,
- "currency": "usd",
- "remaining_amount": 350
}, - {
- "id": "pyfee_xyz",
- "type": "platform_fee",
- "amount": 500,
- "currency": "usd",
- "remaining_amount": 500
}
], - "refunded": false,
- "status": "pending",
- "payment_mode": "ecom",
- "terminal_id": "trm_123xyz",
- "transaction_hold": {
- "id": "th_123xyz",
- "financial_transaction_id": "ft_123xyz"
}, - "expedited": null,
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}, - "checkout_id": "cho_xyz123",
- "additional_transactions": null,
- "checkout": {
- "id": "cho_xyz",
- "account_id": "acc_xyz",
- "platform_account_id": "acc_xyz",
- "payment_intent_id": "pi_xyz",
- "payment_amount": 10000,
- "payment_currency": "USD",
- "payment_description": "my order xyz",
- "payment_methods": [
- {
- "id": "pm_123xyz",
- "type": "card",
- "status": "valid",
- "invalid_reason": null,
- "name": "John Doe",
- "brand": "visa",
- "acct_last_four": "4321",
- "month": "12",
- "year": "2031",
- "address_line1_check": "pass",
- "address_postal_code_check": "pass",
- "bin_details": { }
}, - {
- "id": "pm_789abc",
- "type": "bank_account",
- "status": "valid",
- "invalid_reason": null,
- "account_owner_name": "Mary Lane",
- "account_type": "checking",
- "bank_name": "Altra",
- "acct_last_four": "4512"
}
], - "payment_method_group_id": "pmg_xyz",
- "status": "created",
- "mode": "test",
- "successful_payment_id": "py_123xyz",
- "statement_descriptor": "Big Business",
- "metadata": { },
- "application_fees": {
- "card": {
- "amount": 300
}, - "bank_account": {
- "amount": 150
}
}, - "payment_settings": {
- "ach_payments": true,
- "bnpl_payments": false,
- "credit_card_payments": true,
- "insurance_payments": false,
- "bank_account_verification": false
}, - "payment": {
- "description": "my order xyz",
- "metadata": {
- "new": "info"
}, - "expedited": true,
- "fees": [
- {
- "type": "processing_fee",
- "amount": 295
}, - {
- "type": "platform_fee",
- "amount": 150
}
]
}, - "created_at": "2024-01-01T12:00:00Z",
- "updated_at": "2024-01-01T12:00:00Z",
- "completions": [
- {
- "id": "chc_xyz123",
- "payment_mode": "ecom",
- "payment_token": "pm_xyz123",
- "status": "succeeded",
- "payment_status": "succeeded",
- "payment_error_code": "card_declined",
- "payment_error_description": "Your card was declined",
- "payment_response": {
- "id": "py_xyz",
- "type": "payment",
- "data": {
- "id": "py_xyz",
- "account_id": "acc_xyz",
- "amount": 10000,
- "amount_disputed": 0,
- "amount_refunded": 0,
- "amount_refundable": 10000,
- "balance": 99850,
- "fee_amount": 150,
- "financial_transaction_id": "ft_123xyz",
- "captured": true,
- "capture_strategy": "automatic",
- "currency": "usd",
- "description": "my_order_xyz",
- "disputed": false,
- "disputes": [ ],
- "error_code": "credit_card_number_invalid",
- "error_description": "Credit Card Number Invalid (Failed LUHN checksum)",
- "is_test": true,
- "metadata": { },
- "payment_intent_id": "pi_123xyz",
- "checkout_id": "cho_123xyz",
- "payment_method": {
- "card": {
- "id": "pm_123xyz",
- "acct_last_four": 4242,
- "brand": "Visa",
- "digital_wallet": "apple_pay",
- "name": "Amanda Kessel",
- "token": "pm_123xyz",
- "month": "5",
- "year": "2042",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z",
- "address_line1_check": "unchecked",
- "address_postal_code_check": "unchecked"
}, - "customer_id": "cust_xyz",
- "signature": "4guAJNkVA3lRLVlanNVoBK",
- "account_id": "acc_123"
}, - "application_fee": {
- "id": "fee_123xyz",
- "amount": 150,
- "currency": "usd",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "application_fee_rate_id": "afr_123xyz",
- "fees": [
- {
- "id": "pyfee_abc",
- "type": "processing_fee",
- "amount": 350,
- "currency": "usd",
- "remaining_amount": 350
}, - {
- "id": "pyfee_xyz",
- "type": "platform_fee",
- "amount": 500,
- "currency": "usd",
- "remaining_amount": 500
}
], - "refunded": false,
- "status": "pending",
- "payment_mode": "ecom",
- "terminal_id": "trm_123xyz",
- "transaction_hold": {
- "id": "th_123xyz",
- "financial_transaction_id": "ft_123xyz"
}, - "expedited": null,
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}, - "checkout_id": "cho_xyz123",
- "additional_transactions": [ ],
- "payment_id": "py_xyz123",
- "payment_method_id": "pm_xyz123",
- "terminal_id": "trm_xyz123",
- "created_at": "2024-01-01T12:00:00Z",
- "updated_at": "2024-01-01T12:00:00Z"
}
]
}, - "payment_id": "py_xyz123",
- "payment_method_id": "pm_xyz123",
- "terminal_id": "trm_xyz123",
- "created_at": "2024-01-01T12:00:00Z",
- "updated_at": "2024-01-01T12:00:00Z"
}, - "page_info": null
}Use to refund a checkout. You may refund the full amount or just a portion. When refunding a portion, multiple refunds are supported up until the full payment amount has been refunded.
| Idempotency-Key required | string <uuid> Example: my-request-123abc a string to identify your request (we recommend using a generated uuid, but you may use any unique string) see Idempotent Requests |
| Authorization required | string Example: Bearer {access_token} the |
| amount | integer Amount to be refunded. If missing, the total amount will be used. |
Array of objects Fees to return to the merchant as part of this refund. See Enhanced Fee Management for full documentation. Each fee object specifies:
If omitted, no fees are returned. Only supported for card/ach and card present payments completed with the |
{- "amount": 1000,
- "fees": [
- {
- "type": "processing_fee",
- "amount": 100
}, - {
- "type": "platform_fee",
- "amount": 100
}
]
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "checkout_completion",
- "data": {
- "id": "chr_xyz",
- "checkout_id": "a0db819d-3316-4040-b9b7-2c905552650c",
- "status": "succeeded",
- "refund_response": "invalid_amount",
- "refund_amount": 4900,
- "returned_fees": [
- {
- "type": "processing_fee",
- "amount": 175
}
], - "created_at": "2024-01-01T12:00:00Z",
- "updated_at": "2024-01-01T12:00:00Z"
}, - "page_info": null
}A checkout is used to initiate the collection of a credit card payment, ACH payment, insurance quote payment, BNPL payment, or card reader payment in a single flow. This walk through will take you through collecting a payment via checkout using the Unified Fintech Checkout™ web component. We assume you have an activated sub account for payment processing.
For a more customized checkout experience refer to the Modular Checkout web component docs.
On your backend, using your client id and client secret from the Developer > API keys section of the JustiFi dashboard. Using those, generate an access token.
function getToken() {
return fetch('https://api.justifi.ai/oauth/token', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
"client_id": "YOUR CLIENT ID",
"client_secret": "YOUR CLIENT SECRET"
})
})
.then(response => response.json())
.then(data => data.access_token);
}
const token = await getToken();
From your backend create a checkout using the Checkout API. A checkout requires a payment amount and descripton. You can also pass a Payment Method Group if you want a customer's pre-entered card information to be shown on the checkout. To render the checkout component, you must set the origin_url parameter to be the domain on which you will render the component. For example, to develop locally you could specify "http://localhost:3000" if you're developing on port 3000.
async function makeCheckout(token, subAccountId) {
const response = await fetch('https://api.justifi.ai/v1/checkouts', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`,
'Sub-Account': `${subAccount}`,
},
body: JSON.stringify({
"amount": 1799,
"description": "One Chocolate Donut",
"payment_method_group_id": "(optional)",
"origin_url": http://localhost:3000
})
});
const data = await response.json();
return data;
}
const subAccountId = "acc_5Et9iXrSSAZR2KSouQGAWi
const checkout = await makeCheckout(token, subAccountId);
To render the checkout component, you must generate a web component token. This is a short lived token which is meant to grant short term, fine grained access. The checkout component requires the role of write:checkout:{checkout id} for the checkout you want to process and write:tokenize:{account id} with the sub account id you are processing the payment for.
async function getWebComponentToken(token, checkoutId, accountId) {
const response = await fetch('https://api.justifi.ai/v1/web_component_tokens', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify({
"resources": [`write:checkout:${checkoutId}`, `write:tokenize:${accountId}]
})
});
const data = await response.json();
return data.access_token;
}
const webComponentToken = await getWebComponentToken(token, checkout.id, subAccountId);
Using the web component token generated above and the checkout id, render the checkout web component. This will allow a customer to complete a checkout via credit card payment, ACH payment, or BNPL payment depending upon the sub account configuration. It will also process payments for attached insurance quotes, if the Insurance components were used.
<justifi-checkout auth-token="${webComponentToken}" checkout-id="${checkout.id}"></justifi-checkout>
The web component will emit a submitted event when a payment is submitted for a checkout. This event will have a payment_status attribute. If the payment succeeded, your app can proceed to a successful checkout state. Otherwise, an error message can be presented to the user. Our example below covers both. If there are insurance quotes being processed, the additional_transactions section will contain the results of the insurance payments.
An error event means there was an issue with the payment form, connecting to the network, etc.
<script>
const justifiCheckout = document.querySelector('justifi-checkout');
justifiCheckout.addEventListener('submit-event', (event) => {
if (event.details.data.status === 'succeeded) {
console.log("Checkout succeeded!");
} else {
console.log("A checkout error occured")
}
});
justifiCheckout.addEventListener('error-event', (event) => {
console.log(event);
});
</script>
At this point, your checkout is completed and you have successfully collected a payment!
A checkout is used to initiate the collection of a credit card payment, ACH payment, insurance quote payment, BNPL payment, or card reader payment in a single flow. This walk through will take you through collecting a payment via checkout. We assume you have an activated sub account for payment processing. If you want to offer BNPL or insurance as part of the checkout process you will need to implement the Unified Fintech Checkout™.
On your backend, using your client id and client secret from the Developer > API keys section of the JustiFi dashboard, generate an access token.
function getToken() {
return fetch('https://api.justifi.ai/oauth/token', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
"client_id": "YOUR CLIENT ID",
"client_secret": "YOUR CLIENT SECRET"
})
})
.then(response => response.json())
.then(data => data.access_token);
}
const token = await getToken();
From your backend create a checkout using the Checkout API. A checkout requires a payment amount and descripton. You can also pass a Payment Method Group, if you want a customer's pre-entered card information to be shown on the checkout.
async function makeCheckout(token, subAccountId) {
const response = await fetch('https://api.justifi.ai/v1/checkouts', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`,
'Sub-Account': `${subAccount}`,
},
body: JSON.stringify({
"amount": 1799,
"description": "One Chocolate Donut",
"payment_method_group_id": "(optional)"
})
});
const data = await response.json();
return data;
}
const subAccountId = "acc_5Et9iXrSSAZR2KSouQGAWi
const checkout = await makeCheckout(token, subAccountId);
In order to complete a checkout, you must provide a payment method token. To avoid entering PCI scope, we recommend using our Payment Form web component. You can also collect the payment method information directly and use our Payment Method APIs, but you will likely be entering PCI scope. Once you have tokenized a payment method you can complete a checkout using the ID of the payment method as payment method token.
To complete a checkout, using the Complete Checkout API pass the payment method token collected above as well as an Idempotency-Key. A checkout completion will be recorded upon success or failure. If the payment_status attribute in the response is succeeded the payment has been collected. If insurance quotes have been attached, the outcome of those payments will be in the additional_transactions attribute.
Used to bind an insurance policy with a JustiFi insurance partner
| Authorization required | string Example: Bearer {access_token} the |
| payment_method_id required | string <uuid> Payment method to charge for insurance policy |
| amount required | number amount to charge in cents |
| currency | string Value: "usd" |
| partner_quote_id required | string quote id provided by partner provider |
| partner_name required | string Value: "vertical_insure" partner insurance provider |
| metadata | object <json> any useful information you'd like to store alongside this record |
{- "payment_method_id": "pm_123",
- "amount": 10000,
- "currency": "usd",
- "partner_quote_id": "ins-test-123",
- "partner_name": "vertical_insure",
- "metadata": { }
}{- "id": "ins_xyz",
- "type": "insurance_policy",
- "data": {
- "id": "ins_xyz",
- "account_id": "acc_xyz",
- "amount": 10000,
- "currency": "usd",
- "partner_name": "vertical_insure",
- "partner_quote_id": "test-123",
- "metadata": { },
- "status": "created",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}Creating a business entity is an essential step in integrating your business operations with JustiFi. It is also necessary to comply with local laws and regulations governing your operations. To create a new business entity, you will need to provide basic information such as the business name, website, business type, business structure, and your industry. You may also add details like the legal address, tax ID, and ownership structure. Providing detailed and accurate information about the business entity is essential for ensuring legal compliance, financial accuracy, and it can also help avoid potential legal and financial issues.
Business classification encompasses both the type of business and its operational structure. Use the following table to map your current business type and structure to the correct business classification:
| Business Type | Business Structure | Business Classification |
|---|---|---|
| individual | * | sole_proprietor |
| for_profit | unincorporated_association | sole_proprietor |
| for_profit | sole_proprietorship | sole_proprietor |
| for_profit | public_partnership | partnership |
| for_profit | private_partnership | partnership |
| for_profit | private_corporation | corporation |
| for_profit | public_corporation | public_company |
| for_profit | multi_llc | limited |
| for_profit | single_llc | limited |
| non_profit | incorporated | non_profit |
| non_profit | unincorporated | non_profit |
| government_entity | government_unit | government |
| government_entity | government_instrumentality | government |
| government_entity | tax_exempt_government_instrumentality | government |
Please, choose whether you want to use the business classification (preferred) or the business type and structure (deprecated), but not both. Business classification is a simplification of business type and structure with the same goals.
Note: If you use the classification, it will not have the exact same correspondence with the business type and structure from the previous table because there are fewer classifications than types/structures.
Create a Business
| Authorization required | string Example: Bearer {access_token} the |
| legal_name | string legal business entity name |
| website_url | string website for this business (if they don't have a website, can send their social media business page, app store link, or a product description instead) |
string email address of business entity or representative | |
| phone | string business phone number |
| doing_business_as | string only needed if registered with DBA/Trade Name on SS-4 tax document |
| business_type | string Enum: "for_profit" "non_profit" "government_entity" "individual" (deprecated) use classification instead - see classification mapping table |
| business_structure | string Enum: "sole_proprietorship" "single_llc" "multi_llc" "private_partnership" "private_corporation" "unincorporated_association" "public_partnership" "public_corporation" "incorporated" "unincorporated" "government_unit" "government_instrumentality" "tax_exempt_government_instrumentality" (deprecated) use classification instead - see classification mapping table |
| classification | string Enum: "government" "limited" "non_profit" "partnership" "corporation" "public_company" "sole_proprietor" simplified classification, use instead of business_type and business_structure - see classification mapping table |
| industry | string to help us identify this business entity's category code (MCC), please provide a concise description of what service they offer |
| mcc | string merchant category code for this business, if known. Please note, the JustiFi underwriting team may modify this. If you are unsure, just submit a description in the industry field instead of an MCC |
| tax_id | string the federal tax identification number/EIN issued to this sub account by the IRS (for Individual type, this will be their full SSN), the value is saved but not returned in any API response |
| date_of_incorporation | string the specific day when this business was officially registered with a relevant government authority and was then permitted to carry out its activities |
| country_of_establishment | string Enum: "USA" "CAN" country where the business was established. Defaults to "USA" if not provided (cannot be changed after creation) |
object any useful information you'd like to store alongside this business | |
object (AdditionalQuestions) | |
Address (object) or object | |
Identity (object) or object | |
Array of Identity (object) or objects up to four business owners total |
{- "legal_name": "Business Name",
- "email": "business@justifi.ai",
- "phone": "6124011111",
- "doing_business_as": "Best Business",
- "business_type": "for_profit",
- "business_structure": "sole_proprietorship",
- "classification": "government",
- "industry": "Big Business",
- "mcc": "8021",
- "tax_id": "string",
- "date_of_incorporation": "2015-02-20",
- "country_of_establishment": "USA",
- "metadata": {
- "arr": 1200,
- "social_network": "@business"
}, - "additional_questions": {
- "business_revenue": "84220",
- "business_payment_volume": "1000000",
- "business_when_service_received": "Within 7 days",
- "business_recurring_payments": "true",
- "business_recurring_payments_percentage": "50% monthly, 50% annual",
- "business_seasonal": "No. The business revenue is generated evenly throughout the year",
- "business_other_payment_details": "50% of revenue is taken 90 days in advance of service and 50% of revenue is taken 30 days in advance of service",
- "business_purchase_order_volume": "150",
- "business_invoice_volume": "500",
- "business_fund_use_intent": "expanding marketing efforts",
- "equipment_invoice": "$10,000 invoice for computer equipment",
- "business_invoice_number": "202105-001",
- "business_invoice_amount": "$4500",
- "business_purchase_order_number": "120",
- "industry_code": "541512",
- "duns_number": "123456789",
- "business_payment_decline_volume": "500",
- "business_refund_volume": "100",
- "business_dispute_volume": "50",
- "business_receivable_volume": "US $100,000",
- "business_future_scheduled_payment_volume": "200",
- "business_dispute_win_rate": "75%",
- "length_of_business_relationship": "5 years"
}, - "legal_address": {
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA"
}, - "representative": {
- "name": "Person Name",
- "title": "President",
- "email": "person.name@justifi.ai",
- "phone": "6124011111",
- "dob_day": "01",
- "dob_month": "01",
- "dob_year": "1980",
- "identification_number": "123456789",
- "is_owner": true,
- "metadata": {
- "language": "english",
- "social_network": "@person"
}, - "address": {
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA"
}
}, - "owners": [
- {
- "name": "Person Name",
- "title": "President",
- "email": "person.name@justifi.ai",
- "phone": "6124011111",
- "dob_day": "01",
- "dob_month": "01",
- "dob_year": "1980",
- "identification_number": "123456789",
- "is_owner": true,
- "metadata": {
- "language": "english",
- "social_network": "@person"
}, - "address": {
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA"
}
}
]
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "business",
- "data": {
- "id": "biz_xyz",
- "platform_account_id": "acc_xyz",
- "legal_name": "Business Name",
- "email": "business@justifi.ai",
- "phone": "6124011111",
- "doing_business_as": "Best Business",
- "business_type": "for_profit",
- "business_structure": "sole_proprietorship",
- "classification": "government",
- "industry": "Big Business",
- "mcc": "8021",
- "tax_id": "string",
- "tax_id_last4": "string",
- "date_of_incorporation": "2015-02-20",
- "country_of_establishment": "USA",
- "terms_conditions_accepted": false,
- "metadata": { },
- "associated_accounts": [
- {
- "id": "acc_123xyx"
}
], - "legal_address": {
- "id": "addr_123xyz",
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "representative": {
- "id": "idty_xyz",
- "platform_account_id": "acc_xyz",
- "business_id": "biz_xyz",
- "name": "Person Name",
- "title": "President",
- "email": "person.name@justifi.ai",
- "phone": "6124011111",
- "dob_day": "01",
- "dob_month": "01",
- "dob_year": "1980",
- "ssn_last4": "6789",
- "is_owner": true,
- "metadata": { },
- "address": {
- "id": "addr_123xyz",
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "documents": [
- {
- "id": "doc_abc123",
- "description": "My Document",
- "file_name": "my_document",
- "file_type": "pdf",
- "document_type": "balance_sheet",
- "business_id": "biz_abc123",
- "identity_id": "idty_abc123",
- "metadata": {
- "language": "english",
- "social_network": "@person"
}, - "status": "pending uploaded canceled",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "owners": [
- {
- "id": "idty_xyz",
- "platform_account_id": "acc_xyz",
- "business_id": "biz_xyz",
- "name": "Person Name",
- "title": "President",
- "email": "person.name@justifi.ai",
- "phone": "6124011111",
- "dob_day": "01",
- "dob_month": "01",
- "dob_year": "1980",
- "ssn_last4": "6789",
- "is_owner": true,
- "metadata": { },
- "address": {
- "id": "addr_123xyz",
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "documents": [
- {
- "id": "doc_abc123",
- "description": "My Document",
- "file_name": "my_document",
- "file_type": "pdf",
- "document_type": "balance_sheet",
- "business_id": "biz_abc123",
- "identity_id": "idty_abc123",
- "metadata": {
- "language": "english",
- "social_network": "@person"
}, - "status": "pending uploaded canceled",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "documents": [
- {
- "id": "doc_abc123",
- "description": "My Document",
- "file_name": "my_document",
- "file_type": "pdf",
- "document_type": "balance_sheet",
- "business_id": "biz_abc123",
- "identity_id": "idty_abc123",
- "metadata": {
- "language": "english",
- "social_network": "@person"
}, - "status": "pending uploaded canceled",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "bank_accounts": [
- {
- "id": "ba_123xyz",
- "account_owner_name": "Napheesa Collier",
- "account_type": "checking",
- "acct_last_four": "6789",
- "routing_number": "110000000",
- "bank_name": "Wells Fargo",
- "country": "US",
- "currency": "usd",
- "nickname": "Phee's money",
- "metadata": { },
- "business_id": "biz_123abc",
- "platform_account_id": "acc_123abc",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "additional_questions": {
- "business_revenue": "84220",
- "business_payment_volume": "1000000",
- "business_when_service_received": "Within 7 days",
- "business_recurring_payments": "true",
- "business_recurring_payments_percentage": "50% monthly, 50% annual",
- "business_seasonal": "No. The business revenue is generated evenly throughout the year",
- "business_other_payment_details": "50% of revenue is taken 90 days in advance of service and 50% of revenue is taken 30 days in advance of service",
- "business_purchase_order_volume": "150",
- "business_invoice_volume": "500",
- "business_fund_use_intent": "expanding marketing efforts",
- "equipment_invoice": "$10,000 invoice for computer equipment",
- "business_invoice_number": "202105-001",
- "business_invoice_amount": "$4500",
- "business_purchase_order_number": "120",
- "industry_code": "541512",
- "duns_number": "123456789",
- "business_payment_decline_volume": "500",
- "business_refund_volume": "100",
- "business_dispute_volume": "50",
- "business_receivable_volume": "US $100,000",
- "business_future_scheduled_payment_volume": "200",
- "business_dispute_win_rate": "75%",
- "length_of_business_relationship": "5 years"
}, - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}List businesses for your platform. This endpoint supports pagination.
| business_name | string Example: business_name="Company Name" filter businesses by name |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": 1,
- "type": "array",
- "data": [
- {
- "id": "biz_xyz",
- "platform_account_id": "acc_xyz",
- "legal_name": "Business Name",
- "email": "business@justifi.ai",
- "phone": "6124011111",
- "doing_business_as": "Best Business",
- "business_type": "for_profit",
- "business_structure": "sole_proprietorship",
- "classification": "government",
- "industry": "Big Business",
- "mcc": "8021",
- "tax_id": "string",
- "tax_id_last4": "string",
- "date_of_incorporation": "2015-02-20",
- "country_of_establishment": "USA",
- "terms_conditions_accepted": false,
- "metadata": { },
- "associated_accounts": [
- {
- "id": "acc_123xyx"
}
], - "legal_address": {
- "id": "addr_123xyz",
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "representative": {
- "id": "idty_xyz",
- "platform_account_id": "acc_xyz",
- "business_id": "biz_xyz",
- "name": "Person Name",
- "title": "President",
- "email": "person.name@justifi.ai",
- "phone": "6124011111",
- "dob_day": "01",
- "dob_month": "01",
- "dob_year": "1980",
- "ssn_last4": "6789",
- "is_owner": true,
- "metadata": { },
- "address": {
- "id": "addr_123xyz",
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "documents": [
- {
- "id": "doc_abc123",
- "description": "My Document",
- "file_name": "my_document",
- "file_type": "pdf",
- "document_type": "balance_sheet",
- "business_id": "biz_abc123",
- "identity_id": "idty_abc123",
- "metadata": {
- "language": "english",
- "social_network": "@person"
}, - "status": "pending uploaded canceled",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "owners": [
- {
- "id": "idty_xyz",
- "platform_account_id": "acc_xyz",
- "business_id": "biz_xyz",
- "name": "Person Name",
- "title": "President",
- "email": "person.name@justifi.ai",
- "phone": "6124011111",
- "dob_day": "01",
- "dob_month": "01",
- "dob_year": "1980",
- "ssn_last4": "6789",
- "is_owner": true,
- "metadata": { },
- "address": {
- "id": "addr_123xyz",
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "documents": [
- {
- "id": "doc_abc123",
- "description": "My Document",
- "file_name": "my_document",
- "file_type": "pdf",
- "document_type": "balance_sheet",
- "business_id": "biz_abc123",
- "identity_id": "idty_abc123",
- "metadata": {
- "language": "english",
- "social_network": "@person"
}, - "status": "pending uploaded canceled",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "documents": [
- {
- "id": "doc_abc123",
- "description": "My Document",
- "file_name": "my_document",
- "file_type": "pdf",
- "document_type": "balance_sheet",
- "business_id": "biz_abc123",
- "identity_id": "idty_abc123",
- "metadata": {
- "language": "english",
- "social_network": "@person"
}, - "status": "pending uploaded canceled",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "bank_accounts": [
- {
- "id": "ba_123xyz",
- "account_owner_name": "Napheesa Collier",
- "account_type": "checking",
- "acct_last_four": "6789",
- "routing_number": "110000000",
- "bank_name": "Wells Fargo",
- "country": "US",
- "currency": "usd",
- "nickname": "Phee's money",
- "metadata": { },
- "business_id": "biz_123abc",
- "platform_account_id": "acc_123abc",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "additional_questions": {
- "business_revenue": "84220",
- "business_payment_volume": "1000000",
- "business_when_service_received": "Within 7 days",
- "business_recurring_payments": "true",
- "business_recurring_payments_percentage": "50% monthly, 50% annual",
- "business_seasonal": "No. The business revenue is generated evenly throughout the year",
- "business_other_payment_details": "50% of revenue is taken 90 days in advance of service and 50% of revenue is taken 30 days in advance of service",
- "business_purchase_order_volume": "150",
- "business_invoice_volume": "500",
- "business_fund_use_intent": "expanding marketing efforts",
- "equipment_invoice": "$10,000 invoice for computer equipment",
- "business_invoice_number": "202105-001",
- "business_invoice_amount": "$4500",
- "business_purchase_order_number": "120",
- "industry_code": "541512",
- "duns_number": "123456789",
- "business_payment_decline_volume": "500",
- "business_refund_volume": "100",
- "business_dispute_volume": "50",
- "business_receivable_volume": "US $100,000",
- "business_future_scheduled_payment_volume": "200",
- "business_dispute_win_rate": "75%",
- "length_of_business_relationship": "5 years"
}, - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "page_info": {
- "end_cursor": "WyIyMDIyLTAyLTA4IDE5OjUyOjM3LjEwNDE3MzAwMCIsIjY4MDliYTU5LTYxYjctNDg3MS05YWFiLWE2Y2MyNmY3M2M1ZCJd",
- "has_next": false,
- "has_previous": false,
- "start_cursor": "WyIyMDIyLTAyLTA4IDIwOjAxOjU4LjEyMDIzMjAwMCIsIjU5ZTFjNGI1LWFlOWQtNDIyZC04MTVkLWNjNzQ5NzdlYmFjYSJd"
}
}Update information about a Business
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
| legal_name | string legal business entity name |
| website_url | string website for this business (if they don't have a website, can send their social media business page, app store link, or a product description instead) |
string email address of business entity or representative | |
| phone | string business phone number |
| doing_business_as | string only needed if registered with DBA/Trade Name on SS-4 tax document |
| business_type | string Enum: "for_profit" "non_profit" "government_entity" "individual" |
| business_structure | string Enum: "sole_proprietorship" "single_llc" "multi_llc" "private_partnership" "private_corporation" "unincorporated_association" "public_partnership" "public_corporation" "incorporated" "unincorporated" "government_unit" "government_instrumentality" "tax_exempt_government_instrumentality" |
| industry | string to help us identify this business entity's category code (MCC), please provide a concise description of what service they offer |
| mcc | string merchant category code for this business, if known. Please note, the JustiFi underwriting team may modify this. If you are unsure, just submit a description in the industry field instead of an MCC |
| tax_id | string the federal tax identification number/EIN issued to this sub account by the IRS (for Individual type, this will be their full SSN), the value is saved but not returned in any API response |
| date_of_incorporation | string the specific day when this business was officially registered with a relevant government authority and was then permitted to carry out its activities |
object any useful information you'd like to store alongside this business | |
object (AdditionalQuestions) | |
Address (object) or object | |
Identity (object) or object |
{- "legal_name": "Business Name",
- "email": "business@justifi.ai",
- "phone": "6124011111",
- "doing_business_as": "Best Business",
- "business_type": "for_profit",
- "business_structure": "sole_proprietorship",
- "industry": "Big Business",
- "mcc": "8021",
- "tax_id": "string",
- "date_of_incorporation": "2015-02-20",
- "metadata": {
- "arr": 1200,
- "social_network": "@business"
}, - "additional_questions": {
- "business_revenue": "84220",
- "business_payment_volume": "1000000",
- "business_when_service_received": "Within 7 days",
- "business_recurring_payments": "true",
- "business_recurring_payments_percentage": "50% monthly, 50% annual",
- "business_seasonal": "No. The business revenue is generated evenly throughout the year",
- "business_other_payment_details": "50% of revenue is taken 90 days in advance of service and 50% of revenue is taken 30 days in advance of service",
- "business_purchase_order_volume": "150",
- "business_invoice_volume": "500",
- "business_fund_use_intent": "expanding marketing efforts",
- "equipment_invoice": "$10,000 invoice for computer equipment",
- "business_invoice_number": "202105-001",
- "business_invoice_amount": "$4500",
- "business_purchase_order_number": "120",
- "industry_code": "541512",
- "duns_number": "123456789",
- "business_payment_decline_volume": "500",
- "business_refund_volume": "100",
- "business_dispute_volume": "50",
- "business_receivable_volume": "US $100,000",
- "business_future_scheduled_payment_volume": "200",
- "business_dispute_win_rate": "75%",
- "length_of_business_relationship": "5 years"
}, - "legal_address": {
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA"
}, - "representative": {
- "name": "Person Name",
- "title": "President",
- "email": "person.name@justifi.ai",
- "phone": "6124011111",
- "dob_day": "01",
- "dob_month": "01",
- "dob_year": "1980",
- "identification_number": "123456789",
- "is_owner": true,
- "metadata": {
- "language": "english",
- "social_network": "@person"
}, - "address": {
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA"
}
}
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "business",
- "data": {
- "id": "biz_xyz",
- "platform_account_id": "acc_xyz",
- "legal_name": "Business Name",
- "email": "business@justifi.ai",
- "phone": "6124011111",
- "doing_business_as": "Best Business",
- "business_type": "for_profit",
- "business_structure": "sole_proprietorship",
- "classification": "government",
- "industry": "Big Business",
- "mcc": "8021",
- "tax_id": "string",
- "tax_id_last4": "string",
- "date_of_incorporation": "2015-02-20",
- "country_of_establishment": "USA",
- "terms_conditions_accepted": false,
- "metadata": { },
- "associated_accounts": [
- {
- "id": "acc_123xyx"
}
], - "legal_address": {
- "id": "addr_123xyz",
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "representative": {
- "id": "idty_xyz",
- "platform_account_id": "acc_xyz",
- "business_id": "biz_xyz",
- "name": "Person Name",
- "title": "President",
- "email": "person.name@justifi.ai",
- "phone": "6124011111",
- "dob_day": "01",
- "dob_month": "01",
- "dob_year": "1980",
- "ssn_last4": "6789",
- "is_owner": true,
- "metadata": { },
- "address": {
- "id": "addr_123xyz",
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "documents": [
- {
- "id": "doc_abc123",
- "description": "My Document",
- "file_name": "my_document",
- "file_type": "pdf",
- "document_type": "balance_sheet",
- "business_id": "biz_abc123",
- "identity_id": "idty_abc123",
- "metadata": {
- "language": "english",
- "social_network": "@person"
}, - "status": "pending uploaded canceled",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "owners": [
- {
- "id": "idty_xyz",
- "platform_account_id": "acc_xyz",
- "business_id": "biz_xyz",
- "name": "Person Name",
- "title": "President",
- "email": "person.name@justifi.ai",
- "phone": "6124011111",
- "dob_day": "01",
- "dob_month": "01",
- "dob_year": "1980",
- "ssn_last4": "6789",
- "is_owner": true,
- "metadata": { },
- "address": {
- "id": "addr_123xyz",
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "documents": [
- {
- "id": "doc_abc123",
- "description": "My Document",
- "file_name": "my_document",
- "file_type": "pdf",
- "document_type": "balance_sheet",
- "business_id": "biz_abc123",
- "identity_id": "idty_abc123",
- "metadata": {
- "language": "english",
- "social_network": "@person"
}, - "status": "pending uploaded canceled",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "documents": [
- {
- "id": "doc_abc123",
- "description": "My Document",
- "file_name": "my_document",
- "file_type": "pdf",
- "document_type": "balance_sheet",
- "business_id": "biz_abc123",
- "identity_id": "idty_abc123",
- "metadata": {
- "language": "english",
- "social_network": "@person"
}, - "status": "pending uploaded canceled",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "bank_accounts": [
- {
- "id": "ba_123xyz",
- "account_owner_name": "Napheesa Collier",
- "account_type": "checking",
- "acct_last_four": "6789",
- "routing_number": "110000000",
- "bank_name": "Wells Fargo",
- "country": "US",
- "currency": "usd",
- "nickname": "Phee's money",
- "metadata": { },
- "business_id": "biz_123abc",
- "platform_account_id": "acc_123abc",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "additional_questions": {
- "business_revenue": "84220",
- "business_payment_volume": "1000000",
- "business_when_service_received": "Within 7 days",
- "business_recurring_payments": "true",
- "business_recurring_payments_percentage": "50% monthly, 50% annual",
- "business_seasonal": "No. The business revenue is generated evenly throughout the year",
- "business_other_payment_details": "50% of revenue is taken 90 days in advance of service and 50% of revenue is taken 30 days in advance of service",
- "business_purchase_order_volume": "150",
- "business_invoice_volume": "500",
- "business_fund_use_intent": "expanding marketing efforts",
- "equipment_invoice": "$10,000 invoice for computer equipment",
- "business_invoice_number": "202105-001",
- "business_invoice_amount": "$4500",
- "business_purchase_order_number": "120",
- "industry_code": "541512",
- "duns_number": "123456789",
- "business_payment_decline_volume": "500",
- "business_refund_volume": "100",
- "business_dispute_volume": "50",
- "business_receivable_volume": "US $100,000",
- "business_future_scheduled_payment_volume": "200",
- "business_dispute_win_rate": "75%",
- "length_of_business_relationship": "5 years"
}, - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}Get information about a Business
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "business",
- "data": {
- "id": "biz_xyz",
- "platform_account_id": "acc_xyz",
- "legal_name": "Business Name",
- "email": "business@justifi.ai",
- "phone": "6124011111",
- "doing_business_as": "Best Business",
- "business_type": "for_profit",
- "business_structure": "sole_proprietorship",
- "classification": "government",
- "industry": "Big Business",
- "mcc": "8021",
- "tax_id": "string",
- "tax_id_last4": "string",
- "date_of_incorporation": "2015-02-20",
- "country_of_establishment": "USA",
- "terms_conditions_accepted": false,
- "metadata": { },
- "associated_accounts": [
- {
- "id": "acc_123xyx"
}
], - "legal_address": {
- "id": "addr_123xyz",
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "representative": {
- "id": "idty_xyz",
- "platform_account_id": "acc_xyz",
- "business_id": "biz_xyz",
- "name": "Person Name",
- "title": "President",
- "email": "person.name@justifi.ai",
- "phone": "6124011111",
- "dob_day": "01",
- "dob_month": "01",
- "dob_year": "1980",
- "ssn_last4": "6789",
- "is_owner": true,
- "metadata": { },
- "address": {
- "id": "addr_123xyz",
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "documents": [
- {
- "id": "doc_abc123",
- "description": "My Document",
- "file_name": "my_document",
- "file_type": "pdf",
- "document_type": "balance_sheet",
- "business_id": "biz_abc123",
- "identity_id": "idty_abc123",
- "metadata": {
- "language": "english",
- "social_network": "@person"
}, - "status": "pending uploaded canceled",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "owners": [
- {
- "id": "idty_xyz",
- "platform_account_id": "acc_xyz",
- "business_id": "biz_xyz",
- "name": "Person Name",
- "title": "President",
- "email": "person.name@justifi.ai",
- "phone": "6124011111",
- "dob_day": "01",
- "dob_month": "01",
- "dob_year": "1980",
- "ssn_last4": "6789",
- "is_owner": true,
- "metadata": { },
- "address": {
- "id": "addr_123xyz",
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "documents": [
- {
- "id": "doc_abc123",
- "description": "My Document",
- "file_name": "my_document",
- "file_type": "pdf",
- "document_type": "balance_sheet",
- "business_id": "biz_abc123",
- "identity_id": "idty_abc123",
- "metadata": {
- "language": "english",
- "social_network": "@person"
}, - "status": "pending uploaded canceled",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "documents": [
- {
- "id": "doc_abc123",
- "description": "My Document",
- "file_name": "my_document",
- "file_type": "pdf",
- "document_type": "balance_sheet",
- "business_id": "biz_abc123",
- "identity_id": "idty_abc123",
- "metadata": {
- "language": "english",
- "social_network": "@person"
}, - "status": "pending uploaded canceled",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "bank_accounts": [
- {
- "id": "ba_123xyz",
- "account_owner_name": "Napheesa Collier",
- "account_type": "checking",
- "acct_last_four": "6789",
- "routing_number": "110000000",
- "bank_name": "Wells Fargo",
- "country": "US",
- "currency": "usd",
- "nickname": "Phee's money",
- "metadata": { },
- "business_id": "biz_123abc",
- "platform_account_id": "acc_123abc",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "additional_questions": {
- "business_revenue": "84220",
- "business_payment_volume": "1000000",
- "business_when_service_received": "Within 7 days",
- "business_recurring_payments": "true",
- "business_recurring_payments_percentage": "50% monthly, 50% annual",
- "business_seasonal": "No. The business revenue is generated evenly throughout the year",
- "business_other_payment_details": "50% of revenue is taken 90 days in advance of service and 50% of revenue is taken 30 days in advance of service",
- "business_purchase_order_volume": "150",
- "business_invoice_volume": "500",
- "business_fund_use_intent": "expanding marketing efforts",
- "equipment_invoice": "$10,000 invoice for computer equipment",
- "business_invoice_number": "202105-001",
- "business_invoice_amount": "$4500",
- "business_purchase_order_number": "120",
- "industry_code": "541512",
- "duns_number": "123456789",
- "business_payment_decline_volume": "500",
- "business_refund_volume": "100",
- "business_dispute_volume": "50",
- "business_receivable_volume": "US $100,000",
- "business_future_scheduled_payment_volume": "200",
- "business_dispute_win_rate": "75%",
- "length_of_business_relationship": "5 years"
}, - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}Creating an identity establishes a unique identification for people associated with your business. Accurately providing your information is crucial in ensuring that your identity is properly verified and maintained, and can have important consequences for a variety of financial and legal transactions. Our platform has a secure database for storing identity information, encryption and other security measures to protect your sensitive data.
Create an Identity
| Authorization required | string Example: Bearer {access_token} the |
| name | string legal name |
| title | string job title |
string email address | |
| phone | string phone number |
| dob_day | string two-digit birth day |
| dob_month | string two-digit birth month |
| dob_year | string four-digit birth year (must be at least 18 years old) |
| identification_number | string full social security number |
| is_owner | boolean if an identity owns 25% or more of the business, they are considered an owner |
object any useful information you'd like to store alongside this identity | |
Address (object) or object |
{- "name": "Person Name",
- "title": "President",
- "email": "person.name@justifi.ai",
- "phone": "6124011111",
- "dob_day": "01",
- "dob_month": "01",
- "dob_year": "1980",
- "identification_number": "123456789",
- "is_owner": true,
- "metadata": {
- "language": "english",
- "social_network": "@person"
}, - "address": {
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA"
}
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "identity",
- "data": {
- "id": "idty_xyz",
- "platform_account_id": "acc_xyz",
- "business_id": "biz_xyz",
- "name": "Person Name",
- "title": "President",
- "email": "person.name@justifi.ai",
- "phone": "6124011111",
- "dob_day": "01",
- "dob_month": "01",
- "dob_year": "1980",
- "ssn_last4": "6789",
- "is_owner": true,
- "metadata": { },
- "address": {
- "id": "addr_123xyz",
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "documents": [
- {
- "id": "doc_abc123",
- "description": "My Document",
- "file_name": "my_document",
- "file_type": "pdf",
- "document_type": "balance_sheet",
- "business_id": "biz_abc123",
- "identity_id": "idty_abc123",
- "metadata": {
- "language": "english",
- "social_network": "@person"
}, - "status": "pending uploaded canceled",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}List identities for your platform. This endpoint supports pagination.
| Authorization required | string Example: Bearer {access_token} the |
{- "id": 1,
- "type": "array",
- "data": [
- {
- "id": "idty_xyz",
- "platform_account_id": "acc_xyz",
- "business_id": "biz_xyz",
- "name": "Person Name",
- "title": "President",
- "email": "person.name@justifi.ai",
- "phone": "6124011111",
- "dob_day": "01",
- "dob_month": "01",
- "dob_year": "1980",
- "ssn_last4": "6789",
- "is_owner": true,
- "metadata": { },
- "address": {
- "id": "addr_123xyz",
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "documents": [
- {
- "id": "doc_abc123",
- "description": "My Document",
- "file_name": "my_document",
- "file_type": "pdf",
- "document_type": "balance_sheet",
- "business_id": "biz_abc123",
- "identity_id": "idty_abc123",
- "metadata": {
- "language": "english",
- "social_network": "@person"
}, - "status": "pending uploaded canceled",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "page_info": {
- "end_cursor": "WyIyMDIyLTAyLTA4IDE5OjUyOjM3LjEwNDE3MzAwMCIsIjY4MDliYTU5LTYxYjctNDg3MS05YWFiLWE2Y2MyNmY3M2M1ZCJd",
- "has_next": false,
- "has_previous": false,
- "start_cursor": "WyIyMDIyLTAyLTA4IDIwOjAxOjU4LjEyMDIzMjAwMCIsIjU5ZTFjNGI1LWFlOWQtNDIyZC04MTVkLWNjNzQ5NzdlYmFjYSJd"
}
}Update information about an Identity
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
| name | string legal name |
| title | string job title |
string email address | |
| phone | string phone number |
| dob_day | string two-digit birth day |
| dob_month | string two-digit birth month |
| dob_year | string four-digit birth year (must be at least 18 years old) |
| identification_number | string full social security number |
| is_owner | boolean if an identity owns 25% or more of the business, they are considered an owner |
object any useful information you'd like to store alongside this identity |
{- "name": "Person Name",
- "title": "President",
- "email": "person.name@justifi.ai",
- "phone": "6124011111",
- "dob_day": "01",
- "dob_month": "01",
- "dob_year": "1980",
- "identification_number": "123456789",
- "is_owner": true,
- "metadata": {
- "language": "english",
- "social_network": "@person"
}
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "identity",
- "data": {
- "id": "idty_xyz",
- "platform_account_id": "acc_xyz",
- "business_id": "biz_xyz",
- "name": "Person Name",
- "title": "President",
- "email": "person.name@justifi.ai",
- "phone": "6124011111",
- "dob_day": "01",
- "dob_month": "01",
- "dob_year": "1980",
- "ssn_last4": "6789",
- "is_owner": true,
- "metadata": { },
- "address": {
- "id": "addr_123xyz",
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "documents": [
- {
- "id": "doc_abc123",
- "description": "My Document",
- "file_name": "my_document",
- "file_type": "pdf",
- "document_type": "balance_sheet",
- "business_id": "biz_abc123",
- "identity_id": "idty_abc123",
- "metadata": {
- "language": "english",
- "social_network": "@person"
}, - "status": "pending uploaded canceled",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}Get information about an Identity
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "identity",
- "data": {
- "id": "idty_xyz",
- "platform_account_id": "acc_xyz",
- "business_id": "biz_xyz",
- "name": "Person Name",
- "title": "President",
- "email": "person.name@justifi.ai",
- "phone": "6124011111",
- "dob_day": "01",
- "dob_month": "01",
- "dob_year": "1980",
- "ssn_last4": "6789",
- "is_owner": true,
- "metadata": { },
- "address": {
- "id": "addr_123xyz",
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "documents": [
- {
- "id": "doc_abc123",
- "description": "My Document",
- "file_name": "my_document",
- "file_type": "pdf",
- "document_type": "balance_sheet",
- "business_id": "biz_abc123",
- "identity_id": "idty_abc123",
- "metadata": {
- "language": "english",
- "social_network": "@person"
}, - "status": "pending uploaded canceled",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}Creating an Address entity provides the necessary information to identify and locate a physical address. It may be associated with an Identity entity or Business entity to provide a more complete picture of the parties involved.
Create an Address
| Authorization required | string Example: Bearer {access_token} the |
| line1 | string |
| line2 | string |
| city | string |
| state | string |
| postal_code | string |
| country | string |
{- "line1": "123 Example St",
- "line2": "# 61157",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA"
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "address",
- "data": {
- "id": "addr_123xyz",
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}List addresses for your platform. This endpoint supports pagination.
| Authorization required | string Example: Bearer {access_token} the |
{- "id": 1,
- "type": "array",
- "data": [
- {
- "id": "addr_123xyz",
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "page_info": {
- "end_cursor": "WyIyMDIyLTAyLTA4IDE5OjUyOjM3LjEwNDE3MzAwMCIsIjY4MDliYTU5LTYxYjctNDg3MS05YWFiLWE2Y2MyNmY3M2M1ZCJd",
- "has_next": false,
- "has_previous": false,
- "start_cursor": "WyIyMDIyLTAyLTA4IDIwOjAxOjU4LjEyMDIzMjAwMCIsIjU5ZTFjNGI1LWFlOWQtNDIyZC04MTVkLWNjNzQ5NzdlYmFjYSJd"
}
}Update information about an Address
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
| line1 | string |
| line2 | string |
| city | string |
| state | string |
| postal_code | string |
| country | string |
{- "line1": "123 Example St",
- "line2": "# 61157",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA"
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "address",
- "data": {
- "id": "addr_123xyz",
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}Get information about an Address
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "address",
- "data": {
- "id": "addr_123xyz",
- "line1": "123 Example St",
- "line2": "Suite 101",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": "55555",
- "country": "USA",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}Create/manage documents attached to your businesses and identities. When a document record
is created using this API the response object returns a presigned url used to upload this
document to an encrypted bucket. The presigned url can then be used to upload directly to an
AWS s3 bucket, with a command like curl -X PUT -T /path/to/file.pdf "insert presigned url".
You must use the PUT method. This can also be accomplished from a backend or mobile app, from the browser or using our web components.
After upload is complete the status changes from pending to uploaded.
Create a reference to a document, and receive a presigned URL for uploading the document
| Authorization required | string Example: Bearer {access_token} the |
| description | string |
| file_name required | string |
| file_type required | string the file media type/extension of the file you are uploading. For example, text/plain, application/pdf, image/png |
| document_type required | string Enum: "balance_sheet" "bank_statement" "government_id" "profit_and_loss_statement" "tax_return" "other" |
| business_id | string <uuid> the business id to associate with this document (one of business id or identity id is required) |
| identity_id | string <uuid> the identity id to associate with this document (one of business id or identity id is required) |
| metadata | object any useful information you'd like to store alongside this document |
{- "description": "My Document",
- "file_name": "the_file_name",
- "file_type": "application/pdf",
- "document_type": "balance_sheet",
- "business_id": "biz_abc123",
- "identity_id": "idty_abc123",
- "metadata": {
- "my_id": "123"
}
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "document",
- "data": {
- "id": "doc_abc123",
- "description": "My Document",
- "file_name": "my_document",
- "file_type": "pdf",
- "document_type": "balance_sheet",
- "business_id": "biz_abc123",
- "identity_id": "idty_abc123",
- "metadata": {
- "language": "english",
- "social_network": "@person"
}, - "status": "pending uploaded canceled",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}List the documents you have uploaded. This endpoint supports pagination.
| Authorization required | string Example: Bearer {access_token} the |
{- "id": 1,
- "type": "array",
- "data": [
- {
- "id": "doc_abc123",
- "description": "My Document",
- "file_name": "my_document",
- "file_type": "pdf",
- "document_type": "balance_sheet",
- "business_id": "biz_abc123",
- "identity_id": "idty_abc123",
- "metadata": {
- "language": "english",
- "social_network": "@person"
}, - "status": "pending uploaded canceled",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "page_info": {
- "end_cursor": "WyIyMDIyLTAyLTA4IDE5OjUyOjM3LjEwNDE3MzAwMCIsIjY4MDliYTU5LTYxYjctNDg3MS05YWFiLWE2Y2MyNmY3M2M1ZCJd",
- "has_next": false,
- "has_previous": false,
- "start_cursor": "WyIyMDIyLTAyLTA4IDIwOjAxOjU4LjEyMDIzMjAwMCIsIjU5ZTFjNGI1LWFlOWQtNDIyZC04MTVkLWNjNzQ5NzdlYmFjYSJd"
}
}Get details about a document, and a presigned download URL
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "document",
- "data": {
- "id": "doc_abc123",
- "description": "My Document",
- "file_name": "my_document",
- "file_type": "pdf",
- "document_type": "balance_sheet",
- "business_id": "biz_abc123",
- "identity_id": "idty_abc123",
- "metadata": {
- "language": "english",
- "social_network": "@person"
}, - "status": "pending uploaded canceled",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}Create/manage bank accounts for your businesses. These accounts are used for paying out earnings for usage of various products, for example card processing.
Create a bank account
| Authorization required | string Example: Bearer {access_token} the |
| account_owner_name required | string name of the account owner |
| account_type required | string Enum: "checking" "savings" type of account |
| account_number required | string the account number |
| routing_number required | string routing number |
| business_id required | string <uuid> business id which owns the account |
| bank_name required | string bank name |
| nickname | string nickname for the bank account |
| metadata | object any useful information you'd like to store alongside this bank account |
{- "account_owner_name": "Napheesa Collier",
- "account_type": "checking",
- "account_number": "000123456789",
- "routing_number": "110000000",
- "business_id": "biz_abc123",
- "bank_name": "Wells Fargo",
- "nickname": "Phee's Money",
- "metadata": {
- "my_id": "123"
}
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "bank_account",
- "data": {
- "id": "ba_123xyz",
- "account_owner_name": "Napheesa Collier",
- "account_type": "checking",
- "acct_last_four": "6789",
- "routing_number": "110000000",
- "bank_name": "Wells Fargo",
- "country": "US",
- "currency": "usd",
- "nickname": "Phee's money",
- "metadata": { },
- "business_id": "biz_123abc",
- "platform_account_id": "acc_123abc",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}List the bank accounts you have created for a business. This endpoint supports pagination.
| business_id | string Example: business_id=biz_xyz filter bank accounts which are associated with a business |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": 1,
- "type": "array",
- "data": [
- {
- "id": "ba_123xyz",
- "account_owner_name": "Napheesa Collier",
- "account_type": "checking",
- "acct_last_four": "6789",
- "routing_number": "110000000",
- "bank_name": "Wells Fargo",
- "country": "US",
- "currency": "usd",
- "nickname": "Phee's money",
- "metadata": { },
- "business_id": "biz_123abc",
- "platform_account_id": "acc_123abc",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "page_info": {
- "end_cursor": "WyIyMDIyLTAyLTA4IDE5OjUyOjM3LjEwNDE3MzAwMCIsIjY4MDliYTU5LTYxYjctNDg3MS05YWFiLWE2Y2MyNmY3M2M1ZCJd",
- "has_next": false,
- "has_previous": false,
- "start_cursor": "WyIyMDIyLTAyLTA4IDIwOjAxOjU4LjEyMDIzMjAwMCIsIjU5ZTFjNGI1LWFlOWQtNDIyZC04MTVkLWNjNzQ5NzdlYmFjYSJd"
}
}Get details about a bank account
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "bank_account",
- "data": {
- "id": "ba_123xyz",
- "account_owner_name": "Napheesa Collier",
- "account_type": "checking",
- "acct_last_four": "6789",
- "routing_number": "110000000",
- "bank_name": "Wells Fargo",
- "country": "US",
- "currency": "usd",
- "nickname": "Phee's money",
- "metadata": { },
- "business_id": "biz_123abc",
- "platform_account_id": "acc_123abc",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}Legally binding rules and agreements that outline the rights, responsibilities, and limitations governing the use of the platform.
Accept current Terms and Conditions
| Authorization required | string Example: Bearer {access_token} the |
| business_id required | string business id |
| accepted required | boolean accepts terms and conditions |
| ip required | string client ip address |
| user_agent | string client identification information |
{- "business_id": "biz_xyz",
- "accepted": true,
- "ip": "142.250.219.46",
- "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15"
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "onboarding",
- "data": {
- "id": "tac_xyz",
- "business_id": "biz_xyz",
- "accepted": true,
- "ip": "142.250.219.46",
- "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15"
}, - "page_info": null
}Provisioning API for Products serves as an automated interface to configure resources based on your current entities informations, for example creating an account for card processing.
Product Provisioning
| Authorization required | string Example: Bearer {access_token} the |
| business_id required | string business associated with the account |
| product_category required | string type of product to be provisioned |
{- "business_id": "biz_123",
- "product_category": "payment"
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "onboarding",
- "data": {
- "account_type": "test",
- "sub_account_id": "acc_xyz",
- "platform_account_id": "acc_123",
- "payload": { }
}, - "page_info": null
}JustiFi provides a card present solution which allows you to collect a payment via a terminal provider via one of our technology partners.
To collect a payment via terminal, you must first ensure you ask the JustiFi team to enable the card present feature for your platform. Next, we will work to provision and configure terminals for your sub accounts.
Once you have configured a terminal, you must complete the following steps to complete a payment:
Create a Checkout with the amount you'd like to capture, and a description of the payment.
POST to the terminal pay endpoint which will be used to send your checkout to a terminal for processing. This process can take some time as it requires customer interaction. For this reason, the API will return immediately but the process is asynchronusly happening on a terminal.
At this point, the process is handed over to the terminal to complete. Once the payment transaction is completed, we will publish an event for you to continue the process and take further action, as noted in the next step.
Create an Event Publisher which publishes checkout.completed events. This will provide a means to ensure the payment was successful. You can also listen to checkout completion events, for example a checkout.completion.failed event will be published each time a card is attempted to be processed but the transaction fails for some reason.
If you do not have the ability to handle event publishing, you could poll our checkout API with the id of the checkout you are processing. Contine to poll until the checkout status attribute changes. We recommend you use the checkout events instead of this approach.
Send a checkout to be processed via terminal, listen for checkout events (recommended) or poll checkout API for payment outcome
| Authorization required | string Example: Bearer {access_token} the |
| payment_intent_id | string <uuid> (deprecated, use checkout id) id for the payment intent which you want to process via terminal |
| checkout_id required | string <uuid> id of the checkout which you want to process via terminal |
| terminal_id required | string <uuid> id of the terminal on which you want to process a transaction |
{- "payment_intent_id": "pi_abc123",
- "checkout_id": "cho_abc123",
- "terminal_id": "trm_abc123"
}{- "id": "tses_FQz6I0hMTrcU9Ur7TpOPZ",
- "type": "terminal_sessions",
- "data": {
- "id": "tses_FQz6I0hMTrcU9Ur7TpOPZ",
- "session_type": "payment",
- "status": "created",
- "payment_id": "py_abc123",
- "payment_intent_id": "7e322e88-5311-4979-b283-b9a687137f41",
- "terminal_id": "trm_abc123",
- "account_id": "acc_abc123",
- "platform_account_id": "acc_abc123",
- "checkout_id": "cho_abc123"
}, - "page_info": null
}| status | string Enum: "connected" "disconnected" "unknown" "pending_configuration" "archived" Example: status=active filter records by the terminal status. Accepts multiple comma separated status values. |
| terminal_id | string Example: terminal_id=trm_abc123 filter records by terminal id |
| provider_id | string Example: provider_id=23456789 filter records by provider id, also called device id (DID). Accepts multiple comma separated provider ids. |
| terminal_order_id | string Example: terminal_order_id=tord_123xyz filter records by terminal order id |
| verified_after | string <date-time> Example: verified_after=2024-01-01T00:00:00Z filter records which were verified after the date and time (UTC) specified. Dates without time specified will default to 00:00:00 |
| verified_before | string <date-time> Example: verified_before=2024-01-01T00:00:00Z filter records which were verified before the date and time (UTC) specified. Dates without time specified will default to 00:00:00 |
| verified_on | string <date> Example: verified_on=2024-01-01 filter records which were verified on the date specified between 00:00:00 and 23:59:59 (UTC) |
| Authorization required | string Example: Bearer {access_token} the |
| Sub-Account |
{- "id": 1,
- "type": "array",
- "data": [
- {
- "id": "trm_abc123",
- "account_id": "acc_123xyz",
- "platform_account_id": "acct_789abc",
- "provider": "verifone",
- "status": "disconnected",
- "provider_id": "23456789",
- "provider_serial_number": "888-222-444",
- "nickname": "My Favorite Terminal",
- "verified_at": "2024-01-01T15:00:00Z",
- "model_name": "e285",
- "terminal_order_created_at": "2024-01-01T15:00:00Z",
- "status_last_requested_at": "2024-01-01T15:00:00Z",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
], - "page_info": {
- "end_cursor": "WyIyMDIyLTAyLTA4IDE5OjUyOjM3LjEwNDE3MzAwMCIsIjY4MDliYTU5LTYxYjctNDg3MS05YWFiLWE2Y2MyNmY3M2M1ZCJd",
- "has_next": false,
- "has_previous": false,
- "start_cursor": "WyIyMDIyLTAyLTA4IDIwOjAxOjU4LjEyMDIzMjAwMCIsIjU5ZTFjNGI1LWFlOWQtNDIyZC04MTVkLWNjNzQ5NzdlYmFjYSJd"
}
}| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "terminal",
- "data": {
- "id": "trm_abc123",
- "account_id": "acc_123xyz",
- "platform_account_id": "acct_789abc",
- "provider": "verifone",
- "status": "disconnected",
- "provider_id": "23456789",
- "provider_serial_number": "888-222-444",
- "nickname": "My Favorite Terminal",
- "verified_at": "2024-01-01T15:00:00Z",
- "model_name": "e285",
- "terminal_order_created_at": "2024-01-01T15:00:00Z",
- "status_last_requested_at": "2024-01-01T15:00:00Z",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
| nickname | string terminal nickname |
{- "nickname": "My Favorite Terminal"
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "terminal",
- "data": {
- "id": "trm_abc123",
- "account_id": "acc_123xyz",
- "platform_account_id": "acct_789abc",
- "provider": "verifone",
- "status": "disconnected",
- "provider_id": "23456789",
- "provider_serial_number": "888-222-444",
- "nickname": "My Favorite Terminal",
- "verified_at": "2024-01-01T15:00:00Z",
- "model_name": "e285",
- "terminal_order_created_at": "2024-01-01T15:00:00Z",
- "status_last_requested_at": "2024-01-01T15:00:00Z",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "terminal",
- "data": {
- "id": "trm_abc123",
- "status": "CONNECTED",
- "last_date_time_connected": "2021-01-01T12:00:00Z",
- "last_date_time_active": "2021-01-01T12:00:00Z"
}, - "page_info": null
}This API will attempt to display the nickname or serial number on the screen of the given terminal for 20 seconds.
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
Get information about terminals order
| id required | string <uuid> |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "terminals_order",
- "data": {
- "id": "tord_xyz",
- "business_id": "biz_xyz",
- "account_id": "acc_xyz",
- "order_type": "boarding_only",
- "order_status": "created",
- "company_name": "Business Name",
- "mcc": 7998,
- "receiver_name": "John Doe",
- "contact_first_name": "John",
- "contact_last_name": "Doe",
- "contact_email": "john.doe@example.com",
- "contact_phone_number": 2125554567,
- "line1": "123 Main St",
- "line2": "Apt 4B",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": 55401,
- "time_zone": "US/Central",
- "country": "USA",
- "shipping_tracking_reference": 12345678,
- "created_at": "2024-01-01T12:00:00Z",
- "updated_at": "2024-01-01T12:00:00Z",
- "terminals": [
- {
- "terminal_id": "tmn_abc",
- "terminal_did": "12345678",
- "model_name": "V400m"
}
]
}, - "page_info": null
}Retrieve a list of terminal orders for your account. This endpoint supports pagination.
| created_before | string <date-time> Example: created_before=2022-01-01T00:00:00Z filter records which were created before the date and time (UTC) specified. Dates without time specified will default to 00:00:00 |
| created_after | string <date-time> Example: created_after=2022-01-01T00:00:00Z filter records which were created after the date and time (UTC) specified. Dates without time specified will default to 00:00:00 |
| order_type | string Enum: "boarding_only" "boarding_shipping" Example: order_type=boarding_only filter terminal orders of a specific type |
| order_status | string Enum: "created" "submitted" "completed" Example: order_status=created filter terminal orders of a specific status |
| sub_account_id | string Example: sub_account_id=acc_123xyz filter terminal orders of a specific sub account |
| Authorization required | string Example: Bearer {access_token} the |
{- "id": "prefix_xyz (same as id of data object)",
- "type": "terminals_orders",
- "data": [
- {
- "id": "tord_xyz",
- "business_id": "biz_xyz",
- "account_id": "acc_xyz",
- "order_type": "boarding_only",
- "order_status": "created",
- "company_name": "Business Name",
- "mcc": 7998,
- "receiver_name": "John Doe",
- "contact_first_name": "John",
- "contact_last_name": "Doe",
- "contact_email": "john.doe@example.com",
- "contact_phone_number": 2125554567,
- "line1": "123 Main St",
- "line2": "Apt 4B",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": 55401,
- "time_zone": "US/Central",
- "country": "USA",
- "shipping_tracking_reference": 12345678,
- "created_at": "2024-01-01T12:00:00Z",
- "updated_at": "2024-01-01T12:00:00Z",
- "terminals": [
- {
- "terminal_id": "tmn_abc",
- "terminal_did": "12345678",
- "model_name": "V400m"
}
]
}
], - "page_info": null
}Order (one or multiple) terminals from one of our technology partners
| Authorization required | string Example: Bearer {access_token} the |
| business_id required | string <uuid> id of the business entity ordering a terminal |
| sub_account_id required | string <uuid> id of the account all terminals from this order will be associated |
| order_type required | string Enum: "boarding_only" "boarding_shipping" |
required | Array of objects list of terminals being ordered |
{- "business_id": "biz_abc123",
- "sub_account_id": "acc_abc123",
- "order_type": "boarding_only",
- "order_items": [
- {
- "model_name": "V400m",
- "quantity": 1
}
]
}{- "id": "prefix_xyz (same as id of data object)",
- "type": "terminals_order",
- "data": {
- "id": "tord_xyz",
- "business_id": "biz_xyz",
- "account_id": "acc_xyz",
- "order_type": "boarding_only",
- "order_status": "created",
- "company_name": "Business Name",
- "mcc": 7998,
- "receiver_name": "John Doe",
- "contact_first_name": "John",
- "contact_last_name": "Doe",
- "contact_email": "john.doe@example.com",
- "contact_phone_number": 2125554567,
- "line1": "123 Main St",
- "line2": "Apt 4B",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": 55401,
- "time_zone": "US/Central",
- "country": "USA",
- "shipping_tracking_reference": 12345678,
- "created_at": "2024-01-01T12:00:00Z",
- "updated_at": "2024-01-01T12:00:00Z",
- "terminals": [
- {
- "terminal_id": "tmn_abc",
- "terminal_did": "12345678",
- "model_name": "V400m"
}
]
}, - "page_info": null
}JustiFi Web Components offer an expanding collection of components that can be used in virtually any application, no matter the tech stack. They can be installed using NPM, or included via CDN using a script tag. To learn more, see the documentation in our public GitHub repositiory.
We offer support for using our API via a Ruby SDK and a Node SDK. The projects are open source and available on Github. You can view full documentation on usage there. As more languages are supported, they will be added to this list:
Our event publishing system allows you to subscribe to certain events on the JustiFi platform. Once subscribed, your application will be notified anytime those events occur, so you can react accordingly in real time. You can receive events via webhooks. See the Webhook Delivery section for more details.
We will publish the following events:
Received for the following events: payment.created, payment.succeeded, payment.failed, payment.pending, payment.authorized, payment.captured, payment.canceled
| id | string event unique id |
| idempotency_key | string or null idempotency key for request, when available |
| request_id | string or null id for request, when available |
| account_id | string sub account id for event |
| account_type | string live or test account |
| platform_account_id | string or null platform account id for event, when available |
object or object | |
| version | string version of the event payload |
| event_name | string name of the event (payment.succeeded, sub_account.updated, etc.) |
{- "id": "evt_123xyz",
- "account_id": "acc_123xyz",
- "account_type": "test",
- "platform_account_id": "acc_987zyx",
- "idempotency_key": "string",
- "request_id": "req_123",
- "version": "v1",
- "data": {
- "id": "py_xyz",
- "account_id": "acc_123xyz",
- "amount_disputed": 0,
- "amount_refunded": 0,
- "amount_returned": 0,
- "amount": 10000,
- "amount_refundable": 10000,
- "application_fee_rate_id": "afr_123xyz",
- "balance": 99850,
- "capture_strategy": "automatic",
- "captured": true,
- "created_at": "2021-01-01T12:00:00Z",
- "currency": "usd",
- "description": "my order xyz",
- "disputed": false,
- "error_code": null,
- "error_description": null,
- "fee_amount": 150,
- "financial_transaction_id": "ft_123xyz",
- "is_test": true,
- "metadata": { },
- "payment_intent_id": "pi_xyz",
- "refunded": false,
- "returned": false,
- "status": "succeeded",
- "terminal_id": "trm_123_xyz",
- "updated_at": "2021-01-01T12:00:00Z",
- "payment_method": {
- "card": {
- "id": "pm_123xyz",
- "acct_last_four": "4242",
- "brand": "visa",
- "name": "Sylvia Fowles",
- "token": "pm_123xyz",
- "metadata": { },
- "bin_details": {
- "type": "Debit",
- "card_brand": "Visa",
- "card_class": "Consumer",
- "country": "United States of America",
- "issuer": "WELLS FARGO BANK",
- "funding_source": "Debit"
}, - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "customer_id": null,
- "signature": "123abc"
}, - "application_fee": {
- "id": "fee_123xyz",
- "amount": 150,
- "currency": "usd",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "transaction_hold": {
- "id": "th_123xyz",
- "financial_transaction_id": "ft_123xyz"
}, - "refunds": [ ],
- "disputes": [ ]
}, - "event_name": "payment.created"
}Received for the following events: payment_intent.attached, payment_intent.created, payment_intent.requires_capture, payment_intent.succeeded
| id | string event unique id |
| idempotency_key | string or null idempotency key for request, when available |
| request_id | string or null id for request, when available |
| account_id | string sub account id for event |
| account_type | string live or test account |
| platform_account_id | string or null platform account id for event, when available |
object or object | |
| version | string version of the event payload |
| event_name | string name of the event (payment.succeeded, sub_account.updated, etc.) |
{- "id": "evt_123xyz",
- "account_id": "acc_123xyz",
- "account_type": "test",
- "platform_account_id": "acc_987zyx",
- "idempotency_key": "string",
- "request_id": "req_123",
- "version": "v1",
- "data": {
- "id": "pi_xyz",
- "account_id": "acc_123xyz",
- "amount": 10000,
- "currency": "usd",
- "description": "my order xyz",
- "last_error": null,
- "metadata": { },
- "status": "succeeded",
- "payment_method": {
- "customer_id": null,
- "signature": "123abc",
- "card": {
- "id": "pm_123xyz",
- "name": "Sylvia Fowles",
- "acct_last_four": "4242",
- "brand": "visa",
- "token": "pm_123xyz",
- "month": "5",
- "year": "2042",
- "metadata": { },
- "address_line1_check": "pass",
- "address_postal_code_check": "pass",
- "bin_details": {
- "type": "Debit",
- "card_brand": "Visa",
- "card_class": "Consumer",
- "country": "United States of America",
- "issuer": "WELLS FARGO BANK",
- "funding_source": "Debit"
}
}, - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}
}, - "event_name": "payment_intent.succeeded"
}Received for the following events: payment_method.created, payment_method.updated, payment_method.bin_mapped
| id | string event unique id |
| idempotency_key | string or null idempotency key for request, when available |
| request_id | string or null id for request, when available |
| account_id | string sub account id for event |
| account_type | string live or test account |
| platform_account_id | string or null platform account id for event, when available |
object or object | |
| version | string version of the event payload |
| event_name | string name of the event (payment.succeeded, sub_account.updated, etc.) |
{- "id": "evt_123xyz",
- "account_id": "acc_123xyz",
- "account_type": "test",
- "platform_account_id": "acc_456abc",
- "idempotency_key": "30abie390hjag49h",
- "request_id": "req_100abc",
- "version": "v1",
- "data": {
- "signature": "9fxy123",
- "customer_id": "cust_987zyx",
- "status": "valid",
- "invalid_reason": "nil",
- "card": {
- "id": "pm_123xyz",
- "name": "Sylvia Fowles",
- "acct_last_four": "4242",
- "brand": "visa",
- "token": "pm_123xyz",
- "month": "5",
- "year": "2042",
- "metadata": { },
- "address_line1_check": "pass",
- "address_postal_code_check": "pass"
}
}, - "event_name": "payment_method.created"
}Received for the following events: payment.refunded, payment.refund.updated
| id | string event unique id |
| idempotency_key | string or null idempotency key for request, when available |
| request_id | string or null id for request, when available |
| account_id | string sub account id for event |
| account_type | string live or test account |
| platform_account_id | string or null platform account id for event, when available |
object the attributes for the object | |
| version | string version of the event payload |
| event_name | string name of the event (payment.succeeded, sub_account.updated, etc.) |
{- "id": "evt_123xyz",
- "idempotency_key": "string",
- "request_id": "string",
- "account_id": "acc_123xyz",
- "account_type": "test",
- "platform_account_id": "acc_123xyz",
- "data": {
- "id": "re_xyz",
- "payment_id": "py_xyz",
- "amount": 100,
- "description": "customer canceled their order",
- "reason": "duplicate",
- "status": "succeeded",
- "metadata": { },
- "returned_fees": [
- {
- "id": "rtfee_xyz",
- "payment_fee_id": "pyfee_abc",
- "type": "processing_fee",
- "returned_amount": 175,
- "original_amount": 350,
- "currency": "usd",
- "remaining_amount": 175
}
], - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "version": "v1",
- "event_name": "payment.succeeded"
}Received for the following events: payment.dispute.created, payment.dispute.closed, payment.dispute.forfeited, payment.dispute.submitted
| id | string event unique id |
| idempotency_key | string or null idempotency key for request, when available |
| request_id | string or null id for request, when available |
| account_id | string sub account id for event |
| account_type | string live or test account |
| platform_account_id | string or null platform account id for event, when available |
object the attributes for the object | |
| version | string version of the event payload |
| event_name | string name of the event (payment.succeeded, sub_account.updated, etc.) |
{- "id": "evt_123xyz",
- "idempotency_key": "string",
- "request_id": "string",
- "account_id": "acc_123xyz",
- "account_type": "test",
- "platform_account_id": "acc_123xyz",
- "data": {
- "id": "dp_xyz",
- "payment_id": "py_xyz",
- "account_id": "acc_xyz",
- "amount": 100,
- "currency": "usd",
- "reason": "fraudulent",
- "due_date": "2025-02-23",
- "status": "won",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z",
- "dispute_response": {
- "additional_statement": "string",
- "cancellation_policy_disclosure": "string",
- "cancellation_rebuttal": "string",
- "customer_billing_address": "string",
- "customer_email_address": "string",
- "customer_name": "string",
- "customer_purchase_ip_address": "string",
- "duplicate_charge_explanation": "string",
- "product_description": "string",
- "refund_policy_disclosure": "string",
- "refund_refusal_explanation": "string",
- "service_date": "2024-10-31",
- "shipping_address": "string",
- "shipping_carrier": "string",
- "shipping_date": "2024-10-31",
- "shipping_tracking_number": "string",
- "duplicate_charge_original_payment_id": "string"
}, - "dispute_reversal": {
- "description": "Dispute was reversed",
- "created_at": "2021-01-01T12:00:00Z"
}
}, - "version": "v1",
- "event_name": "payment.succeeded"
}Received for the following events: payment.dispute_evidence.created, payment.dispute_evidence.uploaded
| id | string event unique id |
| idempotency_key | string or null idempotency key for request, when available |
| request_id | string or null id for request, when available |
| account_id | string sub account id for event |
| account_type | string live or test account |
| platform_account_id | string or null platform account id for event, when available |
object the attributes for the object | |
| version | string version of the event payload |
| event_name | string name of the event (payment.succeeded, sub_account.updated, etc.) |
{- "id": "evt_123xyz",
- "idempotency_key": "string",
- "request_id": "string",
- "account_id": "acc_123xyz",
- "account_type": "test",
- "platform_account_id": "acc_123xyz",
- "data": {
- "id": "dpe_xyz",
- "file_name": "receipt.pdf",
- "file_type": "application/pdf",
- "dispute_evidence_type": "receipt",
- "status": "pending",
- "description": "string",
- "presigned_url": "string"
}, - "version": "v1",
- "event_name": "payment.succeeded"
}Received for the following events: payout.created, payout.paid, payout.failed, proceeds.payout.created
| id | string event unique id |
| idempotency_key | string or null idempotency key for request, when available |
| request_id | string or null id for request, when available |
| account_id | string sub account id for event |
| account_type | string live or test account |
| platform_account_id | string or null platform account id for event, when available |
object the attributes for the object | |
| version | string version of the event payload |
| event_name | string name of the event (payment.succeeded, sub_account.updated, etc.) |
{- "id": "evt_123xyz",
- "idempotency_key": "string",
- "request_id": "string",
- "account_id": "acc_123xyz",
- "account_type": "test",
- "platform_account_id": "acc_123xyz",
- "data": {
- "id": "po_xyz",
- "account_id": "449e7a5c-69d3-4b8a-aaaf-5c9b713ebc65",
- "amount": 100000,
- "bank_account": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "full_name": "string",
- "bank_name": "string",
- "account_number_last4": 1111,
- "routing_number": "string",
- "country": "US",
- "currency": "usd",
- "nickname": "string",
- "account_type": "checking"
}, - "currency": "usd",
- "delivery_method": "standard",
- "description": "string",
- "deposits_at": "2021-01-01T12:00:00Z",
- "fees_total": 5000,
- "refunds_count": 5,
- "refunds_total": 10000,
- "payments_count": 50,
- "payments_total": 110000,
- "payout_type": "ach cc",
- "other_total": 100,
- "status": "paid",
- "settlement_priority": "standard",
- "metadata": {
- "customer_payout_id": "cp_12345"
}, - "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "version": "v1",
- "event_name": "payment.succeeded"
}Received for the following events: sub_account.updated. This is published when an account's status changes.
| id | string event unique id |
| idempotency_key | string or null idempotency key for request, when available |
| request_id | string or null id for request, when available |
| account_id | string sub account id for event |
| account_type | string live or test account |
| platform_account_id | string or null platform account id for event, when available |
object the attributes for the object | |
| version | string version of the event payload |
| event_name | string name of the event (payment.succeeded, sub_account.updated, etc.) |
{- "id": "evt_123xyz",
- "idempotency_key": "string",
- "request_id": "string",
- "account_id": "acc_123xyz",
- "account_type": "test",
- "platform_account_id": "acc_123xyz",
- "data": {
- "id": "acc_xyz",
- "name": "The Shire Haberdashery",
- "account_type": "live",
- "status": "enabled",
- "currency": "usd",
- "platform_account_id": "acc_xyz",
- "payout_account_id": "ba_xyz",
- "business_id": "biz_xyz",
- "application_fee_rates": [ ],
- "processing_ready": false,
- "payout_ready": false,
- "related_accounts": {
- "live_account_id": "acc_xyz",
- "test_account_id": "acc_xyz"
}, - "payments_activated_on": "2021-01-15T12:00:00Z",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "version": "v1",
- "event_name": "payment.succeeded"
}Received for the following events: application_fee_rate.created, application_fee_rate.updated
| id | string event unique id |
| idempotency_key | string or null idempotency key for request, when available |
| request_id | string or null id for request, when available |
| account_id | string sub account id for event |
| account_type | string live or test account |
| platform_account_id | string or null platform account id for event, when available |
object the attributes for the object | |
| version | string version of the event payload |
| event_name | string name of the event (payment.succeeded, sub_account.updated, etc.) |
{- "id": "evt_123xyz",
- "idempotency_key": "string",
- "request_id": "string",
- "account_id": "acc_123xyz",
- "account_type": "test",
- "platform_account_id": "acc_123xyz",
- "data": {
- "id": "afr_123xyz",
- "transaction_fee": 50,
- "currency": "usd",
- "basis_point_rate": 250,
- "rate_type": "cc",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z",
- "effective_start": "2021-01-01T12:00:00Z",
- "effective_end": "2021-01-01T12:00:00Z"
}, - "version": "v1",
- "event_name": "payment.succeeded"
}Received for the following events: checkout.created, checkout.completed
| id | string event unique id |
| idempotency_key | string or null idempotency key for request, when available |
| request_id | string or null id for request, when available |
| account_id | string sub account id for event |
| account_type | string live or test account |
| platform_account_id | string or null platform account id for event, when available |
object the attributes for the object | |
| version | string version of the event payload |
| event_name | string name of the event (payment.succeeded, sub_account.updated, etc.) |
{- "id": "evt_123xyz",
- "idempotency_key": "string",
- "request_id": "string",
- "account_id": "acc_123xyz",
- "account_type": "test",
- "platform_account_id": "acc_123xyz",
- "data": {
- "id": "cho_xyz",
- "account_id": "acc_xyz",
- "platform_account_id": "acc_xyz",
- "payment_intent_id": "pi_xyz",
- "payment_amount": 10000,
- "payment_currency": "USD",
- "payment_description": "my order xyz",
- "payment_methods": [
- {
- "id": "pm_123xyz",
- "type": "card",
- "status": "valid",
- "invalid_reason": null,
- "name": "John Doe",
- "brand": "visa",
- "acct_last_four": "4321",
- "month": "12",
- "year": "2031",
- "address_line1_check": "pass",
- "address_postal_code_check": "pass",
- "bin_details": { }
}, - {
- "id": "pm_789abc",
- "type": "bank_account",
- "status": "valid",
- "invalid_reason": null,
- "account_owner_name": "Mary Lane",
- "account_type": "checking",
- "bank_name": "Altra",
- "acct_last_four": "4512"
}
], - "payment_method_group_id": "pmg_xyz",
- "status": "created",
- "mode": "test",
- "successful_payment_id": "py_123xyz",
- "statement_descriptor": "Big Business",
- "metadata": { },
- "application_fees": {
- "card": {
- "amount": 300
}, - "bank_account": {
- "amount": 150
}
}, - "payment_settings": {
- "ach_payments": true,
- "bnpl_payments": false,
- "credit_card_payments": true,
- "insurance_payments": false,
- "bank_account_verification": false
}, - "payment": {
- "description": "my order xyz",
- "metadata": {
- "new": "info"
}, - "expedited": true,
- "fees": [
- {
- "type": "processing_fee",
- "amount": 295
}, - {
- "type": "platform_fee",
- "amount": 150
}
]
}, - "created_at": "2024-01-01T12:00:00Z",
- "updated_at": "2024-01-01T12:00:00Z",
- "completions": [
- {
- "id": "chc_xyz123",
- "payment_mode": "ecom",
- "payment_token": "pm_xyz123",
- "status": "succeeded",
- "payment_status": "succeeded",
- "payment_error_code": "card_declined",
- "payment_error_description": "Your card was declined",
- "payment_response": {
- "id": "py_xyz",
- "type": "payment",
- "data": {
- "id": "py_xyz",
- "account_id": "acc_xyz",
- "amount": 10000,
- "amount_disputed": 0,
- "amount_refunded": 0,
- "amount_refundable": 10000,
- "balance": 99850,
- "fee_amount": 150,
- "financial_transaction_id": "ft_123xyz",
- "captured": true,
- "capture_strategy": "automatic",
- "currency": "usd",
- "description": "my_order_xyz",
- "disputed": false,
- "disputes": [ ],
- "error_code": "credit_card_number_invalid",
- "error_description": "Credit Card Number Invalid (Failed LUHN checksum)",
- "is_test": true,
- "metadata": { },
- "payment_intent_id": "pi_123xyz",
- "checkout_id": "cho_123xyz",
- "payment_method": {
- "card": {
- "id": "pm_123xyz",
- "acct_last_four": 4242,
- "brand": "Visa",
- "digital_wallet": "apple_pay",
- "name": "Amanda Kessel",
- "token": "pm_123xyz",
- "month": "5",
- "year": "2042",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z",
- "address_line1_check": "unchecked",
- "address_postal_code_check": "unchecked"
}, - "customer_id": "cust_xyz",
- "signature": "4guAJNkVA3lRLVlanNVoBK",
- "account_id": "acc_123"
}, - "application_fee": {
- "id": "fee_123xyz",
- "amount": 150,
- "currency": "usd",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "application_fee_rate_id": "afr_123xyz",
- "fees": [
- {
- "id": "pyfee_abc",
- "type": "processing_fee",
- "amount": 350,
- "currency": "usd",
- "remaining_amount": 350
}, - {
- "id": "pyfee_xyz",
- "type": "platform_fee",
- "amount": 500,
- "currency": "usd",
- "remaining_amount": 500
}
], - "refunded": false,
- "status": "pending",
- "payment_mode": "ecom",
- "terminal_id": "trm_123xyz",
- "transaction_hold": {
- "id": "th_123xyz",
- "financial_transaction_id": "ft_123xyz"
}, - "expedited": null,
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}, - "checkout_id": "cho_xyz123",
- "additional_transactions": [ ],
- "payment_id": "py_xyz123",
- "payment_method_id": "pm_xyz123",
- "terminal_id": "trm_xyz123",
- "created_at": "2024-01-01T12:00:00Z",
- "updated_at": "2024-01-01T12:00:00Z"
}
]
}, - "version": "v1",
- "event_name": "payment.succeeded"
}Received for the following events: checkout.completion.succeeded, checkout.completion.failed, and checkout.completion.processing. Note checkout.completion.processing is only sent for terminal payments when a payment amount is sent to a terminal for processing.
| id | string event unique id |
| idempotency_key | string or null idempotency key for request, when available |
| request_id | string or null id for request, when available |
| account_id | string sub account id for event |
| account_type | string live or test account |
| platform_account_id | string or null platform account id for event, when available |
object the attributes for the object | |
| version | string version of the event payload |
| event_name | string name of the event (payment.succeeded, sub_account.updated, etc.) |
{- "id": "evt_123xyz",
- "idempotency_key": "string",
- "request_id": "string",
- "account_id": "acc_123xyz",
- "account_type": "test",
- "platform_account_id": "acc_123xyz",
- "data": {
- "id": "chc_xyz",
- "payment_mode": "ecom",
- "payment_token": "pm_xyz123",
- "status": "succeeded",
- "payment_status": "succeeded",
- "payment_error_code": "card_declined",
- "payment_error_description": "Your card was declined",
- "payment_response": {
- "id": "py_xyz",
- "type": "payment",
- "data": {
- "id": "py_xyz",
- "account_id": "acc_xyz",
- "amount": 10000,
- "amount_disputed": 0,
- "amount_refunded": 0,
- "amount_refundable": 10000,
- "balance": 99850,
- "fee_amount": 150,
- "financial_transaction_id": "ft_123xyz",
- "captured": true,
- "capture_strategy": "automatic",
- "currency": "usd",
- "description": "my_order_xyz",
- "disputed": false,
- "disputes": [ ],
- "error_code": "credit_card_number_invalid",
- "error_description": "Credit Card Number Invalid (Failed LUHN checksum)",
- "is_test": true,
- "metadata": { },
- "payment_intent_id": "pi_123xyz",
- "checkout_id": "cho_123xyz",
- "payment_method": {
- "card": {
- "id": "pm_123xyz",
- "acct_last_four": 4242,
- "brand": "Visa",
- "digital_wallet": "apple_pay",
- "name": "Amanda Kessel",
- "token": "pm_123xyz",
- "month": "5",
- "year": "2042",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z",
- "address_line1_check": "unchecked",
- "address_postal_code_check": "unchecked"
}, - "customer_id": "cust_xyz",
- "signature": "4guAJNkVA3lRLVlanNVoBK",
- "account_id": "acc_123"
}, - "application_fee": {
- "id": "fee_123xyz",
- "amount": 150,
- "currency": "usd",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "application_fee_rate_id": "afr_123xyz",
- "fees": [
- {
- "id": "pyfee_abc",
- "type": "processing_fee",
- "amount": 350,
- "currency": "usd",
- "remaining_amount": 350
}, - {
- "id": "pyfee_xyz",
- "type": "platform_fee",
- "amount": 500,
- "currency": "usd",
- "remaining_amount": 500
}
], - "refunded": false,
- "status": "pending",
- "payment_mode": "ecom",
- "terminal_id": "trm_123xyz",
- "transaction_hold": {
- "id": "th_123xyz",
- "financial_transaction_id": "ft_123xyz"
}, - "expedited": null,
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}, - "checkout_id": "cho_xyz123",
- "additional_transactions": null,
- "checkout": {
- "id": "cho_xyz",
- "account_id": "acc_xyz",
- "platform_account_id": "acc_xyz",
- "payment_intent_id": "pi_xyz",
- "payment_amount": 10000,
- "payment_currency": "USD",
- "payment_description": "my order xyz",
- "payment_methods": [
- {
- "id": "pm_123xyz",
- "type": "card",
- "status": "valid",
- "invalid_reason": null,
- "name": "John Doe",
- "brand": "visa",
- "acct_last_four": "4321",
- "month": "12",
- "year": "2031",
- "address_line1_check": "pass",
- "address_postal_code_check": "pass",
- "bin_details": { }
}, - {
- "id": "pm_789abc",
- "type": "bank_account",
- "status": "valid",
- "invalid_reason": null,
- "account_owner_name": "Mary Lane",
- "account_type": "checking",
- "bank_name": "Altra",
- "acct_last_four": "4512"
}
], - "payment_method_group_id": "pmg_xyz",
- "status": "created",
- "mode": "test",
- "successful_payment_id": "py_123xyz",
- "statement_descriptor": "Big Business",
- "metadata": { },
- "application_fees": {
- "card": {
- "amount": 300
}, - "bank_account": {
- "amount": 150
}
}, - "payment_settings": {
- "ach_payments": true,
- "bnpl_payments": false,
- "credit_card_payments": true,
- "insurance_payments": false,
- "bank_account_verification": false
}, - "payment": {
- "description": "my order xyz",
- "metadata": {
- "new": "info"
}, - "expedited": true,
- "fees": [
- {
- "type": "processing_fee",
- "amount": 295
}, - {
- "type": "platform_fee",
- "amount": 150
}
]
}, - "created_at": "2024-01-01T12:00:00Z",
- "updated_at": "2024-01-01T12:00:00Z",
- "completions": [
- {
- "id": "chc_xyz123",
- "payment_mode": "ecom",
- "payment_token": "pm_xyz123",
- "status": "succeeded",
- "payment_status": "succeeded",
- "payment_error_code": "card_declined",
- "payment_error_description": "Your card was declined",
- "payment_response": {
- "id": "py_xyz",
- "type": "payment",
- "data": {
- "id": "py_xyz",
- "account_id": "acc_xyz",
- "amount": 10000,
- "amount_disputed": 0,
- "amount_refunded": 0,
- "amount_refundable": 10000,
- "balance": 99850,
- "fee_amount": 150,
- "financial_transaction_id": "ft_123xyz",
- "captured": true,
- "capture_strategy": "automatic",
- "currency": "usd",
- "description": "my_order_xyz",
- "disputed": false,
- "disputes": [ ],
- "error_code": "credit_card_number_invalid",
- "error_description": "Credit Card Number Invalid (Failed LUHN checksum)",
- "is_test": true,
- "metadata": { },
- "payment_intent_id": "pi_123xyz",
- "checkout_id": "cho_123xyz",
- "payment_method": {
- "card": {
- "id": "pm_123xyz",
- "acct_last_four": 4242,
- "brand": "Visa",
- "digital_wallet": "apple_pay",
- "name": "Amanda Kessel",
- "token": "pm_123xyz",
- "month": "5",
- "year": "2042",
- "metadata": { },
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z",
- "address_line1_check": "unchecked",
- "address_postal_code_check": "unchecked"
}, - "customer_id": "cust_xyz",
- "signature": "4guAJNkVA3lRLVlanNVoBK",
- "account_id": "acc_123"
}, - "application_fee": {
- "id": "fee_123xyz",
- "amount": 150,
- "currency": "usd",
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "application_fee_rate_id": "afr_123xyz",
- "fees": [
- {
- "id": "pyfee_abc",
- "type": "processing_fee",
- "amount": 350,
- "currency": "usd",
- "remaining_amount": 350
}, - {
- "id": "pyfee_xyz",
- "type": "platform_fee",
- "amount": 500,
- "currency": "usd",
- "remaining_amount": 500
}
], - "refunded": false,
- "status": "pending",
- "payment_mode": "ecom",
- "terminal_id": "trm_123xyz",
- "transaction_hold": {
- "id": "th_123xyz",
- "financial_transaction_id": "ft_123xyz"
}, - "expedited": null,
- "created_at": "2021-01-01T12:00:00Z",
- "updated_at": "2021-01-01T12:00:00Z"
}, - "page_info": null
}, - "checkout_id": "cho_xyz123",
- "additional_transactions": [ ],
- "payment_id": "py_xyz123",
- "payment_method_id": "pm_xyz123",
- "terminal_id": "trm_xyz123",
- "created_at": "2024-01-01T12:00:00Z",
- "updated_at": "2024-01-01T12:00:00Z"
}
]
}, - "payment_id": "py_xyz123",
- "payment_method_id": "pm_xyz123",
- "terminal_id": "trm_xyz123",
- "created_at": "2024-01-01T12:00:00Z",
- "updated_at": "2024-01-01T12:00:00Z"
}, - "version": "v1",
- "event_name": "payment.succeeded"
}Received for the following event: account.payment_setting.updated
| id | string event unique id |
| idempotency_key | string or null idempotency key for request, when available |
| request_id | string or null id for request, when available |
| account_id | string sub account id for event |
| account_type | string live or test account |
| platform_account_id | string or null platform account id for event, when available |
object the attributes for the object | |
| version | string version of the event payload |
| event_name | string name of the event (payment.succeeded, sub_account.updated, etc.) |
{- "id": "evt_123xyz",
- "idempotency_key": "string",
- "request_id": "string",
- "account_id": "acc_123xyz",
- "account_type": "test",
- "platform_account_id": "acc_123xyz",
- "data": {
- "id": "stpy_123abc",
- "account_id": "acc_123abc",
- "mcc_code": "5045",
- "credit_card_payments": true,
- "ach_payments": true,
- "card_present": false,
- "bnpl_payments": false,
- "insurance_payments": false,
- "platform_wallet_account": false
}, - "version": "v1",
- "event_name": "payment.succeeded"
}Received for the following event: account.payout_setting.updated
| id | string event unique id |
| idempotency_key | string or null idempotency key for request, when available |
| request_id | string or null id for request, when available |
| account_id | string sub account id for event |
| account_type | string live or test account |
| platform_account_id | string or null platform account id for event, when available |
object the attributes for the object | |
| version | string version of the event payload |
| event_name | string name of the event (payment.succeeded, sub_account.updated, etc.) |
{- "id": "evt_123xyz",
- "idempotency_key": "string",
- "request_id": "string",
- "account_id": "acc_123xyz",
- "account_type": "test",
- "platform_account_id": "acc_123xyz",
- "data": {
- "public_id": "stpo_213abc",
- "account_id": "acc_123abc",
- "enabled": true,
- "interval": "daily",
- "statement_descriptor": "Name of Account"
}, - "version": "v1",
- "event_name": "payment.succeeded"
}Received for the following events: terminal_order.created, terminal_order.updated
| id | string event unique id |
| idempotency_key | string or null idempotency key for request, when available |
| request_id | string or null id for request, when available |
| account_id | string sub account id for event |
| account_type | string live or test account |
| platform_account_id | string or null platform account id for event, when available |
object the attributes for the object | |
| version | string version of the event payload |
| event_name | string name of the event (payment.succeeded, sub_account.updated, etc.) |
{- "id": "evt_123xyz",
- "idempotency_key": "string",
- "request_id": "string",
- "account_id": "acc_123xyz",
- "account_type": "test",
- "platform_account_id": "acc_123xyz",
- "data": {
- "id": "tord_xyz",
- "business_id": "biz_xyz",
- "account_id": "acc_xyz",
- "order_type": "boarding_only",
- "order_status": "created",
- "company_name": "Business Name",
- "mcc": 7998,
- "receiver_name": "John Doe",
- "contact_first_name": "John",
- "contact_last_name": "Doe",
- "contact_email": "john.doe@example.com",
- "contact_phone_number": 2125554567,
- "line1": "123 Main St",
- "line2": "Apt 4B",
- "city": "Minneapolis",
- "state": "MN",
- "postal_code": 55401,
- "time_zone": "US/Central",
- "country": "USA",
- "shipping_tracking_reference": 12345678,
- "created_at": "2024-01-01T12:00:00Z",
- "updated_at": "2024-01-01T12:00:00Z",
- "terminals": [
- {
- "terminal_id": "tmn_abc",
- "terminal_did": "12345678",
- "model_name": "V400m"
}
]
}, - "version": "v1",
- "event_name": "payment.succeeded"
}Received for the following events: report.scheduled, report.processing, report.completed, report.failed, report.canceled
| id | string event unique id |
| idempotency_key | string or null idempotency key for request, when available |
| request_id | string or null id for request, when available |
| account_id | string sub account id for event |
| account_type | string live or test account |
| platform_account_id | string or null platform account id for event, when available |
object the attributes for the object | |
| version | string version of the event payload |
| event_name | string name of the event (payment.succeeded, sub_account.updated, etc.) |
{- "id": "evt_123xyz",
- "idempotency_key": "string",
- "request_id": "string",
- "account_id": "acc_123xyz",
- "account_type": "test",
- "platform_account_id": "acc_123xyz",
- "data": {
- "id": "rpt_xyz",
- "report_type": "proceeds",
- "nickname": "My Report",
- "status": "scheduled",
- "scheduled_at": "2025-12-25T14:44:45.026Z",
- "run_at": "2025-12-30T14:44:45.026Z",
- "created_at": "2025-12-31T14:44:45.026Z",
- "error_description": "string",
- "account_id": "acc_xyz",
- "presigned_url": "string",
- "platform_account_id": "acc_xyz",
- "parameters": {
- "report_type": "proceeds",
- "start_date": "2025-12-25",
- "end_date": "2025-12-30",
- "nickname": "My Report",
- "account_id": "acc_xyz",
- "platform_account_id": "acc_xyz"
}
}, - "version": "v1",
- "event_name": "payment.succeeded"
}We offer event delivery to your app via webhooks. Webhooks are a reliable method to subscribe to our published events via an API endpoint.
Webhooks are secured by signature verification, which you will need to verify by generating a SHA-256 hex using the following information:
| Parameter | Header | Value |
|---|---|---|
| Timestamp | JUSTIFI-TIMESTAMP | ISO string format |
| Signature | JUSTIFI-SIGNATURE | String |
| Algorithm | ----------------- | SHA-256 |
| Secret Key | ----------------- | Found in your event publisher's page |
| Message | ----------------- | String in the format <timestamp_header>.<received_event_json> |
To verify the signature simply compare the generated SHA-256 hex against it; if it is successful the webhook signature is valid.
Here is a code example for reference:
def webhook_signature_valid?(signature, received_event, timestamp, secret_key)
timestamp_payload = "#{timestamp}.#{received_event.to_json}"
algorithm = OpenSSL::Digest.new("sha256")
hex = OpenSSL::HMAC.hexdigest(algorithm, secret_key, timestamp_payload)
signature == hex
end
If you are using any of our SDKs, we provide a convenient method for validating the signature.
After validating, you must respond with a 200 OK with in 5 seconds. In the event of a non-200 response or a delay of more than 5 seconds, delivery will be
attempted again. For live accounts, webhooks are retried 10 times over 24 hours.
For test accounts, webhooks are retried 3 times over 1 hour.
When you're ready to get started: