{
  "info": {
    "_postman_id": "1f8a3b40-8a1d-4f2e-a8b2-pre-clearance-2026-05-03",
    "name": "JIL Sovereign — Pre-Clearance API",
    "description": "Custodian + exchange flows for the JIL Pre-Clearance API. Pre-request script computes HMAC-SHA256 signature headers automatically. Set the {{access_key_id}} and {{secret}} variables in your environment first.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    { "key": "base_url",      "value": "https://preclearance.jilsovereign.com",     "type": "string" },
    { "key": "access_key_id", "value": "REPLACE_ME_FROM_OPS",                       "type": "string" },
    { "key": "secret",        "value": "REPLACE_ME_FROM_OPS",                       "type": "string" }
  ],
  "auth": { "type": "noauth" },
  "event": [
    {
      "listen": "prerequest",
      "script": {
        "type": "text/javascript",
        "exec": [
          "// HMAC-SHA256 signing per JIL Pre-Clearance auth spec.",
          "// Canonical = method + '\\n' + path + '\\n' + timestamp + '\\n' + nonce + '\\n' + sha256(body)",
          "const ts = new Date().toISOString();",
          "const nonce = pm.variables.replaceIn('{{$randomUUID}}').replace(/-/g, '');",
          "const url = pm.request.url.toString().replace(/^https?:\\/\\/[^/]+/, '');",
          "const path = url.split('?')[0];",
          "const body = pm.request.body && pm.request.body.raw ? pm.request.body.raw : '';",
          "const bodyHash = CryptoJS.SHA256(body).toString(CryptoJS.enc.Hex);",
          "const canonical = pm.request.method + '\\n' + path + '\\n' + ts + '\\n' + nonce + '\\n' + bodyHash;",
          "const sig = CryptoJS.HmacSHA256(canonical, pm.variables.get('secret')).toString(CryptoJS.enc.Base64);",
          "pm.request.headers.upsert({ key: 'X-JIL-Access-Key-Id', value: pm.variables.get('access_key_id') });",
          "pm.request.headers.upsert({ key: 'X-JIL-Timestamp',     value: ts });",
          "pm.request.headers.upsert({ key: 'X-JIL-Nonce',         value: nonce });",
          "pm.request.headers.upsert({ key: 'X-JIL-Signature',     value: sig });"
        ]
      }
    }
  ],
  "item": [
    {
      "name": "01 — Health (no auth)",
      "request": {
        "method": "GET",
        "url": { "raw": "{{base_url}}/health", "host": ["{{base_url}}"], "path": ["health"] },
        "auth": { "type": "noauth" },
        "header": []
      }
    },
    {
      "name": "02 — Public Key (no auth)",
      "request": {
        "method": "GET",
        "url": { "raw": "{{base_url}}/v1/preclearance/public-key", "host": ["{{base_url}}"], "path": ["v1", "preclearance", "public-key"] },
        "auth": { "type": "noauth" },
        "header": []
      }
    },
    {
      "name": "03 — Validate (Fireblocks → Kraken, ETH transfer)",
      "request": {
        "method": "POST",
        "url": { "raw": "{{base_url}}/v1/preclearance/validate", "host": ["{{base_url}}"], "path": ["v1", "preclearance", "validate"] },
        "header": [{ "key": "Content-Type", "value": "application/json" }],
        "body": {
          "mode": "raw",
          "raw": "{\n  \"transit_id\": \"fb-2026050301-7c3a\",\n  \"source_addr\": \"0x7Bcff27567cfE3e67020a0d771a445178756aBa2\",\n  \"destination_addr\": \"0xbeefdeadbeefdeadbeefdeadbeefdeadbeefdead\",\n  \"asset\": \"ETH\",\n  \"amount_native\": \"12.5\",\n  \"amount_usd\": 41250.00,\n  \"sender_id\": \"fund-tax-id-37-3892034\",\n  \"receiver_id\": \"kraken-acct-2391\",\n  \"custodian\": \"fireblocks\",\n  \"exchange\": \"kraken\",\n  \"client_metadata\": {\n    \"desk\": \"trading\",\n    \"initiator\": \"ops_user_47\"\n  }\n}"
        }
      }
    },
    {
      "name": "04 — Validate — high-value USDC (will FLAG)",
      "request": {
        "method": "POST",
        "url": { "raw": "{{base_url}}/v1/preclearance/validate", "host": ["{{base_url}}"], "path": ["v1", "preclearance", "validate"] },
        "header": [{ "key": "Content-Type", "value": "application/json" }],
        "body": {
          "mode": "raw",
          "raw": "{\n  \"transit_id\": \"fb-2026050301-large\",\n  \"source_addr\": \"0x7Bcff27567cfE3e67020a0d771a445178756aBa2\",\n  \"destination_addr\": \"0x1234567890abcdef1234567890abcdef12345678\",\n  \"asset\": \"USDC\",\n  \"amount_native\": \"5000000\",\n  \"amount_usd\": 5000000.00,\n  \"sender_id\": \"family-office-A\",\n  \"receiver_id\": \"coinbase-prime-22\",\n  \"custodian\": \"fireblocks\",\n  \"exchange\": \"coinbase-prime\"\n}"
        }
      }
    },
    {
      "name": "05 — Validate — blocklisted destination (will FAIL)",
      "request": {
        "method": "POST",
        "url": { "raw": "{{base_url}}/v1/preclearance/validate", "host": ["{{base_url}}"], "path": ["v1", "preclearance", "validate"] },
        "header": [{ "key": "Content-Type", "value": "application/json" }],
        "body": {
          "mode": "raw",
          "raw": "{\n  \"transit_id\": \"fb-2026050301-bad\",\n  \"source_addr\": \"0x7Bcff27567cfE3e67020a0d771a445178756aBa2\",\n  \"destination_addr\": \"0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef\",\n  \"asset\": \"ETH\",\n  \"amount_native\": \"1.0\",\n  \"amount_usd\": 3300.00,\n  \"sender_id\": \"fund-tax-id-37-3892034\",\n  \"receiver_id\": \"unknown-91\",\n  \"custodian\": \"fireblocks\",\n  \"exchange\": \"kraken\"\n}"
        }
      }
    },
    {
      "name": "06 — Validate — optimistic finality",
      "request": {
        "method": "POST",
        "url": { "raw": "{{base_url}}/v1/preclearance/validate?finality=optimistic", "host": ["{{base_url}}"], "path": ["v1", "preclearance", "validate"], "query": [{ "key": "finality", "value": "optimistic" }] },
        "header": [{ "key": "Content-Type", "value": "application/json" }],
        "body": {
          "mode": "raw",
          "raw": "{\n  \"transit_id\": \"fb-2026050301-fast\",\n  \"source_addr\": \"0x7Bcff27567cfE3e67020a0d771a445178756aBa2\",\n  \"destination_addr\": \"0xabcdef1234567890abcdef1234567890abcdef12\",\n  \"asset\": \"USDC\",\n  \"amount_native\": \"500\",\n  \"amount_usd\": 500.00,\n  \"sender_id\": \"prop-desk-3\",\n  \"receiver_id\": \"binance-otc-12\",\n  \"custodian\": \"fireblocks\",\n  \"exchange\": \"binance\"\n}"
        }
      }
    },
    {
      "name": "07 — Verify a PSA",
      "request": {
        "method": "POST",
        "url": { "raw": "{{base_url}}/v1/preclearance/verify", "host": ["{{base_url}}"], "path": ["v1", "preclearance", "verify"] },
        "header": [{ "key": "Content-Type", "value": "application/json" }],
        "body": {
          "mode": "raw",
          "raw": "{\n  \"psa\": { /* paste the `psa` object from /validate response */ },\n  \"signature_b64\": \"PASTE_signatures[0].signature_b64_HERE\"\n}"
        }
      }
    },
    {
      "name": "08 — Read a PSA by ID",
      "request": {
        "method": "GET",
        "url": { "raw": "{{base_url}}/v1/preclearance/psa/{{psa_id}}", "host": ["{{base_url}}"], "path": ["v1", "preclearance", "psa", "{{psa_id}}"] }
      }
    },
    {
      "name": "09 — 24-hour stats",
      "request": {
        "method": "GET",
        "url": { "raw": "{{base_url}}/v1/preclearance/stats", "host": ["{{base_url}}"], "path": ["v1", "preclearance", "stats"] }
      }
    }
  ]
}
