What can data actually tell you about a country's creditworthiness?
Three endpoints answer three genuinely different questions about sovereign credit: what an agency says, what the market charges, and how large the market doing the charging actually is. They arrive at three different frequencies from three different publishers, and treating any of them as the same kind of fact is where the trouble starts.
The opinion
GET /credit-risk/sovereign/credit-ratings takes filter[country] (ISO Alpha-3 code or country name), filter[as_of], page[offset], page[limit] and fmt. Asking for the United States returns exactly one row:
{"country_iso3": "USA", "country_name": "United States",
"as_of_date": "2026-01-01T00:00:00+00:00",
"moodys_rating": "Aa1", "sp_rating": "AA+", "fitch_rating": "AA+",
"source": "damodaran"}
Its meta reports frequency: "annual" and attributes the compilation to Damodaran at NYU Stern, sourced from Moody's, S&P and Fitch.
Four properties of that row deserve stating plainly. A rating is categorical: "Aa1" is a string with no arithmetic defined on it. It is an opinion published on a schedule, not a measurement of anything — a committee at an agency formed a view and released it. It is versioned: this dataset gives you an annual snapshot, so intra-year rating actions are not in it. And it is slow: sovereign ratings change on a timescale of years, so a one-row response is the normal case, not an error.
Note also that the three agencies use different alphabets for the same idea. Moody's Aa1 and S&P/Fitch AA+ are the equivalent notch, and mapping between the scales is something you do explicitly, not something the data does for you.
The price
GET /credit-risk/sovereign/cds-spreads has the identical signature. For the United States:
{"country_iso3": "USA", "as_of_date": "2026-01-01T00:00:00+00:00",
"moodys_rating": "Aa1", "cds_spread": 0.0044,
"cds_spread_net_of_switzerland": 0.0030, "source": "damodaran"}
A credit default swap spread is the annual premium, as a fraction of notional, that a protection buyer pays to be compensated if the reference entity defaults. Here 0.0044 means 44 basis points, so a year's protection on $10 million is worth about $44,000. Worth, not paid: since the 2009 Big Bang and Small Bang protocols single-name CDS trade on a fixed running coupon — 100bp by convention for sovereigns — plus an upfront payment that reconciles it to the quoted spread. The number in this field is the par-equivalent quote, and a credit event pays notional less recovery rather than the full amount.
The second column is the same spread with Switzerland's — the reference used as a near-riskless benchmark — subtracted, giving 30 basis points. Switzerland's own cds_spread is exactly 0.0014, its own net-of column is 0, and every other country in the table is netted by that identical 14 basis points. So the "net of" column is one benchmark spread subtracted from all of them — not a component the data shows to be embedded in every sovereign CDS.
The meta attribution is honest about coverage: "Sovereign 10Y CDS spreads where the market is liquid; NULL where no liquid market." Both cds_spread and cds_spread_net_of_switzerland are nullable, and for most of the world they are null. Absence here means no liquid CDS market, not zero risk.
The size
GET /credit-risk/cds-market/aggregates takes filter[metric] (currently only gross_notional), filter[dimension] (grade or cleared_status), filter[value], filter[region], filter[from], filter[to], paging and fmt. Rows carry as_of_date, release_date, metric, breakdown_dimension, breakdown_value, region, usd_notional_mn and source.
The newest data on 28 July 2026 has as_of_date 2026-07-10 and release_date 2026-07-27 — the meta states the lag as T+17 days, and the two date fields let you honour it. By grade, in millions of USD:
- Investment grade — Europe 2,923,438, North America 2,429,758, Asia 108,265
- High yield — Europe 623,078, North America 550,826, Other Regions 3,782, Asia 0
Now the trap, which is really two traps. There is also a row with region = TOTAL and usd_notional_mn = 1,177,686 for high yield. And 550,826 + 623,078 + 0 + 3,782 = 1,177,686 exactly. TOTAL is a value inside the region column, not a separate field. Sum the column naively and you will double every figure.
And breakdown_value carries a third grade beyond IG and HY: a bucket literally called Other, worth hundreds of billions. Filter out region = TOTAL and you still have a three-way split where you expected two. Read the distinct values of both breakdown columns before you group by either.
Try it now
- Here is
/credit-risk/sovereign/credit-ratings?filter[country]=USA,BRA,DEU. Note how many rows came back per country and whatas_of_datesays. Then decide how your schema stores a value that is a string, categorical and annual.
- Here is
/credit-risk/sovereign/cds-spreadswith no country filter: itsmeta, with the count of countries. Paging through all of them on 28 September 2026, 78 of the 157 rows had acds_spreadthat is not null. Say what the other 79 mean, using the attribution's own words, and what a chart that drops them would imply.