SgpBuildResponse
Response from `POST /api/v1/{sport}/sgp/build`. Also what a 422 returns. A 422 is NOT thrown, so check `success` before reading `sgp`, then branch on `reasonCode` (the API sends it on every 422 since the refusal-status change; older API versions sent none on a leg-resolution 422 and threw the refusal as a 502): - `"unresolved"`: a leg could not be resolved. No `sgp`, and a `reason` on each unresolved leg naming which lines FanDuel does offer or why the category, side or leg type cannot work. Fix the legs. - any other {@link SgpReasonCode} (`line-mismatch`, `bet-failure`, `not-placeable`, ...): FanDuel judged the slip and refused it, or its answer did not confirm the legs as sent. The request was valid but cannot be priced as specified, so do not resend the same body unchanged. `legIndex`, `lineEchoed` and `failureCodes` are set where they apply; `message` is prose. Every other failure throws: a `ServiceBusyError` with `code` `no-price` when no usable answer came back (503, retry after `retryAfterMs`), one with an `SGP_*` code ({@link SgpErrorBody} in `details`), or, from older API versions, an `OwlsInsightError` with status 502 whose `details` is the {@link SgpBuildErrorBody}.
Properties
| Name | Type | Description |
|---|---|---|
| code | string | Repeats `reasonCode`. |
| error | string | Present when `success: false`. |
| failureCodes | array | Refused parlay only, when FanDuel rejected it with its own failure codes (e.g. `SELECTION_NOT_FOUND`). |
| legIndex | number | Refused parlay, `line-*` codes only: the leg's index in your `legs` array. |
| legs | array | |
| lineEchoed | numbernull | Refused parlay, `line-*` codes only: the line FanDuel priced, exactly as it sent it, or `null` when it sent none. |
| message | string | Refused parlay (422) only: human-readable prose. Match on `reasonCode`, `legIndex`, `lineEchoed` and `failureCodes`, never on this. |
| meta | object | |
| pricing | string | `"fanduel-slip"` on a 200: the price is FanDuel's own bet-slip answer. |
| reasonCode | string | Present when `success: false`: `"unresolved"` on a leg-resolution 422, otherwise the {@link SgpReasonCode} of a refused parlay (never `no-price`, which is thrown as a 503). Absent from older API versi |
| sgp | object | |
| success | boolean |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/owlsinsight-com/json-schema/owlsinsight-com-sgp-build-response-schema.json",
"title": "SgpBuildResponse",
"description": "Response from `POST /api/v1/{sport}/sgp/build`.\n\nAlso what a 422 returns. A 422 is NOT thrown, so check `success` before\nreading `sgp`, then branch on `reasonCode` (the API sends it on every 422 since\nthe refusal-status change; older API versions sent none on a leg-resolution 422\nand threw the refusal as a 502):\n- `\"unresolved\"`: a leg could not be resolved. No `sgp`, and a `reason` on each\n unresolved leg naming which lines FanDuel does offer or why the category,\n side or leg type cannot work. Fix the legs.\n- any other {@link SgpReasonCode} (`line-mismatch`, `bet-failure`,\n `not-placeable`, ...): FanDuel judged the slip and refused it, or its answer\n did not confirm the legs as sent. The request was valid but cannot be priced\n as specified, so do not resend the same body unchanged. `legIndex`,\n `lineEchoed` and `failureCodes` are set where they apply; `message` is prose.\n\nEvery other failure throws: a `ServiceBusyError` with `code` `no-price` when no\nusable answer came back (503, retry after `retryAfterMs`), one with an `SGP_*`\ncode ({@link SgpErrorBody} in `details`), or, from older API versions, an\n`OwlsInsightError` with status 502 whose `details` is the\n{@link SgpBuildErrorBody}.",
"x-generated": "2026-10-31",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/owlsinsight-com-openapi.json#/components/schemas/SgpBuildResponse",
"properties": {
"code": {
"description": "Repeats `reasonCode`.",
"type": "string",
"x-extensible-enum": [
"ambiguous-combination",
"bet-failure",
"bet-failure-shape",
"combined-odds-missing",
"duplicate-selection",
"leg-failure",
"line-mismatch",
"line-not-echoed",
"line-unexpected",
"line-unverifiable",
"no-price",
"no-sgm-combination",
"not-placeable",
"resp-code",
"runner-odds-duplicate",
"runner-odds-inconsistent",
"runner-odds-missing",
"single-duplicate",
"single-missing",
"single-odds-missing",
"unresolved"
]
},
"error": {
"description": "Present when `success: false`.",
"type": "string"
},
"failureCodes": {
"description": "Refused parlay only, when FanDuel rejected it with its own failure codes\n(e.g. `SELECTION_NOT_FOUND`).",
"items": {
"type": "string"
},
"type": "array"
},
"legIndex": {
"description": "Refused parlay, `line-*` codes only: the leg's index in your `legs` array.",
"format": "double",
"type": "number"
},
"legs": {
"items": {
"$ref": "#/$defs/SgpResolvedLeg"
},
"type": "array"
},
"lineEchoed": {
"description": "Refused parlay, `line-*` codes only: the line FanDuel priced, exactly as it\nsent it, or `null` when it sent none.",
"format": "double",
"type": [
"number",
"null"
]
},
"message": {
"description": "Refused parlay (422) only: human-readable prose. Match on `reasonCode`,\n`legIndex`, `lineEchoed` and `failureCodes`, never on this.",
"type": "string"
},
"meta": {
"$ref": "#/$defs/SgpBuildMeta"
},
"pricing": {
"description": "`\"fanduel-slip\"` on a 200: the price is FanDuel's own bet-slip answer.",
"type": "string"
},
"reasonCode": {
"description": "Present when `success: false`: `\"unresolved\"` on a leg-resolution 422,\notherwise the {@link SgpReasonCode} of a refused parlay (never `no-price`,\nwhich is thrown as a 503). Absent from older API versions' leg-resolution\n422.",
"type": "string",
"x-extensible-enum": [
"ambiguous-combination",
"bet-failure",
"bet-failure-shape",
"combined-odds-missing",
"duplicate-selection",
"leg-failure",
"line-mismatch",
"line-not-echoed",
"line-unexpected",
"line-unverifiable",
"no-price",
"no-sgm-combination",
"not-placeable",
"resp-code",
"runner-odds-duplicate",
"runner-odds-inconsistent",
"runner-odds-missing",
"single-duplicate",
"single-missing",
"single-odds-missing",
"unresolved"
]
},
"sgp": {
"$ref": "#/$defs/SgpPrice"
},
"success": {
"type": "boolean"
}
},
"type": "object",
"x-owls-required": [
"success",
"legs",
"meta"
],
"$defs": {
"SgpBuildMeta": {
"description": "`meta` of a `buildSgp` response (200, the leg-resolution 422 and the refused\n422), and of the no-price 503, `SGP_BUSY` 503 and legacy 502 error bodies.\n\nThe fields marked \"API v2.348.0\" are absent from older API versions.",
"properties": {
"book": {
"description": "The book the legs were resolved and priced against (`\"fanduel\"`).",
"type": "string"
},
"catalogAgeMs": {
"description": "The MINIMUM age, in ms, the catalog data already had at `resolvedAt`; the\ntrue age can be higher. Omitted when the age is unknown. API v2.348.0.",
"format": "double",
"type": "number"
},
"commence_time": {
"type": "string"
},
"eventId": {
"description": "The API echoes eventId as the numeric FanDuel event id."
},
"lineUnverified": {
"description": "`true` on a 200 that priced at least one leg whose line FanDuel's\nresponse does not confirm (alternate N-or-more strikeout rungs). Absent\nwhen every line was confirmed. API v2.348.0.",
"type": "boolean"
},
"lineUnverifiedLegs": {
"description": "With `lineUnverified`: the indexes of those legs in your `legs` array.\nAPI v2.348.0.",
"items": {
"format": "double",
"type": "number"
},
"type": "array"
},
"matchup": {
"type": "string"
},
"priceRequestedAt": {
"description": "When the price request went out, on the API server's clock. Present on\nevery 200, and on a refused 422, a no-price 503 or a legacy 502 only when\nFanDuel returned a response. Absent on a leg-resolution 422 (nothing was\npriced). API v2.348.0.",
"type": "string"
},
"pricedAt": {
"description": "When FanDuel's answer came back, on the API server's clock. Never earlier\nthan `priceRequestedAt`; this is the quote time to use. Same presence as\n`priceRequestedAt`. API v2.348.0.",
"type": "string"
},
"resolvedAt": {
"description": "When the legs were resolved against FanDuel's catalog, before pricing.\nAPI v2.348.0.",
"type": "string"
},
"timestamp": {
"description": "The same instant as `resolvedAt`: when the legs were resolved, BEFORE\npricing. It is not the quote time; use `pricedAt` for that.",
"type": "string"
}
},
"type": "object",
"x-owls-required": [
"eventId",
"book",
"timestamp"
]
},
"SgpFdSelection": {
"description": "The FanDuel selection a resolved SGP leg maps to. `marketId` is specific to\nthe FanDuel state that priced it (New Jersey); `selectionId` is the same in\nevery state.",
"properties": {
"marketId": {
"type": "string"
},
"selectionId": {
"format": "double",
"type": "number"
}
},
"type": "object",
"x-owls-required": [
"marketId",
"selectionId"
]
},
"SgpPrice": {
"description": "The computed parlay price from a successful `buildSgp` call.",
"properties": {
"american": {
"format": "double",
"type": "number"
},
"decimal": {
"format": "double",
"type": "number"
},
"isSGM": {
"description": "Always `true` on a 200: the price is FanDuel's correlated same-game price\nfor exactly the legs sent.",
"type": "boolean"
},
"legs": {
"format": "double",
"type": "number"
}
},
"type": "object",
"x-owls-required": [
"american",
"decimal",
"isSGM",
"legs"
]
},
"SgpResolvedLeg": {
"description": "A single leg echoed back in a `buildSgp` response, with its resolution.",
"properties": {
"description": {
"description": "Present when `resolved: true`: the FanDuel selection it resolved to.",
"type": "string"
},
"fdSelection": {
"$ref": "#/$defs/SgpFdSelection",
"description": "Present when `resolved: true`: the FanDuel selection the leg resolved to."
},
"reason": {
"description": "Present when `resolved: false`: why the leg could not be used.",
"type": "string"
},
"resolved": {
"type": "boolean"
},
"single": {
"description": "On a 200: the leg's stand-alone price, or `null` when none was matched.",
"properties": {
"american": {
"format": "double",
"type": "number"
},
"decimal": {
"format": "double",
"type": "number"
}
},
"type": [
"object",
"null"
],
"x-owls-required": [
"american",
"decimal"
]
}
},
"type": "object",
"x-owls-required": [
"resolved"
]
}
}
}
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
curl "https://apis.io/api/v1/json-schemas/owlsinsight-com-sgp-build-response"
curl "https://apis.io/api/v1/json-schemas?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.