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

# Ping

> Keep a connection warm without spending rate-limit budget.

<Note>
  A ping does **not** count against any rate-limit window, so you can poll it as
  often as your connection's idle timeout requires. See
  **[Rate limits](/concepts/rate-limits)**.
</Note>

## Why ping

Opening a fresh TLS connection costs a round trip or two before your swap is
even sent — latency you pay at exactly the wrong moment. Keeping one connection
open and idle between trades removes that cost, but an idle connection gets
reaped: the Solana host closes one after **60 seconds** of inactivity, and any
proxy in between may be stricter.

Ping well inside the shortest of those and the connection stays up. Because the
endpoint does no work and spends no budget, you can do this on a timer for as
long as your process runs.

<Tabs>
  <Tab title="Solana">
    ```bash theme={null}
    curl "https://eu.solana.bloombot.app/api/v1/ping" \
      -H "Authorization: Bearer blm_sol_live_YOUR_KEY_HERE"
    ```
  </Tab>

  <Tab title="EVM">
    ```bash theme={null}
    curl "https://evm.bloombot.app/api/v1/ping" \
      -H "Authorization: Bearer blm_evm_live_YOUR_KEY_HERE"
    ```
  </Tab>
</Tabs>

```json theme={null}
{
  "success": true,
  "data": { "pong": true }
}
```

<Warning>
  Ping the **same host** you trade against. A warm connection to one host does
  nothing for a request you send to another — that applies to the Solana `eu.`
  and `us.` [regions](/concepts/chains#regions) as much as it does to the Solana
  and EVM hosts.
</Warning>

## What else it tells you

The endpoint is authenticated, and it returns the same `X-RateLimit-*` headers
as every other route, read from your current budget without consuming any of it.
That makes one call answer three questions at once:

| Question                 | Answer                                                     |
| ------------------------ | ---------------------------------------------------------- |
| Is the API reachable?    | `200` versus a transport error                             |
| Is my key still valid?   | `200` versus `401 UNAUTHORIZED` — a revoked key fails here |
| How much budget is left? | The `X-RateLimit-Remaining-*` headers                      |


## OpenAPI

````yaml openapi.yaml GET /api/v1/ping
openapi: 3.1.0
info:
  title: Bloom API
  version: 1.0.0
  description: |
    Programmatic trading and token-deploy API for Bloom. Drive swaps and token
    launches with a personal API key authenticated as a Bearer token.
servers:
  - url: https://eu.solana.bloombot.app
    description: Solana — EU
  - url: https://us.solana.bloombot.app
    description: Solana — US
  - url: https://evm.bloombot.app
    description: EVM
security:
  - bearerAuth: []
tags:
  - name: Trading
    description: Execute swaps across your wallets.
  - name: Deploy
    description: Launch new tokens.
  - name: Utility
    description: Connection probes and account lookups.
paths:
  /api/v1/ping:
    get:
      tags:
        - Utility
      summary: Ping
      description: >
        Keepalive probe. Hold a warm TLS connection to the API open between
        trades so a swap does not pay for a fresh handshake.


        A ping does **not** count against any rate-limit window, so you can poll
        it as often as your connection's idle timeout requires. It still returns
        the full set of `X-RateLimit-*` headers, read from your current budget
        without consuming any of it — which also makes it the cheapest way to
        check remaining budget before a burst, and to confirm a key is still
        valid (a revoked key answers `401`).
      operationId: ping
      responses:
        '200':
          description: The API is reachable and your key is valid.
          headers:
            X-RateLimit-Limit-Minute:
              description: Configured per-minute limit.
              schema:
                type: integer
            X-RateLimit-Limit-Hour:
              description: Configured per-hour limit.
              schema:
                type: integer
            X-RateLimit-Limit-Week:
              description: Configured per-week limit.
              schema:
                type: integer
            X-RateLimit-Remaining-Minute:
              description: Requests remaining in the current minute window.
              schema:
                type: integer
            X-RateLimit-Remaining-Hour:
              description: Requests remaining in the current hour window.
              schema:
                type: integer
            X-RateLimit-Remaining-Week:
              description: Requests remaining in the current week window.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PingResponse'
        '401':
          description: >-
            Unauthorized. Codes: UNAUTHORIZED (missing, malformed, unknown, or
            revoked Bearer token).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  schemas:
    PingResponse:
      type: object
      required:
        - success
        - data
      properties:
        success:
          type: boolean
          example: true
        data:
          type: object
          required:
            - pong
          properties:
            pong:
              type: boolean
              example: true
    ErrorResponse:
      type: object
      required:
        - success
        - error
      properties:
        success:
          type: boolean
          example: false
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
            message:
              type: string
            details:
              type:
                - string
                - 'null'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Your Bloom API key, e.g. `Authorization: Bearer blm_sol_live_…`. Create
        one in Bloom Manager → Manage API Keys.

````