Fixed Income API

Structured access to global bond reference data — issuer details, terms & conditions, coupon information, and Bloomberg identifiers.

AbsoluteData is a specialist provider of precision fixed income reference data. We deliver a comprehensive, accurate, and timely static data layer for a vast universe of global fixed income instruments — covering corporate bonds, government securities, covered bonds, ABS, and emerging market debt.

CategoryDetails
SpecialisationFixed Income Reference Data
CoverageGlobal
Asset ClassesCorporate, Sovereign, ABS, Covered
IdentifiersISIN, FIGI, Bloomberg, LEI
DeliveryReal-time REST API + Bulk Feed
SecurityAPI Key + IP Whitelisting
Supportsupport@absolutedata.ai

Data Dictionary

Complete field reference for the API response schema. Enter your API key above to see personalized field access and full API documentation.

Quick Start

  1. Obtain your API key from the AbsoluteData client portal.
  2. Ensure your server IP is whitelisted (contact support if needed).
  3. Include the x-api-key header on every request.
  4. Use HTTPS only — HTTP requests are rejected.
  5. Respect rate limits (see rate limits) to avoid 429 errors.
  6. Use cursor-based pagination for large result sets (see Pagination).
Base URL: All requests use https://api.absolutedata.ai over HTTPS.

Authentication

Every request must include an API key in the x-api-key HTTP header. Unauthenticated requests receive a 401 Unauthorized response.

Header
x-api-key: YOUR_API_KEY
Security: API keys are sensitive credentials. Never expose them in client-side code, version control, or public repositories. Rotate keys immediately if compromised.

IP Whitelisting

For enhanced security, AbsoluteData supports IP address whitelisting. Once configured, only requests from approved IP ranges are accepted.

API Key StatusIP ConfigurationResult
Valid API KeyNo IP whitelistRequest permitted
Valid API KeyIP whitelistedRequest permitted
Valid API KeyIP not whitelisted403 Forbidden
Invalid / MissingAny401 Unauthorized

Key Expiry

API keys may have an expiration date. Requests made with an expired key receive a 403 ACCESS_DENIED response. Contact support@absolutedata.ai to renew or extend your key.

Base URL

Base URL
https://api.absolutedata.ai
MethodEndpointDescription
GET/v1/healthService health check
GET/v1/bonds/isin/{isin}Single bond lookup by ISIN
GET/v1/bonds/new-issuancesBonds announced within ±7 days
POST/v1/bonds/searchAdvanced search with multi-value filters
POST/v1/bonds/batchBulk ISIN lookup (up to 500)

GET /v1/health

GET /v1/health Service health check — returns API status and version.

Returns the current health status of the API. Does not require authentication.

cURL
curl https://api.absolutedata.ai/v1/health
Response
{
  "status": "healthy",
  "service": "v1"
}

GET /v1/bonds/isin/{isin}

GET /v1/bonds/isin/{isin} Single bond lookup by ISIN path parameter.

Parameters

ParameterTypeRequiredDescription
{isin}StringRequired12-character ISO 6166 ISIN. Example: US3130B9V234
cURL
curl -H "x-api-key: YOUR_API_KEY" \
  "https://api.absolutedata.ai/v1/bonds/isin/US3130B9V234"
Response 200
{
  "pagination": {
    "page": 1,
    "page_size": 1,
    "total_records": 1,
    "total_pages": 1,
    "has_next": false,
    "next_cursor": null
  },
  "items": [
    {
      "_schema": "bond_reference_data_v1",
      "instrument_identifiers": { "isin": "US3130B9V234", "figi": "BBG020W0CFT3" },
      "issuer": { "issuer_name": "Federal Home Loan Banks", ... },
      "terms_and_conditions": { ... },
      "coupon": { ... },
      "third_party_identifiers": { ... }
    }
  ]
}
Note: Using ?isin= as a query parameter on /v1/bonds/new-issuances is blocked. Use this dedicated endpoint instead.

GET /v1/bonds/new-issuances

GET /v1/bonds/new-issuances Bonds announced within ±7 days.

Returns bond reference data for recently announced instruments. Always queries a fixed ±7 day window from today, sorted by announcement date descending. Apply attribute filters within this window.

Fixed date window: This endpoint always queries ±7 days around today. Date parameters (announcement_date_start/end, issue_date_start/end) are ignored. Use POST /v1/bonds/search for custom date range queries.

Parameters

ParameterTypeDescription
currencyStringISO 4217 currency code. Examples: USD, EUR, GBP
country_of_incorporationStringISO 3166-1 alpha-2 country code (e.g., US, DE, GB)
sectorStringIssuer sector classification (e.g., Banks, Oil & Gas)
issuer_typeEnumCorporate, Government, Agency, Municipal, Supranational, Special Purpose Vehicle, Financial
bond_typeEnumFixed, Floating, Convertible, Index Linked, Variable
coupon_typeEnumFixed, Floating, Zero Coupon, Index Linked, Int At Maturity, Non Interest Bearing, Variable
seniorityEnumSenior, Unsubordinated, Subordinated, Junior Subordinated, Tier 1 Subordinated, Tier 2 Subordinated
is_perpetualBooleanFilter by perpetual status (true or false)
issuer_nameStringFull or partial issuer name. Case-insensitive substring match. Max 200 chars.
coupon_rate_minDecimalMinimum coupon rate (%). Example: 3.5
coupon_rate_maxDecimalMaximum coupon rate (%). Example: 5.0
amount_issued_minDecimalMinimum amount issued (nominal)
amount_issued_maxDecimalMaximum amount issued (nominal)
maturity_date_startDateMaturity date range start. Alias: maturity_date_from
maturity_date_endDateMaturity date range end. Alias: maturity_date_to
page_sizeIntegerResults per page. Range: 1–100. Default: 10.
next_cursorStringOpaque cursor from previous response. Legacy alias: next_token
cURL — All new issuances
curl -H "x-api-key: YOUR_API_KEY" \
  "https://api.absolutedata.ai/v1/bonds/new-issuances"
cURL — Filtered
curl -H "x-api-key: YOUR_API_KEY" \
  "https://api.absolutedata.ai/v1/bonds/new-issuances?currency=USD&page_size=50"

POST /v1/bonds/batch

POST /v1/bonds/batch Bulk ISIN lookup — up to 500 ISINs per request.

Retrieve multiple bonds by ISIN in a single request. Results are bucketed into items (found), not_found, and invalid.

Parameters

FieldTypeRequiredDescription
isinsArrayRequiredArray of ISIN strings (1–500). Each must be 12 characters.
cURL
curl -X POST "https://api.absolutedata.ai/v1/bonds/batch" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "isins": ["US48130KTM98", "US3130B9VY35", "US0000000000", "BADISIN"]
  }'

Response Structure

FieldTypeDescription
summary.foundIntegerNumber of ISINs successfully matched
summary.not_foundIntegerValid ISINs with no matching bond
summary.invalidIntegerISINs that failed format validation
itemsArrayFull bond objects for matched ISINs
not_foundArrayISIN strings that were valid but had no match
invalidArrayObjects with input and reason
Response 200
{
  "summary": { "found": 2, "not_found": 1, "invalid": 1 },
  "items": [
    {
      "_schema": "bond_reference_data_v1",
      "instrument_identifiers": { "isin": "US48130KTM98", "figi": "BBG00N1P0GZ7" },
      "issuer": {
        "issuer_name": "JPMORGAN CHASE & CO",
        "issuer_type": "Corporate",
        "lei": "8I5DZWZKVSZI1NUHU748",
        "domicile": { "country_of_incorporation": "US" },
        "classification": { "sector": "Financial" }
      },
      "terms_and_conditions": {
        "announcement_date": "2024-01-15",
        "issue_date": "2024-01-22",
        "maturity_date": "2029-01-22",
        "issue_currency": "USD",
        "amount_issued": "1500000000",
        "bond_type": "Fixed",
        "seniority": "SENIOR"
      },
      "coupon": {
        "coupon_type": "Fixed",
        "issuance_coupon": "4.750",
        "interest_payment_frequency": "Semi-Annual"
      }
    }
  ],
  "not_found": ["US0000000000"],
  "invalid": [
    { "input": "BADISIN", "reason": "Invalid ISIN format." }
  ]
}

Pagination

The API uses cursor-based pagination. Every paginated response includes a pagination object with full metadata.

Pagination Response Object

FieldTypeDescription
pageIntegerCurrent page number (1-based)
page_sizeIntegerNumber of items per page
total_recordsIntegerTotal matching records across all pages
total_pagesIntegerTotal number of pages
has_nextBooleanWhether more pages are available
next_cursorStringOpaque base64 cursor for the next page (null on last page)

Parameters

ParameterTypeDescription
page_sizeIntegerResults per page. Range: 1–100. Default: 10.
next_cursorStringPass the next_cursor from the previous response. Legacy alias: next_token
Important: The cursor is an opaque base64 string. When has_next is false, you have reached the final page. Filters must be re-supplied on each page request.
Pagination Flow
# Step 1: First request — no cursor needed
GET /v1/bonds/new-issuances?currency=USD&coupon_type=Fixed&page_size=10

# Step 2: Response includes next_cursor → pass it in the next request
GET /v1/bonds/new-issuances?currency=USD&coupon_type=Fixed
    &page_size=10&next_cursor=eyJhbm5vdW5jZW1lbnR...

# Step 3: Keep repeating until has_next is false

Your Plan & Rate Limits

Each API key has configurable usage limits. When any limit is exceeded, the API returns 429 Too Many Requests.

Error Responses

All errors follow a standard JSON structure for consistent client-side handling.

Error Format
{
  "error": {
    "type": "Bad Request",
    "code": "INVALID_PARAMETER",
    "message": "Human-readable description",
    "field": "parameter_name",
    "request_id": "uuid"
  }
}

Error Codes

StatusCodeDescription
400INVALID_PARAMETERInvalid parameter value or format
400INVALID_REQUESTMissing required field or malformed request body
401UNAUTHORIZEDMissing API key
403ACCESS_DENIEDIP not whitelisted, key suspended, or key expired
404NOT_FOUNDRoute or resource does not exist
405METHOD_NOT_ALLOWEDWrong HTTP method for this route
429QUOTA_EXCEEDEDHit or record quota exceeded
429RATE_LIMITEDAPI Gateway rate limit exceeded
500INTERNAL_ERRORUnhandled server exception
503SERVICE_UNAVAILABLEDynamoDB unreachable

Response Headers

HeaderValue
Content-Typeapplication/json
Access-Control-Allow-Origin*
Cache-Controlno-store
X-Content-Type-Optionsnosniff

Code Examples — cURL

Single Bond Lookup

cURL
curl -H "x-api-key: YOUR_API_KEY" \
  "https://api.absolutedata.ai/v1/bonds/isin/US3130B9V234"

New Issuances with Filters

cURL
curl -H "x-api-key: YOUR_API_KEY" \
  "https://api.absolutedata.ai/v1/bonds/new-issuances?currency=USD&coupon_type=Fixed&page_size=20"

POST Search

cURL
curl -X POST "https://api.absolutedata.ai/v1/bonds/search" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "currency": ["USD", "EUR"],
    "bond_type": ["Fixed"],
    "coupon_rate_min": 4.0,
    "maturity_date_start": "2030-01-01",
    "page_size": 50
  }'

Batch Lookup

cURL
curl -X POST "https://api.absolutedata.ai/v1/bonds/batch" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "isins": ["US48130KTM98", "US3130B9VY35", "INVALID123"]
  }'

Code Examples — Python

Pagination (Fetch All Pages)

Python
import requests

API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.absolutedata.ai"
HEADERS = {"x-api-key": API_KEY}

def fetch_all_bonds(filters: dict) -> list:
    all_bonds = []
    params = dict(filters)
    while True:
        resp = requests.get(
            f"{BASE_URL}/v1/bonds/new-issuances",
            headers=HEADERS, params=params
        )
        resp.raise_for_status()
        data = resp.json()
        all_bonds.extend(data["items"])
        pagination = data["pagination"]
        print(f"  Page {pagination['page']}: {len(data['items'])} bonds")
        if not pagination["has_next"]:
            break
        params["next_cursor"] = pagination["next_cursor"]
    return all_bonds

bonds = fetch_all_bonds({"currency": "USD", "coupon_type": "Fixed"})
print(f"Total: {len(bonds)} bonds")

POST Search

Python
import requests

resp = requests.post(
    "https://api.absolutedata.ai/v1/bonds/search",
    headers={"x-api-key": "YOUR_API_KEY"},
    json={
        "currency": ["USD", "EUR"],
        "bond_type": ["Fixed"],
        "coupon_rate_min": 4.0,
        "maturity_date_start": "2030-01-01",
        "page_size": 50
    }
)
data = resp.json()
print(f"Found {data['pagination']['total_records']} bonds")

Batch Lookup

Python
import requests

resp = requests.post(
    "https://api.absolutedata.ai/v1/bonds/batch",
    headers={"x-api-key": "YOUR_API_KEY"},
    json={"isins": ["US48130KTM98", "US3130B9VY35", "INVALID123"]}
)
data = resp.json()
print(f"Found: {data['summary']['found']}, "
      f"Not found: {data['summary']['not_found']}, "
      f"Invalid: {data['summary']['invalid']}")

Client Class

Python
import os, requests

class AbsoluteDataClient:
    BASE = "https://api.absolutedata.ai"

    def __init__(self, api_key=None):
        self.session = requests.Session()
        self.session.headers["x-api-key"] = api_key or os.environ["ABSOLUTEDATA_API_KEY"]

    def get_bond(self, isin):
        r = self.session.get(f"{self.BASE}/v1/bonds/isin/{isin}")
        r.raise_for_status()
        items = r.json().get("items", [])
        return items[0] if items else None

    def new_issuances(self, **filters):
        all_items = []
        params = {k: v for k, v in filters.items() if v is not None}
        while True:
            r = self.session.get(f"{self.BASE}/v1/bonds/new-issuances", params=params)
            r.raise_for_status()
            data = r.json()
            all_items.extend(data.get("items", []))
            if not data["pagination"]["has_next"]:
                break
            params["next_cursor"] = data["pagination"]["next_cursor"]
        return all_items

    def search(self, body):
        r = self.session.post(f"{self.BASE}/v1/bonds/search", json=body)
        r.raise_for_status()
        return r.json()

    def batch(self, isins):
        r = self.session.post(f"{self.BASE}/v1/bonds/batch", json={"isins": isins})
        r.raise_for_status()
        return r.json()

Code Examples — JavaScript / Node.js

JavaScript
const axios = require("axios");

const client = axios.create({
  baseURL: "https://api.absolutedata.ai",
  headers: { "x-api-key": process.env.ABSOLUTEDATA_API_KEY },
});

// Single bond lookup
async function getBondByISIN(isin) {
  const { data } = await client.get(`/v1/bonds/isin/${isin}`);
  return data.items[0] ?? null;
}

// Paginated fetch
async function fetchAllBonds(filters) {
  const allBonds = [];
  let nextCursor = null;
  do {
    const params = { ...filters };
    if (nextCursor) params.next_cursor = nextCursor;
    const { data } = await client.get("/v1/bonds/new-issuances", { params });
    allBonds.push(...data.items);
    nextCursor = data.pagination.has_next ? data.pagination.next_cursor : null;
  } while (nextCursor);
  return allBonds;
}

// Advanced search
async function searchBonds(body) {
  const { data } = await client.post("/v1/bonds/search", body);
  return data;
}

// Batch lookup
async function batchLookup(isins) {
  const { data } = await client.post("/v1/bonds/batch", { isins });
  return data;
}