Blogfoundation
Sugra Macro: a stale forecast looks exactly like a fresh one
In October the IMF put German 2027 growth at 1.473 percent; it now says 1.183. A model trained before the revision cites the right source and the wrong number, and nothing in the sentence gives it away. Revisions, composition and derived signals with their components exposed.

In October, the IMF put German growth for 2027 at 1.473 percent. It now puts the same year, for the same country, at 1.183.
Nobody was wrong. That is what a projection does: it gets revised as the data underneath it changes. But notice what it does to anyone quoting it. A model trained before the revision will tell you 1.47 and cite the IMF, and it will be telling the truth about a number that is no longer the number. There is no factual error to catch, no hallucination to detect, no contradiction in the sentence. Just a figure that quietly stopped being current, attached to an impeccable source.
This is the failure mode that makes macro different from markets. A stale price is obviously stale. A stale forecast looks exactly like a fresh one.
Official statistics are not constants
The revision is not a footnote you have to reconstruct. It is a first-class query:
GET /api/v1/imf/revisions/weo/DEU/NGDP_RPCH?vintage=WEO_2025_OCT_VINTAGE
year latest October vintage delta
2027 1.183 1.473 -0.290
2029 0.944 0.980 -0.036
2030 0.655 0.679 -0.024
Three tenths of a percentage point off a single forecast year, which for a large economy is a different planning assumption, not a rounding difference. The same call for China returns -0.153 on 2027, and for the United States +0.045, so the direction is not uniform and cannot be waved away as a global adjustment.
Two things follow, and both are practical.
If you are citing a projection, cite the vintage. “The IMF expects 1.2 percent” is incomplete in the same way a price without a timestamp is incomplete. The vintage is the timestamp.
If your plan was built on a projection, the revision is the trigger to revisit it. Not the news coverage of the revision, which may never come for a country nobody is writing about that week. The delta itself.
Immutable vintages sit alongside the live series, so the comparison is a query rather than an archaeology project through old publications.
The record itself, from the institutions that publish it
The catalogue is 4,515 indicators, and each one carries where it came from:
GET /api/v1/macro/indicators/available
POLIRMX Policy rate - short term Mexico
frequency D 2008-01-21 to 2026-07-25
source: Banco de México
Daily policy rate for Mexico, from the Mexican central bank, with the coverage window stated and the ingest timestamp attached. Not “policy rates, global” from an aggregator that will not tell you whose number it is.
Around four hundred routes sit behind that catalogue, and they are not one kind of thing. There are three layers here and picking the wrong one is a real mistake, so they are worth naming.
A sovereign catalogue, for depth in one economy. For US questions the Federal Reserve’s own economic database is the right first stop, and it is reached through primitives rather than a handful of hardcoded series. Any series by identifier. A whole release returned as a tree, values included, in a single call. Real yields resolved by tenor. And full curves rather than single points:
GET /api/v1/fred/corporate/hqm 200 points, spot curve, 2026-06-01
year_0.5 4.05%
year_1 4.22%
...
year_100 6.41%
Two hundred maturity points from six months to a hundred years, in one response. This is a sovereign institution aggregating other US agencies, which is a different proposition from a commercial vendor doing the same thing.
The publishing institution itself, when the definition matters. The ECB, but also Canada, Norway, Brazil, Czechia, Poland, South Africa, Argentina, Peru, alongside national statistics offices from Spain to Estonia to Denmark. A policy rate is not the same instrument in every country and unemployment is not measured the same way, so when a number is load-bearing you want the publisher’s own series carrying the publisher’s own definition.
Intergovernmental bodies, when comparability is the point. Trade flows, development indicators, population and development goals arrive already put on a common footing by the institutions that maintain the methodology. Here harmonisation is not a loss, it is precisely what you are buying: a figure for Peru you can stand next to a figure for Poland.
The mistake is using the third layer for a question that needed the second, or reaching for a national source when you actually wanted comparability. All three are one key, so the choice is yours to make deliberately rather than one your vendor makes for you.
Depth comes with it. US federal debt runs 237 annual observations, which reaches back past every living memory of the institution.
Not just levels: who holds it and who is buying
An aggregate tells you the size of something. The composition tells you what happens next, and this direction carries the composition.
The Federal Reserve’s own portfolio, weekly, broken out by instrument:
GET /api/v1/fed/soma/history 1,203 weekly records
as of 2026-07-22
notes and bonds 3,605,789,260,700
mortgage-backed 1,937,256,962,541
bills 511,065,926,700
TIPS 273,754,527,000
TIPS inflation comp 106,668,680,927
floating rate 18,382,825,800
total 6,356,127,853,425
Six point three six trillion dollars, and more usefully the shape of it. A balance sheet that is short bills and long mortgage paper behaves differently as it runs off than one weighted the other way, and that difference reaches the curve before it reaches any commentary.
The euro-area equivalent asks who bought, by institutional sector and by country:
GET /api/v1/ecb/shs-sectors/pension/flows sector S129, 2026-Q1
1 Netherlands 23,810 EUR mn
2 Germany 4,648
3 France 1,095
Dutch pension funds moved roughly five times what German ones did into debt holdings in a single quarter. Banks, money-market funds and insurers each have their own view of the same question. That is not a number you can infer from yields, and it is the sort of thing that explains a market move a week before anyone writes the explanation.
Flows between countries, not just totals
Trade appears here as pairs rather than as national aggregates:
GET /api/v1/imf/direction-of-trade?country=DEU&counterpart=CHN
2026-01 goods trade balance -3,863,964,318 USD
Germany against China, one month, one direction, with the series identifier attached. National export totals hide exactly the thing that matters when a corridor closes or a tariff lands: which counterpart. The same surface reaches tariff and trade-barrier data from the trade bodies, and development and demographic series from the UN institutions that maintain them.
There is also a legislative layer, because in some jurisdictions the macro question is really a question about what is moving through a chamber. Bills, actions and committee reports are queryable rather than something you learn from a headline.
Derived signals, with the components exposed
The same discipline this series applies to scores elsewhere applies here. Some questions have no published series, so we compute one, and then show the working:
GET /api/v1/imf/signals/country-risk/TUR
score 14.3 scale 0-100, higher = more pressure
components:
inflation 15.00 score 36.0 higher_is_riskier
government_debt 27.49 score 16.5 higher_is_riskier
current_account -1.16 score 4.6 deficit_is_riskier
gdp_growth 4.02 score 0.0 weaker_growth_is_riskier
methodology v1 heuristic average of debt, current-account deficit, weak
growth and elevated inflation from IMF WEO. Not a credit rating.
Four components, each with its raw value, its contribution and the direction that makes it risky, plus a sentence stating what the number is not. Companion signals cover external pressure and sector-level demand heuristics.
One thing to read carefully: the underlying source carries projections out several years, so a signal built from the latest available observation may be standing on a forecast rather than on a published observation. The as_of field tells you which, and it is the field to check before quoting the score.
The record says what happened. The curve says what people paid to believe.
This is the join that matters most in this direction, and neither half works without the other.
The official record is unambiguous about the present. Inflation is running at 3.46 percent year over year, 332.568 in June against 321.435 twelve months earlier. The policy rate has an upper bound of 3.75 percent. Both are published, both are facts, and between them they describe a restrictive stance against inflation that has not returned to target.
Now ask what people are actually paying for. The government bond curve on the same days:
GET /api/v2/fixed-income/treasury/yield-curve 2026-07-24
1M 3.80 6M 4.08 2Y 4.33
3M 3.96 1Y 4.14 3Y 4.36
Every point on the short end sits above the policy rate and the line rises steadily. Nobody buying at those levels is positioned for cuts.
Then ask what those same people expect inflation to do, which the inflation-protected curve prices directly:
GET /api/v2/fixed-income/treasury/tips-curve 2026-07-17
breakeven 2Y 1.99 5Y 2.32 7Y 2.34
5y5y forward breakeven 2.28
Inflation is 3.46 today and the market is paying for 1.99 over two years.
Read those three together and they are not in conflict, they are one coherent statement: rates stay high for longer, and that is exactly why inflation comes back down. The market is not disagreeing with the official record about the present. It is pricing the consequence of it.
None of that is visible from either side alone. The published series is silent about expectations by construction, and the curve is silent about what actually printed. The gap between them is measurable, it moves, and it is the closest thing to an answer to “what happens next” that does not require anyone’s forecast.
What it still does not tell you
Whether the question is settled.
The same June figure supports two opposite briefings and both are defensible from the number. That is where News joins: policy-uncertainty coverage running at 1.53 percent of an hourly theme stream is a different world from the same release landing in silence. One number says where inflation is, another says what people paid to believe about it, and a third says whether anyone is still arguing.
Keep all three separate in code and separate in the brief. A monthly index level, a daily curve point and an hourly theme share do not average into anything, and a product that offers you the average has thrown away every timestamp in the input.
Where this stops
We return the published record. We do not forecast, and where we return someone else’s forecast we label whose it is and which vintage.
Revisions mean today’s value for a past period may change tomorrow, so store what you saw and when you saw it rather than assuming a series is immutable. Frequencies differ wildly across this direction, from daily policy rates to annual national accounts, and joining them without stating the mismatch produces charts that imply a precision nobody has. National definitions differ even when field names match. And a projection is not an observation: for 2027 nobody has data, they have a model, and the revision above is what a model looks like when it updates.
Not investment advice, and not a substitute for reading the publisher’s methodology when the number is load-bearing.
Running it
H="x-api-key: $SUGRA_API_KEY"
B=https://sugra.ai
# the record, and finding the right series in the first place
curl -sS -H "$H" "$B/api/v1/fred/series/CPIAUCSL?limit=4"
curl -sS -H "$H" "$B/api/v1/fred/series/GDPC1?limit=3&units=pc1"
curl -sS -H "$H" "$B/api/v1/fred/corporate/hqm"
curl -sS -H "$H" "$B/api/v1/fred/government/tips?tenor=10"
curl -sS -H "$H" "$B/api/v1/fred/release/tables?release_id=53"
# what changed since the last publication
curl -sS -H "$H" "$B/api/v1/imf/vintages/weo"
curl -sS -H "$H" "$B/api/v1/imf/revisions/weo/DEU/NGDP_RPCH?vintage=WEO_2025_OCT_VINTAGE"
# straight from the publishing institution
curl -sS -H "$H" "$B/api/v1/macro/indicators/available"
curl -sS -H "$H" "$B/api/v1/treasury/debt-history?limit=25"
curl -sS -H "$H" "$B/api/v1/imf/USA/overview"
# what the market paid to believe, against the same record
curl -sS -H "$H" "$B/api/v2/fixed-income/treasury/yield-curve"
curl -sS -H "$H" "$B/api/v2/fixed-income/treasury/tips-curve"
# composition: who holds it, who is buying, who trades with whom
curl -sS -H "$H" "$B/api/v1/fed/soma/history?limit=8"
curl -sS -H "$H" "$B/api/v1/ecb/shs-sectors/pension/flows"
curl -sS -H "$H" "$B/api/v1/imf/direction-of-trade?country=DEU&counterpart=CHN"
# derived, with components exposed
curl -sS -H "$H" "$B/api/v1/imf/signals/country-risk/TUR"
curl -sS -H "$H" "$B/api/v1/imf/signals/external-pressure/TUR"
# is the question settled? (News leg)
curl -sS -H "$H" "$B/api/v1/gdelt/themes/trending?limit=10"
Store the vintage next to the value. Six months from now, the difference between “we planned on 1.47” and “we planned on what the IMF said in October, which was 1.47” is the difference between a mistake and a decision.
Published official record and labelled projections. Not investment advice. Values pulled live 2026-07-26.
Previous: Sugra Finance. Next: Sugra Entity. Full series: Platform intro.
