{
  "openapi": "3.1.0",
  "info": {
    "title": "RadarFutebol API",
    "version": "1.0.0",
    "summary": "Live football matches in JSON: scores, stats, odds, xG and attacking-pressure index.",
    "description": "Same data source as the RadarFutebol live panel (https://www.radarfutebol.com), recalculated every 5 seconds. Polling faster than that returns the same content. Every request needs a Bearer token issued with an API subscription (Basic or Complete plan); the token is shown on the Payments page of the account. Human documentation: https://www.radarfutebol.com/en/api-docs Versioning: the current contract is version 1, sent in the API-Version response header. Additive changes (new fields) keep the version. A breaking change ships as a new version selected with the API-Version request header, announced by e-mail to API subscribers; an endpoint or version being retired answers with Deprecation and Sunset headers before it is removed. Rate limits: every response carries RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset (seconds, upper bound) and RateLimit-Policy (IETF), plus the legacy X-RateLimit-* headers; a 429 carries Retry-After.",
    "contact": {
      "name": "RadarFutebol",
      "email": "contato@radarfutebol.com",
      "url": "https://www.radarfutebol.com/en/contact"
    },
    "termsOfService": "https://www.radarfutebol.com/termos-de-uso"
  },
  "externalDocs": {
    "description": "API documentation",
    "url": "https://www.radarfutebol.com/en/api-docs"
  },
  "servers": [
    {
      "url": "https://www.radarfutebol.com/api",
      "description": "Production"
    }
  ],
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "tags": [
    {
      "name": "Live football",
      "description": "Live and finished football matches."
    }
  ],
  "paths": {
    "/eventos-live-basico": {
      "get": {
        "operationId": "listLiveMatchesBasic",
        "summary": "List live matches (basic)",
        "description": "Every match in progress with score, current minute and stats for both teams (possession, shots, corners, dangerous attacks, penalties and red cards). Requires the Basic API plan.",
        "tags": [
          "Live football"
        ],
        "security": [
          {
            "bearerAuth": [
              "api-oraculo-basico"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/ApiVersion"
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag from a previous response of the same endpoint.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "ETag": {
                "description": "Weak ETag of the payload. Send it back in If-None-Match to get 304 when nothing changed.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/JogoAoVivoBasico"
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified: the If-None-Match ETag still matches. Empty body.",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              }
            }
          },
          "401": {
            "description": "Missing, invalid or expired token. Stop polling and renew the subscription.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erro"
                }
              }
            },
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              }
            }
          },
          "403": {
            "description": "The token's plan does not include this endpoint.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erro"
                }
              }
            },
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (Basic: 60/min, Complete: 180/min).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erro"
                }
              }
            },
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        },
        "x-plan": "Basic"
      }
    },
    "/eventos-live": {
      "get": {
        "operationId": "listLiveMatches",
        "summary": "List live matches (complete)",
        "description": "Every match in progress with everything from the basic list plus pre-match and live odds, win probabilities, xG, the Score de Lances pressure index and stoppage-time forecast. Requires the Complete API plan.",
        "tags": [
          "Live football"
        ],
        "security": [
          {
            "bearerAuth": [
              "api-oraculo"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/ApiVersion"
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag from a previous response of the same endpoint.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "ETag": {
                "description": "Weak ETag of the payload. Send it back in If-None-Match to get 304 when nothing changed.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/JogoAoVivoCompleto"
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified: the If-None-Match ETag still matches. Empty body.",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              }
            }
          },
          "401": {
            "description": "Missing, invalid or expired token. Stop polling and renew the subscription.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erro"
                }
              }
            },
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              }
            }
          },
          "403": {
            "description": "The token's plan does not include this endpoint.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erro"
                }
              }
            },
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (Basic: 60/min, Complete: 180/min).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erro"
                }
              }
            },
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        },
        "x-plan": "Complete"
      }
    },
    "/eventos-passados/{data}": {
      "get": {
        "operationId": "listFinishedMatchesByDate",
        "summary": "List finished matches of a date",
        "description": "Matches that kicked off on the given date (Brasília time) with competition, teams and final score. Requires the Complete API plan.",
        "tags": [
          "Live football"
        ],
        "security": [
          {
            "bearerAuth": [
              "api-oraculo"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/ApiVersion"
          },
          {
            "name": "data",
            "in": "path",
            "required": true,
            "description": "Date in YYYY-MM-DD format.",
            "schema": {
              "type": "string",
              "format": "date"
            },
            "example": "2026-11-10"
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag from a previous response of the same endpoint.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "ETag": {
                "description": "Weak ETag of the payload. Send it back in If-None-Match to get 304 when nothing changed.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/JogoEncerrado"
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified: the If-None-Match ETag still matches. Empty body.",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              }
            }
          },
          "401": {
            "description": "Missing, invalid or expired token. Stop polling and renew the subscription.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erro"
                }
              }
            },
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              }
            }
          },
          "403": {
            "description": "The token's plan does not include this endpoint.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erro"
                }
              }
            },
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (Basic: 60/min, Complete: 180/min).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erro"
                }
              }
            },
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "404": {
            "description": "Missing date.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erro"
                }
              }
            },
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              }
            }
          }
        },
        "x-plan": "Complete"
      }
    },
    "/dados-evento/{id}": {
      "get": {
        "operationId": "getMatchTimeline",
        "summary": "Get the timeline of one match",
        "description": "Minute-by-minute timeline of one match (events used by the Oracle pressure indicator). Requires the Complete API plan.",
        "tags": [
          "Live football"
        ],
        "security": [
          {
            "bearerAuth": [
              "api-oraculo"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/ApiVersion"
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Match id: the id field returned by the live match endpoints.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag from a previous response of the same endpoint.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "ETag": {
                "description": "Weak ETag of the payload. Send it back in If-None-Match to get 304 when nothing changed.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LanceLinhaDoTempo"
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified: the If-None-Match ETag still matches. Empty body.",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              }
            }
          },
          "401": {
            "description": "Missing, invalid or expired token. Stop polling and renew the subscription.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erro"
                }
              }
            },
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              }
            }
          },
          "403": {
            "description": "The token's plan does not include this endpoint.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erro"
                }
              }
            },
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (Basic: 60/min, Complete: 180/min).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erro"
                }
              }
            },
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "404": {
            "description": "Unknown match id.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erro"
                }
              }
            },
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              }
            }
          }
        },
        "x-plan": "Complete"
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "API token from the account's Payments page. Scope api-oraculo-basico (Basic plan) or api-oraculo (Complete plan)."
      }
    },
    "schemas": {
      "JogoAoVivoBasico": {
        "type": "object",
        "description": "A match in progress (Basic plan).",
        "required": [
          "id",
          "timeCasa",
          "timeFora"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Match id (William Hill id). Use it in /dados-evento/{id}."
          },
          "pais": {
            "type": "string",
            "description": "Country or category of the competition.",
            "examples": [
              "Brasil"
            ]
          },
          "campeonato": {
            "type": "string",
            "description": "Competition name.",
            "examples": [
              "Brasileirão Série A"
            ]
          },
          "timeCasa": {
            "type": "string",
            "description": "Home team."
          },
          "timeFora": {
            "type": "string",
            "description": "Away team."
          },
          "golsTimeCasaFt": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Home team goals in the match so far."
          },
          "golsTimeForaFt": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Away team goals in the match so far."
          },
          "golsTimeCasaHt": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Home team goals at half-time."
          },
          "golsTimeForaHt": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Away team goals at half-time."
          },
          "tempoAtual": {
            "type": [
              "string",
              "null"
            ],
            "description": "Current match minute or period label.",
            "examples": [
              "67'",
              "HT"
            ]
          },
          "posseBolaTimeCasa": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Ball possession of the home team, in percent."
          },
          "chutesGolTimeCasa": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Shots on target by the home team."
          },
          "chutesForaTimeCasa": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Shots off target by the home team."
          },
          "chutesTraveTimeCasa": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Shots hitting the woodwork by the home team."
          },
          "chutesBloqueadoTimeCasa": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Blocked shots by the home team."
          },
          "escanteiosTimeCasa": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Corners of the home team."
          },
          "ataquesPerigososTimeCasa": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Dangerous attacks of the home team."
          },
          "penalidadesTimeCasa": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Penalties awarded to the home team."
          },
          "cartaoVermelhoTimeCasa": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Red cards of the home team."
          },
          "posseBolaTimeFora": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Ball possession of the away team, in percent."
          },
          "chutesGolTimeFora": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Shots on target by the away team."
          },
          "chutesForaTimeFora": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Shots off target by the away team."
          },
          "chutesTraveTimeFora": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Shots hitting the woodwork by the away team."
          },
          "chutesBloqueadoTimeFora": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Blocked shots by the away team."
          },
          "escanteiosTimeFora": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Corners of the away team."
          },
          "ataquesPerigososTimeFora": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Dangerous attacks of the away team."
          },
          "penalidadesTimeFora": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Penalties awarded to the away team."
          },
          "cartaoVermelhoTimeFora": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Red cards of the away team."
          }
        }
      },
      "JogoAoVivoCompleto": {
        "type": "object",
        "description": "A match in progress (Complete plan).",
        "required": [
          "id",
          "timeCasa",
          "timeFora"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Match id (William Hill id). Use it in /dados-evento/{id}."
          },
          "pais": {
            "type": "string",
            "description": "Country or category of the competition.",
            "examples": [
              "Brasil"
            ]
          },
          "campeonato": {
            "type": "string",
            "description": "Competition name.",
            "examples": [
              "Brasileirão Série A"
            ]
          },
          "timeCasa": {
            "type": "string",
            "description": "Home team."
          },
          "timeFora": {
            "type": "string",
            "description": "Away team."
          },
          "golsTimeCasaFt": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Home team goals in the match so far."
          },
          "golsTimeForaFt": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Away team goals in the match so far."
          },
          "golsTimeCasaHt": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Home team goals at half-time."
          },
          "golsTimeForaHt": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Away team goals at half-time."
          },
          "tempoAtual": {
            "type": [
              "string",
              "null"
            ],
            "description": "Current match minute or period label.",
            "examples": [
              "67'",
              "HT"
            ]
          },
          "posseBolaTimeCasa": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Ball possession of the home team, in percent."
          },
          "chutesGolTimeCasa": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Shots on target by the home team."
          },
          "chutesForaTimeCasa": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Shots off target by the home team."
          },
          "chutesTraveTimeCasa": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Shots hitting the woodwork by the home team."
          },
          "chutesBloqueadoTimeCasa": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Blocked shots by the home team."
          },
          "escanteiosTimeCasa": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Corners of the home team."
          },
          "ataquesPerigososTimeCasa": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Dangerous attacks of the home team."
          },
          "penalidadesTimeCasa": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Penalties awarded to the home team."
          },
          "cartaoVermelhoTimeCasa": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Red cards of the home team."
          },
          "posseBolaTimeFora": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Ball possession of the away team, in percent."
          },
          "chutesGolTimeFora": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Shots on target by the away team."
          },
          "chutesForaTimeFora": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Shots off target by the away team."
          },
          "chutesTraveTimeFora": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Shots hitting the woodwork by the away team."
          },
          "chutesBloqueadoTimeFora": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Blocked shots by the away team."
          },
          "escanteiosTimeFora": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Corners of the away team."
          },
          "ataquesPerigososTimeFora": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Dangerous attacks of the away team."
          },
          "penalidadesTimeFora": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Penalties awarded to the away team."
          },
          "cartaoVermelhoTimeFora": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Red cards of the away team."
          },
          "probabilidadesTimeCasa": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Win probability of the home team, in percent."
          },
          "xgTimeCasa": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Expected goals (xG) of the home team."
          },
          "scoreLances10MinTimeCasa": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Score de Lances (attacking-pressure index) of the home team in the last 10 minutes. 0 when there is no data."
          },
          "scoreLances5MinTimeCasa": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Score de Lances of the home team in the last 5 minutes. 0 when there is no data."
          },
          "probabilidadesTimeFora": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Win probability of the away team, in percent."
          },
          "xgTimeFora": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Expected goals (xG) of the away team."
          },
          "scoreLances10MinTimeFora": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Score de Lances (attacking-pressure index) of the away team in the last 10 minutes. 0 when there is no data."
          },
          "scoreLances5MinTimeFora": {
            "type": [
              "integer",
              "number",
              "string",
              "null"
            ],
            "description": "Score de Lances of the away team in the last 5 minutes. 0 when there is no data."
          },
          "over": {
            "type": "boolean",
            "description": "True when the match is in the RadarFutebol goal-trend (over) selection."
          },
          "previsaoAcrescimo1Tempo": {
            "type": [
              "string",
              "integer",
              "null"
            ],
            "description": "Stoppage-time forecast for the first half, in minutes."
          },
          "previsaoAcrescimo2Tempo": {
            "type": [
              "string",
              "integer",
              "null"
            ],
            "description": "Stoppage-time forecast for the second half, in minutes."
          },
          "oddTimeCasa": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pre-match odds for a home win. Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
            "examples": [
              "1.85"
            ]
          },
          "oddEmpate": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pre-match odds for a draw. Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
            "examples": [
              "1.85"
            ]
          },
          "oddTimeFora": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pre-match odds for an away win. Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
            "examples": [
              "1.85"
            ]
          },
          "oddOver05FT": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pre-match odds for over 0.5 goals (full time). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
            "examples": [
              "1.85"
            ]
          },
          "oddUnder05FT": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pre-match odds for under 0.5 goals (full time). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
            "examples": [
              "1.85"
            ]
          },
          "oddOver05HT": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pre-match odds for over 0.5 goals (first half). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
            "examples": [
              "1.85"
            ]
          },
          "oddUnder05HT": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pre-match odds for under 0.5 goals (first half). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
            "examples": [
              "1.85"
            ]
          },
          "oddOver15FT": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pre-match odds for over 1.5 goals (full time). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
            "examples": [
              "1.85"
            ]
          },
          "oddUnder15FT": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pre-match odds for under 1.5 goals (full time). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
            "examples": [
              "1.85"
            ]
          },
          "oddOver15HT": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pre-match odds for over 1.5 goals (first half). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
            "examples": [
              "1.85"
            ]
          },
          "oddUnder15HT": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pre-match odds for under 1.5 goals (first half). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
            "examples": [
              "1.85"
            ]
          },
          "oddOver25FT": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pre-match odds for over 2.5 goals (full time). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
            "examples": [
              "1.85"
            ]
          },
          "oddUnder25FT": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pre-match odds for under 2.5 goals (full time). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
            "examples": [
              "1.85"
            ]
          },
          "oddOver25HT": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pre-match odds for over 2.5 goals (first half). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
            "examples": [
              "1.85"
            ]
          },
          "oddUnder25HT": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pre-match odds for under 2.5 goals (first half). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
            "examples": [
              "1.85"
            ]
          },
          "oddBttsSim": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pre-match odds for both teams to score: yes. Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
            "examples": [
              "1.85"
            ]
          },
          "oddBttsNao": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pre-match odds for both teams to score: no. Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
            "examples": [
              "1.85"
            ]
          },
          "oddsLive": {
            "type": [
              "object",
              "null"
            ],
            "description": "Live odds of the moment (refreshed about every 10 seconds); null when the match has no live market.",
            "properties": {
              "oddTimeCasa": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Live odds right now: a home win. Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
                "examples": [
                  "1.85"
                ]
              },
              "oddEmpate": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Live odds right now: a draw. Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
                "examples": [
                  "1.85"
                ]
              },
              "oddTimeFora": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Live odds right now: an away win. Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
                "examples": [
                  "1.85"
                ]
              },
              "oddOver05FT": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Live odds right now: over 0.5 goals (full time). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
                "examples": [
                  "1.85"
                ]
              },
              "oddUnder05FT": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Live odds right now: under 0.5 goals (full time). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
                "examples": [
                  "1.85"
                ]
              },
              "oddOver05HT": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Live odds right now: over 0.5 goals (first half). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
                "examples": [
                  "1.85"
                ]
              },
              "oddUnder05HT": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Live odds right now: under 0.5 goals (first half). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
                "examples": [
                  "1.85"
                ]
              },
              "oddOver15FT": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Live odds right now: over 1.5 goals (full time). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
                "examples": [
                  "1.85"
                ]
              },
              "oddUnder15FT": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Live odds right now: under 1.5 goals (full time). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
                "examples": [
                  "1.85"
                ]
              },
              "oddOver15HT": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Live odds right now: over 1.5 goals (first half). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
                "examples": [
                  "1.85"
                ]
              },
              "oddUnder15HT": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Live odds right now: under 1.5 goals (first half). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
                "examples": [
                  "1.85"
                ]
              },
              "oddOver25FT": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Live odds right now: over 2.5 goals (full time). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
                "examples": [
                  "1.85"
                ]
              },
              "oddUnder25FT": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Live odds right now: under 2.5 goals (full time). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
                "examples": [
                  "1.85"
                ]
              },
              "oddOver25HT": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Live odds right now: over 2.5 goals (first half). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
                "examples": [
                  "1.85"
                ]
              },
              "oddUnder25HT": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Live odds right now: under 2.5 goals (first half). Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
                "examples": [
                  "1.85"
                ]
              },
              "oddBttsSim": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Live odds right now: both teams to score: yes. Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
                "examples": [
                  "1.85"
                ]
              },
              "oddBttsNao": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Live odds right now: both teams to score: no. Decimal odds as a string with two decimals (e.g. \"1.85\"); null when unavailable.",
                "examples": [
                  "1.85"
                ]
              }
            }
          }
        }
      },
      "JogoEncerrado": {
        "type": "object",
        "description": "A finished match.",
        "required": [
          "idEvento",
          "timeCasa",
          "timeFora"
        ],
        "properties": {
          "idEvento": {
            "type": "integer",
            "description": "RadarFutebol match id."
          },
          "idWilliamhill": {
            "type": [
              "string",
              "null"
            ],
            "description": "William Hill match id."
          },
          "nomeCategoria": {
            "type": "string",
            "description": "Country or category."
          },
          "nomeCampeonato": {
            "type": "string",
            "description": "Competition."
          },
          "timeCasa": {
            "type": "string",
            "description": "Home team."
          },
          "timeFora": {
            "type": "string",
            "description": "Away team."
          },
          "golsTimeCasa": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Home team final goals."
          },
          "golsTimeFora": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Away team final goals."
          }
        }
      },
      "LanceLinhaDoTempo": {
        "type": "object",
        "description": "One timeline entry of a match (minute, team and event counters).",
        "additionalProperties": true
      },
      "Erro": {
        "type": "object",
        "required": [
          "message"
        ],
        "properties": {
          "message": {
            "type": "string",
            "description": "Human-readable error message."
          },
          "error": {
            "type": "string",
            "description": "Stable error code.",
            "enum": [
              "unauthenticated",
              "forbidden",
              "not_found",
              "too_many_requests",
              "server_error",
              "bad_request"
            ]
          },
          "hint": {
            "type": "string",
            "description": "What to do next."
          },
          "documentation": {
            "type": "string",
            "format": "uri",
            "description": "Link to the API documentation."
          }
        }
      }
    },
    "parameters": {
      "ApiVersion": {
        "name": "API-Version",
        "in": "header",
        "required": false,
        "description": "API contract version. Optional; defaults to the current version.",
        "schema": {
          "type": "string",
          "enum": [
            "1"
          ],
          "default": "1"
        }
      }
    },
    "headers": {
      "API-Version": {
        "description": "Contract version that served the response.",
        "schema": {
          "type": "string",
          "examples": [
            "1"
          ]
        }
      },
      "RateLimit-Limit": {
        "description": "Requests allowed in the current window.",
        "schema": {
          "type": "integer"
        }
      },
      "RateLimit-Remaining": {
        "description": "Requests left in the current window.",
        "schema": {
          "type": "integer"
        }
      },
      "RateLimit-Reset": {
        "description": "Seconds until the window resets (upper bound).",
        "schema": {
          "type": "integer"
        }
      },
      "RateLimit-Policy": {
        "description": "Quota policy, e.g. 180;w=60 (180 requests per 60 seconds).",
        "schema": {
          "type": "string"
        }
      }
    }
  }
}
