{
  "info": {
    "name": "Portal Partner API — current",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
    "description": "Set baseUrl to your Portal backend origin plus /partner/v1. Set apiKey locally to a new integration key. Collection execution creates clients/assessments and the Generate report request spends one credit. Provide actual answersJson before completion. Keep request IDs unchanged for retries; clear IDs and regenerate when starting a new assessment/report. No invitation or report email is sent."
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "",
      "type": "string"
    },
    {
      "key": "apiKey",
      "value": "",
      "type": "string"
    },
    {
      "key": "participantId",
      "value": "",
      "type": "string"
    },
    {
      "key": "assessmentId",
      "value": "",
      "type": "string"
    },
    {
      "key": "assessmentResultId",
      "value": "",
      "type": "string"
    },
    {
      "key": "reportId",
      "value": "",
      "type": "string"
    },
    {
      "key": "expiresAt",
      "value": "",
      "type": "string"
    },
    {
      "key": "assessmentRequestId",
      "value": "",
      "type": "string"
    },
    {
      "key": "reportRequestId",
      "value": "",
      "type": "string"
    },
    {
      "key": "answersJson",
      "value": "",
      "type": "string"
    },
    {
      "key": "locale",
      "value": "en",
      "type": "string"
    }
  ],
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{apiKey}}",
        "type": "string"
      }
    ]
  },
  "item": [
    {
      "name": "Check connection",
      "request": {
        "method": "GET",
        "header": [],
        "url": "{{baseUrl}}/status",
        "description": "Scope: connection:read. "
      },
      "event": [
        {
          "listen": "prerequest",
          "script": {
            "type": "text/javascript",
            "exec": [
              "if (!new RegExp('^https?://').test(pm.variables.get('baseUrl') || '') || !(pm.variables.get('baseUrl') || '').endsWith('/partner/v1')) throw new Error('Set baseUrl to your Portal backend origin + /partner/v1');",
              "if (!pm.variables.get('apiKey')) throw new Error('Set apiKey locally; never share it in exported files');"
            ]
          }
        }
      ]
    },
    {
      "name": "Create or update a client",
      "request": {
        "method": "PUT",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": "{{baseUrl}}/participants",
        "description": "Scope: participants:write. ",
        "body": {
          "mode": "raw",
          "raw": "{\n  \"fullName\": \"Alex Example\",\n  \"email\": \"alex@example.test\",\n  \"locale\": \"{{locale}}\",\n  \"externalId\": \"customer-123\"\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "event": [
        {
          "listen": "prerequest",
          "script": {
            "type": "text/javascript",
            "exec": [
              "if (!new RegExp('^https?://').test(pm.variables.get('baseUrl') || '') || !(pm.variables.get('baseUrl') || '').endsWith('/partner/v1')) throw new Error('Set baseUrl to your Portal backend origin + /partner/v1');",
              "if (!pm.variables.get('apiKey')) throw new Error('Set apiKey locally; never share it in exported files');"
            ]
          }
        },
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "if ([200,201].includes(pm.response.code)) {",
              "  const body = pm.response.json();",
              "  if (body.participant?.id) pm.collectionVariables.set('participantId', body.participant.id);",
              "}"
            ]
          }
        }
      ]
    },
    {
      "name": "Create an assessment",
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          },
          {
            "key": "Idempotency-Key",
            "value": "{{assessmentRequestId}}"
          }
        ],
        "url": "{{baseUrl}}/assessments",
        "description": "Scope: assessments:write. ",
        "body": {
          "mode": "raw",
          "raw": "{\n  \"participantId\": \"{{participantId}}\",\n  \"locale\": \"{{locale}}\",\n  \"expiresAt\": \"{{expiresAt}}\"\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "event": [
        {
          "listen": "prerequest",
          "script": {
            "type": "text/javascript",
            "exec": [
              "if (!new RegExp('^https?://').test(pm.variables.get('baseUrl') || '') || !(pm.variables.get('baseUrl') || '').endsWith('/partner/v1')) throw new Error('Set baseUrl to your Portal backend origin + /partner/v1');",
              "if (!pm.variables.get('apiKey')) throw new Error('Set apiKey locally; never share it in exported files');",
              "if (!pm.variables.get('assessmentRequestId')) pm.collectionVariables.set('assessmentRequestId', pm.variables.replaceIn('{{$guid}}'));",
              "if (!pm.variables.get('participantId') || !pm.variables.get('expiresAt')) throw new Error('Set participantId and a future expiresAt timestamp');"
            ]
          }
        },
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "if ([200,201].includes(pm.response.code)) {",
              "  const body = pm.response.json();",
              "  if (body.assessment?.id) pm.collectionVariables.set('assessmentId', body.assessment.id);",
              "}"
            ]
          }
        }
      ]
    },
    {
      "name": "Get the questionnaire",
      "request": {
        "method": "GET",
        "header": [],
        "url": "{{baseUrl}}/assessments/{{assessmentId}}/questions",
        "description": "Scope: assessments:read. "
      },
      "event": [
        {
          "listen": "prerequest",
          "script": {
            "type": "text/javascript",
            "exec": [
              "if (!new RegExp('^https?://').test(pm.variables.get('baseUrl') || '') || !(pm.variables.get('baseUrl') || '').endsWith('/partner/v1')) throw new Error('Set baseUrl to your Portal backend origin + /partner/v1');",
              "if (!pm.variables.get('apiKey')) throw new Error('Set apiKey locally; never share it in exported files');",
              "if (!pm.variables.get('assessmentId')) throw new Error('Set assessmentId from the previous response');"
            ]
          }
        }
      ]
    },
    {
      "name": "Save answers",
      "request": {
        "method": "PUT",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": "{{baseUrl}}/assessments/{{assessmentId}}/answers",
        "description": "Scope: assessments:write. ",
        "body": {
          "mode": "raw",
          "raw": "{{answersJson}}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "event": [
        {
          "listen": "prerequest",
          "script": {
            "type": "text/javascript",
            "exec": [
              "if (!new RegExp('^https?://').test(pm.variables.get('baseUrl') || '') || !(pm.variables.get('baseUrl') || '').endsWith('/partner/v1')) throw new Error('Set baseUrl to your Portal backend origin + /partner/v1');",
              "if (!pm.variables.get('apiKey')) throw new Error('Set apiKey locally; never share it in exported files');",
              "if (!pm.variables.get('assessmentId')) throw new Error('Set assessmentId from the previous response');",
              "const body = JSON.parse(pm.variables.get('answersJson') || '{}'); if (!Array.isArray(body.answers) || !body.answers.length) throw new Error('Set answersJson to actual participant answers using returned question IDs');"
            ]
          }
        }
      ]
    },
    {
      "name": "Complete an assessment",
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": "{{baseUrl}}/assessments/{{assessmentId}}/complete",
        "description": "Scope: assessments:write. ",
        "body": {
          "mode": "raw",
          "raw": "{}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "event": [
        {
          "listen": "prerequest",
          "script": {
            "type": "text/javascript",
            "exec": [
              "if (!new RegExp('^https?://').test(pm.variables.get('baseUrl') || '') || !(pm.variables.get('baseUrl') || '').endsWith('/partner/v1')) throw new Error('Set baseUrl to your Portal backend origin + /partner/v1');",
              "if (!pm.variables.get('apiKey')) throw new Error('Set apiKey locally; never share it in exported files');",
              "if (!pm.variables.get('assessmentId')) throw new Error('Set assessmentId from the previous response');"
            ]
          }
        },
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "if ([200,201].includes(pm.response.code)) {",
              "  const body = pm.response.json();",
              "  if (body.result?.id) pm.collectionVariables.set('assessmentResultId', body.result.id);",
              "}"
            ]
          }
        }
      ]
    },
    {
      "name": "Read assessment progress",
      "request": {
        "method": "GET",
        "header": [],
        "url": "{{baseUrl}}/assessments/{{assessmentId}}",
        "description": "Scope: assessments:read. "
      },
      "event": [
        {
          "listen": "prerequest",
          "script": {
            "type": "text/javascript",
            "exec": [
              "if (!new RegExp('^https?://').test(pm.variables.get('baseUrl') || '') || !(pm.variables.get('baseUrl') || '').endsWith('/partner/v1')) throw new Error('Set baseUrl to your Portal backend origin + /partner/v1');",
              "if (!pm.variables.get('apiKey')) throw new Error('Set apiKey locally; never share it in exported files');",
              "if (!pm.variables.get('assessmentId')) throw new Error('Set assessmentId from the previous response');"
            ]
          }
        },
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "if ([200,201].includes(pm.response.code)) {",
              "  const body = pm.response.json();",
              "  if (body.assessment?.assessmentResultId) pm.collectionVariables.set('assessmentResultId', body.assessment.assessmentResultId);",
              "}"
            ]
          }
        }
      ]
    },
    {
      "name": "Check credit balance",
      "request": {
        "method": "GET",
        "header": [],
        "url": "{{baseUrl}}/credits",
        "description": "Scope: credits:read. "
      },
      "event": [
        {
          "listen": "prerequest",
          "script": {
            "type": "text/javascript",
            "exec": [
              "if (!new RegExp('^https?://').test(pm.variables.get('baseUrl') || '') || !(pm.variables.get('baseUrl') || '').endsWith('/partner/v1')) throw new Error('Set baseUrl to your Portal backend origin + /partner/v1');",
              "if (!pm.variables.get('apiKey')) throw new Error('Set apiKey locally; never share it in exported files');"
            ]
          }
        }
      ]
    },
    {
      "name": "Generate a permanent report (1 credit)",
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          },
          {
            "key": "Idempotency-Key",
            "value": "{{reportRequestId}}"
          }
        ],
        "url": "{{baseUrl}}/reports",
        "description": "Scope: reports:write. Generates a permanent report and spends one credit.",
        "body": {
          "mode": "raw",
          "raw": "{\n  \"assessmentResultId\": \"{{assessmentResultId}}\"\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "event": [
        {
          "listen": "prerequest",
          "script": {
            "type": "text/javascript",
            "exec": [
              "if (!new RegExp('^https?://').test(pm.variables.get('baseUrl') || '') || !(pm.variables.get('baseUrl') || '').endsWith('/partner/v1')) throw new Error('Set baseUrl to your Portal backend origin + /partner/v1');",
              "if (!pm.variables.get('apiKey')) throw new Error('Set apiKey locally; never share it in exported files');",
              "if (!pm.variables.get('reportRequestId')) pm.collectionVariables.set('reportRequestId', pm.variables.replaceIn('{{$guid}}'));",
              "if (!pm.variables.get('assessmentResultId')) throw new Error('Complete the assessment first');"
            ]
          }
        },
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "if ([200,201].includes(pm.response.code)) {",
              "  const body = pm.response.json();",
              "  if (body.report?.id) pm.collectionVariables.set('reportId', body.report.id);",
              "}"
            ]
          }
        }
      ]
    },
    {
      "name": "Read a full report",
      "request": {
        "method": "GET",
        "header": [],
        "url": "{{baseUrl}}/reports/{{reportId}}?locale={{locale}}",
        "description": "Scope: reports:read. "
      },
      "event": [
        {
          "listen": "prerequest",
          "script": {
            "type": "text/javascript",
            "exec": [
              "if (!new RegExp('^https?://').test(pm.variables.get('baseUrl') || '') || !(pm.variables.get('baseUrl') || '').endsWith('/partner/v1')) throw new Error('Set baseUrl to your Portal backend origin + /partner/v1');",
              "if (!pm.variables.get('apiKey')) throw new Error('Set apiKey locally; never share it in exported files');",
              "if (!pm.variables.get('reportId')) throw new Error('Set reportId from the previous response');"
            ]
          }
        }
      ]
    }
  ]
}
