Quickstart notes
Where the player props hide in the odds feed
Specials are off by default, so there is nothing to find in the match object. One flag turns them on, and one join attaches them to the match.
You have the board working, the prices flowing, and then someone asks where the goalscorer markets are. They were always there. Special markets sit in the same feed, switched off by default, and turning them on is one parameter and one join away.
Why your response has no props
Specials are excluded by default so existing integrations keep their payload size, as the player props guide states, checked 2026-10-30. Pass include_specials=1 on the fixtures or markets call and they arrive. The free key covers every one of those requests, at 20 a minute and 100 a day.
That default explains the classic confusion: the match object is not hiding a props section. There is no field to find. The specials are simply not sent until you ask.
Each prop is its own row
The shape that surprises everyone: a prop does not live inside the match object. Every special arrives as its own event row with its own event_id, joined to the main match by parent_id. Three extra fields describe it: special names the market, special_category groups it under labels like Player Props, Team Props, Exact Scores or Futures, and special_units says what the outcomes count, corners or runs or whatever the market measures.
So the join is a group-by. Collect the rows, group the specials under their parent_id, and you have a match with its props attached.
Flat or nested is a workflow choice
The flag has two shapes, per the same guide. include_specials=1 returns flat rows, which pair cheapest with a since cursor: every delta read carries only what changed, prop or match alike. include_specials=nested groups the specials under each parent event's own array, which suits one row per match displays.
Flat first, nested if the display needs it. The flat shape is the one that stays cheap as the slate grows.
The units field is not decoration
A price on "over 2.5" means nothing until you know what is being counted. The special_units field carries it, and two markets with identical lines can count different things. Read the units before the price, every time, especially when a category like Exact Scores mixes with player markets in one category group.
This is the field that keeps a prop on the right screen section and, later, in the right settlement bucket.
A five-minute check
Pull one prematch fixtures call with the flag on, filter to one match's parent_id, and look at what arrived. Names, categories, units, prices: everything a prop board needs is in the rows. The quickstart on the player props page has the curl and jq version ready to run, checked 2026-10-30.
The specials were never missing. They were waiting for one parameter.