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.

ShareXLinkedInFacebookTelegramRedditEmailCopy linkMarkdown
Sugra Macro - the published record, with its vintages

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.

Integrate with one key across every product direction.

Get API keyDocsFamily