{
  "info": {
    "_postman_id": "d4e5f6a7-tpa0-4b8c-9d1e-interpose2026",
    "name": "Interpose TPA API",
    "description": "Retirement Plan Administration — plan lifecycle, participant enrollment, contribution processing, distribution management, ERISA nondiscrimination compliance testing, Form 5500 filing, loans, participant statements, payroll uploads, and QDROs.\n\n**Base URL:** `{{baseUrl}}`\n\n**Environment variables required:**\n- `baseUrl` — e.g. `https://api.interposehq.com`\n- `apiKey` — Bearer token or API key\n- `hmacSecret` — (optional) for HMAC-SHA256 signing\n- `planId` — set after creating a plan\n- `participantId` — set after enrolling a participant\n- `contributionId` — set after processing a contribution\n- `distributionId` — set after requesting a distribution\n- `testId` — set after initiating a compliance test\n- `filingId` — set after initiating a Form 5500 filing\n- `loanId` — set after requesting a loan\n- `statementId` — set after generating a statement\n- `uploadId` — set after uploading payroll\n- `qdroId` — set after submitting a QDRO",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      { "key": "token", "value": "{{apiKey}}", "type": "string" }
    ]
  },
  "event": [
    {
      "listen": "prerequest",
      "script": {
        "type": "text/javascript",
        "exec": [
          "const hmacSecret = pm.environment.get('hmacSecret');",
          "if (hmacSecret) {",
          "    const timestamp = Date.now().toString();",
          "    const method = pm.request.method;",
          "    const urlObj = pm.request.url;",
          "    const path = '/' + urlObj.path.join('/');",
          "    const body = pm.request.body && pm.request.body.raw ? pm.request.body.raw : '';",
          "    const bodyHash = CryptoJS.SHA256(body).toString(CryptoJS.enc.Hex);",
          "    const canonical = method + '\\n' + path + '\\n' + timestamp + '\\n' + bodyHash;",
          "    const signature = CryptoJS.HmacSHA256(canonical, hmacSecret).toString(CryptoJS.enc.Hex);",
          "    pm.request.headers.upsert({ key: 'X-VM-Key-Id', value: pm.environment.get('apiKey') });",
          "    pm.request.headers.upsert({ key: 'X-VM-Timestamp', value: timestamp });",
          "    pm.request.headers.upsert({ key: 'X-VM-Signature', value: signature });",
          "}"
        ]
      }
    }
  ],
  "variable": [
    { "key": "baseUrl", "value": "https://api.interposehq.com", "type": "string" },
    { "key": "apiKey", "value": "your-api-key-here", "type": "string" },
    { "key": "hmacSecret", "value": "", "type": "string" },
    { "key": "planId", "value": "plan_01HV4Y2K3M5N8P9QR2ST4UVWXY", "type": "string" },
    { "key": "participantId", "value": "part_01HV4Y2K3M5N8P9QR2ST4UVWXY", "type": "string" },
    { "key": "contributionId", "value": "cont_01HV4Y2K3M5N8P9QR2ST4UVWXY", "type": "string" },
    { "key": "distributionId", "value": "dist_01HV4Y2K3M5N8P9QR2ST4UVWXY", "type": "string" },
    { "key": "testId", "value": "test_01HV4Y2K3M5N8P9QR2ST4UVWXY", "type": "string" },
    { "key": "filingId", "value": "fil_01HV4Y2K3M5N8P9QR2ST4UVWXY", "type": "string" },
    { "key": "loanId", "value": "loan_01HV4Y2K3M5N8P9QR2ST4UVWXY", "type": "string" },
    { "key": "statementId", "value": "stmt_01HV4Y2K3M5N8P9QR2ST4UVWXY", "type": "string" },
    { "key": "uploadId", "value": "upl_01HV4Y2K3M5N8P9QR2ST4UVWXY", "type": "string" },
    { "key": "qdroId", "value": "qdro_01HV4Y2K3M5N8P9QR2ST4UVWXY", "type": "string" }
  ],
  "item": [
    {
      "name": "Plans",
      "item": [
        {
          "name": "Create Plan",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    const body = pm.response.json();",
                  "    pm.environment.set('planId', body.plan_id);",
                  "    pm.test('plan_id set', () => pm.expect(body.plan_id).to.be.a('string'));",
                  "    pm.test('employee_deferral_limit is 4dp string', () => {",
                  "        pm.expect(body.employee_deferral_limit).to.match(/^-?\\d+\\.\\d{4}$/);",
                  "    });",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"plan_name\": \"Acme Corp 401(k)\",\n  \"plan_type\": \"401k\",\n  \"sponsor_name\": \"Acme Corporation\",\n  \"ein\": \"12-3456789\",\n  \"plan_number\": \"001\",\n  \"effective_date\": \"2026-01-01\",\n  \"trustee\": \"Interpose Trust Company\",\n  \"record_keeper\": \"Interpose TPA\",\n  \"fiscal_year_end\": \"12-31\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/plans",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "plans"]
            },
            "description": "Create a retirement plan. Types: 401k | 403b | 457b | ira_sep | ira_simple | profit_sharing | defined_benefit.\n\nThe response includes §402(g) and §415(c) limits for the current tax year."
          }
        },
        {
          "name": "List Plans",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/plans?page=1&page_size=50",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "plans"],
              "query": [
                { "key": "plan_type", "value": "401k", "disabled": true },
                { "key": "status", "value": "ACTIVE", "disabled": true },
                { "key": "sponsor_name", "value": "Acme", "disabled": true },
                { "key": "page", "value": "1" },
                { "key": "page_size", "value": "50" }
              ]
            }
          }
        },
        {
          "name": "Get Plan",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/plans/{{planId}}",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "plans", "{{planId}}"]
            }
          }
        },
        {
          "name": "Update Plan",
          "request": {
            "method": "PATCH",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"plan_name\": \"Acme Corp 401(k) Plan (Restated)\",\n  \"status\": \"ACTIVE\",\n  \"record_keeper\": \"Interpose TPA v2\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/plans/{{planId}}",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "plans", "{{planId}}"]
            },
            "description": "Update plan name, status, trustee, or record_keeper. Status: PENDING | ACTIVE | FROZEN | TERMINATED."
          }
        }
      ]
    },
    {
      "name": "Participants",
      "item": [
        {
          "name": "Enroll Participant",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    const body = pm.response.json();",
                  "    pm.environment.set('participantId', body.participant_id);",
                  "    pm.test('vesting_percentage is string', () => {",
                  "        pm.expect(body.vesting_percentage).to.be.a('string');",
                  "    });",
                  "    pm.test('account_balance is 4dp string', () => {",
                  "        pm.expect(body.account_balance).to.match(/^-?\\d+\\.\\d{4}$/);",
                  "    });",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"plan_id\": \"{{planId}}\",\n  \"employee_id\": \"EMP-00123\",\n  \"first_name\": \"Alice\",\n  \"last_name\": \"Smith\",\n  \"date_of_birth\": \"1980-03-15\",\n  \"hire_date\": \"2022-01-15\",\n  \"enrollment_date\": \"2026-01-01\",\n  \"vesting_schedule\": \"graded_6year\",\n  \"years_of_service\": 4,\n  \"employee_deferral_rate\": \"0.0600\",\n  \"employee_deferral_type\": \"pre_tax\",\n  \"employer_match_rate\": \"0.0300\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/plans/{{planId}}/participants",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "plans", "{{planId}}", "participants"]
            },
            "description": "Enroll a participant in a plan. Vesting schedules: cliff_3year | graded_6year | immediate | cliff_2year | graded_4year.\n\nThe response includes computed vesting_percentage and ytd contribution totals."
          }
        },
        {
          "name": "List Plan Participants",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/plans/{{planId}}/participants?page=1&page_size=100",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "plans", "{{planId}}", "participants"],
              "query": [
                { "key": "status", "value": "ENROLLED", "disabled": true },
                { "key": "page", "value": "1" },
                { "key": "page_size", "value": "100" }
              ]
            }
          }
        },
        {
          "name": "Get Participant",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/participants/{{participantId}}",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "participants", "{{participantId}}"]
            }
          }
        },
        {
          "name": "Update Participant",
          "request": {
            "method": "PATCH",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"employee_deferral_rate\": \"0.0800\",\n  \"years_of_service\": 5\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/participants/{{participantId}}",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "participants", "{{participantId}}"]
            },
            "description": "Update participant deferral rate, status, employer match rate, or years of service. Status: ELIGIBLE | ENROLLED | TERMINATED | RETIRED | DECEASED."
          }
        }
      ]
    },
    {
      "name": "Contributions",
      "item": [
        {
          "name": "Create Contribution",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    const body = pm.response.json();",
                  "    pm.environment.set('contributionId', body.contribution_id);",
                  "    pm.test('amount is 4dp string', () => {",
                  "        pm.expect(body.amount).to.match(/^-?\\d+\\.\\d{4}$/);",
                  "    });",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"plan_id\": \"{{planId}}\",\n  \"participant_id\": \"{{participantId}}\",\n  \"type\": \"employee_pre_tax\",\n  \"amount\": \"2000.0000\",\n  \"currency\": \"USD\",\n  \"payroll_date\": \"2026-06-30\",\n  \"notes\": \"June payroll deferral\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/contributions",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "contributions"]
            },
            "description": "Process a contribution. Types: employee_pre_tax | employee_roth | catch_up | employer_match | employer_nonelective | employer_profit_sharing | rollover_traditional | rollover_roth.\n\nThe API enforces §402(g) ($23,500 for 2026) and §415(c) ($70,000 for 2026) limits — returns 422 if exceeded."
          }
        },
        {
          "name": "Employer Match Contribution",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"plan_id\": \"{{planId}}\",\n  \"participant_id\": \"{{participantId}}\",\n  \"type\": \"employer_match\",\n  \"amount\": \"600.0000\",\n  \"currency\": \"USD\",\n  \"payroll_date\": \"2026-06-30\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/contributions",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "contributions"]
            }
          }
        },
        {
          "name": "Catch-Up Contribution (50+)",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"plan_id\": \"{{planId}}\",\n  \"participant_id\": \"{{participantId}}\",\n  \"type\": \"catch_up\",\n  \"amount\": \"500.0000\",\n  \"currency\": \"USD\",\n  \"payroll_date\": \"2026-06-30\",\n  \"notes\": \"SECURE 2.0 catch-up — participant age 50+\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/contributions",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "contributions"]
            },
            "description": "Catch-up contributions for participants aged 50+. 2026 catch-up limit: $7,500."
          }
        },
        {
          "name": "List Plan Contributions",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/plans/{{planId}}/contributions?page=1&page_size=100",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "plans", "{{planId}}", "contributions"],
              "query": [
                { "key": "participant_id", "value": "{{participantId}}", "disabled": true },
                { "key": "type", "value": "employee_pre_tax", "disabled": true },
                { "key": "page", "value": "1" },
                { "key": "page_size", "value": "100" }
              ]
            }
          }
        },
        {
          "name": "Get Contribution",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/contributions/{{contributionId}}",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "contributions", "{{contributionId}}"]
            }
          }
        }
      ]
    },
    {
      "name": "Distributions",
      "item": [
        {
          "name": "Request Distribution",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    const body = pm.response.json();",
                  "    pm.environment.set('distributionId', body.distribution_id);",
                  "    pm.test('gross_amount is 4dp string', () => {",
                  "        pm.expect(body.gross_amount).to.match(/^-?\\d+\\.\\d{4}$/);",
                  "    });",
                  "    pm.test('federal_withholding is 4dp string', () => {",
                  "        pm.expect(body.federal_withholding).to.match(/^-?\\d+\\.\\d{4}$/);",
                  "    });",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"plan_id\": \"{{planId}}\",\n  \"participant_id\": \"{{participantId}}\",\n  \"type\": \"normal\",\n  \"gross_amount\": \"50000.0000\",\n  \"currency\": \"USD\",\n  \"reason\": \"Retirement distribution — participant age 65\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/distributions",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "distributions"]
            },
            "description": "Request a distribution. Types: normal | early | hardship | rmd | in_service | rollover_out | death | disability | loan_offset.\n\nResponse includes computed federal_withholding (20% mandatory for eligible rollover distributions), state_withholding, and early_withdrawal_penalty (10% for early distributions)."
          }
        },
        {
          "name": "Request RMD Distribution",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"plan_id\": \"{{planId}}\",\n  \"participant_id\": \"{{participantId}}\",\n  \"type\": \"rmd\",\n  \"gross_amount\": \"8500.0000\",\n  \"currency\": \"USD\",\n  \"reason\": \"Required Minimum Distribution — SECURE 2.0 RMD age 73\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/distributions",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "distributions"]
            }
          }
        },
        {
          "name": "Approve Distribution",
          "request": {
            "method": "PATCH",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"APPROVED\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/distributions/{{distributionId}}",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "distributions", "{{distributionId}}"]
            }
          }
        },
        {
          "name": "Mark Distribution Disbursed",
          "request": {
            "method": "PATCH",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"DISBURSED\",\n  \"disbursed_at\": \"2026-06-27T15:00:00.000000000Z\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/distributions/{{distributionId}}",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "distributions", "{{distributionId}}"]
            }
          }
        },
        {
          "name": "Get Distribution",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/distributions/{{distributionId}}",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "distributions", "{{distributionId}}"]
            }
          }
        },
        {
          "name": "List Plan Distributions",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/plans/{{planId}}/distributions?page=1&page_size=100",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "plans", "{{planId}}", "distributions"],
              "query": [
                { "key": "participant_id", "value": "{{participantId}}", "disabled": true },
                { "key": "status", "value": "PENDING_APPROVAL", "disabled": true },
                { "key": "page", "value": "1" },
                { "key": "page_size", "value": "100" }
              ]
            }
          }
        }
      ]
    },
    {
      "name": "Compliance Tests (ADP/ACP/Top-Heavy)",
      "item": [
        {
          "name": "Initiate ADP Test",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    const body = pm.response.json();",
                  "    pm.environment.set('testId', body.test_id);",
                  "    pm.test('test_id set', () => pm.expect(body.test_id).to.be.a('string'));",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"test_type\": \"adp\",\n  \"test_year\": 2026,\n  \"notes\": \"Annual ADP nondiscrimination test for plan year 2026\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/plans/{{planId}}/compliance/tests",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "plans", "{{planId}}", "compliance", "tests"]
            },
            "description": "Initiate an ERISA nondiscrimination test. Types: adp | acp | top_heavy | coverage_410b | max_contribution.\n\nADP test compares HCE vs NHCE deferral rates. Failure triggers a correction deadline."
          }
        },
        {
          "name": "Initiate ACP Test",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"test_type\": \"acp\",\n  \"test_year\": 2026\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/plans/{{planId}}/compliance/tests",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "plans", "{{planId}}", "compliance", "tests"]
            }
          }
        },
        {
          "name": "Initiate Top-Heavy Test",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"test_type\": \"top_heavy\",\n  \"test_year\": 2026\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/plans/{{planId}}/compliance/tests",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "plans", "{{planId}}", "compliance", "tests"]
            }
          }
        },
        {
          "name": "List Compliance Tests",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/plans/{{planId}}/compliance/tests?test_year=2026&page=1&page_size=50",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "plans", "{{planId}}", "compliance", "tests"],
              "query": [
                { "key": "test_year", "value": "2026" },
                { "key": "status", "value": "PASSED", "disabled": true },
                { "key": "page", "value": "1" },
                { "key": "page_size", "value": "50" }
              ]
            }
          }
        },
        {
          "name": "Get Compliance Test",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/compliance/tests/{{testId}}",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "compliance", "tests", "{{testId}}"]
            }
          }
        },
        {
          "name": "Update Compliance Test (add correction)",
          "request": {
            "method": "PATCH",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"CORRECTED\",\n  \"result_summary\": \"ADP test failed — HCE rate 8.5% exceeds NHCE rate 4.2% + 2%. Corrected via QNECs.\",\n  \"correction_method\": \"QNEC — Qualified Non-Elective Contribution to NHCEs\",\n  \"correction_deadline\": \"2027-03-15\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/compliance/tests/{{testId}}",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "compliance", "tests", "{{testId}}"]
            }
          }
        }
      ]
    },
    {
      "name": "Plan Documents",
      "item": [
        {
          "name": "Create Plan Document",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    const body = pm.response.json();",
                  "    pm.environment.set('documentId', body.document_id);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"plan_id\": \"{{planId}}\",\n  \"type\": \"plan_document\",\n  \"title\": \"Acme Corp 401(k) Plan Document 2026 Restatement\",\n  \"effective_date\": \"2026-01-01\",\n  \"content_url\": \"https://your-storage.example.com/docs/plan-doc-2026.pdf\",\n  \"notes\": \"SECURE 2.0 compliant restatement\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/plans/{{planId}}/documents",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "plans", "{{planId}}", "documents"]
            },
            "description": "Create a plan document. Types: plan_document | amendment | restatement | spd | smm | summary_annual_report | safe_harbor_notice | qdia_notice | notice_404a5."
          }
        },
        {
          "name": "List Plan Documents",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/plans/{{planId}}/documents?page=1&page_size=100",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "plans", "{{planId}}", "documents"],
              "query": [
                { "key": "type", "value": "spd", "disabled": true },
                { "key": "status", "value": "ADOPTED", "disabled": true },
                { "key": "page", "value": "1" },
                { "key": "page_size", "value": "100" }
              ]
            }
          }
        },
        {
          "name": "Get Document",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/documents/{{documentId}}",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "documents", "{{documentId}}"]
            }
          }
        },
        {
          "name": "Update Document Status",
          "request": {
            "method": "PATCH",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"ADOPTED\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/documents/{{documentId}}",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "documents", "{{documentId}}"]
            },
            "description": "Status: DRAFT | ADOPTED | SUPERSEDED | DISTRIBUTED | ARCHIVED."
          }
        }
      ]
    },
    {
      "name": "Form 5500",
      "item": [
        {
          "name": "Initiate Filing",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    const body = pm.response.json();",
                  "    pm.environment.set('filingId', body.filing_id);",
                  "    pm.test('filing_id set', () => pm.expect(body.filing_id).to.be.a('string'));",
                  "    pm.test('total_assets_eoy is 4dp string', () => {",
                  "        pm.expect(body.total_assets_eoy).to.match(/^-?\\d+\\.\\d{4}$/);",
                  "    });",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"plan_id\": \"{{planId}}\",\n  \"plan_year_start\": \"2025-01-01\",\n  \"plan_year_end\": \"2025-12-31\",\n  \"form_type\": \"5500\",\n  \"preparer_name\": \"Interpose TPA\",\n  \"preparer_ein\": \"98-7654321\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/plans/{{planId}}/form5500",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "plans", "{{planId}}", "form5500"]
            },
            "description": "Initiate a Form 5500 filing. Form types: 5500 (100+ participants) | 5500-SF (small plan <100) | 5500-EZ (one-participant).\n\nDue date is typically 7 months after plan year end (July 31 for calendar-year plans)."
          }
        },
        {
          "name": "List Filings",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/plans/{{planId}}/form5500?page=1&page_size=50",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "plans", "{{planId}}", "form5500"],
              "query": [
                { "key": "status", "value": "DRAFT", "disabled": true },
                { "key": "page", "value": "1" },
                { "key": "page_size", "value": "50" }
              ]
            }
          }
        },
        {
          "name": "Get Filing",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/form5500/{{filingId}}",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "form5500", "{{filingId}}"]
            }
          }
        },
        {
          "name": "Update Filing (add financial data)",
          "request": {
            "method": "PATCH",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"READY_TO_FILE\",\n  \"participants_bob\": 45,\n  \"participants_eoy\": 52,\n  \"total_assets_bob\": \"1250000.0000\",\n  \"total_assets_eoy\": \"1485000.0000\",\n  \"employer_contributions\": \"125000.0000\",\n  \"participant_contributions\": \"87500.0000\",\n  \"benefits_paid\": \"45000.0000\",\n  \"admin_expenses\": \"12500.0000\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/form5500/{{filingId}}",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "form5500", "{{filingId}}"]
            }
          }
        },
        {
          "name": "Submit Filing (EFAST2)",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/form5500/{{filingId}}/submit",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "form5500", "{{filingId}}", "submit"]
            },
            "description": "Submit a READY_TO_FILE filing to EFAST2 (DOL). Transitions status to FILED. Returns 422 if the filing is not in READY_TO_FILE status."
          }
        }
      ]
    },
    {
      "name": "Loans",
      "item": [
        {
          "name": "Request Loan",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    const body = pm.response.json();",
                  "    pm.environment.set('loanId', body.loan_id);",
                  "    pm.test('monthly_payment is 4dp string', () => {",
                  "        pm.expect(body.monthly_payment).to.match(/^-?\\d+\\.\\d{4}$/);",
                  "    });",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"participant_id\": \"{{participantId}}\",\n  \"loan_type\": \"general_purpose\",\n  \"principal\": \"15000.0000\",\n  \"annual_interest_rate\": \"0.0600\",\n  \"term_months\": 60,\n  \"first_payment_date\": \"2026-08-01\",\n  \"currency\": \"USD\",\n  \"purpose\": \"Debt consolidation\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/plans/{{planId}}/participants/{{participantId}}/loans",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "plans", "{{planId}}", "participants", "{{participantId}}", "loans"]
            },
            "description": "Request a plan loan. Types: general_purpose (max 5 years) | primary_residence (max 15 years).\n\nIRS limit: lesser of $50,000 or 50% of vested balance. The API enforces this automatically."
          }
        },
        {
          "name": "Record Loan Payment",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"payment_date\": \"2026-08-01\",\n  \"amount\": \"289.9900\",\n  \"currency\": \"USD\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/loans/{{loanId}}/payments",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "loans", "{{loanId}}", "payments"]
            },
            "description": "Record a loan repayment. Response shows principal_applied, interest_applied, and remaining_balance."
          }
        },
        {
          "name": "List Plan Loans",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/plans/{{planId}}/loans?page=1&page_size=100",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "plans", "{{planId}}", "loans"],
              "query": [
                { "key": "participant_id", "value": "{{participantId}}", "disabled": true },
                { "key": "status", "value": "ACTIVE", "disabled": true },
                { "key": "page", "value": "1" },
                { "key": "page_size", "value": "100" }
              ]
            }
          }
        },
        {
          "name": "Get Loan",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/loans/{{loanId}}",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "loans", "{{loanId}}"]
            }
          }
        },
        {
          "name": "Get Amortization Schedule",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/loans/{{loanId}}/amortization",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "loans", "{{loanId}}", "amortization"]
            },
            "description": "Get the full amortization schedule. Each entry shows payment_number, payment_date, payment_amount, principal, interest, and ending_balance — all as 4dp strings."
          }
        },
        {
          "name": "Update Loan Status",
          "request": {
            "method": "PATCH",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"PAID_OFF\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/loans/{{loanId}}",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "loans", "{{loanId}}"]
            },
            "description": "Status: ACTIVE | PAID_OFF | DEFAULT | OFFSET."
          }
        }
      ]
    },
    {
      "name": "Participant Statements",
      "item": [
        {
          "name": "Generate Statements",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    const body = pm.response.json();",
                  "    if (body.length > 0) {",
                  "        pm.environment.set('statementId', body[0].statement_id);",
                  "    }",
                  "    pm.test('statements generated', () => pm.expect(body).to.be.an('array'));",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"plan_id\": \"{{planId}}\",\n  \"period\": \"quarterly\",\n  \"period_start\": \"2026-04-01\",\n  \"period_end\": \"2026-06-30\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/plans/{{planId}}/statements",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "plans", "{{planId}}", "statements"]
            },
            "description": "Generate participant statements for a plan period. Omit participant_id to generate for all active participants. Required by ERISA § 105."
          }
        },
        {
          "name": "List Plan Statements",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/plans/{{planId}}/statements?page=1&page_size=100",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "plans", "{{planId}}", "statements"],
              "query": [
                { "key": "participant_id", "value": "{{participantId}}", "disabled": true },
                { "key": "period", "value": "quarterly", "disabled": true },
                { "key": "status", "value": "GENERATED", "disabled": true },
                { "key": "page", "value": "1" },
                { "key": "page_size", "value": "100" }
              ]
            }
          }
        },
        {
          "name": "Get Statement",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/statements/{{statementId}}",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "statements", "{{statementId}}"]
            }
          }
        },
        {
          "name": "Mark Statement Distributed",
          "request": {
            "method": "PATCH",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/statements/{{statementId}}/distribute",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "statements", "{{statementId}}", "distribute"]
            },
            "description": "Record that a statement has been furnished to the participant. Required to satisfy ERISA § 105 delivery obligations."
          }
        }
      ]
    },
    {
      "name": "Payroll Uploads",
      "item": [
        {
          "name": "Upload Payroll File",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    const body = pm.response.json();",
                  "    pm.environment.set('uploadId', body.upload_id);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"payroll_date\": \"2026-06-30\",\n  \"rows\": [\n    {\n      \"employee_id\": \"EMP-00123\",\n      \"contribution_type\": \"employee_pre_tax\",\n      \"amount\": \"1500.0000\",\n      \"payroll_date\": \"2026-06-30\",\n      \"currency\": \"USD\"\n    },\n    {\n      \"employee_id\": \"EMP-00123\",\n      \"contribution_type\": \"employer_match\",\n      \"amount\": \"450.0000\",\n      \"payroll_date\": \"2026-06-30\",\n      \"currency\": \"USD\"\n    },\n    {\n      \"employee_id\": \"EMP-00456\",\n      \"contribution_type\": \"employee_pre_tax\",\n      \"amount\": \"2000.0000\",\n      \"payroll_date\": \"2026-06-30\",\n      \"currency\": \"USD\"\n    }\n  ]\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/plans/{{planId}}/payroll/uploads",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "plans", "{{planId}}", "payroll", "uploads"]
            },
            "description": "Upload a payroll file to batch-process contributions for multiple participants. Each row is validated against §402(g)/§415(c) limits."
          }
        },
        {
          "name": "List Payroll Uploads",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/plans/{{planId}}/payroll/uploads?page=1&page_size=50",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "plans", "{{planId}}", "payroll", "uploads"],
              "query": [
                { "key": "status", "value": "PROCESSED", "disabled": true },
                { "key": "page", "value": "1" },
                { "key": "page_size", "value": "50" }
              ]
            }
          }
        },
        {
          "name": "Get Upload",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/payroll/uploads/{{uploadId}}",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "payroll", "uploads", "{{uploadId}}"]
            }
          }
        }
      ]
    },
    {
      "name": "QDROs",
      "item": [
        {
          "name": "Submit QDRO",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    const body = pm.response.json();",
                  "    pm.environment.set('qdroId', body.qdro_id);",
                  "    pm.test('qdro_id set', () => pm.expect(body.qdro_id).to.be.a('string'));",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"plan_id\": \"{{planId}}\",\n  \"participant_id\": \"{{participantId}}\",\n  \"alternate_payee_name\": \"John Smith\",\n  \"alternate_payee_dob\": \"1982-07-20\",\n  \"assignment_type\": \"percentage\",\n  \"assignment_value\": \"0.5000\",\n  \"court_order_date\": \"2026-05-15\",\n  \"court_case_number\": \"2026-DR-00789\",\n  \"jurisdiction\": \"New York\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/qdro",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "qdro"]
            },
            "description": "Submit a Qualified Domestic Relations Order. assignment_type: dollar_amount | percentage. Triggers a review workflow before the alternate payee receives funds."
          }
        },
        {
          "name": "Get QDRO",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/qdro/{{qdroId}}",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "qdro", "{{qdroId}}"]
            }
          }
        },
        {
          "name": "Update QDRO (approve/reject)",
          "request": {
            "method": "PATCH",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"APPROVED\",\n  \"reviewed_by\": \"Legal — M. Williams\",\n  \"notes\": \"Order meets all ERISA §414(p) requirements\"\n}",
              "options": { "raw": { "language": "json" } }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/qdro/{{qdroId}}",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "qdro", "{{qdroId}}"]
            },
            "description": "Approve or reject a QDRO after legal review. Status: PENDING_REVIEW | APPROVED | REJECTED | PROCESSED."
          }
        },
        {
          "name": "List Plan QDROs",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/v1/tpa/plans/{{planId}}/qdro?page=1&page_size=100",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tpa", "plans", "{{planId}}", "qdro"],
              "query": [
                { "key": "participant_id", "value": "{{participantId}}", "disabled": true },
                { "key": "status", "value": "PENDING_REVIEW", "disabled": true },
                { "key": "page", "value": "1" },
                { "key": "page_size", "value": "100" }
              ]
            }
          }
        }
      ]
    },
    {
      "name": "Health",
      "item": [
        {
          "name": "Health Check",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/health",
              "host": ["{{baseUrl}}"],
              "path": ["health"]
            },
            "description": "Service health check. Returns 200 OK when the TPA service is healthy."
          }
        }
      ]
    }
  ]
}
