> ## Documentation Index
> Fetch the complete documentation index at: https://octo-98895abd.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# curve

> One B3 reference curve on one session (B3 reference rates, TaxaSwap.txt, b3_reference_rate, from 2008-01-02), shortest vertex first, every vertex as published: calendar_days, business_days, rate, and whether the vertex is FIXED (vertex_type F, its nominal tenor in vertex_code) or MOVING (M, a contract maturity). PRE is DI x pré (% a.a., compounded on 252 business days; its moving vertices include every DI1 maturity at that contract's settlement rate); DOC is the clean onshore dollar coupon (% a.a., LINEAR on 360 calendar days); DPL is the clean IPCA coupon, a real rate (% a.a., 252 business days), and B3's implied inflation is (1 + PRE) / (1 + DPL) − 1 at the same tenor. rate_basis rides on every row. PAST THE LAST MATURITY OF THE CONTRACT THAT ANCHORS A CURVE (DI1 for PRE, DDI for DOC, DAP for DPL) B3 EXTRAPOLATES the last forward rate, so the long vertices are not prices (B3 Manual de Curvas v21). DPL's shortest vertices lean on the current month's IPCA projection. p_curve is PRE, DOC or DPL and anything else raises 22023 listing them; p_trade_date NULL = the newest session held, and a date with no session returns no rows. Nothing is interpolated. More than 1000 rows RAISES 22023; a session holds about 300 vertices per curve.

**Row cap.** A window producing more than 1000 rows raises SQLSTATE `22023` naming this function. Nothing is trimmed to fit — PostgREST would silently cut the response at 1000 and a cut-short series is indistinguishable from one that simply ends. This function does not page — narrow the window instead.



## OpenAPI

````yaml /openapi.json post /rpc/curve
openapi: 3.1.0
info:
  title: SILO Data API
  version: '75'
  summary: >-
    Read-only Brazilian public financial data: CVM filings, BACEN series, B3
    quotes and the B3 BDI group.
  description: >
    Schema `api` over PostgREST. Views are `GET /<view>`; functions are

    `POST /rpc/<function>` with a JSON body.


    **This document is generated** from the live Postgres catalog by

    `scripts/gen_openapi.py` — `pg_get_function_arguments` for the RPC
    signatures,

    `information_schema.columns` for the view columns, and the granted-to-`anon`

    privilege set for which objects exist at all. It is not hand-maintained, and

    `tests/test_openapi_spec.py` fails the build when it drifts from the SQL.


    ### Two different ceilings


    Reading one for the other is the most expensive mistake on this API.


    * **The row cap refuses.** Fifty-nine set-returning functions raise SQLSTATE
      `22023` when the window they were handed would produce more than 1000 rows.
      Nothing is trimmed, and the error says why and how to fix it (the message,
      plus PostgREST's `details` and `hint`). Five of them (`panel`,
      `quote_history`, `fund_nav`, `index_history`, `trade_consolidated_history`)
      take a `p_after` cursor so you can walk the series; the other fifty-four ask you to narrow the window. `fund_nav` paging
      additionally REQUIRES `p_entity_type` — its cursor is a bare period, which
      is unique only within one family, and CNPJs that file under both `fi` and
      `fidc` in the same month would otherwise be ambiguous.
    * **The tier ceiling clamps.** Three other functions (`search_funds`,
      `option_chain`, `option_exercises`) silently lower `p_limit` to a per-tier maximum. No error is raised, so the
      only way to know the result was cut is to know the ceiling. Signing in
      raises it.

    Separately from both, PostgREST's server-wide `db-max-rows = 1000` cuts
    every

    response, on every endpoint, for every tier. On the GET views
    `Content-Range`

    is the signal (`0-999/*`); `Prefer: count=exact` turns the `*` into a total.


    ### Retention


    Most of this warehouse is append-only history. The **B3 BDI group** —

    `short_interest`, `short_interest_by_sector`, `investor_flow`,

    `lending_trades`, `lending_participants` — is not: B3 keeps roughly 21
    business

    days and publishes no archive. A missed session cannot be bought back. See

    Market Coverage.
  license:
    name: See repository
    url: https://github.com/PedroDnT/SILO-BZ
servers:
  - url: https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1
    description: Supabase PostgREST, schema `api`
security:
  - apikey: []
tags:
  - name: ANBIMA
  - name: Company events
  - name: Coverage & catalog
  - name: Derivatives
  - name: FIDC
  - name: FNET documents
  - name: Financials
  - name: Funds
  - name: Holdings
  - name: Inflation
  - name: Lookup
  - name: Macro
  - name: Macro expectations
  - name: Other
  - name: Panel
  - name: Portfolio
  - name: Quotes
  - name: Rates
  - name: Research
  - name: Screens
  - name: Securities lending
  - name: Short interest & flows
paths:
  /rpc/curve:
    post:
      tags:
        - Rates
      summary: curve
      description: >-
        One B3 reference curve on one session (B3 reference rates, TaxaSwap.txt,
        b3_reference_rate, from 2008-01-02), shortest vertex first, every vertex
        as published: calendar_days, business_days, rate, and whether the vertex
        is FIXED (vertex_type F, its nominal tenor in vertex_code) or MOVING (M,
        a contract maturity). PRE is DI x pré (% a.a., compounded on 252
        business days; its moving vertices include every DI1 maturity at that
        contract's settlement rate); DOC is the clean onshore dollar coupon (%
        a.a., LINEAR on 360 calendar days); DPL is the clean IPCA coupon, a real
        rate (% a.a., 252 business days), and B3's implied inflation is (1 +
        PRE) / (1 + DPL) − 1 at the same tenor. rate_basis rides on every row.
        PAST THE LAST MATURITY OF THE CONTRACT THAT ANCHORS A CURVE (DI1 for
        PRE, DDI for DOC, DAP for DPL) B3 EXTRAPOLATES the last forward rate, so
        the long vertices are not prices (B3 Manual de Curvas v21). DPL's
        shortest vertices lean on the current month's IPCA projection. p_curve
        is PRE, DOC or DPL and anything else raises 22023 listing them;
        p_trade_date NULL = the newest session held, and a date with no session
        returns no rows. Nothing is interpolated. More than 1000 rows RAISES
        22023; a session holds about 300 vertices per curve.


        **Row cap.** A window producing more than 1000 rows raises SQLSTATE
        `22023` naming this function. Nothing is trimmed to fit — PostgREST
        would silently cut the response at 1000 and a cut-short series is
        indistinguishable from one that simply ends. This function does not page
        — narrow the window instead.
      operationId: rpc_curve
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                p_curve:
                  type:
                    - string
                    - 'null'
                  description: Defaults to `'PRE'::text`.
                  default: PRE
                p_trade_date:
                  type:
                    - string
                    - 'null'
                  format: date
                  description: Defaults to `NULL::date`.
                  default: null
      responses:
        '200':
          description: >-
            The result set, shortest vertex first. An unknown id is an empty
            array, not a 404 and never a guessed value.
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    trade_date:
                      type:
                        - string
                        - 'null'
                      format: date
                    curve:
                      type:
                        - string
                        - 'null'
                    calendar_days:
                      type:
                        - integer
                        - 'null'
                      format: int32
                    business_days:
                      type:
                        - integer
                        - 'null'
                      format: int32
                    rate:
                      type:
                        - number
                        - 'null'
                    rate_basis:
                      type:
                        - string
                        - 'null'
                    vertex_type:
                      type:
                        - string
                        - 'null'
                    vertex_code:
                      type:
                        - string
                        - 'null'
                    source:
                      type:
                        - string
                        - 'null'
        '400':
          description: >-
            Bad request. Contract violations raise SQLSTATE `22023` with a
            message naming the limit or the argument at fault.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: >-
            No usable `apikey`, or a request for a schema outside `api`.
            `Accept-Profile: public` and any `cvm_*` / `b3_cotahist` / `cia_*`
            path answer 401 for every caller, by grant — schema `api` is the
            entire public surface.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: No such endpoint in schema `api`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    Error:
      type: object
      description: >-
        PostgREST error body. `code` carries the SQLSTATE — `22023` is a
        contract refusal.
      properties:
        code:
          type:
            - string
            - 'null'
          examples:
            - '22023'
        message:
          type:
            - string
            - 'null'
        details:
          type:
            - string
            - 'null'
        hint:
          type:
            - string
            - 'null'
  securitySchemes:
    apikey:
      type: apiKey
      in: header
      name: apikey
      description: >-
        The publishable key (`sb_publishable_…`), on every request. It is NOT a
        JWT — sending it as `Authorization: Bearer` is rejected as an invalid
        JWT. It identifies the project, not you, and maps to the Postgres `anon`
        role.

````

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