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

# Batch lookup assets by symbols



## OpenAPI

````yaml /api-reference/openapi.yaml get /assets/batch
openapi: 3.0.0
info:
  title: Bluum Finance Investment API
  version: 1.0.0
  description: >
    The Bluum Finance API provides embeddable investment experiences, allowing
    fintech partners to manage investor accounts, facilitate trading, handle
    document uploads, and manage wallet operations.


    ### Response conventions


    Every resource response carries a small, consistent set of envelope keys

    followed by domain fields:


    ```json

    {
      "id": "<prefix>_<base32>",
      "object": "<resource>",
      "created": <unix_seconds>,
      "livemode": <boolean>,
      "metadata": { ... },
      ... domain fields ...
    }

    ```


    List endpoints return:


    ```json

    {
      "object": "list",
      "url": "/v1/<resource>",
      "has_more": false,
      "data": [ <resource>... ]
    }

    ```


    Errors are wrapped in:


    ```json

    {
      "error": {
        "type": "invalid_request_error",
        "code": "BLUM-400-001",
        "message": "...",
        "param": "tax_id"
      }
    }

    ```


    See `ResourceEnvelope`, `ListEnvelope`, and `ErrorEnvelope` in

    `shared-schemas.yaml` for the full schemas.


    ### Product entitlements


    Core investing (accounts, funding, trading, positions, documents,

    webhooks) is available to every tenant. Three surfaces are add-on products

    that must be enabled for your tenant before use:


    - **Market Data** — `/v1/market-data/*`

    - **Cash Management** — `/v1/cash-management/*`


    Calling a disabled product returns HTTP `403` with the legacy

    `{ "status": "error", "code": "PRODUCT_NOT_ENABLED", "message": "..." }`

    body (not the standard error envelope). Contact your Bluum account manager

    to enable a product.


    ### Field naming


    - snake_case throughout (no camelCase)

    - `email` / `phone` (not `email_address` / `phone_number`)

    - `first_name` / `middle_name` / `last_name` (not `given_name` /
    `family_name`)

    - `address: { street: [string], unit?, city, state?, postal_code?, country
    }`
      (the `street` array form preserves multi-line addresses; ISO 3166-1
      alpha-2 country code on `address.country` and on the top-level
      `country_of_*` fields)
    - `quantity` (not `qty`)

    - Status enums are lowercase Bluum-native vocabulary (e.g. `pending` /
    `filled` / `cancelled` / `failed`)


    Regulatory vocabulary (CAIS / FINRA / IRS / FATF) is preserved verbatim

    (e.g. `tax_id_type`, `country_of_tax_residence`, `is_politically_exposed`,

    `funding_source`).


    ### Terminology


    The investor resource lives at `/v1/investors`. Path parameter is

    `investor_id`.


    ### Asset classification


    Assets carry a canonical `(class, country)` pair:

    - `class`: `equity` | `etf` | `bond` | `bill` | `note` | `mutual_fund` |
      `derivative` | `cryptocurrency` | `commodity` | `real_estate` | `cash`
    - `country`: ISO 3166-1 alpha-2, lower-case (`us`, `ng`, …). Null for
      country-agnostic instruments (most crypto).

    ### Fixed income (bonds)


    Bond orders use the same `POST /v1/investors/{investor_id}/orders`

    endpoint as equities, with bond-specific semantics:

    - `quantity` carries **face value** (e.g. `"10000"` for $10k face),
      and must be a multiple of the bond's `min_increment`.
    - `limit_price` is quoted as **% of par** (e.g. `"99.875"` = 99.875%
      of face value).
    - `settlement_date` is optional; defaults to T+1 for US treasuries
      and T+2 for corporates.
    - Bond quote responses (`/v1/market-data/assets/{symbol}/quote`)
      include a `bond` block with clean/dirty price, accrued interest,
      and yield to maturity.

    Bond trading must be explicitly enabled on the tenant before orders

    will route. Contact Bluum support to flip `fixedIncomeEnabled`.


    ### Authentication


    HTTP Basic Authentication. **API Key** is the username, **API Secret** is

    the password. Base64-encode `API_KEY:API_SECRET` and send in the

    `Authorization` header.
servers:
  - url: https://api.bluumfinance.com/v1
    description: Production Environment
  - url: https://sandbox.api.bluumfinance.com/v1
    description: Sandbox/Testing Environment
  - url: https://service.bluumfinance.com/v1
    description: Production Environment (legacy alias)
  - url: https://test-service.bluumfinance.com/v1
    description: Sandbox/Testing Environment (legacy alias)
security:
  - BluumApiKeyAuth: []
  - BearerAuth: []
tags:
  - name: Investors
    description: Create and manage investor accounts, wallets, and transactions.
  - name: API Keys
    description: Mint, list, and revoke investor-scoped API keys for programmatic access.
  - name: Compliance
    description: Investor compliance workflows, KYC checks, and document submissions.
  - name: Transfers
    description: Deposit and withdrawal operations for investor wallets.
  - name: Funding Sources
    description: Connect and manage external funding sources (Plaid, bank accounts).
  - name: Trading
    description: Place, list, and cancel investor orders.
  - name: Positions
    description: View investor portfolio positions.
  - name: Assets
    description: Search and retrieve asset reference data.
  - name: Document Management
    description: Upload, list, and download documents.
  - name: Markets
    description: Market reference data, status, calendar, and halts.
  - name: Market Data
    description: Real-time quotes, snapshots, and historical bars (paywalled product).
  - name: Webhooks
    description: Register and manage webhook endpoints for event delivery.
  - name: Disclosures
    description: >-
      Partner-facing disclosure library (verbatim regulated copy, PDFs) +
      per-investor acceptance trail.
  - name: Cash Sweep
    description: >-
      High Yield Cash (HYC) / FDIC Bank Sweep enrollment, tier management, and
      interest reporting.
  - name: Cash Management
    description: >-
      Multi-currency, zero-day-liquidity yield on cash — programs, eligibility,
      enrollment, sweeps, withdrawals, earnings.
paths:
  /assets/batch:
    get:
      tags:
        - Assets
      summary: Batch lookup assets by symbols
      operationId: getAssetsBySymbols
      parameters:
        - name: symbols
          in: query
          required: true
          schema:
            type: string
          description: Comma-separated ticker symbols (max 20).
          example: META,AAPL,TSLA
        - name: market
          in: query
          required: false
          schema:
            type: string
          description: >-
            Market hint when the symbol trades on multiple exchanges (e.g. XNAS,
            XNYS, XNSA).
          example: XNAS
      responses:
        '200':
          description: List of assets
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ListEnvelope'
                  - type: object
                    properties:
                      data:
                        type: array
                        items:
                          $ref: '#/components/schemas/AssetResource'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '500':
          $ref: '#/components/responses/InternalServerError'
components:
  schemas:
    ListEnvelope:
      type: object
      description: |
        List envelope. `data` holds the page of items;
        each item is itself wrapped in a ResourceEnvelope.
      required:
        - object
        - url
        - has_more
        - data
      additionalProperties: true
      properties:
        object:
          type: string
          enum:
            - list
        url:
          type: string
          description: The endpoint path that produced this list.
          example: /v1/investors/inv_…/deposits
        has_more:
          type: boolean
          description: Whether more results exist beyond `data`.
          example: false
        data:
          type: array
          items:
            $ref: '#/components/schemas/ResourceEnvelope'
    AssetResource:
      description: 'Envelope-wrapped asset resource (object: asset).'
      allOf:
        - $ref: '#/components/schemas/ResourceEnvelope'
        - $ref: '#/components/schemas/AssetSearchResult'
    ResourceEnvelope:
      type: object
      description: |
        Resource envelope. Domain fields are spread after the
        envelope keys (`id`, `object`, `created`, `livemode`, `metadata`).
        Some Bluum-original resources may emit only `object` + `livemode`
        without `id` / `created` (e.g. one-off action results).
      required:
        - object
        - livemode
      additionalProperties: true
      properties:
        id:
          type: string
          description: Prefixed public id (e.g. `inv_…`, `ord_…`, `dep_…`).
          example: inv_01j9x8m2k7qpzwv3t5r6y8n0ab
        object:
          type: string
          description: The resource type discriminator.
          example: investor
        created:
          type: integer
          nullable: true
          description: Unix-seconds timestamp of resource creation.
          example: 1747776000
        livemode:
          type: boolean
          description: |
            Whether this resource was created against a live API key.
            Test-mode keys always return `false`.
          example: false
        metadata:
          type: object
          additionalProperties:
            type: string
          description: Partner-set key/value map for cross-referencing.
    AssetSearchResult:
      type: object
      description: Asset information including metadata and current price data
      properties:
        id:
          type: string
          description: Unique identifier for the asset
          example: b0b6dd9d-8b9b-48b9-bbb8-bbbb49bb1bbb
        class:
          type: string
          enum:
            - equity
            - etf
            - bond
            - bill
            - note
            - mutual_fund
            - derivative
            - cryptocurrency
            - commodity
            - real_estate
            - cash
          description: >
            Canonical instrument class. Combine with `country` for the full
            picture

            (e.g. `class=equity` + `country=us` corresponds to a US stock).
          example: equity
        country:
          type: string
          nullable: true
          description: >-
            ISO 3166-1 alpha-2 country code (lower-case). Null for
            country-agnostic instruments.
          example: us
        market:
          type: string
          description: |
            Market/exchange code (ISO 10383 MIC):
            - XNAS: NASDAQ
            - XNYS: NYSE
            - BATS: BATS Global Markets
            - ARCA: NYSE Arca
            - OTC: OTC Markets
            - XNSA: Nigerian Exchange
            - XNAI: Nairobi Securities Exchange
          example: XNAS
        market_name:
          type: string
          description: |
            Common exchange/market identifier for display:
            - NASDAQ: NASDAQ (US)
            - NYSE: New York Stock Exchange (US)
            - NGX: Nigerian Exchange (NG)
            - NSE: Nairobi Securities Exchange (KE)
          example: NASDAQ
        market_country:
          type: string
          nullable: true
          description: >-
            ISO 3166-1 alpha-2 country code of the exchange (upper-case). Null
            for global/crypto venues.
          example: US
        market_currency:
          type: string
          description: Primary trading currency of the exchange (ISO 4217).
          example: USD
        symbol:
          type: string
          description: >-
            Asset ticker symbol. For fixed-income assets this is the bond ticker
            when Alpaca provides one (corporates, e.g. "ABBNVX"); treasuries,
            which have no ticker, fall back to the CUSIP. The CUSIP is always
            available as `id` and under `bond.cusip`.
          example: AAPL
        name:
          type: string
          description: Full name of the asset
          example: Apple Inc.
        status:
          type: string
          enum:
            - active
            - inactive
          description: Asset status
          example: active
        tradable:
          type: boolean
          description: Whether the asset is currently tradable
          example: true
        marginable:
          type: boolean
          description: Whether the asset can be traded on margin
          example: true
        shortable:
          type: boolean
          description: Whether the asset can be shorted
          example: true
        easy_to_borrow:
          type: boolean
          description: Whether the asset is easy to borrow for shorting
          example: true
        fractionable:
          type: boolean
          description: Whether the asset can be traded in fractional shares
          example: true
        fractional_eh_enabled:
          type: boolean
          description: >-
            Whether the asset supports fractional trading during extended hours
            (pre/post market)
          example: true
        price:
          type: number
          description: Current/last traded price (optional, when available)
          example: 178.5
        change:
          type: number
          description: Price change from previous close (optional)
          example: 1.5
        changePercent:
          type: number
          description: Percentage change from previous close (optional)
          example: 0.85
        previousClose:
          type: number
          description: Previous day's closing price (optional)
          example: 177
        bidPrice:
          type: number
          description: Current best bid price (optional)
          example: 178.48
        askPrice:
          type: number
          description: Current best ask price (optional)
          example: 178.52
        currency:
          type: string
          description: Currency code for asset pricing (ISO 4217)
          example: USD
        price_timestamp:
          type: string
          format: date-time
          nullable: true
          description: >-
            When the price was recorded by its source. Use this to judge price
            recency.
          example: '2026-05-29T20:00:00.000Z'
        last_synced_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            When the asset row was last refreshed from its provider. Null for
            live (never-persisted) results.
          example: '2026-06-01T02:12:31.000Z'
        bond:
          $ref: '#/components/schemas/BondAttributes'
      required:
        - id
        - class
        - country
        - market
        - market_name
        - market_country
        - market_currency
        - symbol
        - name
        - status
        - tradable
        - marginable
        - shortable
        - easy_to_borrow
        - fractionable
        - fractional_eh_enabled
        - currency
    ErrorEnvelope:
      type: object
      description: |
        Error envelope. The Bluum-specific `BLUM-XXX-XXX`
        code is carried in `error.code`; `error.type` is the broad
        category clients branch on.
      required:
        - error
      properties:
        error:
          type: object
          required:
            - type
            - code
            - message
          properties:
            type:
              type: string
              enum:
                - invalid_request_error
                - authentication_error
                - permission_error
                - not_found_error
                - conflict_error
                - idempotency_error
                - rate_limit_error
                - api_error
              example: invalid_request_error
            code:
              type: string
              description: The Bluum-specific error code.
              example: BLUM-400-001
            message:
              type: string
              description: Developer-facing message.
            param:
              type: string
              description: Field path of the invalid input.
              example: tax_id
            doc_url:
              type: string
              format: uri
              example: https://docs.bluum.finance/errors/BLUM-400-001
            request_log_url:
              type: string
              format: uri
              description: Deep link to the request log in the partner dashboard.
    BondAttributes:
      type: object
      description: |
        Fixed-income attributes. Populated only when `class` is `bond` /
        `bill` / `note`. Equity / crypto / ETF assets omit this block.
      properties:
        cusip:
          type: string
          description: >-
            9-character CUSIP (US bonds). For non-US bonds the canonical id
            lives in `isin`.
          example: 00037BAC6
        isin:
          type: string
          description: 12-character ISIN (international identifier).
          example: US00037BAC63
        bond_status:
          type: string
          enum:
            - outstanding
            - pre_issuance
            - matured
          description: Lifecycle state of the issue.
          example: outstanding
        bond_type:
          type: string
          enum:
            - treasury
            - corporate
            - municipal
            - agency
            - sovereign
          description: Bond category.
          example: corporate
        bond_subtype:
          type: string
          description: >-
            Treasury subtype (`bill` / `note` / `bond`) or corporate
            sub-classification.
          example: bond
        maturity_date:
          type: string
          format: date
          description: Date the bond matures and face value is redeemed.
          example: '2042-05-08'
        issue_date:
          type: string
          format: date
          example: '2012-05-08'
        dated_date:
          type: string
          format: date
        first_coupon_date:
          type: string
          format: date
        next_coupon_date:
          type: string
          format: date
        last_coupon_date:
          type: string
          format: date
        coupon_rate:
          type: string
          description: Annual coupon rate as a decimal (e.g. "0.04375" = 4.375%).
          example: '4.375'
        coupon_type:
          type: string
          description: '"fixed" | "zero" | "floating" | ...'
          example: fixed
        coupon_frequency:
          type: integer
          description: >-
            Payments per year (1=annual, 2=semi_annual, 4=quarterly, 12=monthly,
            0=zero/at_maturity).
          example: 2
        accrual_basis:
          type: string
          description: Day-count convention (`ACT/ACT`, `ACT/360`, `30/360`, ...).
          example: 30/360
        accrued_interest:
          type: number
          description: Accrued interest per 100 face since the last coupon.
          example: 2.795139
        face_value:
          type: string
          description: Par value of one unit, in `currency`.
          example: '1000'
        min_increment:
          type: string
          description: >-
            Minimum face-value purchase increment. Orders must be multiples of
            this.
          example: '2000'
        settlement_period:
          type: integer
          description: >-
            T+N business days for settlement (1 for treasuries, 2 for
            corporates).
          example: 2
        close_price_date:
          type: string
          format: date
          description: Date of the last close price.
          example: '2026-05-29'
        yield_to_maturity:
          type: number
          description: Yield to maturity (annualized decimal).
          example: 5.485755
        yield_to_worst:
          type: number
          description: Yield to worst (annualized decimal).
          example: 5.485755
        callable:
          type: boolean
          example: false
        puttable:
          type: boolean
          example: false
        convertible:
          type: boolean
          example: false
        perpetual:
          type: boolean
          example: false
        next_call_date:
          type: string
          format: date
        next_call_price:
          type: number
        call_type:
          type: string
          example: make_whole
        issuer:
          type: string
          description: Issuing entity. Corporate bonds only — treasuries omit.
          example: ABB Finance (USA) Inc.
        ticker:
          type: string
          description: Bond ticker (Bloomberg-style). Corporate bonds only.
          example: ABBNVX
        sector:
          type: string
          example: Capital Goods
        seniority:
          type: string
          example: Senior
        country_domicile:
          type: string
          description: ISO country of the issuer.
          example: US
        rating:
          type: string
          description: Composite credit rating (currently S&P).
          example: AAA
        sp_rating:
          type: string
          description: S&P rating.
          example: AAA
        sp_outlook:
          type: string
          enum:
            - positive
            - negative
            - stable
            - developing
          example: stable
  responses:
    BadRequestError:
      description: The request was malformed or failed validation.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              type: invalid_request_error
              code: BLUM-400-002
              message: Required field 'symbol' is missing.
              param: symbol
    UnauthorizedError:
      description: Authentication information is missing or invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              type: authentication_error
              code: BLUM-401-001
              message: Missing or invalid Authorization header.
    InternalServerError:
      description: An internal server error occurred.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              type: api_error
              code: BLUM-500-001
              message: An internal server error occurred. Please try again later.
  securitySchemes:
    BluumApiKeyAuth:
      type: http
      scheme: basic
      description: >
        HTTP Basic Authentication using the **API Key** as username and **API
        Secret** as password.
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: |
        JWT token from Clerk authentication

````