> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tenderly.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Add wallets to a project in bulk

> Add many wallet addresses to a project in one request. Each wallet lists one or more networks, and each address and network combination is one wallet-network pair. A request takes at most 100 pairs; a pair repeated in the request counts once.

The response sorts the requested addresses into two lists:

- `added`: wallets this request added to the project.
- `existing`: addresses the project already had, as wallets or contracts. Their type and display name are not changed, so sending the same list again is safe.

An address is added as a wallet even when it is a contract. Every network must be a public network supported by Tenderly. An unsupported network returns `400` and nothing is added. If the new addresses would exceed your account's address limit, the request returns `403` and nothing is added.

**Tags**

Tags are added on every network the wallet is listed on, including addresses the project already had. Tags the address already has are kept; this endpoint never removes tags. A request that includes tags requires the `update_contract` project permission in addition to `add_contract`. Tagged addresses can be targeted as a group by [alerts](https://docs.tenderly.co/monitoring/alerts/types).



## OpenAPI

````yaml /api-reference/openapi.json post /v2/accounts/{accountSlug}/projects/{projectSlug}/wallets
openapi: 3.1.0
info:
  version: 1.0.0
  title: Tenderly API
  description: >
    # Introduction


    The Tenderly API provides a programmatic interface for managing Tenderly
    resources using standard HTTP requests.

    It mirrors many functionalities available through the Tenderly Dashboard,
    enabling you to script complex actions. The API documentation includes a
    design and technology overview, followed by detailed endpoint information.


    [Log into your Tenderly account](https://dashboard.tenderly.co/login) to
    automatically populate your API credentials in the documentation. Your
    account ID and project slug will be pre-filled across the documentation,
    excluding the API access token for security reasons. 


    Base URL: `https://api.tenderly.co/api`


    ## Authentication


    The Tenderly API requires an access token to authenticate your requests.
    Learn how to [generate and manage your API access
    keys](https://docs.tenderly.co/account/projects/how-to-generate-api-access-token).


    Add `X-Access-Key` to each request header, e.g.:


    ```bash

    curl
    'https://api.tenderly.co/api/v1/account/${TENDERLY_ACCOUNT_SLUG}/project/${TENDERLY_PROJECT_SLUG}/simulate'
    \
      -H 'X-Access-Key: ${TENDERLY_ACCESS_KEY}' \
      ...
    ```


    Do not share your secret API keys in publicly accessible areas such as
    GitHub, client-side code, and so forth.


    Authentication to the API is performed via HTTP Basic Auth. Provide your API
    key as the basic auth username value. You do not need to provide a password.


    If you need to authenticate via bearer auth (e.g., for a cross-origin
    request), use:


    ```bash

    curl
    'https://api.tenderly.co/api/v1/account/${TENDERLY_ACCOUNT_SLUG}/project/${TENDERLY_PROJECT_SLUG}/simulate'
    \
      -H 'Authorization: Bearer <TENDERLY_TOKEN>' \
      ...
    ```


    All API requests must be made over HTTPS. Calls made over plain HTTP will
    fail. API requests without authentication will also fail.


    ## Requests


    Any tool capable of making HTTP requests can interact with the API by
    requesting the appropriate URI. Requests should be made using the HTTPS
    protocol to ensure that traffic is encrypted. 


    The API's response varies with the request method used.


    |Method|Usage|

    |--- |--- |

    |GET|Used to retrieve information about your account, project, or resources.
    The requested information is returned as a JSON object. The attributes
    defined by the JSON object can be used to form additional requests. Requests
    made using the GET method are read-only and will not affect the objects you
    are querying.|

    |DELETE|Used to destroy a resource and remove it from your account and
    project. This methods removes the specified object if it is found. If it is
    not found, the operation will return a response indicating that the object
    was not found. You do not have to check if the resource is available prior
    to issuing a DELETE command. The final state will be the same regardless of
    its existence.|

    |PUT|Used to update the information about a resource in your account. The
    PUT method sets the state of the target using the provided values,
    regardless of their current values. Requests using the PUT method do not
    need to check the current attributes of the object.|

    |PATCH|Some resources support partial modification. In these cases, the
    PATCH method is available. Unlike PUT which generally requires a complete
    representation of a resource, a PATCH request is a set of instructions on
    how to modify a resource updating only specific attributes.|

    |POST|Used to create a new object. The POST request includes all of the
    attributes necessary to create a new object.|


    ## Errors


    The API responds with standard HTTP statuses, including error codes that
    indicate the outcome of requests. In the event of a problem, the status will
    contain the error code, while the

    body of the response will usually contain additional information about the
    problem.


    |Status Code|Type|Description|

    |--- |--- |--- |

    |200|OK|Everything worked as expected.|

    |400|Bad Request|The request was unacceptable, often due to missing a
    required parameter.|

    |401|Unauthorized|No valid API key provided.|

    |402|Request Failed|The parameters were valid but the request failed.|

    |403|Forbidden|The API key doesn’t have permissions to perform the request.|

    |404|Not Found|The requested resource doesn’t exist.|

    |429|Too Many Requests|Too many requests hit the API too quickly. We
    recommend an exponential backoff of your requests.|

    |500, 502, 503, 504|Server Errors|Something went wrong on Tenderly’s end.|


    Both 400 and 500 level errors return a JSON object in the response body,
    containing specific attributes detailing the error.


    |Name|Type|Description|

    |--- |--- |--- |

    |id|string|Endpoints include an error ID that should be provided when
    reporting bugs or opening support tickets to help identify the issue.|

    |slug|string|A short identifier corresponding to the HTTP status code
    returned. For example, the ID for a response returning a 404 status code
    would be "not_found."|

    |message|string|A message providing additional information about the error,
    including details to help resolve it when possible.|


    ### Example error response


    HTTP/1.1 404 Bad request

    ```json

    {

    "error": {
      "id": "596b1dc7-af60-477b-aab3-6c93eb92ddfa",
      "slug": "bad_request",
      "message": "Bad request input parameters"
     }
    }

    ```


    ## Responses


    When a request is successful, a response body will typically be sent back in

    the form of a JSON object. An exception to this is when a DELETE request is

    processed, which will result in a successful HTTP 204 status and an empty

    response body.


    The value of these keys will generally be a JSON object for a request on a

    single object and an array of objects for a request on a collection of

    objects.


    ### Response for a single object


    ```json

    {
      "simulation": {
        "id": "123"
        "...": "..."
      }
    }

    ```


    ### Response for an object collection


    ```json

    {
      "simulations": [
        {
          "id": "123"
          "...": "..."
        },
        {
          "id": "1234"
          "...": "..."
        }
      ]
    }

    ```


    ## Pagination


    By default, 20 objects are returned per page per request.

    You can customize this behavior using the following parameters:


    * **Pagination Limit (perPage)**: To change the number of items per page,

    append `?perPage=[number]` to your request. For example, `?perPage=2` limits

    the results to two items per page. The maximum limit is 100 items per page.

    * **Page Offset (page)**: To navigate through paginated results, use the

    `?page=[number]` parameter. For instance, `?page=3` will take you to the
    third page of the results.

    Only positive integers are valid for this parameter.


    Remember:


    * You can combine these parameters. For example, `?perPage=10&page=2` will
    show the second page with 10 items per page.

    * The maximum number of results per page (`perPage`) is 100.


    ## Rate limits


    Requests through the API are rate limited per `X-Access-Key` API key.
    Current rate limits:


    * **Non-authenticated users:** 100 requests per minute

    * **Authenticated users:** 400 requests per minute


    Once you exceed either limit, you will be rate limited until the next cycle

    starts. Space out any requests that you would otherwise issue in bursts for

    the best results.


    The rate limiting information is contained within the response headers of

    each request. The relevant headers are:


    * **X-Tdly-Limit**: The number of requests that can be made per minute.

    * **X-Tdly-Remaining**: The number of requests that remain before you hit
    your request limit. See the information below for how the request limits
    expire.

    * **X-Tdly-Reset-Timestamp**: This represents the time when the oldest
    request will expire. The value is given in [Unix epoch
    time](http://en.wikipedia.org/wiki/Unix_time). See below for more
    information about how request limits expire.


    As long as the `X-Tdly-Remaining` count is above zero, you will be able

    to make additional requests.


    The way that a request expires and is removed from the current limit count

    is important to understand. Rather than counting all of the requests for a

    minute and resetting the `X-Tdly-Remaining` value at the end of the minute,

    each request instead has its own timer.


    This means that each request contributes toward the `X-Tdly-Remaining`

    count for one complete minute after the request is made. When that request's

    timer runs out, it is no longer counted toward the request limit.


    This has implications on the meaning of the `X-Tdly-Reset-Timestamp` header
    as

    well. Because the entire rate limit is not reset at one time, the value of

    this header is set to the time when the _oldest_ request will expire.


    Keep this in mind if you see your `X-Tdly-Reset-Timestamp` value change, but
    not

    move an entire minute into the future.


    If the `X-Tdly-Remaining` reaches zero, subsequent requests will receive

    a 429 error code until the request reset has been reached. 


    `X-Tdly-Remaining` reaching zero can also indicate that the "burst limit" of
    250 

    requests per minute limit was met, even if the 400 requests per minute limit
    was not. 


    You can see the format of the response in the examples. 


    **Note:** Some endpoints may have special rate limit requirements that

    are independent of the limits defined above.


    ### Sample rate limit headers


    ```bash

    'X-Tdly-Limit': 100

    'X-Tdly-Remaining': 79

    'X-Tdly-Reset-Timestamp': 1402425459

    ```


    ### Sample rate exceeded response


    429 Too Many Requests

    ```bash

    {
      id: "too_many_requests",
      message: "API Rate limit exceeded."
    }

    ```


    ## Parameters


    There are two different ways to pass parameters in a request to the API.


    When passing parameters to create or update an object, parameters should be

    passed as a JSON object containing the appropriate attribute names and

    values as key-value pairs. When you use this format, you should specify that

    you are sending a JSON object in the header. This is done by setting the

    `Content-Type` header to `application/json`. This ensures that your request

    is interpreted correctly.


    When passing parameters to filter a response on GET requests, parameters can

    be passed using standard query attributes. In this case, the parameters

    would be embedded into the URI itself by appending a `?` to the end of the

    URI and then setting each attribute with an equal sign. Attributes can be

    separated with a `&`. Tools like `curl` can create the appropriate URI when

    given parameters and values; this can also be done using the `-F` flag and

    then passing the key and value as an argument. The argument should take the

    form of a quoted string with the attribute being set to a value with an

    equal sign.


    ### Pass parameters as a JSON object


    ```bash

    curl
    'https://api.tenderly.co/api/v1/account/${TENDERLY_ACCOUNT_SLUG}/project/${TENDERLY_PROJECT_SLUG}/simulate'
    \
      -H 'X-Access-Key: ${TENDERLY_ACCESS_KEY}' \
      -H 'content-type: application/json' \
      --data-raw '{"network_id":"1","block_number":null,"transaction_index":null,"from":"0x0000000000000000000000000000000000000000","input":"0x42966c68000000000000000000000000000000000000000000000000000000000000022b","to":"0x94c87a7b26980ae7aaa361c5c7e03e632ab36e6c","gas":8000000,"gas_price":"0","value":"0","access_list":[],"generate_access_list":true,"save":true,"block_header":null}' \
      --compressed
    ```


    ### Pass filter parameters as a query string


    ```bash

    curl
    'https://api.tenderly.co/api/v1/account/${TENDERLY_ACCOUNT_SLUG}/project/${TENDERLY_PROJECT_SLUG}/simulations?page=1&perPage=20'
    \
      -H 'X-Access-Key: ${TENDERLY_ACCESS_KEY}' \
      --compressed
    ```


    ## Cross origin resource sharing


    In order to make requests to the API from other domains, the API implements

    Cross Origin Resource Sharing (CORS) support.


    CORS support is generally used to create AJAX requests outside of the domain

    that the request originated from. This is necessary to implement projects

    like control panels utilizing the API. This tells the browser that it can

    send requests to an outside domain.


    The procedure that the browser initiates in order to perform these actions

    (other than GET requests) begins by sending a "preflight" request. This sets

    the `Origin` header and uses the `OPTIONS` method. The server will reply

    with the methods it allows and some of the limits it imposes. The

    client then sends the actual request if it falls within the allowed

    constraints.


    This process is usually done by the browser in the background, but you can

    use curl to emulate this process. The headers that will be set to show the
    constraints are:


    * **Access-Control-Allow-Origin**: This is the domain that is sent by the
    client or browser as the origin of the request. It is set through an
    `Origin` header.

    * **Access-Control-Allow-Methods**: This specifies the allowed options for
    requests from that domain. This will generally be all available methods.

    * **Access-Control-Expose-Headers**: This will contain the headers that will
    be available to requests from the origin domain.

    * **Access-Control-Max-Age**: This is the length of time that the access is
    considered valid. After this expires, a new preflight should be sent.

    * **Access-Control-Allow-Credentials**: This will be set to `true`. It
    basically allows you to send your Access token for authentication.


    You should not need to be concerned with the details of these headers,

    because the browser will typically do all of the work for you.
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0.html
  contact:
    name: Tenderly Support
    email: support@tenderly.co
  termsOfService: https://tenderly.co/terms-of-service
servers:
  - url: https://api.tenderly.co/api
    description: production
security:
  - ApiKeyAuth: []
  - BearerAuth: []
tags:
  - name: Projects
    description: >-
      Projects organize your work into separate spaces that contain contracts,
      wallets, alerts, Web3 Actions, Virtual Environments and simulations. Every
      other endpoint is scoped to a project through the `accountSlug` and
      `projectSlug` path parameters.


      On organization accounts a project is either open to every organization
      member or restricted to an invited member list.


      Learn more about
      [Projects](https://docs.tenderly.co/platform/account/projects/overview)
      and [restricted
      projects](https://docs.tenderly.co/platform/account/projects/restricted-projects).
  - name: Contracts
    description: >-
      Tenderly allows you to add verified and unverified smart contracts to your
      project to use in development. Once you add a contract, you can start
      inspecting and debugging transactions, simulating transactions with
      modified parameters, or monitoring contract usage.


      Learn more about managing [Smart
      Contracts](https://docs.tenderly.co/monitoring/smart-contracts).
  - name: Wallets
    description: >-
      Similar to contracts, you can also add any public wallet addresses to your
      Tenderly projects. This allows you to keep track of wallet activity, view
      all transactions, simulate transactions, set up wallet alerts, and more.


      Learn more about managing
      [Wallets](https://docs.tenderly.co/monitoring/wallets).
  - name: Simulator
    description: >-
      Transaction Simulations let you preview the exact outcomes of transactions
      before they are sent to the live network. Transactions are simulated on an
      exact replica of the latest state of the specific network, providing the
      most accurate simulation results. 


      The Tenderly API supports simulating single or bundled transactions
      through a single request. 


      **Common use cases for simulations**


      - [Asset and balance
      changes](https://docs.tenderly.co/simulations/asset-balance-changes): Get
      exact dollar values for all balance and asset changes that will happen.

      - [Gas estimation](https://docs.tenderly.co/simulations/gas-estimation):
      Accurately predict the gas costs before sending the transaction.

      - [State overrides](https://docs.tenderly.co/simulations/state-overrides):
      Modify blockchain conditions like timestamps and contract data to test
      different scenarios.

      - [Preview transaction
      outcomes](https://docs.tenderly.co/simulations/transaction-preview):
      Identify and fix issues that could cause transactions to fail.

      - Access lists: Create lists of addresses and storage slots the
      transaction will access.

      - Human-readable errors: Get complex errors decoded into explanations that
      you can easily understand.


      Learn more about [Transaction
      Simulations](https://docs.tenderly.co/simulations).
  - name: Alerts
    description: >-
      Alerts listen for specific on-chain events and send real-time
      notifications to your desired destination when the event occurs. This can
      be email, your favorite messaging app, an incident monitoring system, or
      webhooks and Web3 Actions.


      Learn more about
      [Alerts](https://docs.tenderly.co/alerts/intro-to-alerts).
  - name: Delivery Channels
    description: >-
      When the desired event triggers your Alert, Tenderly will send the data
      about the event to a designated Alert Destination. The Destination
      (Delivery Channel) will use this data to send you an email notification,
      Discord, or Slack message or send it to another Tenderly system like Web3
      Actions or a Webhook.


      Learn more about [Delivery
      Channels](https://docs.tenderly.co/alerts/configuring-alert-destinations).
  - name: Actions
    description: >-
      Web3 Actions allow you to execute custom code in response to on-chain and
      off-chain events. They work as programmable hooks for smart contracts. A
      Web3 Action is a regular JS/TS function that is executed on our
      infrastructure. 


      Learn more about [Web3
      Actions](https://docs.tenderly.co/web3-actions/intro-to-web3-actions).
  - name: Virtual Environments
    description: >-
      Virtual Environments are simulated blockchain networks, designed to
      replicate real networks for various stages of dapp development. Use them
      as risk-free development and staging infrastructure that fully tracks real
      network state without the need to use real cryptocurrency or assets.


      Environments are multi-chain groupings of Virtual Environments, providing
      a coordinated set of simulated networks for end-to-end cross-chain
      testing. Each environment contains a Virtual Environment per configured
      network, and an active instance manages the current state across all
      chains.


      Environments support cross-chain bridge simulation, allowing you to test
      bridging and messaging protocols across networks in a fully isolated and
      reproducible setup.
  - name: Other
    description: >-
      This section contains miscellaneous endpoints that do not fit into other
      categories, such as checking supported networks on the Tenderly platform.
paths:
  /v2/accounts/{accountSlug}/projects/{projectSlug}/wallets:
    post:
      tags:
        - Wallets
      summary: Add wallets to a project in bulk
      description: >-
        Add many wallet addresses to a project in one request. Each wallet lists
        one or more networks, and each address and network combination is one
        wallet-network pair. A request takes at most 100 pairs; a pair repeated
        in the request counts once.


        The response sorts the requested addresses into two lists:


        - `added`: wallets this request added to the project.

        - `existing`: addresses the project already had, as wallets or
        contracts. Their type and display name are not changed, so sending the
        same list again is safe.


        An address is added as a wallet even when it is a contract. Every
        network must be a public network supported by Tenderly. An unsupported
        network returns `400` and nothing is added. If the new addresses would
        exceed your account's address limit, the request returns `403` and
        nothing is added.


        **Tags**


        Tags are added on every network the wallet is listed on, including
        addresses the project already had. Tags the address already has are
        kept; this endpoint never removes tags. A request that includes tags
        requires the `update_contract` project permission in addition to
        `add_contract`. Tagged addresses can be targeted as a group by
        [alerts](https://docs.tenderly.co/monitoring/alerts/types).
      operationId: bulkAddWalletsToProject
      parameters:
        - name: accountSlug
          in: path
          schema:
            type: string
          required: true
          description: Account slug of the user
          example: me
        - name: projectSlug
          in: path
          schema:
            type: string
          required: true
          description: Project slug of the account
          example: project
      requestBody:
        required: true
        description: Wallets to add to the project
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bulk-add-wallets-payload'
            examples:
              bulk_add_wallets:
                $ref: '#/components/examples/bulk_add_wallets_post_request'
      responses:
        '200':
          $ref: '#/components/responses/bulk_add_wallets_post'
        '400':
          $ref: '#/components/responses/bad_request'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/not_found'
        '429':
          $ref: '#/components/responses/too_many_requests'
        '500':
          $ref: '#/components/responses/server_error'
      x-codeSamples:
        - lang: cURL
          label: Add wallets in bulk
          source: >-
            curl
            'https://api.tenderly.co/api/v2/accounts/${TENDERLY_ACCOUNT_SLUG}/projects/${TENDERLY_PROJECT_SLUG}/wallets'
            \
              -H 'X-Access-Key: ${TENDERLY_ACCESS_KEY}' \
              -H 'content-type: application/json' \
              --data-raw '{"wallets":[{"address":"0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2","network_ids":["1","8453"],"display_name":"Treasury","tags":["treasury"]},{"address":"0xb0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0","network_ids":["1"]}]}'
components:
  schemas:
    bulk-add-wallets-payload:
      type: object
      title: Bulk Add Wallets Payload
      properties:
        wallets:
          title: wallets
          description: >-
            Wallets to add. Across all wallets, the request takes at most 100
            wallet-network pairs (one pair per address and network). A pair
            repeated in the request counts once.
          type: array
          minItems: 1
          items:
            $ref: '#/components/schemas/bulk-add-wallet'
      required:
        - wallets
    bulk-add-wallet:
      type: object
      title: Bulk Add Wallet
      properties:
        address:
          title: address
          description: >-
            Wallet address, `0x` followed by 40 hex characters. The address is
            stored lowercase.
          type: string
          pattern: ^0x[0-9a-fA-F]{40}$
          example: '0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2'
        network_ids:
          title: network_ids
          description: >-
            IDs of the networks to add the wallet on. Each network is one
            wallet-network pair.
          type: array
          minItems: 1
          items:
            type: string
          example:
            - '1'
            - '8453'
        display_name:
          title: display_name
          description: >-
            Optional name of the wallet to be displayed. Applies only to wallets
            this request adds; the display name of an address the project
            already had is not changed. If the same address and network appear
            more than once in the request, the first display name is used.
          type: string
          example: Treasury
        tags:
          title: tags
          description: >-
            Optional tags to add to the wallet on every listed network. At most
            10 tags per wallet, each up to 255 characters. Surrounding
            whitespace is trimmed, an empty tag is rejected, and duplicate tags
            are ignored. Requires the `update_contract` project permission.
          type: array
          maxItems: 10
          items:
            type: string
            minLength: 1
            maxLength: 255
          example:
            - treasury
      required:
        - address
        - network_ids
    bulk-add-wallets-response:
      type: object
      title: Bulk Add Wallets Response
      description: >-
        Every requested address and network pair, sorted by whether this request
        added it.
      properties:
        added:
          title: added
          description: >-
            Wallets this request added to the project, one entry per
            wallet-network pair.
          type: array
          items:
            $ref: '#/components/schemas/project-address'
        existing:
          title: existing
          description: >-
            Requested addresses the project already had, as wallets or
            contracts. Their type and display name are unchanged; tags from the
            request are added to them.
          type: array
          items:
            $ref: '#/components/schemas/project-address'
    error:
      type: object
      properties:
        error:
          type: object
          properties:
            id:
              description: >-
                Endpoints include an error ID that should be  provided when
                reporting bugs or opening support tickets to help  identify the
                issue.
              type: string
              example: 4d9d8375-3c56-4925-a3e7-eb137fed17e9
            slug:
              description: >-
                A short identifier corresponding to the HTTP status code
                returned. For  example, the ID for a response returning a 404
                status code would be "not_found."
              type: string
              example: not_found
            message:
              description: >-
                A message providing additional information about the error,
                including  details to help resolve it when possible.
              type: string
              example: The resource you were accessing could not be found.
            data:
              description: Additional context about the error.
              type: object
              properties:
                rid:
                  description: >-
                    Resource identifier indicating which resource type caused
                    the error.
                  type: string
                  enum:
                    - rid:account
                    - rid:project
                    - rid:alert
                    - rid:contract
                    - rid:delivery_channel
                    - rid:network
                    - rid:simulation
                    - rid:simulation_draft
                    - rid:vnet
                    - rid:wallet
                    - rid:action
                    - rid:action_call
                  example: rid:project
              additionalProperties: true
          required:
            - id
            - slug
            - message
      required:
        - error
    project-address:
      type: object
      title: Project Address
      description: An address in the project on one network, as a wallet or a contract.
      properties:
        id:
          title: id
          description: >-
            ID of the address on the network, in the form
            `eth:{network_id}:{address}`.
          type: string
          example: eth:1:0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2
        contract:
          title: contract
          description: Details of the address on the network.
          type: object
          additionalProperties: true
          properties:
            id:
              type: string
              example: eth:1:0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2
            network_id:
              type: string
              example: '1'
            address:
              type: string
              example: '0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2'
            type:
              description: Stored type of the address, `wallet` or `contract`.
              type: string
              example: wallet
        account:
          title: account
          description: Same details as `contract`.
          type: object
          additionalProperties: true
        project_id:
          title: project_id
          description: ID of the project.
          type: string
          format: uuid
          example: dfdc391a-a15d-4590-9aef-8691259c7df4
        added_by_id:
          title: added_by_id
          description: ID of the user who added the address to the project.
          type: string
          format: uuid
          example: 7d5e8b1f-8bf8-4eae-a70f-fb7d354b1cc2
        display_name:
          title: display_name
          description: Display name of the address in the project. Empty when none is set.
          type: string
          example: Treasury
        account_type:
          title: account_type
          description: How the project tracks the address, `wallet` or `contract`.
          type: string
          example: wallet
        tags:
          title: tags
          description: >-
            Tags on the address in the project. Omitted when the address has no
            tags.
          type: array
          items:
            type: object
            properties:
              tag:
                type: string
                example: treasury
              created_at:
                type: string
                format: date-time
                example: '2026-10-02T09:14:07.512Z'
        details_visible:
          title: details_visible
          type: boolean
          example: true
        include_in_transaction_listing:
          title: include_in_transaction_listing
          type: boolean
          example: true
        verification_type:
          title: verification_type
          type: string
          example: ''
        previous_versions:
          title: previous_versions
          type:
            - array
            - 'null'
          items:
            type: object
          example: null
        added_at:
          title: added_at
          description: When the address was added to the project.
          type: string
          format: date-time
          example: '2026-10-02T09:14:07.498Z'
  examples:
    bulk_add_wallets_post_request:
      summary: Add two wallets, one on two networks with a tag
      description: >-
        Adds a treasury wallet on Ethereum Mainnet and Base with a display name
        and a tag, and a second wallet on Ethereum Mainnet. The request has
        three wallet-network pairs.
      value:
        wallets:
          - address: '0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2'
            network_ids:
              - '1'
              - '8453'
            display_name: Treasury
            tags:
              - treasury
          - address: '0xb0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0'
            network_ids:
              - '1'
    bulk_add_wallets_post_response:
      summary: Two wallets added, one already in the project
      description: >-
        Response to the example request. The treasury wallet is new on both
        networks, so `added` has one entry per network, each with the tag. The
        second wallet was already in the project and is returned under
        `existing` with its display name unchanged.
      value:
        added:
          - id: eth:1:0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2
            contract:
              id: eth:1:0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2
              contract_id: ''
              balance: '0x0'
              network_id: '1'
              public: false
              verification_date: null
              address: '0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2'
              contract_name: ''
              ens_domain: null
              type: wallet
              evm_version: ''
              compiler_version: ''
              optimizations_used: false
              optimization_runs: 0
              libraries: null
              compiler_settings: null
              deployed_bytecode: ''
              creation_bytecode: ''
              data: null
              creation_block: 0
              creation_tx: ''
              creator_address: ''
              created_at: '2026-10-02T09:14:07Z'
              in_project: false
            account:
              id: eth:1:0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2
              contract_id: ''
              balance: '0x0'
              network_id: '1'
              public: false
              verification_date: null
              address: '0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2'
              contract_name: ''
              ens_domain: null
              type: wallet
              evm_version: ''
              compiler_version: ''
              optimizations_used: false
              optimization_runs: 0
              libraries: null
              compiler_settings: null
              deployed_bytecode: ''
              creation_bytecode: ''
              data: null
              creation_block: 0
              creation_tx: ''
              creator_address: ''
              created_at: '2026-10-02T09:14:07Z'
              in_project: false
            project_id: dfdc391a-a15d-4590-9aef-8691259c7df4
            added_by_id: 7d5e8b1f-8bf8-4eae-a70f-fb7d354b1cc2
            tags:
              - tag: treasury
                created_at: '2026-10-02T09:14:07.512Z'
            previous_versions: null
            details_visible: true
            include_in_transaction_listing: true
            display_name: Treasury
            account_type: wallet
            verification_type: ''
            added_at: '2026-10-02T09:14:07.498Z'
          - id: eth:8453:0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2
            contract:
              id: eth:8453:0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2
              contract_id: ''
              balance: '0x0'
              network_id: '8453'
              public: false
              verification_date: null
              address: '0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2'
              contract_name: ''
              ens_domain: null
              type: wallet
              evm_version: ''
              compiler_version: ''
              optimizations_used: false
              optimization_runs: 0
              libraries: null
              compiler_settings: null
              deployed_bytecode: ''
              creation_bytecode: ''
              data: null
              creation_block: 0
              creation_tx: ''
              creator_address: ''
              created_at: '2026-10-02T09:14:07Z'
              in_project: false
            account:
              id: eth:8453:0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2
              contract_id: ''
              balance: '0x0'
              network_id: '8453'
              public: false
              verification_date: null
              address: '0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2'
              contract_name: ''
              ens_domain: null
              type: wallet
              evm_version: ''
              compiler_version: ''
              optimizations_used: false
              optimization_runs: 0
              libraries: null
              compiler_settings: null
              deployed_bytecode: ''
              creation_bytecode: ''
              data: null
              creation_block: 0
              creation_tx: ''
              creator_address: ''
              created_at: '2026-10-02T09:14:07Z'
              in_project: false
            project_id: dfdc391a-a15d-4590-9aef-8691259c7df4
            added_by_id: 7d5e8b1f-8bf8-4eae-a70f-fb7d354b1cc2
            tags:
              - tag: treasury
                created_at: '2026-10-02T09:14:07.512Z'
            previous_versions: null
            details_visible: true
            include_in_transaction_listing: true
            display_name: Treasury
            account_type: wallet
            verification_type: ''
            added_at: '2026-10-02T09:14:07.498Z'
        existing:
          - id: eth:1:0xb0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0
            contract:
              id: eth:1:0xb0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0
              contract_id: ''
              balance: '0x22b1c8c1227a0000'
              network_id: '1'
              public: false
              verification_date: null
              address: '0xb0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0'
              contract_name: ''
              ens_domain: null
              type: wallet
              evm_version: ''
              compiler_version: ''
              optimizations_used: false
              optimization_runs: 0
              libraries: null
              compiler_settings: null
              deployed_bytecode: ''
              creation_bytecode: ''
              data: null
              creation_block: 0
              creation_tx: ''
              creator_address: ''
              created_at: '2024-03-08T16:40:12Z'
              in_project: false
            account:
              id: eth:1:0xb0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0
              contract_id: ''
              balance: '0x22b1c8c1227a0000'
              network_id: '1'
              public: false
              verification_date: null
              address: '0xb0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0'
              contract_name: ''
              ens_domain: null
              type: wallet
              evm_version: ''
              compiler_version: ''
              optimizations_used: false
              optimization_runs: 0
              libraries: null
              compiler_settings: null
              deployed_bytecode: ''
              creation_bytecode: ''
              data: null
              creation_block: 0
              creation_tx: ''
              creator_address: ''
              created_at: '2024-03-08T16:40:12Z'
              in_project: false
            project_id: dfdc391a-a15d-4590-9aef-8691259c7df4
            added_by_id: 7d5e8b1f-8bf8-4eae-a70f-fb7d354b1cc2
            previous_versions: null
            details_visible: true
            include_in_transaction_listing: true
            display_name: Ops wallet
            account_type: wallet
            verification_type: ''
            added_at: '2026-07-14T11:02:51.204Z'
  responses:
    bulk_add_wallets_post:
      description: A successful response.
      headers:
        X-Tdly-Limit:
          $ref: '#/components/headers/ratelimit-limit'
        X-Tdly-Remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        X-Tdly-Reset-Timestamp:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/bulk-add-wallets-response'
          examples:
            bulk_add_wallets:
              $ref: '#/components/examples/bulk_add_wallets_post_response'
    bad_request:
      description: Bad Request
      headers:
        X-Tdly-Limit:
          $ref: '#/components/headers/ratelimit-limit'
        X-Tdly-Remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        X-Tdly-Reset-Timestamp:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/error'
          example:
            error:
              id: 596b1dc7-af60-477b-aab3-6c93eb92ddfa
              slug: bad_request
              message: Bad request input parameters
    unauthorized:
      description: Unauthorized
      headers:
        X-Tdly-Limit:
          $ref: '#/components/headers/ratelimit-limit'
        X-Tdly-Remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        X-Tdly-Reset-Timestamp:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/error'
          example:
            error:
              id: 596b1dc7-af60-477b-aab3-6c93eb92ddfa
              slug: unauthorized
              message: Unauthorized
    forbidden:
      description: Forbidden
      headers:
        X-Tdly-Limit:
          $ref: '#/components/headers/ratelimit-limit'
        X-Tdly-Remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        X-Tdly-Reset-Timestamp:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/error'
          example:
            error:
              id: 596b1dc7-af60-477b-aab3-6c93eb92ddfa
              slug: insufficient_permissions
              message: Insufficient permissions
    not_found:
      description: The resource was not found.
      headers:
        X-Tdly-Limit:
          $ref: '#/components/headers/ratelimit-limit'
        X-Tdly-Remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        X-Tdly-Reset-Timestamp:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/error'
          example:
            error:
              id: 596b1dc7-af60-477b-aab3-6c93eb92ddfa
              slug: resource_not_found
              message: The resource you requested could not be found.
    too_many_requests:
      description: >-
        The request was rate limited. See the [rate
        limits](#section/Introduction/Rate-limits) section for the current
        limits and how request counts expire.
      headers:
        X-Tdly-Limit:
          $ref: '#/components/headers/ratelimit-limit'
        X-Tdly-Remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        X-Tdly-Reset-Timestamp:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/error'
          example:
            error:
              id: 9a7bbe06-7f6f-4a45-8c78-8d64b9a9d0e1
              slug: too_many_requests
              message: API Rate limit exceeded.
    server_error:
      description: Server error.
      headers:
        X-Tdly-Limit:
          $ref: '#/components/headers/ratelimit-limit'
        X-Tdly-Remaining:
          $ref: '#/components/headers/ratelimit-remaining'
        X-Tdly-Reset-Timestamp:
          $ref: '#/components/headers/ratelimit-reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/error'
          example:
            error:
              id: 596b1dc7-af60-477b-aab3-6c93eb92ddfa
              slug: internal_server_error
              message: Internal server error
  headers:
    ratelimit-limit:
      schema:
        type: integer
      example: 100
      description: >-
        The default limit on number of requests that can be made per minute.
        Current rate limits are:

        * **Non-authenticated users:** 100 requests per minute

        * **Authenticated users:** 400 requests per minute
    ratelimit-remaining:
      schema:
        type: integer
      example: 16
      description: >-
        The number of requests in your quota that remain before you hit your
        request limit.
    ratelimit-reset:
      schema:
        type: integer
      example: 1444931833
      description: >-
        The time when the oldest request will expire. The value is given in Unix
        epoch time.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      name: X-Access-Key
      in: header
      description: >-
        An API key is a token that a client provides when making API calls. Send
        it as the `X-Access-Key` request header on any endpoint:


        ```bash

        curl '<API_ENDPOINT>' \
          -H 'X-Access-Key: ${TENDERLY_ACCESS_KEY}' \
          ...
        ```


        Learn how to generate API access tokens at [Tenderly
        Docs](https://docs.tenderly.co/account/projects/how-to-generate-api-access-token).
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        Bearer authentication (also called token authentication) is an HTTP
        authentication scheme that involves security tokens called bearer
        tokens.

        The bearer token is a cryptic string, usually generated by the server in
        response to a login request. The client must send this token in

        the Authorization header when making requests to protected resources:


        ```bash

        curl '<API_ENDPOINT>' \
          -H 'Authorization: Bearer <TENDERLY_TOKEN>' \
          ...
        ```


        **Note**: Bearer tokens cannot be revoked and expire after 30 days.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.