{
  "version": 1,
  "description": "HMAC-SHA256 canonicalization vectors for /v1. canonical = METHOD\\nPATH\\nSORTED_ENCODED_QUERY\\nTIMESTAMP\\nNONCE\\nSHA256hex(body). Source of truth for public docs.",
  "vectors": [
    {
      "name": "empty query",
      "secret": "test_secret_4league_v1_vectors",
      "method": "GET",
      "path": "/v1/matches",
      "query": "",
      "timestamp": "1760000000",
      "nonce": "nonce-001",
      "body": "",
      "bodySha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "canonical": "GET\n/v1/matches\n\n1760000000\nnonce-001\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "signature": "903040be05e734c2b295e25ea802bdfbc6e1cce4406a3afe0d361ee7ff45e7d6"
    },
    {
      "name": "repeated keys",
      "secret": "test_secret_4league_v1_vectors",
      "method": "GET",
      "path": "/v1/matches",
      "query": "a=2&a=1",
      "timestamp": "1760000000",
      "nonce": "nonce-002",
      "body": "",
      "bodySha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "canonical": "GET\n/v1/matches\na=1&a=2\n1760000000\nnonce-002\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "signature": "76274b346898d08032f7608b950a5ebc01ac9d4b34e2b52edf59f823e0e12861"
    },
    {
      "name": "bare key",
      "secret": "test_secret_4league_v1_vectors",
      "method": "GET",
      "path": "/v1/matches",
      "query": "a",
      "timestamp": "1760000000",
      "nonce": "nonce-003",
      "body": "",
      "bodySha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "canonical": "GET\n/v1/matches\na=\n1760000000\nnonce-003\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "signature": "4ed3288f2dda1c8d1eaf39729643c65f198e4a27629409fafa0a8fec014d47e8"
    },
    {
      "name": "space as %20",
      "secret": "test_secret_4league_v1_vectors",
      "method": "GET",
      "path": "/v1/teams",
      "query": "q=a%20b",
      "timestamp": "1760000000",
      "nonce": "nonce-004",
      "body": "",
      "bodySha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "canonical": "GET\n/v1/teams\nq=a%20b\n1760000000\nnonce-004\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "signature": "6b3730554fa4ef46117bb60187dd3d9ef65cf7c85ddd645593f21fd3b00928b0"
    },
    {
      "name": "plus is literal plus",
      "secret": "test_secret_4league_v1_vectors",
      "method": "GET",
      "path": "/v1/teams",
      "query": "q=a+b",
      "timestamp": "1760000000",
      "nonce": "nonce-005",
      "body": "",
      "bodySha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "canonical": "GET\n/v1/teams\nq=a%2Bb\n1760000000\nnonce-005\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "signature": "48e8997268263e2612419ca151e60adfe5b20b9212c588ff8af539c5c41703ca"
    },
    {
      "name": "space vs plus vs %20 mixed ordering",
      "secret": "test_secret_4league_v1_vectors",
      "method": "GET",
      "path": "/v1/teams",
      "query": "q=a%20b&q=a+b&q=a%20b",
      "timestamp": "1760000000",
      "nonce": "nonce-006",
      "body": "",
      "bodySha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "canonical": "GET\n/v1/teams\nq=a%20b&q=a%20b&q=a%2Bb\n1760000000\nnonce-006\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "signature": "230e08300afa936ad9dd6f0539392c56a4a81516dcbe309f908384e3cb4bf5cd"
    },
    {
      "name": "reserved !*'()",
      "secret": "test_secret_4league_v1_vectors",
      "method": "GET",
      "path": "/v1/teams",
      "query": "q=!*'()",
      "timestamp": "1760000000",
      "nonce": "nonce-007",
      "body": "",
      "bodySha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "canonical": "GET\n/v1/teams\nq=%21%2A%27%28%29\n1760000000\nnonce-007\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "signature": "690554aa74fb6c8a42d76769e20829965fbe6c26ed0ef8ac597b3acf5d0cb331"
    },
    {
      "name": "unreserved ~-._",
      "secret": "test_secret_4league_v1_vectors",
      "method": "GET",
      "path": "/v1/teams",
      "query": "q=~-._",
      "timestamp": "1760000000",
      "nonce": "nonce-008",
      "body": "",
      "bodySha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "canonical": "GET\n/v1/teams\nq=~-._\n1760000000\nnonce-008\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "signature": "67f11cab7f8384659aeadd21184230da224c0dee2ba50077153e76db644cca1a"
    },
    {
      "name": "utf-8 multibyte",
      "secret": "test_secret_4league_v1_vectors",
      "method": "GET",
      "path": "/v1/teams",
      "query": "q=%C8%99coal%C4%83&n=caf%C3%A9",
      "timestamp": "1760000000",
      "nonce": "nonce-009",
      "body": "",
      "bodySha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "canonical": "GET\n/v1/teams\nn=caf%C3%A9&q=%C8%99coal%C4%83\n1760000000\nnonce-009\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "signature": "9d9706b14c6582e24b6b34da13768dd43ef1c033a2adb3081d48ef7a5b1b3ffb"
    },
    {
      "name": "already-encoded %2F in value and lowercase hex",
      "secret": "test_secret_4league_v1_vectors",
      "method": "GET",
      "path": "/v1/teams",
      "query": "path=a%2fb",
      "timestamp": "1760000000",
      "nonce": "nonce-010",
      "body": "",
      "bodySha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "canonical": "GET\n/v1/teams\npath=a%2Fb\n1760000000\nnonce-010\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "signature": "380fd52b283d6c12fa4f20989b807093de6edd6629e2ade9882a2777f3b86926"
    },
    {
      "name": "encoded %2f in path (hex uppercased)",
      "secret": "test_secret_4league_v1_vectors",
      "method": "GET",
      "path": "/v1/teams/a%2fb",
      "query": "",
      "timestamp": "1760000000",
      "nonce": "nonce-011",
      "body": "",
      "bodySha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "canonical": "GET\n/v1/teams/a%2Fb\n\n1760000000\nnonce-011\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "signature": "668f5b9470ad297b4c4980c9c047f062b0f148348ec17a89739bade79732703c"
    },
    {
      "name": "trailing slash",
      "secret": "test_secret_4league_v1_vectors",
      "method": "GET",
      "path": "/v1/matches/",
      "query": "a=1",
      "timestamp": "1760000000",
      "nonce": "nonce-012",
      "body": "",
      "bodySha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "canonical": "GET\n/v1/matches/\na=1\n1760000000\nnonce-012\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "signature": "137fd995b0670929107f66b9c320f9f4a3167abed0df10ebb4921388befb353c"
    },
    {
      "name": "HEAD method",
      "secret": "test_secret_4league_v1_vectors",
      "method": "HEAD",
      "path": "/v1/matches",
      "query": "limit=5",
      "timestamp": "1760000000",
      "nonce": "nonce-013",
      "body": "",
      "bodySha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "canonical": "HEAD\n/v1/matches\nlimit=5\n1760000000\nnonce-013\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "signature": "2064573c401f55f5b1bc8afbc021ce2d0464b7ddb26f315e84982abd7227e263"
    },
    {
      "name": "empty body hash (explicit)",
      "secret": "test_secret_4league_v1_vectors",
      "method": "GET",
      "path": "/v1/players",
      "query": "page=2&limit=10",
      "timestamp": "1760000000",
      "nonce": "nonce-014",
      "body": "",
      "bodySha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "canonical": "GET\n/v1/players\nlimit=10&page=2\n1760000000\nnonce-014\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "signature": "9854a8d069df657609e4081eebf857c4ea8b6d470929e00a2d9b15290a19bc2e"
    },
    {
      "name": "sort by encoded key then value",
      "secret": "test_secret_4league_v1_vectors",
      "method": "GET",
      "path": "/v1/matches",
      "query": "b=2&a=3&a=1&B=0&a=%7E",
      "timestamp": "1760000000",
      "nonce": "nonce-015",
      "body": "",
      "bodySha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "canonical": "GET\n/v1/matches\nB=0&a=1&a=3&a=~&b=2\n1760000000\nnonce-015\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
      "signature": "c6712f89abf14c4f38e66145a7701637819ba023de8fc3475583e077b6a1c0ee"
    },
    {
      "name": "POST with JSON body",
      "secret": "test_secret_4league_v1_vectors",
      "method": "POST",
      "path": "/v1/matches",
      "query": "",
      "timestamp": "1760000000",
      "nonce": "nonce-016",
      "body": "{\"name\":\"Cup\",\"teams\":[1,2]}",
      "bodySha256": "82574f474fed0a660c9bb9231dd8cedeeb3a821366a740254a741b2e8bce0a40",
      "canonical": "POST\n/v1/matches\n\n1760000000\nnonce-016\n82574f474fed0a660c9bb9231dd8cedeeb3a821366a740254a741b2e8bce0a40",
      "signature": "3ee3f45e38b3470eb09e9a039f3034b139b1514510ae575578594385a88b38c9"
    },
    {
      "name": "PUT with multibyte UTF-8 body",
      "secret": "test_secret_4league_v1_vectors",
      "method": "PUT",
      "path": "/v1/teams",
      "query": "id=7",
      "timestamp": "1760000000",
      "nonce": "nonce-017",
      "body": "{\"name\":\"Fotbal Clubul Școala Ștefan ⚽ café\"}",
      "bodySha256": "814f3910f94697d5efbc75c84b6c0deed320fbdb0c9152d26a64dc910f4c0c63",
      "canonical": "PUT\n/v1/teams\nid=7\n1760000000\nnonce-017\n814f3910f94697d5efbc75c84b6c0deed320fbdb0c9152d26a64dc910f4c0c63",
      "signature": "637aafea5bd33f4d50ff80f3ec72939d3f86822d0a4b8a92999f9354b7734c7b"
    }
  ]
}
