{
  "description": "Como assinar requisições e verificar webhooks. Cada snippet traz o código e uma conferência com o vetor de teste (test-vectors.json).",
  "algorithm": {
    "request": "X-Signature = hex(HMAC_SHA256(secret, METODO + \"\\n\" + CAMINHO_COM_QUERY + \"\\n\" + TIMESTAMP + \"\\n\" + SHA256_HEX(CORPO)))",
    "webhook": "X-Webhook-Signature = hex(HMAC_SHA256(whsec, TIMESTAMP + \".\" + CORPO_BRUTO))"
  },
  "languages": [
    {
      "id": "node",
      "label": "Node.js",
      "file": "sign.mjs",
      "code": "import { createHash, createHmac, timingSafeEqual } from \"node:crypto\";\n\n/** Assina uma requisição: retorna o valor do cabeçalho X-Signature. */\nexport function signRequest(secret, method, pathWithQuery, timestamp, body = \"\") {\n  const canonical = [\n    method.toUpperCase(),\n    pathWithQuery, // exatamente como enviado, com /api/v1 e a query string\n    timestamp, // epoch em segundos (string)\n    createHash(\"sha256\").update(body).digest(\"hex\"),\n  ].join(\"\\n\");\n  return createHmac(\"sha256\", secret).update(canonical).digest(\"hex\");\n}\n\n/** Verifica um webhook recebido (use o corpo BRUTO, antes de parsear o JSON). */\nexport function verifyWebhook(secret, timestamp, rawBody, signature) {\n  const expected = createHmac(\"sha256\", secret).update(`${timestamp}.${rawBody}`).digest(\"hex\");\n  const a = Buffer.from(expected);\n  const b = Buffer.from(signature);\n  return a.length === b.length && timingSafeEqual(a, b);\n}",
      "full": "import { createHash, createHmac, timingSafeEqual } from \"node:crypto\";\n\n/** Assina uma requisição: retorna o valor do cabeçalho X-Signature. */\nexport function signRequest(secret, method, pathWithQuery, timestamp, body = \"\") {\n  const canonical = [\n    method.toUpperCase(),\n    pathWithQuery, // exatamente como enviado, com /api/v1 e a query string\n    timestamp, // epoch em segundos (string)\n    createHash(\"sha256\").update(body).digest(\"hex\"),\n  ].join(\"\\n\");\n  return createHmac(\"sha256\", secret).update(canonical).digest(\"hex\");\n}\n\n/** Verifica um webhook recebido (use o corpo BRUTO, antes de parsear o JSON). */\nexport function verifyWebhook(secret, timestamp, rawBody, signature) {\n  const expected = createHmac(\"sha256\", secret).update(`${timestamp}.${rawBody}`).digest(\"hex\");\n  const a = Buffer.from(expected);\n  const b = Buffer.from(signature);\n  return a.length === b.length && timingSafeEqual(a, b);\n}\n// Conferência com o vetor de teste\nconsole.log(signRequest(\"sk_test_vetor_de_teste_nao_use_em_producao\", \"POST\", \"/api/v1/players\", \"1700000000\", \"{\\\"externalId\\\":\\\"jogador-123\\\",\\\"name\\\":\\\"Ana Souza\\\"}\"));\nconsole.log(signRequest(\"sk_test_vetor_de_teste_nao_use_em_producao\", \"GET\", \"/api/v1/players?externalId=jogador-123\", \"1700000000\"));\nconsole.log(verifyWebhook(\"whsec_vetor_de_teste_nao_use_em_producao\", \"1700000000\", \"{\\\"id\\\":\\\"evt_vetor\\\",\\\"type\\\":\\\"webhook.test\\\",\\\"createdAt\\\":\\\"2023-11-14T22:13:20.000Z\\\",\\\"apiVersion\\\":\\\"1.0.0\\\",\\\"data\\\":{\\\"message\\\":\\\"ok\\\"}}\", \"a95e51addfc7fd14d048f689f85dfc36b8b8b3f48c8fd8dd98e114c4b6711c14\"));"
    },
    {
      "id": "python",
      "label": "Python",
      "file": "sign.py",
      "code": "import hashlib\nimport hmac\n\n\ndef sign_request(secret, method, path_with_query, timestamp, body=\"\"):\n    \"\"\"Assina uma requisição: retorna o valor do cabeçalho X-Signature.\"\"\"\n    canonical = \"\\n\".join([\n        method.upper(),\n        path_with_query,  # exatamente como enviado, com /api/v1 e a query string\n        timestamp,        # epoch em segundos (string)\n        hashlib.sha256(body.encode()).hexdigest(),\n    ])\n    return hmac.new(secret.encode(), canonical.encode(), hashlib.sha256).hexdigest()\n\n\ndef verify_webhook(secret, timestamp, raw_body, signature):\n    \"\"\"Verifica um webhook recebido (use o corpo BRUTO, antes de parsear o JSON).\"\"\"\n    expected = hmac.new(secret.encode(), f\"{timestamp}.{raw_body}\".encode(), hashlib.sha256).hexdigest()\n    return hmac.compare_digest(expected, signature)",
      "full": "import hashlib\nimport hmac\n\n\ndef sign_request(secret, method, path_with_query, timestamp, body=\"\"):\n    \"\"\"Assina uma requisição: retorna o valor do cabeçalho X-Signature.\"\"\"\n    canonical = \"\\n\".join([\n        method.upper(),\n        path_with_query,  # exatamente como enviado, com /api/v1 e a query string\n        timestamp,        # epoch em segundos (string)\n        hashlib.sha256(body.encode()).hexdigest(),\n    ])\n    return hmac.new(secret.encode(), canonical.encode(), hashlib.sha256).hexdigest()\n\n\ndef verify_webhook(secret, timestamp, raw_body, signature):\n    \"\"\"Verifica um webhook recebido (use o corpo BRUTO, antes de parsear o JSON).\"\"\"\n    expected = hmac.new(secret.encode(), f\"{timestamp}.{raw_body}\".encode(), hashlib.sha256).hexdigest()\n    return hmac.compare_digest(expected, signature)\n\n# Conferência com o vetor de teste\nprint(sign_request(\"sk_test_vetor_de_teste_nao_use_em_producao\", \"POST\", \"/api/v1/players\", \"1700000000\", \"{\\\"externalId\\\":\\\"jogador-123\\\",\\\"name\\\":\\\"Ana Souza\\\"}\"))\nprint(sign_request(\"sk_test_vetor_de_teste_nao_use_em_producao\", \"GET\", \"/api/v1/players?externalId=jogador-123\", \"1700000000\"))\nprint(str(verify_webhook(\"whsec_vetor_de_teste_nao_use_em_producao\", \"1700000000\", \"{\\\"id\\\":\\\"evt_vetor\\\",\\\"type\\\":\\\"webhook.test\\\",\\\"createdAt\\\":\\\"2023-11-14T22:13:20.000Z\\\",\\\"apiVersion\\\":\\\"1.0.0\\\",\\\"data\\\":{\\\"message\\\":\\\"ok\\\"}}\", \"a95e51addfc7fd14d048f689f85dfc36b8b8b3f48c8fd8dd98e114c4b6711c14\")).lower())"
    },
    {
      "id": "php",
      "label": "PHP",
      "file": "sign.php",
      "code": "<?php\n/** Assina uma requisição: retorna o valor do cabeçalho X-Signature. */\nfunction sign_request(string $secret, string $method, string $pathWithQuery, string $timestamp, string $body = \"\"): string {\n    $canonical = implode(\"\\n\", [\n        strtoupper($method),\n        $pathWithQuery, // exatamente como enviado, com /api/v1 e a query string\n        $timestamp,     // epoch em segundos (string)\n        hash(\"sha256\", $body),\n    ]);\n    return hash_hmac(\"sha256\", $canonical, $secret);\n}\n\n/** Verifica um webhook recebido (use o corpo BRUTO: file_get_contents(\"php://input\")). */\nfunction verify_webhook(string $secret, string $timestamp, string $rawBody, string $signature): bool {\n    return hash_equals(hash_hmac(\"sha256\", $timestamp . \".\" . $rawBody, $secret), $signature);\n}",
      "full": "<?php\n/** Assina uma requisição: retorna o valor do cabeçalho X-Signature. */\nfunction sign_request(string $secret, string $method, string $pathWithQuery, string $timestamp, string $body = \"\"): string {\n    $canonical = implode(\"\\n\", [\n        strtoupper($method),\n        $pathWithQuery, // exatamente como enviado, com /api/v1 e a query string\n        $timestamp,     // epoch em segundos (string)\n        hash(\"sha256\", $body),\n    ]);\n    return hash_hmac(\"sha256\", $canonical, $secret);\n}\n\n/** Verifica um webhook recebido (use o corpo BRUTO: file_get_contents(\"php://input\")). */\nfunction verify_webhook(string $secret, string $timestamp, string $rawBody, string $signature): bool {\n    return hash_equals(hash_hmac(\"sha256\", $timestamp . \".\" . $rawBody, $secret), $signature);\n}\n\n// Conferência com o vetor de teste\necho sign_request(\"sk_test_vetor_de_teste_nao_use_em_producao\", \"POST\", \"/api/v1/players\", \"1700000000\", \"{\\\"externalId\\\":\\\"jogador-123\\\",\\\"name\\\":\\\"Ana Souza\\\"}\"), \"\\n\";\necho sign_request(\"sk_test_vetor_de_teste_nao_use_em_producao\", \"GET\", \"/api/v1/players?externalId=jogador-123\", \"1700000000\"), \"\\n\";\necho verify_webhook(\"whsec_vetor_de_teste_nao_use_em_producao\", \"1700000000\", \"{\\\"id\\\":\\\"evt_vetor\\\",\\\"type\\\":\\\"webhook.test\\\",\\\"createdAt\\\":\\\"2023-11-14T22:13:20.000Z\\\",\\\"apiVersion\\\":\\\"1.0.0\\\",\\\"data\\\":{\\\"message\\\":\\\"ok\\\"}}\", \"a95e51addfc7fd14d048f689f85dfc36b8b8b3f48c8fd8dd98e114c4b6711c14\") ? \"true\" : \"false\", \"\\n\";"
    },
    {
      "id": "go",
      "label": "Go",
      "file": "sign.go",
      "code": "package main\n\nimport (\n\t\"crypto/hmac\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"strings\"\n)\n\n// signRequest assina uma requisição: retorna o valor do cabeçalho X-Signature.\nfunc signRequest(secret, method, pathWithQuery, timestamp, body string) string {\n\tsum := sha256.Sum256([]byte(body))\n\tcanonical := strings.ToUpper(method) + \"\\n\" +\n\t\tpathWithQuery + \"\\n\" + // exatamente como enviado, com /api/v1 e a query string\n\t\ttimestamp + \"\\n\" + // epoch em segundos (string)\n\t\thex.EncodeToString(sum[:])\n\tmac := hmac.New(sha256.New, []byte(secret))\n\tmac.Write([]byte(canonical))\n\treturn hex.EncodeToString(mac.Sum(nil))\n}\n\n// verifyWebhook verifica um webhook recebido (use o corpo BRUTO).\nfunc verifyWebhook(secret, timestamp, rawBody, signature string) bool {\n\tmac := hmac.New(sha256.New, []byte(secret))\n\tmac.Write([]byte(timestamp + \".\" + rawBody))\n\treturn hmac.Equal([]byte(hex.EncodeToString(mac.Sum(nil))), []byte(signature))\n}",
      "full": "package main\n\nimport (\n\t\"crypto/hmac\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"strings\"\n)\n\n// signRequest assina uma requisição: retorna o valor do cabeçalho X-Signature.\nfunc signRequest(secret, method, pathWithQuery, timestamp, body string) string {\n\tsum := sha256.Sum256([]byte(body))\n\tcanonical := strings.ToUpper(method) + \"\\n\" +\n\t\tpathWithQuery + \"\\n\" + // exatamente como enviado, com /api/v1 e a query string\n\t\ttimestamp + \"\\n\" + // epoch em segundos (string)\n\t\thex.EncodeToString(sum[:])\n\tmac := hmac.New(sha256.New, []byte(secret))\n\tmac.Write([]byte(canonical))\n\treturn hex.EncodeToString(mac.Sum(nil))\n}\n\n// verifyWebhook verifica um webhook recebido (use o corpo BRUTO).\nfunc verifyWebhook(secret, timestamp, rawBody, signature string) bool {\n\tmac := hmac.New(sha256.New, []byte(secret))\n\tmac.Write([]byte(timestamp + \".\" + rawBody))\n\treturn hmac.Equal([]byte(hex.EncodeToString(mac.Sum(nil))), []byte(signature))\n}\n\nfunc main() {\n\t// Conferência com o vetor de teste\n\tfmt.Println(signRequest(\"sk_test_vetor_de_teste_nao_use_em_producao\", \"POST\", \"/api/v1/players\", \"1700000000\", \"{\\\"externalId\\\":\\\"jogador-123\\\",\\\"name\\\":\\\"Ana Souza\\\"}\"))\n\tfmt.Println(signRequest(\"sk_test_vetor_de_teste_nao_use_em_producao\", \"GET\", \"/api/v1/players?externalId=jogador-123\", \"1700000000\", \"\"))\n\tfmt.Println(verifyWebhook(\"whsec_vetor_de_teste_nao_use_em_producao\", \"1700000000\", \"{\\\"id\\\":\\\"evt_vetor\\\",\\\"type\\\":\\\"webhook.test\\\",\\\"createdAt\\\":\\\"2023-11-14T22:13:20.000Z\\\",\\\"apiVersion\\\":\\\"1.0.0\\\",\\\"data\\\":{\\\"message\\\":\\\"ok\\\"}}\", \"a95e51addfc7fd14d048f689f85dfc36b8b8b3f48c8fd8dd98e114c4b6711c14\"))\n}"
    },
    {
      "id": "java",
      "label": "Java",
      "file": "BetSigner.java",
      "code": "import java.nio.charset.StandardCharsets;\nimport java.security.MessageDigest;\nimport java.util.HexFormat;\nimport javax.crypto.Mac;\nimport javax.crypto.spec.SecretKeySpec;\n\npublic class BetSigner {\n    static String hmacHex(String secret, String message) throws Exception {\n        Mac mac = Mac.getInstance(\"HmacSHA256\");\n        mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), \"HmacSHA256\"));\n        return HexFormat.of().formatHex(mac.doFinal(message.getBytes(StandardCharsets.UTF_8)));\n    }\n\n    /** Assina uma requisição: retorna o valor do cabeçalho X-Signature. */\n    public static String signRequest(String secret, String method, String pathWithQuery, String timestamp, String body) throws Exception {\n        String bodyHash = HexFormat.of().formatHex(\n            MessageDigest.getInstance(\"SHA-256\").digest(body.getBytes(StandardCharsets.UTF_8)));\n        // pathWithQuery: exatamente como enviado, com /api/v1 e a query string; timestamp: epoch em segundos\n        return hmacHex(secret, String.join(\"\\n\", method.toUpperCase(), pathWithQuery, timestamp, bodyHash));\n    }\n\n    /** Verifica um webhook recebido (use o corpo BRUTO). */\n    public static boolean verifyWebhook(String secret, String timestamp, String rawBody, String signature) throws Exception {\n        String expected = hmacHex(secret, timestamp + \".\" + rawBody);\n        return MessageDigest.isEqual(expected.getBytes(StandardCharsets.UTF_8), signature.getBytes(StandardCharsets.UTF_8));\n    }",
      "full": "import java.nio.charset.StandardCharsets;\nimport java.security.MessageDigest;\nimport java.util.HexFormat;\nimport javax.crypto.Mac;\nimport javax.crypto.spec.SecretKeySpec;\n\npublic class BetSigner {\n    static String hmacHex(String secret, String message) throws Exception {\n        Mac mac = Mac.getInstance(\"HmacSHA256\");\n        mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), \"HmacSHA256\"));\n        return HexFormat.of().formatHex(mac.doFinal(message.getBytes(StandardCharsets.UTF_8)));\n    }\n\n    /** Assina uma requisição: retorna o valor do cabeçalho X-Signature. */\n    public static String signRequest(String secret, String method, String pathWithQuery, String timestamp, String body) throws Exception {\n        String bodyHash = HexFormat.of().formatHex(\n            MessageDigest.getInstance(\"SHA-256\").digest(body.getBytes(StandardCharsets.UTF_8)));\n        // pathWithQuery: exatamente como enviado, com /api/v1 e a query string; timestamp: epoch em segundos\n        return hmacHex(secret, String.join(\"\\n\", method.toUpperCase(), pathWithQuery, timestamp, bodyHash));\n    }\n\n    /** Verifica um webhook recebido (use o corpo BRUTO). */\n    public static boolean verifyWebhook(String secret, String timestamp, String rawBody, String signature) throws Exception {\n        String expected = hmacHex(secret, timestamp + \".\" + rawBody);\n        return MessageDigest.isEqual(expected.getBytes(StandardCharsets.UTF_8), signature.getBytes(StandardCharsets.UTF_8));\n    }\n\n    public static void main(String[] args) throws Exception {\n        // Conferência com o vetor de teste\n        System.out.println(signRequest(\"sk_test_vetor_de_teste_nao_use_em_producao\", \"POST\", \"/api/v1/players\", \"1700000000\", \"{\\\"externalId\\\":\\\"jogador-123\\\",\\\"name\\\":\\\"Ana Souza\\\"}\"));\n        System.out.println(signRequest(\"sk_test_vetor_de_teste_nao_use_em_producao\", \"GET\", \"/api/v1/players?externalId=jogador-123\", \"1700000000\", \"\"));\n        System.out.println(verifyWebhook(\"whsec_vetor_de_teste_nao_use_em_producao\", \"1700000000\", \"{\\\"id\\\":\\\"evt_vetor\\\",\\\"type\\\":\\\"webhook.test\\\",\\\"createdAt\\\":\\\"2023-11-14T22:13:20.000Z\\\",\\\"apiVersion\\\":\\\"1.0.0\\\",\\\"data\\\":{\\\"message\\\":\\\"ok\\\"}}\", \"a95e51addfc7fd14d048f689f85dfc36b8b8b3f48c8fd8dd98e114c4b6711c14\"));\n    }\n}"
    },
    {
      "id": "csharp",
      "label": "C#",
      "file": "BetSigner.cs",
      "code": "using System;\nusing System.Security.Cryptography;\nusing System.Text;\n\npublic static class BetSigner\n{\n    static string HmacHex(string secret, string message)\n    {\n        using var h = new HMACSHA256(Encoding.UTF8.GetBytes(secret));\n        return Convert.ToHexString(h.ComputeHash(Encoding.UTF8.GetBytes(message))).ToLowerInvariant();\n    }\n\n    /// <summary>Assina uma requisição: retorna o valor do cabeçalho X-Signature.</summary>\n    public static string SignRequest(string secret, string method, string pathWithQuery, string timestamp, string body = \"\")\n    {\n        var bodyHash = Convert.ToHexString(SHA256.HashData(Encoding.UTF8.GetBytes(body))).ToLowerInvariant();\n        // pathWithQuery: exatamente como enviado, com /api/v1 e a query string; timestamp: epoch em segundos\n        return HmacHex(secret, string.Join(\"\\n\", method.ToUpperInvariant(), pathWithQuery, timestamp, bodyHash));\n    }\n\n    /// <summary>Verifica um webhook recebido (use o corpo BRUTO).</summary>\n    public static bool VerifyWebhook(string secret, string timestamp, string rawBody, string signature) =>\n        CryptographicOperations.FixedTimeEquals(\n            Encoding.UTF8.GetBytes(HmacHex(secret, $\"{timestamp}.{rawBody}\")),\n            Encoding.UTF8.GetBytes(signature));",
      "full": "using System;\nusing System.Security.Cryptography;\nusing System.Text;\n\npublic static class BetSigner\n{\n    static string HmacHex(string secret, string message)\n    {\n        using var h = new HMACSHA256(Encoding.UTF8.GetBytes(secret));\n        return Convert.ToHexString(h.ComputeHash(Encoding.UTF8.GetBytes(message))).ToLowerInvariant();\n    }\n\n    /// <summary>Assina uma requisição: retorna o valor do cabeçalho X-Signature.</summary>\n    public static string SignRequest(string secret, string method, string pathWithQuery, string timestamp, string body = \"\")\n    {\n        var bodyHash = Convert.ToHexString(SHA256.HashData(Encoding.UTF8.GetBytes(body))).ToLowerInvariant();\n        // pathWithQuery: exatamente como enviado, com /api/v1 e a query string; timestamp: epoch em segundos\n        return HmacHex(secret, string.Join(\"\\n\", method.ToUpperInvariant(), pathWithQuery, timestamp, bodyHash));\n    }\n\n    /// <summary>Verifica um webhook recebido (use o corpo BRUTO).</summary>\n    public static bool VerifyWebhook(string secret, string timestamp, string rawBody, string signature) =>\n        CryptographicOperations.FixedTimeEquals(\n            Encoding.UTF8.GetBytes(HmacHex(secret, $\"{timestamp}.{rawBody}\")),\n            Encoding.UTF8.GetBytes(signature));\n\n    public static void Main()\n    {\n        // Conferência com o vetor de teste\n        Console.WriteLine(SignRequest(\"sk_test_vetor_de_teste_nao_use_em_producao\", \"POST\", \"/api/v1/players\", \"1700000000\", \"{\\\"externalId\\\":\\\"jogador-123\\\",\\\"name\\\":\\\"Ana Souza\\\"}\"));\n        Console.WriteLine(SignRequest(\"sk_test_vetor_de_teste_nao_use_em_producao\", \"GET\", \"/api/v1/players?externalId=jogador-123\", \"1700000000\"));\n        Console.WriteLine(VerifyWebhook(\"whsec_vetor_de_teste_nao_use_em_producao\", \"1700000000\", \"{\\\"id\\\":\\\"evt_vetor\\\",\\\"type\\\":\\\"webhook.test\\\",\\\"createdAt\\\":\\\"2023-11-14T22:13:20.000Z\\\",\\\"apiVersion\\\":\\\"1.0.0\\\",\\\"data\\\":{\\\"message\\\":\\\"ok\\\"}}\", \"a95e51addfc7fd14d048f689f85dfc36b8b8b3f48c8fd8dd98e114c4b6711c14\").ToString().ToLowerInvariant());\n    }\n}"
    },
    {
      "id": "bash",
      "label": "curl / openssl",
      "file": "sign.sh",
      "code": "#!/usr/bin/env bash\n# Assina uma requisição: imprime o valor do cabeçalho X-Signature.\n# uso: sign_request SECRET METODO CAMINHO_COM_QUERY TIMESTAMP [CORPO]\nsign_request() {\n  local secret=\"$1\" method=\"$2\" path=\"$3\" ts=\"$4\" body=\"${5:-}\"\n  local body_hash\n  body_hash=$(printf '%s' \"$body\" | openssl dgst -sha256 -hex | sed 's/^.* //')\n  printf '%s\\n%s\\n%s\\n%s' \"$method\" \"$path\" \"$ts\" \"$body_hash\" \\\n    | openssl dgst -sha256 -hmac \"$secret\" -hex | sed 's/^.* //'\n}\n\n# Assinatura de um webhook: HMAC-SHA256 de \"TIMESTAMP.CORPO_BRUTO\" com o segredo whsec_...\nwebhook_signature() {\n  printf '%s.%s' \"$2\" \"$3\" | openssl dgst -sha256 -hmac \"$1\" -hex | sed 's/^.* //'\n}",
      "full": "#!/usr/bin/env bash\n# Assina uma requisição: imprime o valor do cabeçalho X-Signature.\n# uso: sign_request SECRET METODO CAMINHO_COM_QUERY TIMESTAMP [CORPO]\nsign_request() {\n  local secret=\"$1\" method=\"$2\" path=\"$3\" ts=\"$4\" body=\"${5:-}\"\n  local body_hash\n  body_hash=$(printf '%s' \"$body\" | openssl dgst -sha256 -hex | sed 's/^.* //')\n  printf '%s\\n%s\\n%s\\n%s' \"$method\" \"$path\" \"$ts\" \"$body_hash\" \\\n    | openssl dgst -sha256 -hmac \"$secret\" -hex | sed 's/^.* //'\n}\n\n# Assinatura de um webhook: HMAC-SHA256 de \"TIMESTAMP.CORPO_BRUTO\" com o segredo whsec_...\nwebhook_signature() {\n  printf '%s.%s' \"$2\" \"$3\" | openssl dgst -sha256 -hmac \"$1\" -hex | sed 's/^.* //'\n}\n\n# Conferência com o vetor de teste\nsign_request 'sk_test_vetor_de_teste_nao_use_em_producao' POST '/api/v1/players' 1700000000 '{\"externalId\":\"jogador-123\",\"name\":\"Ana Souza\"}'\nsign_request 'sk_test_vetor_de_teste_nao_use_em_producao' GET '/api/v1/players?externalId=jogador-123' 1700000000\nwebhook_signature 'whsec_vetor_de_teste_nao_use_em_producao' 1700000000 '{\"id\":\"evt_vetor\",\"type\":\"webhook.test\",\"createdAt\":\"2023-11-14T22:13:20.000Z\",\"apiVersion\":\"1.0.0\",\"data\":{\"message\":\"ok\"}}'"
    }
  ]
}
