{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-Docs/Get-started/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Sandbox testing"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"sandbox-testing","__idx":0},"children":["Sandbox testing"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The sandbox is a separate Talli environment with its own credentials and base URL, both provided by your Talli representative. It runs the same ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/v3/distribution-manager"]}," API as production, with test money. To create, rename, rotate or delete sandbox credentials yourself, call the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/get-started/credentials"},"children":["credentials endpoints"]}," on the sandbox base URL."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The sandbox adds ten endpoints that stand in for the actors your test cannot control: your bank, the bank partner, the beneficiary's bank, PayPal, a merchant charging a prepaid card, the beneficiary's mailbox, the mailbox of a colleague you invite to the console, and time passing. In the routes below, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["…"]}," stands for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/v3/distribution-manager"]},"."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Endpoint"},"children":["Endpoint"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Stands in for"},"children":["Stands in for"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#simulate-an-incoming-ach-deposit"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST …/simulate/bank-accounts/{bankAccountId}/:receive-ach"]}]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Your bank sending an inbound ACH credit to a Talli bank account."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#simulate-the-settlement-of-an-ach-payout"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST …/simulate/payout-instructions/{payoutInstructionId}/:settle-ach"]}]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The bank partner settling an ACH payout."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#simulate-the-end-of-the-ach-return-window"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST …/simulate/payout-instructions/{payoutInstructionId}/:complete-ach"]}]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The ACH return window passing without a return."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#simulate-the-return-of-an-ach-payout"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST …/simulate/payout-instructions/{payoutInstructionId}/:return-ach"]}]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The beneficiary's bank returning a settled ACH payout."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#simulate-the-completion-of-a-paypal-or-venmo-payout"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST …/simulate/payout-instructions/{payoutInstructionId}/:settle-paypal"]}]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["PayPal paying out a PayPal or Venmo payout."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#simulate-a-purchase-authorization-on-a-prepaid-card"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST …/simulate/card-transactions/:authorize"]}]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["A merchant authorizing a purchase on a prepaid card."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#simulate-the-settlement-of-a-prepaid-card-transaction"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST …/simulate/card-transactions/{transactionId}/:clear"]}]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The merchant settling a pending card purchase."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#simulate-the-void-of-a-prepaid-card-transaction"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST …/simulate/card-transactions/{transactionId}/:void"]}]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The merchant cancelling a pending card purchase."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#read-the-emails-the-platform-sent"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET …/simulate/emails"]}]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The beneficiary's mailbox."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#read-the-pending-console-invitations"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET …/simulate/invitations"]}]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The mailbox of a colleague invited to the console."]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In production these routes return ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["404"]},", and the API reference does not list them. The ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#endpoint-reference"},"children":["endpoint reference"]}," below documents them in full."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ten simulate endpoints need the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["simulation:manage"]}," scope. The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":direct-ach"]}," endpoint that this guide mentions needs the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payoutInstructions:directPayout"]}," scope. Both scopes are in the Full access preset. If one of these calls returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["403"]},", call with a Full access credential. A credential's access cannot change, so if your organization has none, a console user can create one, as ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/get-started/credentials#create-a-credential"},"children":["Credentials"]}," describes."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"test-a-payout-end-to-end","__idx":1},"children":["Test a payout end to end"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["These four steps are the same for every payout method. You need a distribution whose bank account is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Active"]}," and which offers at least one payout method. The ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/get-started/quickstart-distributions"},"children":["Distributions quickstart"]}," shows how to find your distributions."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"1-find-the-bank-account-to-fund","__idx":2},"children":["1. Find the bank account to fund"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Every distribution draws its payouts from one bank account. Read it from the distribution:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl --request GET \\\n  --url 'https://api.sandbox.talli.ai/v3/distribution-manager/distributions/YOUR_DISTRIBUTION_ID/account-details' \\\n  --header 'Authorization: Bearer YOUR_ACCESS_TOKEN'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Take ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id"]}," from the response — that is the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["bankAccountId"]}," you fund in step 2. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET …/bank-accounts"]}," lists every account you have. In production you would push a real ACH deposit to the account's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["routingNumber"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["accountNumber"]},", or, when ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["acceptsWires"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["true"]},", send a domestic wire with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["accountHolderName"]}," as the beneficiary and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["bankName"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["bankAddress"]}," as the beneficiary bank; in the sandbox you call ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":receive-ach"]}," instead."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"2-fund-the-bank-account","__idx":3},"children":["2. Fund the bank account"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl --request POST \\\n  --url 'https://api.sandbox.talli.ai/v3/distribution-manager/simulate/bank-accounts/YOUR_BANK_ACCOUNT_ID/:receive-ach' \\\n  --header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \\\n  --header 'Content-Type: application/json' \\\n  --data '{ \"amount\": 25000.00, \"idempotencyKey\": \"funding-1\" }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Send an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["idempotencyKey"]},". A call that fails halfway can then be repeated safely: it resumes the same deposit instead of adding a second one."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The call returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["202"]}," as soon as the bank partner accepts the deposit. Poll ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET …/bank-accounts/{id}"]}," until ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["unallocatedBalance"]}," covers the payouts you plan to send. It rises within seconds."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Fund the account whatever payout method you test. Every payout draws on it."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"3-create-and-initiate-a-payout-instruction","__idx":4},"children":["3. Create and initiate a payout instruction"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST …/payout-instructions"]}," creates it, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST …/payout-instructions/{id}/:initiate"]}," sends the beneficiary a claim email. See the API reference for both request bodies. The payout instruction is now ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Initiated"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"4-claim-the-payout-as-the-beneficiary","__idx":5},"children":["4. Claim the payout as the beneficiary"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl --request GET \\\n  --url 'https://api.sandbox.talli.ai/v3/distribution-manager/simulate/emails?limit=50' \\\n  --header 'Authorization: Bearer YOUR_ACCESS_TOKEN'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Match the rows on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["recipient"]}," to find your beneficiary's mail, and take the newest ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["InitiateEmail"]}," among them. Open the claim link in its ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["htmlBody"]},". Claim the payout as the beneficiary would. If the claim page asks for a one-time code, read it from the same endpoint — it arrives as an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OtpEmail"]},". Select a payout method and complete the claim."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can also get the claim link from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST …/payout-instructions/{id}/:export-claim-link"]},", which sends no email."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST …/payout-instructions/{id}/:send-notification"]}," sends the same ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["InitiateEmail"]}," again, with a new claim link; the earlier links keep working."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The payout instruction moves to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Requested"]},". What happens next depends on the payout method the beneficiary selected:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["ACH"]}," waits for the bank partner to settle it. Finish it with ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#finish-an-ach-payout"},"children":["Finish an ACH payout"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PayPal and Venmo"]}," wait for PayPal. Finish them with ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#finish-a-paypal-or-venmo-payout"},"children":["Finish a PayPal or Venmo payout"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Gift cards"]}," are issued by the gift card provider's test environment. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#test-a-gift-card-payout"},"children":["Test a gift card payout"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Prepaid cards"]}," are issued by the bank partner's test environment. Put purchases on them with ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#test-prepaid-card-transactions"},"children":["Test prepaid card transactions"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Every other payout method"]}," has no simulate call. Poll ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET …/payout-instructions/{id}"]}," and watch the status, or wait for the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/get-started/webhooks"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payoutInstruction.updated"]}]}," event."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"finish-an-ach-payout","__idx":6},"children":["Finish an ACH payout"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["An ACH payout is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Requested"]}," once the platform has originated it at the bank partner. Settle it:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl --request POST \\\n  --url 'https://api.sandbox.talli.ai/v3/distribution-manager/simulate/payout-instructions/YOUR_PAYOUT_INSTRUCTION_ID/:settle-ach' \\\n  --header 'Authorization: Bearer YOUR_ACCESS_TOKEN'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["409"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["The ACH payout has not been originated at the bank partner yet"]}," means the payout has not reached the bank partner. Wait a few seconds and call again."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["As in production, a settled ACH payout then waits two business days in the ACH return window, and the payout instruction stays ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Requested"]},". Within that window you choose how the payout ends."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["The payout succeeds."]}," Close the return window at once instead of waiting two business days:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl --request POST \\\n  --url 'https://api.sandbox.talli.ai/v3/distribution-manager/simulate/payout-instructions/YOUR_PAYOUT_INSTRUCTION_ID/:complete-ach' \\\n  --header 'Authorization: Bearer YOUR_ACCESS_TOKEN'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Poll ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET …/payout-instructions/{id}"]}," until the status is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Fulfilled"]},", or wait for the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/get-started/webhooks"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payoutInstruction.updated"]}]}," event. It follows within seconds. Without this call the payout is fulfilled once the two business days have passed."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["The beneficiary's bank returns the payout."]}," Return it while it is in the return window. The body is optional: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["returnReasonCode"]}," is the ACH return reason the beneficiary's bank reports, one of the codes listed in ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#ach-return-reason-codes"},"children":["ACH return reason codes"]},". Without it the payout is returned with no reason code."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl --request POST \\\n  --url 'https://api.sandbox.talli.ai/v3/distribution-manager/simulate/payout-instructions/YOUR_PAYOUT_INSTRUCTION_ID/:return-ach' \\\n  --header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \\\n  --header 'Content-Type: application/json' \\\n  --data '{ \"returnReasonCode\": \"R03\" }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Within seconds the amount goes back to the bank account. A payout claimed by a beneficiary moves to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Reinitiated"]},", and the beneficiary gets a new claim email (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FailureReinitiateEmail"]}," in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET …/simulate/emails"]},"). A payout created with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":direct-ach"]}," moves to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Cancelled"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If the payout instruction has not changed within a minute, call ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":return-ach"]}," again. The bank partner occasionally accepts a return without applying it, and a repeated call never returns a payout twice."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["409"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["The ACH payout is not settled yet"]}," means ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":settle-ach"]}," has not been called, or its result has not reached the platform yet. A ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["409"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["already fulfilled"]}," means the return window is closed: a fulfilled payout cannot be returned in the sandbox."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Call either ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":complete-ach"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":return-ach"]},", not both. After either call, wait until ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET …/payout-instructions/{id}"]}," shows the new status: the other call made before that can leave a returned payout ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Fulfilled"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To test ACH payouts without the claim journey, use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST …/distributions/{id}/payout-instructions/:direct-ach"]},". It creates the payout instruction from beneficiary and bank details you supply and sends no email, so it replaces steps 3 and 4. Settle, complete or return it the same way."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"finish-a-paypal-or-venmo-payout","__idx":7},"children":["Finish a PayPal or Venmo payout"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A PayPal or Venmo payout in the sandbox never reaches PayPal, so it completes only through this call:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl --request POST \\\n  --url 'https://api.sandbox.talli.ai/v3/distribution-manager/simulate/payout-instructions/YOUR_PAYOUT_INSTRUCTION_ID/:settle-paypal' \\\n  --header 'Authorization: Bearer YOUR_ACCESS_TOKEN'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Poll ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET …/payout-instructions/{id}"]}," until the status is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Fulfilled"]},", or wait for the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/get-started/webhooks"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payoutInstruction.updated"]}]}," event. It follows within seconds."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["409"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["The PayPal transfer is Initiated and has not been queued yet"]}," means the platform is still preparing the payout, which takes a few seconds after the claim. Wait a few seconds and call again."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"test-prepaid-card-transactions","__idx":8},"children":["Test prepaid card transactions"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Once the beneficiary has claimed the payout with a prepaid card and the card screen of the claim journey shows the card, you can put purchases on it. Copy the card number from the card screen."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["A purchase within the balance."]}," Authorize it with the card number as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pan"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl --request POST \\\n  --url 'https://api.sandbox.talli.ai/v3/distribution-manager/simulate/card-transactions/:authorize' \\\n  --header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \\\n  --header 'Content-Type: application/json' \\\n  --data '{ \"pan\": \"YOUR_CARD_NUMBER\", \"amount\": 25.00 }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The call answers ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["202"]}," with the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["transactionId"]}," of the purchase. The card screen shows a pending purchase and an available balance lower by the amount within seconds. Then settle it with that ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["transactionId"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl --request POST \\\n  --url 'https://api.sandbox.talli.ai/v3/distribution-manager/simulate/card-transactions/YOUR_TRANSACTION_ID/:clear' \\\n  --header 'Authorization: Bearer YOUR_ACCESS_TOKEN'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The card screen shows the purchase as settled within seconds."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["A declined purchase."]}," Authorize more than the available balance. The call still answers ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["202"]}," with a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["transactionId"]},": the card declines the purchase, the card screen shows it as declined, and the balance does not change."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["A cancelled purchase."]}," Authorize a purchase, then void it with its ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["transactionId"]}," while it is pending:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl --request POST \\\n  --url 'https://api.sandbox.talli.ai/v3/distribution-manager/simulate/card-transactions/YOUR_TRANSACTION_ID/:void' \\\n  --header 'Authorization: Bearer YOUR_ACCESS_TOKEN'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The pending amount returns to the available balance. This can take up to a minute, so check the card screen again."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The card number is sent only to the bank partner and is never returned in a response. The sandbox does not check that the card belongs to your organization, so use the cards of your own payouts."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"test-a-gift-card-payout","__idx":9},"children":["Test a gift card payout"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A gift card payout needs no simulate call: the sandbox orders the card from the gift card provider's test environment, as production orders it from the live one."]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Add a gift card payout method to your distribution. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET …/payout-methods"]}," lists the methods the sandbox offers; the gift card methods carry the brand name."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fund the bank account, create and initiate a payout instruction, and claim it as the beneficiary with the gift card method, as in ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#test-a-payout-end-to-end"},"children":["Test a payout end to end"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Poll ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET …/payout-instructions/{id}"]}," until the status is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Fulfilled"]},", or wait for the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/get-started/webhooks"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payoutInstruction.updated"]}]}," event. It usually takes seconds, at most about two minutes."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Open the card as the beneficiary: the claim page shows it, and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /beneficiary/gift-card"]}," returns its card number and PIN."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If the payout instruction is still ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Requested"]}," after a few minutes, the provider's test environment did not issue the card. Create a new payout instruction and claim it again."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"invite-a-colleague-to-the-sandbox-console","__idx":10},"children":["Invite a colleague to the sandbox console"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The sandbox console is at ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://console.sandbox.talli.ai"]},". Invite a colleague with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST …/invitations/bulk"]},", as in production. The sandbox delivers no invitation email, so read the invitation link instead:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl --request GET \\\n  --url 'https://api.sandbox.talli.ai/v3/distribution-manager/simulate/invitations?limit=10' \\\n  --header 'Authorization: Bearer YOUR_ACCESS_TOKEN'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Match the rows on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["invitee"]}," and open the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["invitationUrl"]},". The invitee sets a password, enrols an authenticator app, and lands on the console as a member of your organization."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"how-the-sandbox-differs-from-production","__idx":11},"children":["How the sandbox differs from production"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["A simulate call returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["202"]}," when the bank partner or the platform accepts it, not when Talli has applied the result. The result follows seconds later, so poll the resource you expect to change, or receive it as a ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/get-started/webhooks"},"children":["webhook"]}," where an event exists."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Simulated settlement is instant. A real ACH deposit or payout takes a few business days."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The ACH return window lasts two business days after settlement, as in production. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":complete-ach"]}," closes it at once."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["In production, a return that arrives within two business days after the payout settles is handled automatically: the amount goes back to the bank account, a beneficiary payout is reinitiated with a new claim email, and a direct payout is cancelled. A return after that reaches a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Fulfilled"]}," payout; contact Talli support. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":return-ach"]}," simulates the first case only."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["No PayPal or Venmo payout leaves the sandbox. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":settle-paypal"]}," is the only way one completes."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Prepaid card purchases come only from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":authorize"]},", from a US merchant named ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Sandbox merchant"]},". A declined or a voided purchase shows on the card screen as in production."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Gift cards come from the gift card provider's test environment: test brands only, and about one order in seventeen is never issued."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The sandbox delivers no email. Claim links and one-time codes come from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET …/simulate/emails"]},", console invitation links from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET …/simulate/invitations"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["With a brand slug, claim links open at ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://<slug>.redeem.sandbox.talli.ai"]}," and the console at ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://<slug>.console.sandbox.talli.ai"]},". Custom domains for the claim page and the console are not available on the sandbox."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"endpoint-reference","__idx":12},"children":["Endpoint reference"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"simulate-an-incoming-ach-deposit","__idx":13},"children":["Simulate an incoming ACH deposit"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST /v3/distribution-manager/simulate/bank-accounts/{bankAccountId}/:receive-ach\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Funds the bank account as an inbound ACH credit from your bank would: the bank partner receives, settles and releases the credit into the account."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Type"},"children":["Type"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["amount"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["decimal"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Required. The amount to deposit, in dollars. Positive, at most 2 decimal places."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["idempotencyKey"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Optional, at most 100 characters. Repeating a call with the same key, bank account and amount resumes an interrupted deposit instead of creating a second one. Without a key, every call creates a new deposit."]}]}]}]}]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Code"},"children":["Code"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Meaning"},"children":["Meaning"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["202"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The bank partner accepted the deposit. Empty body."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The amount is not positive, or has more than 2 decimal places."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["404"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["No bank account with this id in your organization."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["409"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The bank account is not provisioned yet, or the idempotency key was already used for a different deposit."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["500"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The bank partner rejected a step of the simulation. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["detail"]}," names the step. Repeat the call with the same ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["idempotencyKey"]}," to resume the deposit. A call sent without a key cannot be resumed, and repeating it deposits the amount a second time."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"simulate-the-settlement-of-an-ach-payout","__idx":14},"children":["Simulate the settlement of an ACH payout"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST /v3/distribution-manager/simulate/payout-instructions/{payoutInstructionId}/:settle-ach\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Settles the payout instruction's ACH transfer as the bank partner would. The payout then waits in the ACH return window and the payout instruction stays ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Requested"]},". The request has no body."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Code"},"children":["Code"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Meaning"},"children":["Meaning"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["202"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The bank partner accepted the settlement. Empty body."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["404"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["No payout instruction with this id in your organization."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["409"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The payout has no ACH transfer that can be settled. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["detail"]}," names the current state. A payout claimed with another payout method always answers ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["409"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["500"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The bank partner rejected a step of the simulation. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["detail"]}," names the step. The call is safe to repeat."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"simulate-the-end-of-the-ach-return-window","__idx":15},"children":["Simulate the end of the ACH return window"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST /v3/distribution-manager/simulate/payout-instructions/{payoutInstructionId}/:complete-ach\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Closes the return window of a settled ACH payout as if two business days had passed without a return. The payout instruction then completes through the normal pipeline. The request has no body."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Code"},"children":["Code"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Meaning"},"children":["Meaning"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["202"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The platform accepted the completion. Empty body."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["404"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["No payout instruction with this id in your organization."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["409"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The payout is not in the return window. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["detail"]}," names the current state: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["not settled yet"]}," means call ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":settle-ach"]}," first or wait a few seconds after it, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["already fulfilled"]}," means the payout is complete, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FailedPermanently"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["already returned"]}," means the payout was returned."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"simulate-the-return-of-an-ach-payout","__idx":16},"children":["Simulate the return of an ACH payout"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST /v3/distribution-manager/simulate/payout-instructions/{payoutInstructionId}/:return-ach\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Returns a settled ACH payout inside its return window as the beneficiary's bank would. The amount goes back to the bank account through the normal pipeline. The request body is optional."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Type"},"children":["Type"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["returnReasonCode"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Optional. An ACH return reason code, in capitals, for example ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["R03"]},". See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#ach-return-reason-codes"},"children":["ACH return reason codes"]},". Without it the payout is returned with no reason code."]}]}]}]}]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Code"},"children":["Code"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Meaning"},"children":["Meaning"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["202"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The bank partner accepted the return. Empty body. The bank partner applies it a few seconds later. If the payout instruction has not changed within a minute, call again: a repeated call never returns a payout twice."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["returnReasonCode"]}," is not one of the accepted codes."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["404"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["No payout instruction with this id in your organization."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["409"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The payout is not in the return window. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["detail"]}," names the current state: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["not settled yet"]}," means call ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":settle-ach"]}," first or wait a few seconds after it, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["already fulfilled"]}," means the window is closed and the payout cannot be returned in the sandbox, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FailedPermanently"]}," means the return is complete, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["already returned"]}," means it is being applied."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["500"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The bank partner rejected the return. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["detail"]}," names the step."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"ach-return-reason-codes","__idx":17},"children":["ACH return reason codes"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The beneficiary's bank reports why it returned a payout with a code defined by the Nacha Operating Rules. These are the codes a bank typically sends back for a payout to a beneficiary's account:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Code"},"children":["Code"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Meaning"},"children":["Meaning"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["R02"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Account closed."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["R03"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["No account, or the account cannot be located."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["R04"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Invalid account number structure."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["R06"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Returned at the request of the originating bank."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["R14"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Representative payee deceased or unable to continue in that capacity."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["R15"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Beneficiary or account holder deceased."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["R16"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Account frozen, or entry returned per OFAC instruction."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["R17"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["File record edit reject."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["R20"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Non-transaction account."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["R23"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Credit entry refused by the receiver."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["R24"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Duplicate entry."]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":return-ach"]}," also accepts every other Nacha code from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["R01"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["R47"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["R50"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["R53"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["R61"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["R77"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["R80"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["R85"]},". The code does not change how the payout ends: the amount goes back to the bank account, and the payout instruction moves to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Reinitiated"]},", or to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Cancelled"]}," for a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":direct-ach"]}," payout."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"simulate-a-purchase-authorization-on-a-prepaid-card","__idx":18},"children":["Simulate a purchase authorization on a prepaid card"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST /v3/distribution-manager/simulate/card-transactions/:authorize\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Authorizes a purchase on the prepaid card with this card number as a merchant would. Within the available balance the purchase is pending and the balance drops; above it the card declines the purchase and the balance does not change."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Type"},"children":["Type"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pan"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Required. The card number from the beneficiary's card screen, 13 to 19 digits, no spaces."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["amount"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["decimal"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Required. The purchase amount, in dollars. Positive, at most 2 decimal places."]}]}]}]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl --request POST \\\n  --url 'https://api.sandbox.talli.ai/v3/distribution-manager/simulate/card-transactions/:authorize' \\\n  --header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \\\n  --header 'Content-Type: application/json' \\\n  --data '{ \"pan\": \"YOUR_CARD_NUMBER\", \"amount\": 25.00 }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Successful response example:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"transactionId\": \"3f6c2a1e-8b4d-4c7a-9e21-5d0b7f3a9c64\"\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Code"},"children":["Code"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Meaning"},"children":["Meaning"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["202"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The bank partner accepted the authorization, approved or declined. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["transactionId"]}," identifies the purchase for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":clear"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":void"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pan"]}," is not 13 to 19 digits, or the amount is not positive or has more than 2 decimal places."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["404"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["No card has this card number at the bank partner. Check the number on the card screen. Nothing was authorized."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["500"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The bank partner rejected the call. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["detail"]}," names the step. Check the card screen before you repeat it: the purchase may have been authorized, and a repeated call adds a second one."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"simulate-the-settlement-of-a-prepaid-card-transaction","__idx":19},"children":["Simulate the settlement of a prepaid card transaction"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST /v3/distribution-manager/simulate/card-transactions/{transactionId}/:clear\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Settles a pending card transaction as the merchant would. Take ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["transactionId"]}," from the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":authorize"]}," response. The request has no body."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl --request POST \\\n  --url 'https://api.sandbox.talli.ai/v3/distribution-manager/simulate/card-transactions/YOUR_TRANSACTION_ID/:clear' \\\n  --header 'Authorization: Bearer YOUR_ACCESS_TOKEN'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Code"},"children":["Code"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Meaning"},"children":["Meaning"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["202"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The bank partner accepted the settlement. Empty body. The card screen shows the purchase as settled within seconds."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["404"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The bank partner has no card transaction with this id."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["409"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The transaction is not pending. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["detail"]}," names its status."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["500"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The bank partner rejected the call. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["detail"]}," names the step."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"simulate-the-void-of-a-prepaid-card-transaction","__idx":20},"children":["Simulate the void of a prepaid card transaction"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST /v3/distribution-manager/simulate/card-transactions/{transactionId}/:void\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Cancels a pending card transaction as the merchant would: the pending amount returns to the available balance. Take ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["transactionId"]}," from the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":authorize"]}," response. The request has no body."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl --request POST \\\n  --url 'https://api.sandbox.talli.ai/v3/distribution-manager/simulate/card-transactions/YOUR_TRANSACTION_ID/:void' \\\n  --header 'Authorization: Bearer YOUR_ACCESS_TOKEN'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Code"},"children":["Code"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Meaning"},"children":["Meaning"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["202"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The bank partner accepted the void. Empty body. The result can take up to a minute; check the card screen."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["404"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The bank partner has no card transaction with this id."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["409"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The transaction is not pending. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["detail"]}," names its status."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["500"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The bank partner rejected the call. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["detail"]}," names the step."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"simulate-the-completion-of-a-paypal-or-venmo-payout","__idx":21},"children":["Simulate the completion of a PayPal or Venmo payout"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST /v3/distribution-manager/simulate/payout-instructions/{payoutInstructionId}/:settle-paypal\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Completes the payout instruction's PayPal or Venmo transfer as PayPal would when the payout succeeds. The payout instruction then completes through the normal pipeline. No money is sent to PayPal. The request has no body."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Code"},"children":["Code"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Meaning"},"children":["Meaning"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["202"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The platform accepted the completion. Empty body."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["404"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["No payout instruction with this id in your organization."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["409"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The payout has no PayPal or Venmo transfer that can be completed. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["detail"]}," names the current state: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Initiated"]}," means wait a few seconds and call again, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["already Processed"]}," means the payout is complete. A payout claimed with another payout method always answers ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["409"]},"."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"read-the-emails-the-platform-sent","__idx":22},"children":["Read the emails the platform sent"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"GET /v3/distribution-manager/simulate/emails?limit=10\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Returns your organization's most recent emails, newest first, with claim links and one-time codes, so you can test the beneficiary journey without a real mailbox. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["limit"]}," is between 1 and 50 and defaults to 10; a value outside that range is rejected with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]},". There is no paging."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Successful response example:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"[\n  {\n    \"id\": \"7c1d2e3f-4a5b-6c7d-8e9f-0a1b2c3d4e5f\",\n    \"recipient\": \"beneficiary@example.com\",\n    \"templateType\": \"InitiateEmail\",\n    \"deliveryStatus\": \"Delivered\",\n    \"createdOn\": \"2026-09-09T10:15:03.412Z\",\n    \"sentOn\": \"2026-09-09T10:15:04.128Z\",\n    \"payoutInstructionId\": \"1a2b3c4d-e5f6-7890-1234-567890abcdef\",\n    \"subject\": \"Your payment is ready\",\n    \"htmlBody\": \"<html>…<a href=\\\"https://claim.example.talli.ai/…\\\">Claim your payment</a>…</html>\"\n  }\n]\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Identifier of the email record."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["recipient"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The address the email was sent to."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["templateType"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["InitiateEmail"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ReminderEmail"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FailureReinitiateEmail"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OtpEmail"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PushEmail"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["InternalRequest"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PayoutAvailableEmail"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["deliveryStatus"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Queued"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Sending"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Sent"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Delivered"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Opened"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Bounced"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SpamComplaint"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SendingFailed"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Cancelled"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["createdOn"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["When the platform created the email. The sort field."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sentOn"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["When the email was handed to the provider. For a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Queued"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Sending"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Cancelled"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SendingFailed"]}," email this is the planned send time instead."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payoutInstructionId"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The payout instruction the email belongs to, where there is one."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["subject"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Subject line."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["htmlBody"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["HTML body, including the claim link or the one-time code."]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["subject"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["htmlBody"]}," are ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}," while the email content is not available. For an email sent seconds ago, call again."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"read-the-pending-console-invitations","__idx":23},"children":["Read the pending console invitations"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"GET /v3/distribution-manager/simulate/invitations?limit=10\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Returns your organization's pending console invitations, newest first, each with the link the invitee opens to accept it. Expired invitations are omitted. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["limit"]}," is between 1 and 50 and defaults to 10; a value outside that range is rejected with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]},". There is no paging."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Successful response example:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"[\n  {\n    \"id\": \"uinv_OzHeJnMgHRDFMzqw\",\n    \"invitee\": \"colleague@example.com\",\n    \"inviter\": \"Talli Platform\",\n    \"createdAt\": \"2026-09-16T12:19:11.886Z\",\n    \"expiresAt\": \"2026-09-23T12:19:11.886Z\",\n    \"invitationUrl\": \"https://console.sandbox.talli.ai/?invitation=…&organization=…&organization_name=…\"\n  }\n]\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Identifier of the invitation, the same as in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET …/invitations"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["invitee"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The address the invitation was sent to."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["inviter"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The name shown to the invitee as the sender."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["createdAt"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["When the invitation was created. The sort field."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["expiresAt"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["When the invitation stops working."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["invitationUrl"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The link that accepts the invitation. Anyone who opens it can join your sandbox organization as the invitee, so treat the response as you would a mailbox."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"rate-limits","__idx":24},"children":["Rate limits"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Nine simulate endpoints carry their own limits, per organization; a call to one of them spends the limit below instead of the general 60 / minute default described in ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/get-started/api-basics"},"children":["API Basics"]},". The eight ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST"]}," endpoints share one allowance. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET …/simulate/invitations"]}," has no limit of its own and spends the general default."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Endpoint(s)"},"children":["Endpoint(s)"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Limit"},"children":["Limit"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST …/simulate/bank-accounts/{id}/:receive-ach"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":settle-ach"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":complete-ach"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":return-ach"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":settle-paypal"]}," under ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST …/simulate/payout-instructions/{id}/"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":authorize"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":clear"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":void"]}," under ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST …/simulate/card-transactions/"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["10 / minute"]},", shared"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET …/simulate/emails"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["120 / minute"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET …/simulate/invitations"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["general default, ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["60 / minute"]}]}]}]}]}]}]},"headings":[{"value":"Sandbox testing","id":"sandbox-testing","depth":2},{"value":"Test a payout end to end","id":"test-a-payout-end-to-end","depth":2},{"value":"1. Find the bank account to fund","id":"1-find-the-bank-account-to-fund","depth":3},{"value":"2. Fund the bank account","id":"2-fund-the-bank-account","depth":3},{"value":"3. Create and initiate a payout instruction","id":"3-create-and-initiate-a-payout-instruction","depth":3},{"value":"4. Claim the payout as the beneficiary","id":"4-claim-the-payout-as-the-beneficiary","depth":3},{"value":"Finish an ACH payout","id":"finish-an-ach-payout","depth":2},{"value":"Finish a PayPal or Venmo payout","id":"finish-a-paypal-or-venmo-payout","depth":2},{"value":"Test prepaid card transactions","id":"test-prepaid-card-transactions","depth":2},{"value":"Test a gift card payout","id":"test-a-gift-card-payout","depth":2},{"value":"Invite a colleague to the sandbox console","id":"invite-a-colleague-to-the-sandbox-console","depth":2},{"value":"How the sandbox differs from production","id":"how-the-sandbox-differs-from-production","depth":2},{"value":"Endpoint reference","id":"endpoint-reference","depth":2},{"value":"Simulate an incoming ACH deposit","id":"simulate-an-incoming-ach-deposit","depth":3},{"value":"Simulate the settlement of an ACH payout","id":"simulate-the-settlement-of-an-ach-payout","depth":3},{"value":"Simulate the end of the ACH return window","id":"simulate-the-end-of-the-ach-return-window","depth":3},{"value":"Simulate the return of an ACH payout","id":"simulate-the-return-of-an-ach-payout","depth":3},{"value":"ACH return reason codes","id":"ach-return-reason-codes","depth":4},{"value":"Simulate a purchase authorization on a prepaid card","id":"simulate-a-purchase-authorization-on-a-prepaid-card","depth":3},{"value":"Simulate the settlement of a prepaid card transaction","id":"simulate-the-settlement-of-a-prepaid-card-transaction","depth":3},{"value":"Simulate the void of a prepaid card transaction","id":"simulate-the-void-of-a-prepaid-card-transaction","depth":3},{"value":"Simulate the completion of a PayPal or Venmo payout","id":"simulate-the-completion-of-a-paypal-or-venmo-payout","depth":3},{"value":"Read the emails the platform sent","id":"read-the-emails-the-platform-sent","depth":3},{"value":"Read the pending console invitations","id":"read-the-pending-console-invitations","depth":3},{"value":"Rate limits","id":"rate-limits","depth":2}],"frontmatter":{"seo":{"title":"Sandbox testing"}},"lastModified":"2026-10-28T14:53:31.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/docs/get-started/sandbox-testing","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}