owlsinsight-com · Schema

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}.

CompanySportsBettingDataAPI

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
View JSON Schema on GitHub

JSON Schema

owlsinsight-com-sgp-build-response-schema.json Raw ↑
{
  "$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.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/owlsinsight-com-sgp-build-response"
All schemas
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.