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.
| Category | Details |
|---|---|
| Specialisation | Fixed Income Reference Data |
| Coverage | Global |
| Asset Classes | Corporate, Sovereign, ABS, Covered |
| Identifiers | ISIN, FIGI, Bloomberg, 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
- Obtain your API key from the AbsoluteData client portal.
- Ensure your server IP is whitelisted (contact support if needed).
- Include the
x-api-keyheader on every request. - Use HTTPS only — HTTP requests are rejected.
- Respect rate limits (see rate limits) to avoid
429errors. - Use cursor-based pagination for large result sets (see Pagination).
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.
x-api-key: YOUR_API_KEY
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
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
Returns the current health status of the API. Does not require authentication.
curl https://api.absolutedata.ai/v1/health
{
"status": "healthy",
"service": "v1"
}
GET /v1/bonds/isin/{isin}
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
{isin} | String | Required | 12-character ISO 6166 ISIN. Example: US3130B9V234 |
curl -H "x-api-key: YOUR_API_KEY" \
"https://api.absolutedata.ai/v1/bonds/isin/US3130B9V234"
{
"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": { ... }
}
]
}
?isin= as a query parameter on /v1/bonds/new-issuances is blocked. Use this dedicated endpoint instead.
GET /v1/bonds/new-issuances
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.
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 -H "x-api-key: YOUR_API_KEY" \
"https://api.absolutedata.ai/v1/bonds/new-issuances"
curl -H "x-api-key: YOUR_API_KEY" \
"https://api.absolutedata.ai/v1/bonds/new-issuances?currency=USD&page_size=50"
POST /v1/bonds/search
Supports multi-value array filters (up to 25 values per field) for fields such as currency, country, sector, bond type, coupon type, and seniority. At least one filter is required.
400.
Parameters
| Field | Type | Description |
|---|---|---|
currency | String | Array | Single or array of up to 25 ISO 4217 codes. Example: ["USD", "EUR"] |
country_of_incorporation | String | Array | Single or array of ISO 3166-1 codes. Example: ["DE", "FR"] |
sector | String | Array | Single or array. Example: ["Banks"] |
issuer_type | String | Array | Corporate, Government, Agency, Municipal, Supranational, Special Purpose Vehicle, Financial |
bond_type | String | Array | Fixed, Floating, Convertible, Index Linked, Variable |
coupon_type | String | Array | Fixed, Floating, Zero Coupon, Index Linked, Int At Maturity, Non Interest Bearing, Variable |
seniority | String | Array | Senior, Unsubordinated, Subordinated, Junior Subordinated, Tier 1 Subordinated, Tier 2 Subordinated |
issuer_name | String | Issuer name substring match (case-insensitive) |
is_perpetual | Boolean | Filter by perpetual status |
coupon_rate_min | Decimal | Minimum coupon rate (%) |
coupon_rate_max | Decimal | Maximum coupon rate (%) |
amount_issued_min | Decimal | Minimum amount issued |
amount_issued_max | Decimal | Maximum amount issued |
announcement_date_start | Date | Announcement date range start (YYYY-MM-DD) |
announcement_date_end | Date | Announcement date range end |
issue_date_start | Date | Issue date range start. Alias: issue_date_from |
issue_date_end | Date | Issue date range end. Alias: issue_date_to |
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 (1–100, default 10) |
next_cursor | String | Pagination cursor from previous response |
currency: ["USD", "EUR"] matches either). Different fields combine with AND logic.
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
}'
{
"pagination": {
"page": 1,
"page_size": 50,
"total_records": 1092,
"total_pages": 22,
"has_next": true,
"next_cursor": "eyJ..."
},
"items": [
{
"_schema": "bond_reference_data_v1",
"instrument_identifiers": { "isin": "US48130KTM98" },
...
}
]
}
POST /v1/bonds/batch
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 -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 |
{
"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 |
has_next is false, you have reached the final page. Filters must be re-supplied on each page request.
# 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": {
"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 -H "x-api-key: YOUR_API_KEY" \
"https://api.absolutedata.ai/v1/bonds/isin/US3130B9V234"
New Issuances with Filters
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 -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 -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)
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
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
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
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
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;
}