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

# Asset List

> List asset statuses

## Quick Start

### Authentication

Include your API key in the `X-API-KEY` header:

```bash theme={null}
X-API-KEY: <api-key>
```

## Sync Strategy and Removals

<Warning>
  When using time-based filtering (e.g., fetching only the last 5 minutes of blocklist data), you may miss asset removals from the blocklist. To ensure complete data consistency, use one of these approaches:
</Warning>

### Recommended Approaches

1. **Monitor allowlist and unknown list for removals**: Check both the allowlist and unknown list endpoints periodically to detect assets that have been removed from the blocklist.

2. **Periodic full sync**: Perform a complete sync of the full blocklist at regular intervals (e.g., hourly or daily) to catch any missed changes.

3. **Hybrid approach**: Use time-based filtering for frequent updates combined with periodic full syncs for comprehensive coverage.

### Why This Matters

Asset status changes can move assets between different lists (blocklist, allowlist, unknown). Time-based queries on a single endpoint may not capture these transitions, potentially leaving your local cache with outdated information about blocked assets that should no longer be blocked.

## Pagination

To use pagination, include the `per_page` and `next_page` parameters in your request:

* `per_page <number>`: Number of items to return per page (max: 10000)
* `next_page <string>`: Cursor for the next page of results

### Example implementation for pagination:

<CodeGroup>
  ```javascript JavaScript theme={null}
  async function fetchAllAssets(type, status) {
    let allAssets = [];
    let nextPage = null;
    while (true) {
      const response = await fetch(
        "https://app.chainpatrol.io/api/v2/asset/list",
        {
          method: "POST",
          headers: {
            "Content-Type": "application/json",
            "X-API-KEY": "YOUR_API_KEY_HERE",
          },
          body: JSON.stringify({
            type,
            status,
            per_page: 500,
            next_page: nextPage,
          }),
        }
      );
      const data = await response.json();
      allAssets = allAssets.concat(data.assets);
      nextPage = data.next_page;
      if (!nextPage) {
        break;
      }
    }
    return allAssets;
  }
  fetchAllAssets("URL", "BLOCKED")
    .then((assets) => console.log("All assets:", assets))
    .catch((error) => console.error("Error fetching assets:", error));
  ```

  ```typescript TypeScript theme={null}
  async function fetchAllAssets(type: string, status: string): Promise<any[]> {
    let allAssets: any[] = [];
    let nextPage: string | null = null;

    while (true) {
      const response = await fetch(
        "https://app.chainpatrol.io/api/v2/asset/list",
        {
          method: "POST",
          headers: {
            "Content-Type": "application/json",
            "X-API-KEY": "YOUR_API_KEY_HERE",
          },
          body: JSON.stringify({
            type,
            status,
            per_page: 500,
            next_page: nextPage,
          }),
        }
      );
      const data = await response.json();
      allAssets = allAssets.concat(data.assets);
      nextPage = data.next_page;

      if (!nextPage) {
        break;
      }
    }
    return allAssets;
  }

  fetchAllAssets("URL", "BLOCKED")
    .then((assets) => console.log("All assets:", assets))
    .catch((error) => console.error("Error fetching assets:", error));
  ```

  ```python Python theme={null}
  import requests

  def fetch_all_assets(type: str, status: str) -> list:
      all_assets = []
      next_page = None
      while True:
          response = requests.post(
              "https://app.chainpatrol.io/api/v2/asset/list",
              headers={
                  "Content-Type": "application/json",
                  "X-API-KEY": "YOUR_API_KEY_HERE",
              },
              json={
                  "type": type,
                  "status": status,
                  "per_page": 500,
                  "next_page": next_page,
              },
          )
          data = response.json()
          all_assets.extend(data["assets"])
          next_page = data.get("next_page")
          if not next_page:
              break
      return all_assets

  try:
      assets = fetch_all_assets("URL", "BLOCKED")
      print("All assets:", assets)
  except Exception as error:
      print("Error fetching assets:", str(error))
  ```
</CodeGroup>


## OpenAPI

````yaml POST /asset/list
openapi: 3.0.3
info:
  title: ChainPatrol External API - OpenAPI 3.0
  description: ChainPatrol External API documentation
  version: 2.0.0
servers:
  - url: https://app.chainpatrol.io/api/v2
security: []
tags:
  - name: asset
  - name: report
externalDocs:
  url: https://chainpatrol.com/docs
paths:
  /asset/list:
    post:
      tags:
        - asset
      summary: List assets
      description: List asset statuses
      operationId: assetList
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                type:
                  type: string
                  enum:
                    - URL
                    - PAGE
                    - ADDRESS
                    - DISCORD
                    - LINKEDIN
                    - TWITTER
                    - FACEBOOK
                    - YOUTUBE
                    - REDDIT
                    - TELEGRAM
                    - GOOGLE_APP_STORE
                    - APPLE_APP_STORE
                    - AMAZON_APP_STORE
                    - MICROSOFT_APP_STORE
                    - TIKTOK
                    - INSTAGRAM
                    - THREADS
                    - MEDIUM
                    - CHROME_WEB_STORE
                    - MOZILLA_ADDONS
                    - OPERA_ADDONS
                    - EMAIL
                    - PATREON
                    - OPENSEA
                    - FARCASTER
                    - IPFS
                    - GOOGLE_FORM
                    - WHATSAPP
                    - DISCORD_USER
                    - QUORA
                    - GITHUB
                    - TEACHABLE
                    - SUBSTACK
                    - DEBANK
                    - TAWK_TO
                    - JOTFORM
                    - PRIMAL
                    - BLUESKY
                    - SNAPCHAT
                    - DESO
                    - PINTEREST
                    - FLICKR
                    - GALXE
                    - VELOG
                    - NPM
                    - PYPI
                    - HEX
                    - DOCKER_HUB
                    - VOCAL_MEDIA
                    - TECKFINE
                    - TENDERLY
                    - HACKMD
                    - ETSY
                    - ZAZZLE
                    - BASENAME
                    - BILIBILI_TV
                    - VIMEO
                    - DAILYMOTION
                    - PHONE_NUMBER
                    - SLACK
                    - CALENDLY
                    - NGROK
                    - RARIBLE
                    - RUST_PACKAGE
                    - FLATHUB
                    - VIDLII
                    - VEVIOZ
                    - ISSUU
                    - SOUNDCLOUD
                    - ZAPPER
                    - REDNOTE
                    - SAMSUNG_APP_STORE
                    - HUAWEI_APP_STORE
                    - XIAOMI_APP_STORE
                    - TENCENT_APP_STORE
                    - OPPO_APP_STORE
                    - VIVO_APP_STORE
                    - F_DROID
                    - GOOGLE_AD
                    - BING_AD
                    - TWITCH
                    - BEHANCE
                    - ZORA
                    - META_AD
                    - SIGNAL
                    - DEVIANTART
                    - BANDCAMP
                    - ARCHIVE_ORG
                    - FIVE_HUNDRED_PX
                status:
                  type: string
                  enum:
                    - UNKNOWN
                    - ALLOWED
                    - BLOCKED
                  default: BLOCKED
                startDate:
                  type: string
                endDate:
                  type: string
                per_page:
                  type: integer
                  minimum: 1
                  maximum: 10000
                  default: 100
                next_page:
                  type: string
                  nullable: true
              required:
                - type
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  assets:
                    type: array
                    items:
                      type: object
                      properties:
                        content:
                          type: string
                        type:
                          type: string
                          enum:
                            - URL
                            - PAGE
                            - ADDRESS
                            - DISCORD
                            - LINKEDIN
                            - TWITTER
                            - FACEBOOK
                            - YOUTUBE
                            - REDDIT
                            - TELEGRAM
                            - GOOGLE_APP_STORE
                            - APPLE_APP_STORE
                            - AMAZON_APP_STORE
                            - MICROSOFT_APP_STORE
                            - TIKTOK
                            - INSTAGRAM
                            - THREADS
                            - MEDIUM
                            - CHROME_WEB_STORE
                            - MOZILLA_ADDONS
                            - OPERA_ADDONS
                            - EMAIL
                            - PATREON
                            - OPENSEA
                            - FARCASTER
                            - IPFS
                            - GOOGLE_FORM
                            - WHATSAPP
                            - DISCORD_USER
                            - QUORA
                            - GITHUB
                            - TEACHABLE
                            - SUBSTACK
                            - DEBANK
                            - TAWK_TO
                            - JOTFORM
                            - PRIMAL
                            - BLUESKY
                            - SNAPCHAT
                            - DESO
                            - PINTEREST
                            - FLICKR
                            - GALXE
                            - VELOG
                            - NPM
                            - PYPI
                            - HEX
                            - DOCKER_HUB
                            - VOCAL_MEDIA
                            - TECKFINE
                            - TENDERLY
                            - HACKMD
                            - ETSY
                            - ZAZZLE
                            - BASENAME
                            - BILIBILI_TV
                            - VIMEO
                            - DAILYMOTION
                            - PHONE_NUMBER
                            - SLACK
                            - CALENDLY
                            - NGROK
                            - RARIBLE
                            - RUST_PACKAGE
                            - FLATHUB
                            - VIDLII
                            - VEVIOZ
                            - ISSUU
                            - SOUNDCLOUD
                            - ZAPPER
                            - REDNOTE
                            - SAMSUNG_APP_STORE
                            - HUAWEI_APP_STORE
                            - XIAOMI_APP_STORE
                            - TENCENT_APP_STORE
                            - OPPO_APP_STORE
                            - VIVO_APP_STORE
                            - F_DROID
                            - GOOGLE_AD
                            - BING_AD
                            - TWITCH
                            - BEHANCE
                            - ZORA
                            - META_AD
                            - SIGNAL
                            - DEVIANTART
                            - BANDCAMP
                            - ARCHIVE_ORG
                            - FIVE_HUNDRED_PX
                        status:
                          type: string
                          enum:
                            - UNKNOWN
                            - ALLOWED
                            - BLOCKED
                        watchStatus:
                          type: string
                          enum:
                            - ENABLED
                            - DISABLED
                        updatedAt:
                          type: string
                      required:
                        - content
                        - type
                        - status
                        - watchStatus
                        - updatedAt
                  next_page:
                    type: string
                    nullable: true
                required:
                  - assets
        '400':
          description: Invalid input data
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error.BAD_REQUEST'
        '401':
          description: Authorization not provided
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error.UNAUTHORIZED'
        '403':
          description: Insufficient access
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error.FORBIDDEN'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error.INTERNAL_SERVER_ERROR'
      security:
        - ApiKey: []
components:
  schemas:
    error.BAD_REQUEST:
      type: object
      properties:
        message:
          type: string
          description: The error message
          example: Invalid input data
        code:
          type: string
          description: The error code
          example: BAD_REQUEST
        issues:
          type: array
          items:
            type: object
            properties:
              message:
                type: string
            required:
              - message
          description: An array of issues that were responsible for the error
          example: []
      required:
        - message
        - code
      title: Invalid input data error (400)
      description: The error information
      example:
        code: BAD_REQUEST
        message: Invalid input data
        issues: []
    error.UNAUTHORIZED:
      type: object
      properties:
        message:
          type: string
          description: The error message
          example: Authorization not provided
        code:
          type: string
          description: The error code
          example: UNAUTHORIZED
        issues:
          type: array
          items:
            type: object
            properties:
              message:
                type: string
            required:
              - message
          description: An array of issues that were responsible for the error
          example: []
      required:
        - message
        - code
      title: Authorization not provided error (401)
      description: The error information
      example:
        code: UNAUTHORIZED
        message: Authorization not provided
        issues: []
    error.FORBIDDEN:
      type: object
      properties:
        message:
          type: string
          description: The error message
          example: Insufficient access
        code:
          type: string
          description: The error code
          example: FORBIDDEN
        issues:
          type: array
          items:
            type: object
            properties:
              message:
                type: string
            required:
              - message
          description: An array of issues that were responsible for the error
          example: []
      required:
        - message
        - code
      title: Insufficient access error (403)
      description: The error information
      example:
        code: FORBIDDEN
        message: Insufficient access
        issues: []
    error.INTERNAL_SERVER_ERROR:
      type: object
      properties:
        message:
          type: string
          description: The error message
          example: Internal server error
        code:
          type: string
          description: The error code
          example: INTERNAL_SERVER_ERROR
        issues:
          type: array
          items:
            type: object
            properties:
              message:
                type: string
            required:
              - message
          description: An array of issues that were responsible for the error
          example: []
      required:
        - message
        - code
      title: Internal server error error (500)
      description: The error information
      example:
        code: INTERNAL_SERVER_ERROR
        message: Internal server error
        issues: []
  securitySchemes:
    ApiKey:
      type: apiKey
      in: header
      name: X-API-KEY
      description: >-
        Your API key. This is required by most endpoints to access our API
        programatically. Reach out to us at
        [support@chainpatrol.io](mailto:support@chainpatrol.io?subject=Re:%20API%20Key%20for%20SDK&body=Company:%20%0AName:%20%0APurpose:%20)
        to get an API key for your use.

````