# Read Dixon-Coles World Cup 2026 forecasts and backtests with Machina

Machina's Forecasts API returns the Dixon-Coles match forecast stored for a FIFA World Cup 2026 fixture. `forecast_integrity` in the same response says whether that forecast was computed before kickoff, and a separate backtest call scores the archived forecasts against verified 90-minute results. A forecast costs $0.12 and the backtest costs $0.12. Send `POST https://agents.machina.gg/zcj/8gywrhj8onyx/world-cup/v1/get-match-forecast` with a fixture, or `POST https://agents.machina.gg/zcj/8gywrhj8onyx/world-cup/v1/backtest-forecasts` with `{}`, and pay the 402 price quote.

## At a glance

- **Endpoints:** `POST https://agents.machina.gg/zcj/8gywrhj8onyx/world-cup/v1/get-match-forecast` (one fixture), `POST https://agents.machina.gg/zcj/8gywrhj8onyx/world-cup/v1/backtest-forecasts` (the whole archive)
- **Body:** forecast takes a fixture selector such as `{"event": "Brazil vs Morocco"}`. Backtest takes `{}`.
- **Price per call:** forecast $0.12, backtest $0.12
- **Payment:** a 402 is the price quote, which you pay and retry. x402 (Base USDC) and MPP (Tempo USDC) are the wallet rails. No account or API key is needed.
- **Response:** JSON in a `{status, meta, data}` envelope. `data.forecast` holds the probabilities and model block. `data.track_record` holds the backtest scores.
- **Scope:** the completed FIFA World Cup 2026 archive only (`live: false`, `mode: final_archive`). Nothing is recomputed at request time.
- **Full purchase flow:** [the buyer skill](https://agents.machina.gg/zcj/8gywrhj8onyx/SKILL.md)

## Read the stored forecast for one fixture

1. Send the fixture:

   ```bash
   curl -s -X POST https://agents.machina.gg/zcj/8gywrhj8onyx/world-cup/v1/get-match-forecast \
     -H 'Content-Type: application/json' \
     -d '{"event": "Brazil vs Morocco"}'
   ```

   The storefront answers with a 402 quoting $0.12. Nothing is charged until you pay it, and [the buyer skill](https://agents.machina.gg/zcj/8gywrhj8onyx/SKILL.md) covers paying and retrying.

2. Read `data.forecast` and `data.forecast_integrity`. This example paid $0.12 and returned the following fields, shown here as an excerpt:

   ```json
   {
     "forecast": {
       "home_team": {"name": "Brazil", "urn": "urn:machina:sport:soccer:team:brazil:bra"},
       "away_team": {"name": "Morocco", "urn": "urn:machina:sport:soccer:team:morocco:mar"},
       "probabilities": {"home_win": 0.3869, "draw": 0.3256, "away_win": 0.2875, "over_2_5": 0.3635, "under_2_5": 0.6365},
       "exact_scorelines": {"0-0": 0.1327, "1-0": 0.1207, "1-1": 0.1495},
       "most_likely_score": "1-1",
       "home_expected_goals": 1.172,
       "away_expected_goals": 0.976,
       "model": {"method": "dixon_coles_analytic_stdlib", "rho": -0.12, "computed_at": "2026-06-13T07:00:02.352497Z"},
       "confidence": 0.15,
       "data_source": "seed"
     },
     "forecast_integrity": {"kickoff": "2026-06-13T22:00:00+00:00", "computed_at": "2026-06-13T07:00:02.352497Z", "classification": "verified_pre_kickoff", "verified_pre_kickoff": true}
   }
   ```

The fixture can be identified with any of these selectors. If you send more than one, the fixture must match all of them.

| You have | Send |
| --- | --- |
| A fixture label | `event`, such as `"Brazil vs Morocco"` |
| The canonical id | `event_urn` |
| The API-Football fixture id | `provider_event_id` |
| One team | `team`, with `opponent` or `date` (`YYYY-MM-DD`) to narrow it |

The forecast response also carries these fields:

- **`confidence`:** the model's self-assessed confidence, from 0 to 1.
- **`flags`:** markers such as `bootstrap_seeded`.
- **`caveats`:** limits on how the estimate should be read.
- **`forecast_integrity`:** says whether the stored forecast predates kickoff, beside the `kickoff` and `computed_at` it compares.

`data_source` says what fed the model before kickoff:

| `data_source` | Model input |
| --- | --- |
| `seed` | At least one team had not played a tournament match, so the model drew on the FIFA-ranking prior; `confidence` is `0.15` |
| `blend` | Tournament results blended with the seed prior; `confidence` rises with games played |
| `results` | Tournament results only |

A `seed` forecast is the intended archived answer, not a placeholder.

## Model and market comparison

`model_vs_market` compares the model with a market cache. Its fields are `comparison_status`, `gaps`, `count`, `max_gap_bps` and `min_gap_bps`. `min_gap_bps` is also a request field: an integer, default `100`, minimum `0`. The response reports gaps only when the cache holds a verifiable historical pre-match quote, and suppresses them otherwise. In the example, `market_integrity.classification` is `settled_or_late_cache` and `gaps` is empty.

## Score the archive with the backtest

1. Send an empty body:

   ```bash
   curl -s -X POST https://agents.machina.gg/zcj/8gywrhj8onyx/world-cup/v1/backtest-forecasts \
     -H 'Content-Type: application/json' \
     -d '{}'
   ```

   The 402 quotes $0.12. Pay it and retry the same request.

2. Read `data.track_record` and the counts. This example paid $0.12 and returned the following figures, with the first of six calibration bins shown:

   ```json
   {
     "total_count": 104,
     "included_count": 98,
     "excluded_count": 6,
     "exclusion_reasons": {"forecast_at_or_after_kickoff": 6},
     "track_record": {
       "sample_size": 98,
       "sample_size_sufficient": true,
       "accuracy": {"total": 98, "correct": 52, "accuracy_percent": 53.06},
       "brier_scores": {"avg_1x2": 0.1913, "baseline_random_1x2": 0.2222, "avg_over_2_5": 0.3057, "baseline_random_over_2_5": 0.25, "is_better_than_random": true},
       "calibration": {"avg_calibration_error": 0.0676, "curve": [{"bin": 3, "label": "30-40%", "count": 11, "predicted_avg": 0.3798, "actual_rate": 0.2727}]}
     },
     "clv_settled_count": 0,
     "calibration_settled_count": 0
   }
   ```

The backtest scores only forecasts with a pre-kickoff timestamp. It scores them against the regulation-time result, so matches decided in extra time or on penalties are scored through `regulation_time_score`. Each calibration bin pairs the average predicted probability with the observed rate. The `recommendation` string compares the 1X2 Brier score with the uniform baseline and sets a target of below `0.05` for calibration error.

The archive's own figures show where the model did well and where it fell short. Its 1X2 Brier score of 0.1913 beats the uniform baseline of 0.2222, and 52 of the 98 forecasts were scored correct. Its over and under 2.5 goals score of 0.3057 is worse than that market's 0.25 baseline, and its calibration error of 0.0676 misses the 0.05 target.

Closing line value and market calibration are unsupported. Both are listed in `archive.missing_capabilities` and `coverage.unsupported_fields`. In the example, `clv_report` and `calibration_report` are empty objects.

## Boundaries and billing

- The data is an archive of the completed FIFA World Cup 2026. On the backtest, a `competition` other than `world-cup-2026` returns `400 unsupported_parameter`.
- The backtest accepts only the listed values: `league` is `""` or `"1"`, `season` is `""` or `"2026"`, and `calibration_window_days` is `90`.
- Each forecast call resolves exactly one fixture.
- The output is informational research with no selection, ranking or recommendation of wagers.
- An unpaid 402 charges nothing. Unserved answers carry `billed: false` and are never billed.
- Card payment for a single call needs a call priced at $0.50 or more. Prepaid credit and its purchase flow are in [the buyer skill](https://agents.machina.gg/zcj/8gywrhj8onyx/SKILL.md).

## Errors on this job

| Status and code | Meaning | Action |
| --- | --- | --- |
| `402` | The price quote | Pay and retry, or stop |
| `400 fixture_selector_required` | No selector was sent | Add `event`, `event_urn`, `provider_event_id` or `team` |
| `400 fixture_ambiguous` | More than one fixture matched | Pick one from `candidates`, or add `opponent` or `date` |
| `400 unsupported_parameter` | A value outside the archive | Use only the fields listed in `accepted_fields`, with their documented values |
| `404 fixture_not_found` | No archived fixture matched | Check the selector |
| `503 archive_row_missing` | The archive holds no row for a valid selector | Retry later |
| `502 archive_error` | Archive integrity error; nothing was served | Retry later |

## Frequently asked questions

### Are the forecasts recomputed after the match?

No. Each response returns the original pre-kickoff Dixon-Coles output exactly as it was stored. `forecast_integrity` states whether the stored `computed_at` predates kickoff.

### Why does the backtest score 98 forecasts and not 104?

Six of the 104 archived forecasts were computed at or after kickoff. They are counted under `exclusion_reasons.forecast_at_or_after_kickoff` and left out of every score.

### Does the API cover live matches or other competitions?

No. It serves only the archive of the completed FIFA World Cup 2026. The backtest rejects a `competition` other than `world-cup-2026` with `unsupported_parameter`, and that answer is not billed.

### How accurate were Machina's World Cup 2026 forecasts?

The backtest scored 98 pre-kickoff forecasts: 52 were correct, and the 1X2 Brier score of 0.1913 beats the uniform baseline of 0.2222. The calibration error of 0.0676 misses Machina's own target of below 0.05.

### What does a confidence of 0.15 mean?

The forecast is seed-only. At least one team had not yet played a tournament match, so the model fell back on the FIFA-ranking prior, and `data_source` is `seed`.

## Keep reading

- [The buyer skill](https://agents.machina.gg/zcj/8gywrhj8onyx/SKILL.md): the full purchase flow
- [How to pay](https://agents.machina.gg/zcj/8gywrhj8onyx/payment.md): x402, MPP, card and Credits
- [Forecasts API reference](https://agents.machina.gg/zcj/8gywrhj8onyx/services/forecasts/openapi.json): request and response schemas
- [Error reference](https://agents.machina.gg/zcj/8gywrhj8onyx/errors.md): payment and access errors
- [Catalog](https://agents.machina.gg/zcj/8gywrhj8onyx/manifest.json): live services, plans and prices

---

Updated 2026-10-20. All Machina Sports guides: https://agents.machina.gg/guides.md. Storefront: https://agents.machina.gg/zcj/8gywrhj8onyx/llms.txt.
