---
title: "List Covenant Data"
url: "https://console.9fin.com/apis/covenants-service/versions/d54352ff-53e9-48ef-9f3e-d1bf83d9fca7/operations/list_covenant_data_v0_covenants_data_get"
---

> Full API specification: https://console.9fin.com/apis/covenants-service/versions/d54352ff-53e9-48ef-9f3e-d1bf83d9fca7.md

# List Covenant Data

`GET` `/v0/covenants/data`

Operation ID: `list_covenant_data_v0_covenants_data_get`

List anonymised covenant data with basic query-param filtering. The response is entity-per-instrument with cursor pagination. Only the query parameters declared for this endpoint are accepted; any other filter-looking query parameter is rejected with a ``VALIDATION_ERROR`` response naming the offending field. Worked examples: 1. Plain (no filters, first page):: GET /v0/covenants/data 2. Filtered (one fixed-field predicate):: GET /v0/covenants/data?instrument.type__eq=Bond 3. Filtered + sorted (comma-separated ``__in``, multi-key ``sort_by``):: GET /v0/covenants/data?instrument.region__in=Europe,US &financials.net_senior_leverage__gte=4.0 &sort_by=terms.issue_date__desc 4. Page 2 with a cursor (``next_cursor`` from the prior page's response, replayed verbatim — the cursor is bound to those exact filters and sort; reusing it with different filters is rejected):: GET /v0/covenants/data?instrument.region__in=Europe,US &financials.net_senior_leverage__gte=4.0 &sort_by=terms.issue_date__desc &cursor=<next_cursor from example 3's response> 5. ``__all`` (AND, not OR - every listed value must be present):: GET /v0/covenants/data?issuer.sponsor__all=Apollo,Blackstone 6. Ratings and company (CFR) ratings - set membership, exactly as the 9fin screener does it. There is no "BB- or better" ordering:: GET /v0/covenants/data?ratings.moodys__in=B1,B2,B3 GET /v0/covenants/data?ratings.s_and_p_cfr__eq=B 7. Size and EBITDA. These are range-valued: on anonymised rows the figure is reported as a bucket, and the filter matches when that bucket OVERLAPS the bound. A match therefore means "this deal's reported range permits the value", not "the exact figure clears it". Only ``__gte``/``__lte`` are accepted - exact and strict comparison against a bucket has no honest meaning:: GET /v0/covenants/data?financials.ebitda__gte=100&terms.amount__lte=500 8. Counterparties and booleans:: GET /v0/covenants/data?parties.bookrunner__contains=Goldman GET /v0/covenants/data?issuer.sponsored__eq=true The complete list of filterable fields, their permitted operators and their value types is served by the filter catalog, and every field in it is accepted here. Fields whose values are anonymised on restricted deals (counterparty names, sponsor name, industry L2/L3, purpose, country of issuer) are absent from those rows and so never match a filter on them.

## Query parameters

- `sort_by` (optional) - Comma-separated sort keys, e.g. 'terms.issue_date__desc,financials.net_senior_leverage__asc'.
- `limit` (integer, optional)
- `cursor` (optional) - Opaque pagination cursor from a prior page's next_cursor; omit on the first page.
- `instrument.type__eq` (optional)
- `instrument.region__in` (optional) - Comma-separated, e.g. 'Europe,US'.
- `instrument.currency__eq` (optional)
- `terms.issue_date__gte` (optional)
- `terms.issue_date__lte` (optional)
- `terms.maturity__gte` (optional)
- `terms.maturity__lte` (optional)
- `financials.net_senior_leverage__gte` (optional)
- `financials.net_senior_leverage__lte` (optional)
- `financials.net_total_leverage__gte` (optional)
- `financials.net_total_leverage__lte` (optional)
- `issuer.sponsor__all` (optional) - Comma-separated; matches only rows co-sponsored by ALL listed names (e.g. 'Apollo,Blackstone' excludes a deal sponsored by only one of them). Reference implementation of a proposed (not yet approved) 9th filter operator - see the worked example below.
- `deal.id__eq` (string, optional) - Filter: deal.id equals.
- `deal.id__in` (string, optional) - Filter: deal.id matches any of (comma-separated).
- `financials.ebitda__gte` (number, optional) - Filter: financials.ebitda greater than or equal to.
- `financials.ebitda__lte` (number, optional) - Filter: financials.ebitda less than or equal to.
- `financials.net_senior_leverage__eq` (number, optional) - Filter: financials.net_senior_leverage equals.
- `financials.net_senior_leverage__gt` (number, optional) - Filter: financials.net_senior_leverage greater than.
- `financials.net_senior_leverage__lt` (number, optional) - Filter: financials.net_senior_leverage less than.
- `financials.net_total_leverage__eq` (number, optional) - Filter: financials.net_total_leverage equals.
- `financials.net_total_leverage__gt` (number, optional) - Filter: financials.net_total_leverage greater than.
- `financials.net_total_leverage__lt` (number, optional) - Filter: financials.net_total_leverage less than.
- `instrument.category__eq` (string, optional) - Filter: instrument.category equals.
- `instrument.category__in` (string, optional) - Filter: instrument.category matches any of (comma-separated).
- `instrument.category__neq` (string, optional) - Filter: instrument.category does not equal.
- `instrument.country_of_issuer__eq` (string, optional) - Filter: instrument.country_of_issuer equals.
- `instrument.country_of_issuer__in` (string, optional) - Filter: instrument.country_of_issuer matches any of (comma-separated).
- `instrument.country_of_issuer__neq` (string, optional) - Filter: instrument.country_of_issuer does not equal.
- `instrument.country_of_risk__eq` (string, optional) - Filter: instrument.country_of_risk equals.
- `instrument.country_of_risk__in` (string, optional) - Filter: instrument.country_of_risk matches any of (comma-separated).
- `instrument.country_of_risk__neq` (string, optional) - Filter: instrument.country_of_risk does not equal.
- `instrument.currency__in` (string, optional) - Filter: instrument.currency matches any of (comma-separated).
- `instrument.currency__neq` (string, optional) - Filter: instrument.currency does not equal.
- `instrument.is_sustainability_linked__eq` (boolean, optional) - Filter: instrument.is_sustainability_linked equals.
- `instrument.purpose__all` (string, optional) - Filter: instrument.purpose matches all of (comma-separated; AND, not OR).
- `instrument.purpose__eq` (string, optional) - Filter: instrument.purpose equals.
- `instrument.purpose__in` (string, optional) - Filter: instrument.purpose matches any of (comma-separated).
- `instrument.region__eq` (string, optional) - Filter: instrument.region equals.
- `instrument.region__neq` (string, optional) - Filter: instrument.region does not equal.
- `instrument.type__in` (string, optional) - Filter: instrument.type matches any of (comma-separated).
- `instrument.type__neq` (string, optional) - Filter: instrument.type does not equal.
- `issuer.company__contains` (string, optional) - Filter: issuer.company contains (case-insensitive substring).
- `issuer.company__eq` (string, optional) - Filter: issuer.company equals.
- `issuer.company__in` (string, optional) - Filter: issuer.company matches any of (comma-separated).
- `issuer.industry__eq` (string, optional) - Filter: issuer.industry equals.
- `issuer.industry__in` (string, optional) - Filter: issuer.industry matches any of (comma-separated).
- `issuer.industry_l2__eq` (string, optional) - Filter: issuer.industry_l2 equals.
- `issuer.industry_l2__in` (string, optional) - Filter: issuer.industry_l2 matches any of (comma-separated).
- `issuer.industry_l3__eq` (string, optional) - Filter: issuer.industry_l3 equals.
- `issuer.industry_l3__in` (string, optional) - Filter: issuer.industry_l3 matches any of (comma-separated).
- `issuer.sponsor__eq` (string, optional) - Filter: issuer.sponsor equals.
- `issuer.sponsor__in` (string, optional) - Filter: issuer.sponsor matches any of (comma-separated).
- `issuer.sponsored__eq` (boolean, optional) - Filter: issuer.sponsored equals.
- `parties.bookrunner__contains` (string, optional) - Filter: parties.bookrunner contains (case-insensitive substring).
- `parties.bookrunner__eq` (string, optional) - Filter: parties.bookrunner equals.
- `parties.bookrunner__in` (string, optional) - Filter: parties.bookrunner matches any of (comma-separated).
- `parties.bookrunner_legal_advisor__contains` (string, optional) - Filter: parties.bookrunner_legal_advisor contains (case-insensitive substring).
- `parties.bookrunner_legal_advisor__eq` (string, optional) - Filter: parties.bookrunner_legal_advisor equals.
- `parties.bookrunner_legal_advisor__in` (string, optional) - Filter: parties.bookrunner_legal_advisor matches any of (comma-separated).
- `parties.company_legal_advisor__contains` (string, optional) - Filter: parties.company_legal_advisor contains (case-insensitive substring).
- `parties.company_legal_advisor__eq` (string, optional) - Filter: parties.company_legal_advisor equals.
- `parties.company_legal_advisor__in` (string, optional) - Filter: parties.company_legal_advisor matches any of (comma-separated).
- `ratings.fitch__eq` (string, optional) - Filter: ratings.fitch equals.
- `ratings.fitch__in` (string, optional) - Filter: ratings.fitch matches any of (comma-separated).
- `ratings.fitch__neq` (string, optional) - Filter: ratings.fitch does not equal.
- `ratings.fitch_cfr__eq` (string, optional) - Filter: ratings.fitch_cfr equals.
- `ratings.fitch_cfr__in` (string, optional) - Filter: ratings.fitch_cfr matches any of (comma-separated).
- `ratings.fitch_cfr__neq` (string, optional) - Filter: ratings.fitch_cfr does not equal.
- `ratings.moodys__eq` (string, optional) - Filter: ratings.moodys equals.
- `ratings.moodys__in` (string, optional) - Filter: ratings.moodys matches any of (comma-separated).
- `ratings.moodys__neq` (string, optional) - Filter: ratings.moodys does not equal.
- `ratings.moodys_cfr__eq` (string, optional) - Filter: ratings.moodys_cfr equals.
- `ratings.moodys_cfr__in` (string, optional) - Filter: ratings.moodys_cfr matches any of (comma-separated).
- `ratings.moodys_cfr__neq` (string, optional) - Filter: ratings.moodys_cfr does not equal.
- `ratings.s_and_p__eq` (string, optional) - Filter: ratings.s_and_p equals.
- `ratings.s_and_p__in` (string, optional) - Filter: ratings.s_and_p matches any of (comma-separated).
- `ratings.s_and_p__neq` (string, optional) - Filter: ratings.s_and_p does not equal.
- `ratings.s_and_p_cfr__eq` (string, optional) - Filter: ratings.s_and_p_cfr equals.
- `ratings.s_and_p_cfr__in` (string, optional) - Filter: ratings.s_and_p_cfr matches any of (comma-separated).
- `ratings.s_and_p_cfr__neq` (string, optional) - Filter: ratings.s_and_p_cfr does not equal.
- `terms.amount__gte` (number, optional) - Filter: terms.amount greater than or equal to.
- `terms.amount__lte` (number, optional) - Filter: terms.amount less than or equal to.
- `terms.coupon__eq` (number, optional) - Filter: terms.coupon equals.
- `terms.coupon__gt` (number, optional) - Filter: terms.coupon greater than.
- `terms.coupon__gte` (number, optional) - Filter: terms.coupon greater than or equal to.
- `terms.coupon__lt` (number, optional) - Filter: terms.coupon less than.
- `terms.coupon__lte` (number, optional) - Filter: terms.coupon less than or equal to.
- `terms.issue_date__eq` (string, date, optional) - Filter: terms.issue_date equals.
- `terms.issue_date__gt` (string, date, optional) - Filter: terms.issue_date greater than.
- `terms.issue_date__lt` (string, date, optional) - Filter: terms.issue_date less than.
- `terms.issue_price__eq` (number, optional) - Filter: terms.issue_price equals.
- `terms.issue_price__gt` (number, optional) - Filter: terms.issue_price greater than.
- `terms.issue_price__gte` (number, optional) - Filter: terms.issue_price greater than or equal to.
- `terms.issue_price__lt` (number, optional) - Filter: terms.issue_price less than.
- `terms.issue_price__lte` (number, optional) - Filter: terms.issue_price less than or equal to.
- `terms.maturity__eq` (string, date, optional) - Filter: terms.maturity equals.
- `terms.maturity__gt` (string, date, optional) - Filter: terms.maturity greater than.
- `terms.maturity__lt` (string, date, optional) - Filter: terms.maturity less than.
- `terms.non_call__eq` (string, optional) - Filter: terms.non_call equals.
- `terms.non_call__in` (string, optional) - Filter: terms.non_call matches any of (comma-separated).
- `terms.non_call__neq` (string, optional) - Filter: terms.non_call does not equal.

## Responses

- `200` - Successful Response
- `401` - Unauthorized - the `Authorization: Bearer` token is missing, expired, malformed, or was not issued for this API. Obtain a new token from the token endpoint using your application's client credentials and retry. Returned by Kong before the request reaches this service; the app itself performs no token check, so this is the only 401 shape.
- `422` - Validation Error
- `429` - Rate limit exceeded. Enforced by Kong.

## OpenAPI definition

```yaml
openapi: 3.1.0
info:
  title: Covenant Data API
  version: 0.7.0
servers:
  - url: https://api.9fin.com
paths:
  /v0/covenants/data:
    get:
      tags:
        - Covenant Data
      summary: List Covenant Data
      description: >-
        List anonymised covenant data with basic query-param filtering.


        The response is entity-per-instrument with cursor pagination. Only the

        query parameters declared for this endpoint are accepted; any other

        filter-looking query parameter is rejected with a ``VALIDATION_ERROR``

        response naming the offending field.


        Worked examples:


        1. Plain (no filters, first page)::

            GET /v0/covenants/data

        2. Filtered (one fixed-field predicate)::

            GET /v0/covenants/data?instrument.type__eq=Bond

        3. Filtered + sorted (comma-separated ``__in``, multi-key ``sort_by``)::

            GET /v0/covenants/data?instrument.region__in=Europe,US
                &financials.net_senior_leverage__gte=4.0
                &sort_by=terms.issue_date__desc

        4. Page 2 with a cursor (``next_cursor`` from the prior page's
           response, replayed verbatim — the cursor is bound to those exact
           filters and sort; reusing it with different filters is rejected)::

            GET /v0/covenants/data?instrument.region__in=Europe,US
                &financials.net_senior_leverage__gte=4.0
                &sort_by=terms.issue_date__desc
                &cursor=<next_cursor from example 3's response>

        5. ``__all`` (AND, not OR - every listed value must be present)::

            GET /v0/covenants/data?issuer.sponsor__all=Apollo,Blackstone

        6. Ratings and company (CFR) ratings - set membership, exactly as the
           9fin screener does it. There is no "BB- or better" ordering::

            GET /v0/covenants/data?ratings.moodys__in=B1,B2,B3
            GET /v0/covenants/data?ratings.s_and_p_cfr__eq=B

        7. Size and EBITDA. These are range-valued: on anonymised rows the
        figure
           is reported as a bucket, and the filter matches when that bucket
           OVERLAPS the bound. A match therefore means "this deal's reported
           range permits the value", not "the exact figure clears it". Only
           ``__gte``/``__lte`` are accepted - exact and strict comparison against
           a bucket has no honest meaning::

            GET /v0/covenants/data?financials.ebitda__gte=100&terms.amount__lte=500

        8. Counterparties and booleans::

            GET /v0/covenants/data?parties.bookrunner__contains=Goldman
            GET /v0/covenants/data?issuer.sponsored__eq=true

        The complete list of filterable fields, their permitted operators and

        their value types is served by the filter catalog, and every field in it

        is accepted here. Fields whose values are anonymised on restricted deals

        (counterparty names, sponsor name, industry L2/L3, purpose, country of

        issuer) are absent from those rows and so never match a filter on them.
      operationId: list_covenant_data_v0_covenants_data_get
      security:
        - HTTPBearer: []
      parameters:
        - name: sort_by
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: "null"
            description: Comma-separated sort keys, e.g.
              'terms.issue_date__desc,financials.net_senior_leverage__asc'.
            title: Sort By
          description: Comma-separated sort keys, e.g.
            'terms.issue_date__desc,financials.net_senior_leverage__asc'.
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            maximum: 100
            minimum: 1
            default: 48
            title: Limit
        - name: cursor
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: "null"
            description: Opaque pagination cursor from a prior page's next_cursor; omit on
              the first page.
            title: Cursor
          description: Opaque pagination cursor from a prior page's next_cursor; omit on
            the first page.
        - name: instrument.type__eq
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: "null"
            examples:
              - Bond
            title: Instrument.Type  Eq
        - name: instrument.region__in
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: "null"
            description: Comma-separated, e.g. 'Europe,US'.
            title: Instrument.Region  In
          description: Comma-separated, e.g. 'Europe,US'.
        - name: instrument.currency__eq
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: "null"
            examples:
              - EUR
            title: Instrument.Currency  Eq
        - name: terms.issue_date__gte
          in: query
          required: false
          schema:
            anyOf:
              - type: string
                format: date
              - type: "null"
            title: Terms.Issue Date  Gte
        - name: terms.issue_date__lte
          in: query
          required: false
          schema:
            anyOf:
              - type: string
                format: date
              - type: "null"
            title: Terms.Issue Date  Lte
        - name: terms.maturity__gte
          in: query
          required: false
          schema:
            anyOf:
              - type: string
                format: date
              - type: "null"
            title: Terms.Maturity  Gte
        - name: terms.maturity__lte
          in: query
          required: false
          schema:
            anyOf:
              - type: string
                format: date
              - type: "null"
            title: Terms.Maturity  Lte
        - name: financials.net_senior_leverage__gte
          in: query
          required: false
          schema:
            anyOf:
              - type: number
              - type: "null"
            title: Financials.Net Senior Leverage  Gte
        - name: financials.net_senior_leverage__lte
          in: query
          required: false
          schema:
            anyOf:
              - type: number
              - type: "null"
            title: Financials.Net Senior Leverage  Lte
        - name: financials.net_total_leverage__gte
          in: query
          required: false
          schema:
            anyOf:
              - type: number
              - type: "null"
            title: Financials.Net Total Leverage  Gte
        - name: financials.net_total_leverage__lte
          in: query
          required: false
          schema:
            anyOf:
              - type: number
              - type: "null"
            title: Financials.Net Total Leverage  Lte
        - name: issuer.sponsor__all
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: "null"
            description: Comma-separated; matches only rows co-sponsored by ALL listed names
              (e.g. 'Apollo,Blackstone' excludes a deal sponsored by only one of
              them). Reference implementation of a proposed (not yet approved)
              9th filter operator - see the worked example below.
            title: Issuer.Sponsor  All
          description: Comma-separated; matches only rows co-sponsored by ALL listed names
            (e.g. 'Apollo,Blackstone' excludes a deal sponsored by only one of
            them). Reference implementation of a proposed (not yet approved) 9th
            filter operator - see the worked example below.
        - name: deal.id__eq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: deal.id equals."
        - name: deal.id__in
          in: query
          required: false
          schema:
            type: string
          description: "Filter: deal.id matches any of (comma-separated)."
        - name: financials.ebitda__gte
          in: query
          required: false
          schema:
            type: number
          description: "Filter: financials.ebitda greater than or equal to."
        - name: financials.ebitda__lte
          in: query
          required: false
          schema:
            type: number
          description: "Filter: financials.ebitda less than or equal to."
        - name: financials.net_senior_leverage__eq
          in: query
          required: false
          schema:
            type: number
          description: "Filter: financials.net_senior_leverage equals."
        - name: financials.net_senior_leverage__gt
          in: query
          required: false
          schema:
            type: number
          description: "Filter: financials.net_senior_leverage greater than."
        - name: financials.net_senior_leverage__lt
          in: query
          required: false
          schema:
            type: number
          description: "Filter: financials.net_senior_leverage less than."
        - name: financials.net_total_leverage__eq
          in: query
          required: false
          schema:
            type: number
          description: "Filter: financials.net_total_leverage equals."
        - name: financials.net_total_leverage__gt
          in: query
          required: false
          schema:
            type: number
          description: "Filter: financials.net_total_leverage greater than."
        - name: financials.net_total_leverage__lt
          in: query
          required: false
          schema:
            type: number
          description: "Filter: financials.net_total_leverage less than."
        - name: instrument.category__eq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: instrument.category equals."
        - name: instrument.category__in
          in: query
          required: false
          schema:
            type: string
          description: "Filter: instrument.category matches any of (comma-separated)."
        - name: instrument.category__neq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: instrument.category does not equal."
        - name: instrument.country_of_issuer__eq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: instrument.country_of_issuer equals."
        - name: instrument.country_of_issuer__in
          in: query
          required: false
          schema:
            type: string
          description: "Filter: instrument.country_of_issuer matches any of
            (comma-separated)."
        - name: instrument.country_of_issuer__neq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: instrument.country_of_issuer does not equal."
        - name: instrument.country_of_risk__eq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: instrument.country_of_risk equals."
        - name: instrument.country_of_risk__in
          in: query
          required: false
          schema:
            type: string
          description: "Filter: instrument.country_of_risk matches any of
            (comma-separated)."
        - name: instrument.country_of_risk__neq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: instrument.country_of_risk does not equal."
        - name: instrument.currency__in
          in: query
          required: false
          schema:
            type: string
          description: "Filter: instrument.currency matches any of (comma-separated)."
        - name: instrument.currency__neq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: instrument.currency does not equal."
        - name: instrument.is_sustainability_linked__eq
          in: query
          required: false
          schema:
            type: boolean
          description: "Filter: instrument.is_sustainability_linked equals."
        - name: instrument.purpose__all
          in: query
          required: false
          schema:
            type: string
          description: "Filter: instrument.purpose matches all of (comma-separated; AND,
            not OR)."
        - name: instrument.purpose__eq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: instrument.purpose equals."
        - name: instrument.purpose__in
          in: query
          required: false
          schema:
            type: string
          description: "Filter: instrument.purpose matches any of (comma-separated)."
        - name: instrument.region__eq
          in: query
          required: false
          schema:
            type: string
            enum:
              - Europe
              - US
          description: "Filter: instrument.region equals."
        - name: instrument.region__neq
          in: query
          required: false
          schema:
            type: string
            enum:
              - Europe
              - US
          description: "Filter: instrument.region does not equal."
        - name: instrument.type__in
          in: query
          required: false
          schema:
            type: string
            enum:
              - Loan
              - Bond
          description: "Filter: instrument.type matches any of (comma-separated)."
        - name: instrument.type__neq
          in: query
          required: false
          schema:
            type: string
            enum:
              - Loan
              - Bond
          description: "Filter: instrument.type does not equal."
        - name: issuer.company__contains
          in: query
          required: false
          schema:
            type: string
          description: "Filter: issuer.company contains (case-insensitive substring)."
        - name: issuer.company__eq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: issuer.company equals."
        - name: issuer.company__in
          in: query
          required: false
          schema:
            type: string
          description: "Filter: issuer.company matches any of (comma-separated)."
        - name: issuer.industry__eq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: issuer.industry equals."
        - name: issuer.industry__in
          in: query
          required: false
          schema:
            type: string
          description: "Filter: issuer.industry matches any of (comma-separated)."
        - name: issuer.industry_l2__eq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: issuer.industry_l2 equals."
        - name: issuer.industry_l2__in
          in: query
          required: false
          schema:
            type: string
          description: "Filter: issuer.industry_l2 matches any of (comma-separated)."
        - name: issuer.industry_l3__eq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: issuer.industry_l3 equals."
        - name: issuer.industry_l3__in
          in: query
          required: false
          schema:
            type: string
          description: "Filter: issuer.industry_l3 matches any of (comma-separated)."
        - name: issuer.sponsor__eq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: issuer.sponsor equals."
        - name: issuer.sponsor__in
          in: query
          required: false
          schema:
            type: string
          description: "Filter: issuer.sponsor matches any of (comma-separated)."
        - name: issuer.sponsored__eq
          in: query
          required: false
          schema:
            type: boolean
          description: "Filter: issuer.sponsored equals."
        - name: parties.bookrunner__contains
          in: query
          required: false
          schema:
            type: string
          description: "Filter: parties.bookrunner contains (case-insensitive substring)."
        - name: parties.bookrunner__eq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: parties.bookrunner equals."
        - name: parties.bookrunner__in
          in: query
          required: false
          schema:
            type: string
          description: "Filter: parties.bookrunner matches any of (comma-separated)."
        - name: parties.bookrunner_legal_advisor__contains
          in: query
          required: false
          schema:
            type: string
          description: "Filter: parties.bookrunner_legal_advisor contains
            (case-insensitive substring)."
        - name: parties.bookrunner_legal_advisor__eq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: parties.bookrunner_legal_advisor equals."
        - name: parties.bookrunner_legal_advisor__in
          in: query
          required: false
          schema:
            type: string
          description: "Filter: parties.bookrunner_legal_advisor matches any of
            (comma-separated)."
        - name: parties.company_legal_advisor__contains
          in: query
          required: false
          schema:
            type: string
          description: "Filter: parties.company_legal_advisor contains (case-insensitive
            substring)."
        - name: parties.company_legal_advisor__eq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: parties.company_legal_advisor equals."
        - name: parties.company_legal_advisor__in
          in: query
          required: false
          schema:
            type: string
          description: "Filter: parties.company_legal_advisor matches any of
            (comma-separated)."
        - name: ratings.fitch__eq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: ratings.fitch equals."
        - name: ratings.fitch__in
          in: query
          required: false
          schema:
            type: string
          description: "Filter: ratings.fitch matches any of (comma-separated)."
        - name: ratings.fitch__neq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: ratings.fitch does not equal."
        - name: ratings.fitch_cfr__eq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: ratings.fitch_cfr equals."
        - name: ratings.fitch_cfr__in
          in: query
          required: false
          schema:
            type: string
          description: "Filter: ratings.fitch_cfr matches any of (comma-separated)."
        - name: ratings.fitch_cfr__neq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: ratings.fitch_cfr does not equal."
        - name: ratings.moodys__eq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: ratings.moodys equals."
        - name: ratings.moodys__in
          in: query
          required: false
          schema:
            type: string
          description: "Filter: ratings.moodys matches any of (comma-separated)."
        - name: ratings.moodys__neq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: ratings.moodys does not equal."
        - name: ratings.moodys_cfr__eq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: ratings.moodys_cfr equals."
        - name: ratings.moodys_cfr__in
          in: query
          required: false
          schema:
            type: string
          description: "Filter: ratings.moodys_cfr matches any of (comma-separated)."
        - name: ratings.moodys_cfr__neq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: ratings.moodys_cfr does not equal."
        - name: ratings.s_and_p__eq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: ratings.s_and_p equals."
        - name: ratings.s_and_p__in
          in: query
          required: false
          schema:
            type: string
          description: "Filter: ratings.s_and_p matches any of (comma-separated)."
        - name: ratings.s_and_p__neq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: ratings.s_and_p does not equal."
        - name: ratings.s_and_p_cfr__eq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: ratings.s_and_p_cfr equals."
        - name: ratings.s_and_p_cfr__in
          in: query
          required: false
          schema:
            type: string
          description: "Filter: ratings.s_and_p_cfr matches any of (comma-separated)."
        - name: ratings.s_and_p_cfr__neq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: ratings.s_and_p_cfr does not equal."
        - name: terms.amount__gte
          in: query
          required: false
          schema:
            type: number
          description: "Filter: terms.amount greater than or equal to."
        - name: terms.amount__lte
          in: query
          required: false
          schema:
            type: number
          description: "Filter: terms.amount less than or equal to."
        - name: terms.coupon__eq
          in: query
          required: false
          schema:
            type: number
          description: "Filter: terms.coupon equals."
        - name: terms.coupon__gt
          in: query
          required: false
          schema:
            type: number
          description: "Filter: terms.coupon greater than."
        - name: terms.coupon__gte
          in: query
          required: false
          schema:
            type: number
          description: "Filter: terms.coupon greater than or equal to."
        - name: terms.coupon__lt
          in: query
          required: false
          schema:
            type: number
          description: "Filter: terms.coupon less than."
        - name: terms.coupon__lte
          in: query
          required: false
          schema:
            type: number
          description: "Filter: terms.coupon less than or equal to."
        - name: terms.issue_date__eq
          in: query
          required: false
          schema:
            type: string
            format: date
          description: "Filter: terms.issue_date equals."
        - name: terms.issue_date__gt
          in: query
          required: false
          schema:
            type: string
            format: date
          description: "Filter: terms.issue_date greater than."
        - name: terms.issue_date__lt
          in: query
          required: false
          schema:
            type: string
            format: date
          description: "Filter: terms.issue_date less than."
        - name: terms.issue_price__eq
          in: query
          required: false
          schema:
            type: number
          description: "Filter: terms.issue_price equals."
        - name: terms.issue_price__gt
          in: query
          required: false
          schema:
            type: number
          description: "Filter: terms.issue_price greater than."
        - name: terms.issue_price__gte
          in: query
          required: false
          schema:
            type: number
          description: "Filter: terms.issue_price greater than or equal to."
        - name: terms.issue_price__lt
          in: query
          required: false
          schema:
            type: number
          description: "Filter: terms.issue_price less than."
        - name: terms.issue_price__lte
          in: query
          required: false
          schema:
            type: number
          description: "Filter: terms.issue_price less than or equal to."
        - name: terms.maturity__eq
          in: query
          required: false
          schema:
            type: string
            format: date
          description: "Filter: terms.maturity equals."
        - name: terms.maturity__gt
          in: query
          required: false
          schema:
            type: string
            format: date
          description: "Filter: terms.maturity greater than."
        - name: terms.maturity__lt
          in: query
          required: false
          schema:
            type: string
            format: date
          description: "Filter: terms.maturity less than."
        - name: terms.non_call__eq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: terms.non_call equals."
        - name: terms.non_call__in
          in: query
          required: false
          schema:
            type: string
          description: "Filter: terms.non_call matches any of (comma-separated)."
        - name: terms.non_call__neq
          in: query
          required: false
          schema:
            type: string
          description: "Filter: terms.non_call does not equal."
      responses:
        "200":
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CovenantDataSearchResponse"
        "401":
          description: "Unauthorized - the `Authorization: Bearer` token is missing,
            expired, malformed, or was not issued for this API. Obtain a new
            token from the token endpoint using your application's client
            credentials and retry. Returned by Kong before the request reaches
            this service; the app itself performs no token check, so this is the
            only 401 shape."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/KongGatewayError"
        "422":
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "429":
          description: Rate limit exceeded. Enforced by Kong.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/KongGatewayError"
security:
  - HTTPBearer: []
components:
  schemas:
    CovenantDataSearchResponse:
      properties:
        items:
          items:
            $ref: "#/components/schemas/CovenantDataRecord"
          type: array
          title: Items
        total:
          anyOf:
            - type: integer
            - type: "null"
          title: Total
        next_cursor:
          anyOf:
            - type: string
            - type: "null"
          title: Next Cursor
      type: object
      required:
        - items
      title: CovenantDataSearchResponse
    KongGatewayError:
      type: object
      properties:
        message:
          type: string
          title: Message
      required:
        - message
      title: KongGatewayError
    ErrorResponse:
      description: The error envelope returned by every non-2xx response from this service.
      properties:
        error_code:
          $ref: "#/components/schemas/ErrorCode"
        message:
          title: Message
          type: string
        trace_id:
          title: Trace Id
          type: string
      required:
        - error_code
        - message
        - trace_id
      title: ErrorResponse
      type: object
    CovenantDataRecord:
      properties:
        instrument:
          $ref: "#/components/schemas/Instrument"
        issuer:
          $ref: "#/components/schemas/Issuer"
        deal:
          $ref: "#/components/schemas/Deal"
        terms:
          $ref: "#/components/schemas/Terms"
        ratings:
          $ref: "#/components/schemas/Ratings"
        parties:
          $ref: "#/components/schemas/Parties"
        financials:
          $ref: "#/components/schemas/Financials"
        covenants:
          items:
            $ref: "#/components/schemas/Covenant"
          type: array
          title: Covenants
      type: object
      required:
        - instrument
        - issuer
        - deal
        - terms
        - ratings
        - parties
        - financials
      title: CovenantDataRecord
      description: One instrument (entity-per-instrument shape).
    ErrorCode:
      enum:
        - BAD_REQUEST
        - VALIDATION_ERROR
        - UNAUTHORIZED
        - FORBIDDEN
        - NOT_FOUND
        - METHOD_NOT_ALLOWED
        - RATE_LIMITED
        - INTERNAL_ERROR
        - SERVICE_UNAVAILABLE
      title: ErrorCode
      type: string
    Instrument:
      properties:
        type:
          anyOf:
            - type: string
            - type: "null"
          title: Type
        region:
          anyOf:
            - type: string
            - type: "null"
          title: Region
        currency:
          anyOf:
            - type: string
            - type: "null"
          title: Currency
        country_of_risk:
          anyOf:
            - type: string
            - type: "null"
          title: Country Of Risk
        country_of_issuer:
          anyOf:
            - type: string
            - type: "null"
          title: Country Of Issuer
        category:
          anyOf:
            - type: string
            - type: "null"
          title: Category
        purpose:
          anyOf:
            - type: string
            - type: "null"
          title: Purpose
        is_sustainability_linked:
          anyOf:
            - type: boolean
            - type: "null"
          title: Is Sustainability Linked
      type: object
      title: Instrument
    Issuer:
      properties:
        company:
          anyOf:
            - type: string
            - type: "null"
          title: Company
        industry:
          items:
            type: string
          type: array
          title: Industry
        industry_l2:
          anyOf:
            - type: string
            - type: "null"
          title: Industry L2
        industry_l3:
          anyOf:
            - type: string
            - type: "null"
          title: Industry L3
        sponsor:
          anyOf:
            - type: string
            - type: "null"
          title: Sponsor
        sponsored:
          anyOf:
            - type: boolean
            - type: "null"
          title: Sponsored
      type: object
      title: Issuer
    Deal:
      properties:
        id:
          type: string
          title: Id
        name:
          type: string
          title: Name
      type: object
      required:
        - id
        - name
      title: Deal
      description: |-
        Synthesized deal object.

        ``id`` is a stable hash of the internal deal identity (never the raw
        sequential integer); ``name`` is synthesized from street name + issue
        date + instrument type since there is no human-readable deal-name field
        upstream.
    Terms:
      properties:
        amount:
          anyOf:
            - $ref: "#/components/schemas/Range"
            - type: "null"
        coupon:
          anyOf:
            - type: number
            - type: "null"
          title: Coupon
        issue_date:
          anyOf:
            - type: string
              format: date
            - type: "null"
          title: Issue Date
        maturity:
          anyOf:
            - type: string
              format: date
            - type: "null"
          title: Maturity
        issue_price:
          anyOf:
            - type: number
            - type: "null"
          title: Issue Price
        non_call:
          anyOf:
            - type: string
            - type: "null"
          title: Non Call
      type: object
      title: Terms
    Ratings:
      properties:
        fitch:
          anyOf:
            - type: string
            - type: "null"
          title: Fitch
        moodys:
          anyOf:
            - type: string
            - type: "null"
          title: Moodys
        s_and_p:
          anyOf:
            - type: string
            - type: "null"
          title: S And P
        fitch_cfr:
          anyOf:
            - type: string
            - type: "null"
          title: Fitch Cfr
        moodys_cfr:
          anyOf:
            - type: string
            - type: "null"
          title: Moodys Cfr
        s_and_p_cfr:
          anyOf:
            - type: string
            - type: "null"
          title: S And P Cfr
      type: object
      title: Ratings
      description: |-
        Instrument ratings at issuance, plus company-level (CFR) ratings.

        The ``*_cfr`` values are Corporate Family Ratings - a property of the
        issuer, not the tranche.
    Parties:
      properties:
        bookrunner:
          anyOf:
            - type: string
            - type: "null"
          title: Bookrunner
        company_legal_advisor:
          anyOf:
            - type: string
            - type: "null"
          title: Company Legal Advisor
        bookrunner_legal_advisor:
          anyOf:
            - type: string
            - type: "null"
          title: Bookrunner Legal Advisor
      type: object
      title: Parties
      description: >-
        Counterparties on the instrument.


        All three are real firm names and all three are nulled on restricted
        rows

        (``scramble_func=set_null`` in ``models.py``), mirroring the legacy

        screener's behaviour exactly.
    Financials:
      properties:
        ebitda:
          anyOf:
            - $ref: "#/components/schemas/Range"
            - type: "null"
        net_senior_leverage:
          anyOf:
            - type: number
            - type: "null"
          title: Net Senior Leverage
        net_total_leverage:
          anyOf:
            - type: number
            - type: "null"
          title: Net Total Leverage
      type: object
      title: Financials
    Covenant:
      properties:
        key:
          type: string
          title: Key
        category:
          type: string
          title: Category
        name:
          type: string
          title: Name
        value_type:
          type: string
          enum:
            - string
            - number
            - boolean
          title: Value Type
        value:
          anyOf:
            - type: string
            - type: number
            - type: boolean
          title: Value
        unit:
          anyOf:
            - type: string
            - type: "null"
          title: Unit
      type: object
      required:
        - key
        - category
        - name
        - value_type
        - value
      title: Covenant
      description: >-
        One covenant datapoint, self-describing.


        Carries its own ``key``/``category``/``name`` inline so no second call
        to the

        reference catalog is needed to interpret a search response. ``value`` is

        heterogeneous by datapoint (string, number, bool); the required

        ``value_type`` discriminator disambiguates it, as published in the

        OpenAPI spec.


        ``value`` is required and never null: a covenant entry whose source

        datapoint yields no extractable value is dropped by the composition
        layer

        rather than emitted as ``value: null`` alongside a ``value_type``.

        ``unit`` is omitted from the wire (``response_model_exclude_none``)
        unless

        the value is a number with a unit.
    Range:
      properties:
        min:
          anyOf:
            - type: number
            - type: "null"
          title: Min
        max:
          anyOf:
            - type: number
            - type: "null"
          title: Max
      type: object
      title: Range
      description: Anonymised numeric bucket, e.g. amount/EBITDA ranges.
  securitySchemes:
    HTTPBearer:
      type: http
      scheme: bearer
      bearerFormat: JWT
```
