Fixed Income API

Structured access to global bond reference data — issuer details, terms & conditions, coupon information, and 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.

Category Details
Specialisation Fixed Income Reference Data
Coverage Global
Asset Classes Corporate, Sovereign, ABS, Covered
Identifiers ISIN, FIGI, LEI
Delivery Real-time REST API + Bulk Feed
Security API Key + IP Whitelisting
Support support@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 Status IP Configuration Result
Valid API Key No IP whitelist Request permitted
Valid API Key IP whitelisted Request permitted
Valid API Key IP not whitelisted 403 Forbidden
Invalid / Missing Any 401 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
Method Endpoint Description
GET /v1/health Service health check
GET /v1/bonds/isin/{isin} Single bond lookup by ISIN
GET /v1/bonds/new-issuances Bonds announced within ±7 days
POST /v1/bonds/search Advanced search with multi-value filters
POST /v1/bonds/batch Bulk 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

Parameter Type Required Description
{isin} String Required 12-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

Parameter Type Description
currency String ISO 4217 currency code. Examples: USD, EUR, GBP
country_of_incorporation String ISO 3166-1 alpha-2 country code (e.g., US, DE, GB)
sector String Issuer sector classification (e.g., Banks, Oil & Gas)
issuer_type Enum Corporate, Government, Agency, Municipal, Supranational, Special Purpose Vehicle, Financial
bond_type Enum Fixed, Floating, Convertible, Index Linked, Variable
coupon_type Enum Fixed, Floating, Zero Coupon, Index Linked, Int At Maturity, Non Interest Bearing, Variable
seniority Enum Senior, Unsubordinated, Subordinated, Junior Subordinated, Tier 1 Subordinated, Tier 2 Subordinated
is_perpetual Boolean Filter by perpetual status (true or false)
issuer_name String Full or partial issuer name. Case-insensitive substring match. Max 200 chars.
coupon_rate_min Decimal Minimum coupon rate (%). Example: 3.5
coupon_rate_max Decimal Maximum coupon rate (%). Example: 5.0
amount_issued_min Decimal Minimum amount issued (nominal)
amount_issued_max Decimal Maximum amount issued (nominal)
maturity_date_start Date Maturity date range start. Alias: maturity_date_from
maturity_date_end Date Maturity date range end. Alias: maturity_date_to
page_size Integer Results per page. Range: 1–100. Default: 10.
next_cursor String Opaque 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

Field Type Required Description
isins Array Required Array 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

Field Type Description
summary.found Integer Number of ISINs successfully matched
summary.not_found Integer Valid ISINs with no matching bond
summary.invalid Integer ISINs that failed format validation
items Array Full bond objects for matched ISINs
not_found Array ISIN strings that were valid but had no match
invalid Array Objects 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

Field Type Description
page Integer Current page number (1-based)
page_size Integer Number of items per page
total_records Integer Total matching records across all pages
total_pages Integer Total number of pages
has_next Boolean Whether more pages are available
next_cursor String Opaque base64 cursor for the next page (null on last page)

Parameters

Parameter Type Description
page_size Integer Results per page. Range: 1–100. Default: 10.
next_cursor String Pass 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

Status Code Description
400 INVALID_PARAMETER Invalid parameter value or format
400 INVALID_REQUEST Missing required field or malformed request body
401 UNAUTHORIZED Missing API key
403 ACCESS_DENIED IP not whitelisted, key suspended, or key expired
404 NOT_FOUND Route or resource does not exist
405 METHOD_NOT_ALLOWED Wrong HTTP method for this route
429 QUOTA_EXCEEDED Hit or record quota exceeded
429 RATE_LIMITED API Gateway rate limit exceeded
500 INTERNAL_ERROR Unhandled server exception
503 SERVICE_UNAVAILABLE DynamoDB unreachable

Response Headers

Header Value
Content-Type application/json
Access-Control-Allow-Origin *
Cache-Control no-store
X-Content-Type-Options nosniff

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;
}