> This page is for Taurus PROTECT, version v3.38.
> For other versions, use one of these documentation indexes:
> - v3.58 (default): https://taurushq.ferndocs.com/protect-capital/v3.58/llms.txt
> - v3.56: https://taurushq.ferndocs.com/protect-capital/v3.56/llms.txt
> - v3.54: https://taurushq.ferndocs.com/protect-capital/v3.54/llms.txt
> - v3.52: https://taurushq.ferndocs.com/protect-capital/v3.52/llms.txt
> - v3.50: https://taurushq.ferndocs.com/protect-capital/v3.50/llms.txt
> - v3.48: https://taurushq.ferndocs.com/protect-capital/v3.48/llms.txt
> - v3.46: https://taurushq.ferndocs.com/protect-capital/v3.46/llms.txt
> - v3.44: https://taurushq.ferndocs.com/protect-capital/v3.44/llms.txt
> - v3.42: https://taurushq.ferndocs.com/protect-capital/v3.42/llms.txt
> - v3.40: https://taurushq.ferndocs.com/protect-capital/v3.40/llms.txt
> - v3.38: https://taurushq.ferndocs.com/protect-capital/v3.38/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://taurushq.ferndocs.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://taurushq.ferndocs.com/_mcp/server.

# Creating A Multi Destination Bundle Transaction Request

## Basic Description

This endpoint is used to create a Bundle of  \_Transaction Requests \_  in Taurus-PROTECT.\
To understand what is a  *Transaction*, what is a  \_ Request \_ and the differences between these two concepts, please refer to the following [page](/protect-capital/v3.38/reference/entities#transaction) in the Taurus User Guides.

This endpoint would accept a POST Request with a JSON payload containing the multiple Transaction Requests details.\
Within the JSON payload for each one of the requests in the bundle, you must include the `amount`, `fromAddressId `or `fromWalletId`, and `toAddressId `or `toWhitelistedAddressId `as required parameters. In other words, the `amount`, `fromAddressId` or `fromWalletId`, and `toAddressId` or `toWhitelistedAddressId`are the only required parameters that must be included within the JSON payload for each one of the Requests within the bundle.\
The bundle is considered an atomic operation within Taurus-PROTECT. That means that if one one of the transactions within the bundle gets rejected, then all of the bundle will fail automatically.

## Prerequisites

### Required Roles

Certain API endpoints require that the user has a specific role in order to access them. Roles are used to restrict access to certain functionality within the system and ensure that only authorized users are able to perform specific actions.

Here is the list of required Roles for this particular endpoint:

* RequestCreator
* TPUser

To find out more about roles, please refer to the following [page](/user-guides/docs/users-1#creating-a-new-user) in the Taurus User Guides.

### Required Input Parameters

Certain API endpoints require specific input parameters. Here is the list of Required Input Parameters for this particular endpoint:

* **amount**: the amount of the selected currency
* **fromAddressId** or **fromWalletId**: the originating Address or Wallet
* **toAddressId** or **toWhitelistedAddressId**: the destination internal or whitelisted external Address

> **Warning**
>
> **Differences between `fromWalletId `and  `fromAddressId`**
>
> For this particular endpoint, if you select to use `fromAddressId`, all the funds will be deducted from one single Address in Taurus-PROTECT.
> However, if you select `fromWalletId`, Taurus-PROTECT will start from the address with the highest amounts of funds within the Wallet and continue to the next address until the required amount of funds is reached.

> **Note**
>
> **Preconditions**
>
> It is important to note that the selected Wallets and Addresses needs to pre-exist and be active in the system. In addition, the total amount within the Bundle of Transaction Request needs to be smaller than the total amount of funds that is held on each one of the originating Address or Wallet.

## Call Example

You can find a basic example in cURL below.\
Please note that you will need to update the `BASEURL` and the `APITOKEN` for the command to function.\
In this example, Taurus-PROTECT has created a new *Transaction Request* with 0.001 BTC as the specified amount to be transferred from Address 100934 to Address 487221 and has assigned it and 0.001 BTC as the specified amount to be transferred from Address 100934 to Address 487225.

**`cURL`**

```curl cURL
export BASEURL=https://taurus-protect-instance.com
export APIToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiZXh0ZXJuYWxVc2VySUQiOiJ0ZWFtMUV4dGVybmFsVXNlcklEIiwidGVuYW50SUQiOjEsImNhcGl0YWxUZW5hbnRJRCI6MSwiZmlyc3RuYW1lIjoiSm9obiIsImxhc3RuYW1lIjoiRG9lIiwicm9sZXMiOlsidHB1c2VyIl0sImVtYWlsIjoidGVhbTFAYmFuay5jb20iLCJ1c2VybmFtZSI6InRlYW0xIiwiand0X3JlbmV3YWJsZV9hbW91bnQiOjAsImlzX3RvdHBfZW5hYmxlZCI6ZmFsc2UsImF1dGhfc3RhdHVzIjoiU1VDQ0VTUyIsImxhc3RfbG9naW4iOiIyMDIzLTAxLTAxVDAwOjAwOjAwLjE0OTc0NDIzMloiLCJsb2dnZWRfaW5fd2l0aF9zc28iOmZhbHNlLCJrZXkiOiIiLCJleHAiOjE2ODEyMTkyNzYsImlhdCI6MTY4MTIxNzQ3Nn0.K_85arIrigpkN1yHttCydpeT6oVg2c6PyQnuji907Og
curl --location "$BASEURLapi/rest/v1/requests/bundle/outgoing" \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header "Authorization: Bearer $APIToken" \
--data '{
          "requests": [
            {
              "amount": "100000",
              "fromAddressId": "100934",
              "toAddressId": "487221"
            }
            ,
            {
              "amount": "100000",
              "fromAddressId": "100934",
              "toAddressId": "487225"      
            }
          ]
				}'
```

This piece of code sends a POST request to  [https://your-protect-instance.example.com/api/rest/v1/requests/bundle/outgoing](https://your-protect-instance.example.com/api/rest/v1/requests/bundle/outgoing) with the JSON string in the request body.

> **Tip**
>
> **Call Result**
>
> A successful response for the POST call to create a bundle transaction might look like this:

```json
{
    "result": {
        "id": "92",
        "tenantId": "1",
        "blockchain": "BTC",
        "details": {
            "amount": "200000",
            "source": {
                "totalSources": "1",
                "fromAddressId": "100934"
            },
            "destination": {
                "totalDestinations": "2"
            }
        },
        "status": "CREATING",
        "creationDate": "2023-06-06T15:53:58.745566Z",
        "updateDate": "2023-06-06T15:53:58.745566Z",
        "requests": [
            {
                "id": "4351008",
                "tenantId": "1",
                "currency": "BTC",
                "envelope": "Cgc0MzUxMDA4EIHJ07K1m4ezFxgBKvkGEs0BCkcKFG0vNDQnLzAnLzc1Jy8wJy8zMTMnEAEaIEQy2NFy6aCMadka4jZhPKZqMqMh6yNU3/MowA2YSLFaIAIotcDYATDv/bb1DRIoCiIzQmVNeTlLTWtUZnpqellFV3RnbkYzQlVZcFl6ZXVZaUtLEKCNBhodChRtLzQ0Jy8wJy83NScvMCcvMzEzJxABGO3qzwEyNmJ1bmRsZTo5Mjo0MzUxMDA4OjgzZjY4NWRjLTE5MDMtNDE5My05OTE5LTYwODBjY2FjMWUyODjMASIXCgpyZXF1ZXN0X2lkEAEaBzQzNTEwMDgiEgoJcnVsZXNfa2V5EAEaA0JUQyIRCghjdXJyZW5jeRABGgNCVEMiIAoNY3VycmVuY3lfbmFtZRABGg1CaXRjb2luIC0gQlRDIlEKC2N1cnJlbmN5X2lkEAEaQDU4NDczN2UzYzRmZDI2ZmFlMzAwNzBkNzczNDRhOGFlOTJiYjg5ZmVlOTk4NzU3ZjZiMGVlOWQ3MWVkMDc0YTEiaQoGc291cmNlEAQaVQgBElEIxpQGEiIzTDNweG9Ddm1GS2FLS2tqenFaZ0V6TTJEOEQ0Q1Q2UFUyGhF0Zy10cmFkZWQgYWRkcmVzcyIUbS80NCcvMCcvNzUnLzAnLzMxMyciBnNvdXJjZSJyCgtkZXN0aW5hdGlvbhAFGlQSUgi13h0SIjNCZU15OUtNa1Rmemp6WUVXdGduRjNCVVlwWXpldVlpS0saEXRnLXRyYWRlZCBhZGRyZXNzIhVtLzQ0Jy8wJy83NScvMCcvMTc5OSciC2Rlc3RpbmF0aW9uIpwBCgZhbW91bnQQChqHAQoDAYagEgcyMy42MzUwGggyMzYzNS4wMyAIKgNCVEMyA0NIRjphCh12YWxpZGF0b3ItY29yZUB0YXVydXNncm91cC5jaBJAOYxHpqc1Sa3AjdLcFdZ4eoRz6d/+2TY7GWQeqP0CCe5teTN/DoA+VBP61Ece4Gx0B04KEb20E93N/1VpGxNHzyIGYW1vdW50Ih4KEXRvdGFsX2ZpYXRfYW1vdW50EAEaBzIzLjYzNTAiEQoJZmVlX2xpbWl0EAIaAqQoIh8KFGZlZV9wYWlkX2J5X3JlY2VpdmVyEAEaBWZhbHNlIiAKFXVzZV91bmNvbmZpcm1lZF9mdW5kcxABGgVmYWxzZToHbWFpbm5ldA==",
                "status": "CREATED",
                "trails": [
                    {
                        "userId": "11",
                        "externalUserId": "team1@bank.com",
                        "action": "created",
                        "requestStatus": "CREATED"
                    },
                    {
                        "userId": "1",
                        "externalUserId": "validator-core@taurusgroup.ch",
                        "action": "approvers_assigned",
                        "comment": "rule = [source: any, destination: any, amount: 1.0000], approvals = ['team1': 1 sig]",
                        "requestStatus": "CREATED"
                    }
                ],
                "rule": "rule = [source: any, destination: any, amount: 1.0000], approvals = ['team1': 1 sig]",
                "approvers": {
                    "parallel": [
                        {
                            "sequential": [
                                {
                                    "externalGroupID": "team1",
                                    "minimumSignatures": 1
                                }
                            ]
                        }
                    ]
                },
                "type": "payment",
                "currencyInfo": {
                    "name": "Bitcoin",
                    "symbol": "BTC",
                    "blockchain": "BTC",
                    "decimals": "8",
                    "isUTXOBased": true,
                    "enabled": true,
                    "id": "584737e3c4fd26fae30070d77344a8ae92bb89fee998757f6b0ee9d71ed074a1",
                    "displayName": "Bitcoin - BTC",
                    "type": "native",
                    "network": "mainnet"
                },
                "requestBundleId": "92"
            },
            {
                "id": "4351009",
                "tenantId": "1",
                "currency": "BTC",
                "envelope": "Cgc0MzUxMDA5EIqwgbS1m4ezFxgBKvgGEswBCkcKFG0vNDQnLzAnLzc1Jy8wJy8zMTMnEAEaIEQy2NFy6aCMadka4jZhPKZqMqMh6yNU3/MowA2YSLFaIAIotcDYATDv/bb1DRIoCiIzTGJLZmY5VXY1d0hpQjRtNVcyd2hraHhYZkNaWEZZc0V3EKCNBhodChRtLzQ0Jy8wJy83NScvMCcvMzEzJxABGPvt0QEyNmJ1bmRsZTo5Mjo0MzUxMDA5OmMwYzJmN2RjLWY3NTktNGQzNC1hMzk1LWVhMzIxZDYxMTBkZDgrIhcKCnJlcXVlc3RfaWQQARoHNDM1MTAwOSISCglydWxlc19rZXkQARoDQlRDIhEKCGN1cnJlbmN5EAEaA0JUQyIgCg1jdXJyZW5jeV9uYW1lEAEaDUJpdGNvaW4gLSBCVEMiUQoLY3VycmVuY3lfaWQQARpANTg0NzM3ZTNjNGZkMjZmYWUzMDA3MGQ3NzM0NGE4YWU5MmJiODlmZWU5OTg3NTdmNmIwZWU5ZDcxZWQwNzRhMSJpCgZzb3VyY2UQBBpVCAESUQjGlAYSIjNMM3B4b0N2bUZLYUtLa2p6cVpnRXpNMkQ4RDRDVDZQVTIaEXRnLXRyYWRlZCBhZGRyZXNzIhRtLzQ0Jy8wJy83NScvMCcvMzEzJyIGc291cmNlInIKC2Rlc3RpbmF0aW9uEAUaVBJSCLneHRIiM0xiS2ZmOVV2NXdIaUI0bTVXMndoa2h4WGZDWlhGWXNFdxoRdGctdHJhZGVkIGFkZHJlc3MiFW0vNDQnLzAnLzc1Jy8wJy8xODAwJyILZGVzdGluYXRpb24inAEKBmFtb3VudBAKGocBCgMBhqASBzIzLjYzNTAaCDIzNjM1LjAzIAgqA0JUQzIDQ0hGOmEKHXZhbGlkYXRvci1jb3JlQHRhdXJ1c2dyb3VwLmNoEkA5jEempzVJrcCN0twV1nh6hHPp3/7ZNjsZZB6o/QIJ7m15M38OgD5UE/rURx7gbHQHTgoRvbQT3c3/VWkbE0fPIgZhbW91bnQiHgoRdG90YWxfZmlhdF9hbW91bnQQARoHMjMuNjM1MCIRCglmZWVfbGltaXQQAhoCIpoiHwoUZmVlX3BhaWRfYnlfcmVjZWl2ZXIQARoFZmFsc2UiIAoVdXNlX3VuY29uZmlybWVkX2Z1bmRzEAEaBWZhbHNlOgdtYWlubmV0",
                "status": "CREATED",
                "trails": [
                    {
                        "userId": "11",
                        "externalUserId": "team1@bank.com",
                        "action": "created",
                        "requestStatus": "CREATED"
                    },
                    {
                        "userId": "1",
                        "externalUserId": "validator-core@taurusgroup.ch",
                        "action": "approvers_assigned",
                        "comment": "rule = [source: any, destination: any, amount: 1.0000], approvals = ['team1': 1 sig]",
                        "requestStatus": "CREATED"
                    }
                ],
                "rule": "rule = [source: any, destination: any, amount: 1.0000], approvals = ['team1': 1 sig]",
                "approvers": {
                    "parallel": [
                        {
                            "sequential": [
                                {
                                    "externalGroupID": "team1",
                                    "minimumSignatures": 1
                                }
                            ]
                        }
                    ]
                },
                "type": "payment",
                "currencyInfo": {
                    "name": "Bitcoin",
                    "symbol": "BTC",
                    "blockchain": "BTC",
                    "decimals": "8",
                    "isUTXOBased": true,
                    "enabled": true,
                    "id": "584737e3c4fd26fae30070d77344a8ae92bb89fee998757f6b0ee9d71ed074a1",
                    "displayName": "Bitcoin - BTC",
                    "type": "native",
                    "network": "mainnet"
                },
                "requestBundleId": "92"
            }
        ],
        "network": "mainnet"
    }
}
```

Taurus-PROTECT responds with a JSON object containing the request details for each Request within the Bundle, including the Request `status` and the newly assigned Request`id`.

## Requirements for Future Use

For this particular endpoint, we need to store the Bundle `id` as it will be required in the next step where we will sign the Bundle.

You can find the Swagger-generated page for this endpoint in the following [link](/protect-capital/v3.38/reference/requests/create-outgoing-bundle).