# Get a World Cup 2026 player's match performance by ID with Machina

Machina's player performance API returns one player's archived figures from one FIFA World Cup 2026 match, with FIFA's official Power Ranking values kept apart from Machina's provisional estimates. Each call costs $0.01, and the squads call that finds the player's id costs $0.01, so the full lookup costs $0.02. Find the id with the squads call, then send `POST https://agents.machina.gg/zcj/s7u8dkqkwcd1/world-cup/v1/get-player-performance-context` with the fixture and that id.

## At a glance

- **Endpoint:** `POST https://agents.machina.gg/zcj/s7u8dkqkwcd1/world-cup/v1/get-player-performance-context`, one player per request
- **Body:** a fixture selector (`event`, `event_urn`, `provider_event_id`, or `team` with `opponent` or `date`). Add one player selector: `player_urn`, `player_id` or `player` (a name). Optionally add `team` or `team_id`.
- **Price:** $0.01. The squads lookup costs $0.01.
- **Payment:** a 402 price quote you pay over x402 or MPP and retry. No account or API key.
- **Response:** `data.player_performance_context` with `player`, `official_fifa_power_ranking`, `machina_provisional_performance_signal` and `context_and_evidence`
- **Scope:** the completed tournament's archive only. `archive.live` is `false`.
- **Full purchase flow:** [the buyer skill](https://agents.machina.gg/zcj/s7u8dkqkwcd1/SKILL.md)

## Find the player's id, then request the context

Each call below answers first with a 402 price quote, which you pay and retry. [The buyer skill](https://agents.machina.gg/zcj/s7u8dkqkwcd1/SKILL.md) has the steps.

1. Request both squads for the fixture:

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

   This example request paid $0.01 and took 3.6 seconds. The response lists each side's players under `data.squads.teams[].players`:

   ```json
   {"status": "success", "meta": {"code": 200}, "data": {"squads": {"teams": [{"side": "home", "team": "Brazil", "players": [{"name": "<player name>", "player_urn": "<player_urn>", "provider_ids": {"api_football": "<api_football player id>", "espn": "<espn id>"}}]}]}}}
   ```

   Take the player's `player_urn` or `provider_ids.api_football`. FIFA's published roster is in a separate list, `official_registration_snapshot.teams[].players`, keyed by `canonical_urn`.

2. Request the player's context by id, for the same fixture:

   ```bash
   curl -s -X POST https://agents.machina.gg/zcj/s7u8dkqkwcd1/world-cup/v1/get-player-performance-context \
     -H 'Content-Type: application/json' \
     -d '{"event": "Brazil vs Morocco", "team": "Brazil", "player_id": "<api_football player id>"}'
   ```

   This example request, which selected a player by API-Football id, paid $0.01 and took 3.4 seconds. The response has this shape:

   ```json
   {"status": "success", "data": {"player_performance_context": {
     "player": {"name": "<player name>", "player_id": "<api_football player id>", "team_name": "<team>", "position": "<position>", "is_goalkeeper": "<boolean>", "minutes_played": "<minutes or null>", "minutes_evidence": "<boolean>"},
     "official_fifa_power_ranking": {"source": "fifa.com", "status": "<status>", "scores": {"attacking": "<score or null>"}, "classification": {}, "source_snapshot": {}},
     "machina_provisional_performance_signal": {"status": "<status>", "scores_0_10": {"attacking": "<score or null>"}, "drivers": [], "confidence": "<number>", "disclaimer": "<text>"},
     "context_and_evidence": {"fallback_path": [], "missing_info_flags": [], "citations": []}
   }}}
   ```

3. Read the player fields. Keep the official values and the estimates apart.

## Official FIFA values and Machina estimates

| Block | What it holds | How to tell |
| --- | --- | --- |
| `official_fifa_power_ranking` | FIFA's Power Ranking `scores` and category `classification` | `source` is `fifa.com`, and `source_snapshot` gives the FIFA file's `url`, `sha256` and `fetched_at` |
| `machina_provisional_performance_signal` | Machina's `scores_0_10`, `drivers` and `confidence` | A `disclaimer` marks it as provisional and not an official FIFA Power Ranking |

Both blocks score the same categories: `attacking`, `creativity`, `defending`, `defending_goal` and `in_possession`. Each block has its own `status`. A score the archive does not hold is `null`, so read `status` before you use a number. `player.minutes_evidence` says whether `minutes_played` is backed by evidence.

## Boundaries

- The data covers the completed FIFA World Cup 2026 archive only. It has no live or upcoming matches and no other competition.
- Each request returns one player for one fixture. There is no batch request.
- A name in `player` can match more than one player. An id, either `player_urn` or `player_id`, selects exactly one.
- The squads lists are not a lineup or eligibility record for the match date.
- Nothing is charged until you pay the 402. An unserved answer carries `error.billed: false` and is never charged.

## Errors

| Status and `reason_code` | Meaning | Action |
| --- | --- | --- |
| `402` | The price quote | Pay and retry the same request, or stop |
| `400 player_selector_required` | No `player_urn`, `player_id` or `player` was sent | Add one, ideally an id from the squads call |
| `400 player_ambiguous` | The name matched more than one player, and the response lists candidates | Resend with the chosen candidate's id |
| `400 fixture_selector_required` / `fixture_ambiguous` | The fixture is missing or matches several matches | Add `opponent` or `date`, or use one candidate's `event_urn` |
| `404 player_not_found` / `fixture_not_found` | The archive holds no such player or fixture | Check the id against the squads response |
| `503 archive_row_missing` | The selector is valid, but the archive has no row for it | Retry later |

Error bodies for request-side problems carry `accepted_fields`, the request fields the endpoint accepts.

## Frequently asked questions

### Why select a player by id instead of by name?

A name can match more than one player. In that case the call returns candidates and no figures. A `player_urn` or API-Football `player_id` taken from the squads call selects exactly one player.

### How much do one player's match stats cost?

$0.01 per call, plus $0.01 if you look up the id first. That is $0.02 in total. The 402 states the exact price before you pay.

### Are the FIFA scores and Machina's scores the same thing?

No. `official_fifa_power_ranking` holds FIFA's published values with a link to FIFA's source file. `machina_provisional_performance_signal` holds Machina's own estimate and is labelled provisional. Treat them as two separate signals.

### Can I pay for a single call by card?

A single call is below the card floor of $0.50. To pay by card, buy prepaid Credits, with a minimum purchase of $0.50. [The buyer skill](https://agents.machina.gg/zcj/s7u8dkqkwcd1/SKILL.md) has the steps.

### Does the API cover live or upcoming matches?

No. It serves the archive of the completed FIFA World Cup 2026, and every response reports `live` as `false`.

## Keep reading

- [Buyer skill](https://agents.machina.gg/zcj/s7u8dkqkwcd1/SKILL.md): the full purchase flow
- [How to pay](https://agents.machina.gg/zcj/s7u8dkqkwcd1/payment.md): x402, MPP, card and Credits
- [Error reference](https://agents.machina.gg/zcj/s7u8dkqkwcd1/errors.md): payment and access errors
- [Match Context API reference](https://agents.machina.gg/zcj/s7u8dkqkwcd1/services/match-context/openapi.json): every field and selector

---

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