{
  "info": {
    "_postman_id": "a1b2c3d4-sot-wathq-demo-2026",
    "name": "Wathq — SOT Demo (Commercial Registration + Company Contract)",
    "description": "Test collection for Wathq APIs used in the SOT platform KYB flow.\n\n## Setup\n1. Import this collection into Postman.\n2. Open **Collection variables** and set `api_key` to your Wathq API key.\n3. Set `cr_number` (legacy CR, e.g. `1009203129`).\n4. Run **Step 1 — Resolve CR National Number** first; the test script saves `cr_national` automatically.\n5. Run the other requests using `{{cr_national}}`.\n\n## Notes\n- Base paths: `commercial-registration` (CR data) and `company-contract` (articles of association).\n- Auth: `apiKey` header only (not Bearer).\n- For legacy CR numbers, always resolve via `/crNationalNumber/{id}` before calling `/fullinfo`.\n- SJSC companies may return empty `parties` — that is a registry limitation, not a Postman issue.\n\nDocs: https://developer.wathq.sa/en/api/32 (CR) · https://developer.wathq.sa/en/api/35 (Contract)",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    {
      "key": "wathq_base",
      "value": "https://api.wathq.sa"
    },
    {
      "key": "api_key",
      "value": "YOUR_WATHQ_API_KEY_HERE"
    },
    {
      "key": "cr_number",
      "value": "1009203129",
      "description": "Legacy CR number (10 digits)"
    },
    {
      "key": "cr_national",
      "value": "7049166916",
      "description": "CR national number — auto-set by Step 1, or set manually"
    },
    {
      "key": "seller_national_id",
      "value": "1093214185",
      "description": "National ID to test /owns verification"
    },
    {
      "key": "id_type",
      "value": "1",
      "description": "1 = national ID (هوية وطنية)"
    }
  ],
  "auth": {
    "type": "apikey",
    "apikey": [
      {
        "key": "key",
        "value": "apiKey",
        "type": "string"
      },
      {
        "key": "value",
        "value": "{{api_key}}",
        "type": "string"
      },
      {
        "key": "in",
        "value": "header",
        "type": "string"
      }
    ]
  },
  "item": [
    {
      "name": "0 — Setup",
      "item": [
        {
          "name": "Step 1 — Resolve CR National Number",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 200', function () {",
                  "    pm.response.to.have.status(200);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json.crNationalNumber) {",
                  "    pm.collectionVariables.set('cr_national', json.crNationalNumber);",
                  "    console.log('cr_national set to:', json.crNationalNumber);",
                  "}",
                  "",
                  "pm.test('crNationalNumber returned', function () {",
                  "    pm.expect(json).to.have.property('crNationalNumber');",
                  "});"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{wathq_base}}/commercial-registration/crNationalNumber/{{cr_number}}",
              "host": ["{{wathq_base}}"],
              "path": ["commercial-registration", "crNationalNumber", "{{cr_number}}"]
            },
            "description": "Converts a legacy CR number to the national number required by new-legislation endpoints.\n\nExample: `1009203129` → `7049166916`"
          },
          "response": []
        }
      ],
      "description": "Run Step 1 first when using a legacy CR number."
    },
    {
      "name": "1 — Commercial Registration",
      "item": [
        {
          "name": "Full Info (parties, capital, managers)",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 200', () => pm.response.to.have.status(200));",
                  "const j = pm.response.json();",
                  "pm.test('Has entityType', () => pm.expect(j.entityType).to.be.an('object'));",
                  "pm.test('Has stockCapital or contributionCapital', () => {",
                  "    pm.expect(j.capital).to.be.an('object');",
                  "});",
                  "if (j.parties) {",
                  "    console.log('parties count:', j.parties.length);",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{wathq_base}}/commercial-registration/fullinfo/{{cr_national}}",
              "host": ["{{wathq_base}}"],
              "path": ["commercial-registration", "fullinfo", "{{cr_national}}"]
            },
            "description": "Full CR payload. Check `entityType.formName`, `capital.stockCapital.stocks`, and `parties[]` for shareholder data."
          },
          "response": []
        },
        {
          "name": "Basic Info",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{wathq_base}}/commercial-registration/info/{{cr_national}}",
              "host": ["{{wathq_base}}"],
              "path": ["commercial-registration", "info", "{{cr_national}}"]
            },
            "description": "Lighter CR summary — name, type, status, activities."
          },
          "response": []
        },
        {
          "name": "Capital & Shares",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 200', () => pm.response.to.have.status(200));",
                  "const j = pm.response.json();",
                  "const stocks = j.stockCapital?.stocks || [];",
                  "const total = stocks.reduce((s, st) => s + (st.count || 0), 0);",
                  "console.log('Total shares from stocks:', total);"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{wathq_base}}/commercial-registration/capital/{{cr_national}}",
              "host": ["{{wathq_base}}"],
              "path": ["commercial-registration", "capital", "{{cr_national}}"]
            },
            "description": "Capital structure — `stockCapital.stocks[].count` gives total share count."
          },
          "response": []
        },
        {
          "name": "Status",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{wathq_base}}/commercial-registration/status/{{cr_national}}",
              "host": ["{{wathq_base}}"],
              "path": ["commercial-registration", "status", "{{cr_national}}"]
            },
            "description": "CR status only (e.g. نشط / معلق)."
          },
          "response": []
        },
        {
          "name": "Managers",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{wathq_base}}/commercial-registration/managers/{{cr_national}}",
              "host": ["{{wathq_base}}"],
              "path": ["commercial-registration", "managers", "{{cr_national}}"]
            },
            "description": "List of managers with national IDs."
          },
          "response": []
        },
        {
          "name": "Owners / Partners",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "const code = pm.response.code;",
                  "if (code === 200) {",
                  "    const j = pm.response.json();",
                  "    const count = Array.isArray(j) ? j.length : 0;",
                  "    console.log('owners/partners count:', count);",
                  "    pm.test('Owners array returned', () => pm.expect(j).to.be.an('array'));",
                  "} else {",
                  "    console.log('Non-200 — may be empty for SJSC or server error:', code);",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{wathq_base}}/commercial-registration/owners/{{cr_national}}",
              "host": ["{{wathq_base}}"],
              "path": ["commercial-registration", "owners", "{{cr_national}}"]
            },
            "description": "Owners/partners with `partnerShare`. Often populated for partnerships; may be empty for SJSC."
          },
          "response": []
        },
        {
          "name": "Management Structure",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{wathq_base}}/commercial-registration/management/{{cr_national}}",
              "host": ["{{wathq_base}}"],
              "path": ["commercial-registration", "management", "{{cr_national}}"]
            },
            "description": "Management structure (may require separate subscription — 403 if not enabled)."
          },
          "response": []
        },
        {
          "name": "Manager Detail + Authorities",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{wathq_base}}/commercial-registration/manager/{{cr_national}}/{{seller_national_id}}/{{id_type}}",
              "host": ["{{wathq_base}}"],
              "path": [
                "commercial-registration",
                "manager",
                "{{cr_national}}",
                "{{seller_national_id}}",
                "{{id_type}}"
              ]
            },
            "description": "Single manager details and authorities. May return 403 if not on your plan."
          },
          "response": []
        },
        {
          "name": "Verify ID Ownership (owns)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{wathq_base}}/commercial-registration/owns/{{seller_national_id}}",
              "host": ["{{wathq_base}}"],
              "path": ["commercial-registration", "owns", "{{seller_national_id}}"]
            },
            "description": "Point-check: which CRs does this national ID own/participate in? Useful when `parties` is empty."
          },
          "response": []
        },
        {
          "name": "Beneficiary (free)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{wathq_base}}/commercial-registration/beneficiary/{{cr_national}}",
              "host": ["{{wathq_base}}"],
              "path": ["commercial-registration", "beneficiary", "{{cr_national}}"]
            },
            "description": "Beneficiary data — listed as free on Wathq pricing page."
          },
          "response": []
        }
      ],
      "description": "Commercial Registration (New Legislation) — https://developer.wathq.sa/en/api/32"
    },
    {
      "name": "2 — Company Contract (Articles of Association)",
      "item": [
        {
          "name": "Contract Info (AoA + entity)",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 200', () => pm.response.to.have.status(200));",
                  "const j = pm.response.json();",
                  "pm.test('Has entity', () => pm.expect(j.entity).to.be.an('object'));",
                  "pm.test('Has articles', () => pm.expect(j.articles).to.be.an('array'));",
                  "const parties = j.entity?.parties || [];",
                  "console.log('contract parties count:', parties.length);"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{wathq_base}}/company-contract/info/{{cr_national}}",
              "host": ["{{wathq_base}}"],
              "path": ["company-contract", "info", "{{cr_national}}"]
            },
            "description": "Full articles of association. Check `entity.parties` for shareholders — may still be empty for SJSC."
          },
          "response": []
        },
        {
          "name": "Contract Management",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{wathq_base}}/company-contract/management/{{cr_national}}",
              "host": ["{{wathq_base}}"],
              "path": ["company-contract", "management", "{{cr_national}}"]
            },
            "description": "Management block from company contract."
          },
          "response": []
        },
        {
          "name": "Contract Partners",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{wathq_base}}/company-contract/partners/{{cr_national}}",
              "host": ["{{wathq_base}}"],
              "path": ["company-contract", "partners", "{{cr_national}}"]
            },
            "description": "Dedicated partners endpoint — may return 500 if not available for this entity."
          },
          "response": []
        },
        {
          "name": "Contract Owners",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{wathq_base}}/company-contract/owners/{{cr_national}}",
              "host": ["{{wathq_base}}"],
              "path": ["company-contract", "owners", "{{cr_national}}"]
            },
            "description": "Dedicated owners endpoint — may return 500 if not available for this entity."
          },
          "response": []
        },
        {
          "name": "Contract Managers",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{wathq_base}}/company-contract/managers/{{cr_national}}",
              "host": ["{{wathq_base}}"],
              "path": ["company-contract", "managers", "{{cr_national}}"]
            },
            "description": "Managers from company contract service."
          },
          "response": []
        }
      ],
      "description": "Commercial Contract Issuing (New Legislation) — https://developer.wathq.sa/en/api/35"
    },
    {
      "name": "3 — Comparison CR (partnership example)",
      "item": [
        {
          "name": "Resolve 4030010781 → national number",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "const json = pm.response.json();",
                  "if (json.crNationalNumber) {",
                  "    pm.collectionVariables.set('cr_national', json.crNationalNumber);",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{wathq_base}}/commercial-registration/crNationalNumber/4030010781",
              "host": ["{{wathq_base}}"],
              "path": ["commercial-registration", "crNationalNumber", "4030010781"]
            },
            "description": "Partnership company (توصية بسيطة) — owners endpoint returns data unlike SJSC."
          },
          "response": []
        },
        {
          "name": "Owners (partnership — has parties)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{wathq_base}}/commercial-registration/owners/{{cr_national}}",
              "host": ["{{wathq_base}}"],
              "path": ["commercial-registration", "owners", "{{cr_national}}"]
            },
            "description": "Run after resolve above. Compare with SJSC where owners is empty."
          },
          "response": []
        }
      ],
      "description": "Side-by-side: partnership CR returns partner list; SJSC often does not."
    }
  ]
}
