{
  "info": {
    "_postman_id": "1000eddd-d1f5-4608-ab55-9bf04931fec2",
    "name": "CRD Public REST API",
    "description": "# CRD API Collection\n\nUse this collection with the CRD Environment Template. The API version is the latest version identified for CRD; this export does not pin a software build number.\n\n## Setup\n\n1. Import the collection and the environment template into Postman.\n2. Select the CRD environment.\n3. Set `crd_base_url` to the configured CRD API origin, including protocol and port, without a trailing slash or `/api` suffix.\n4. Enter credentials in your local environment values only. Do not export or share secrets.\n\n## Authenticate\n\nUse `api / Login / Request a token` for CRD username/password authentication, or `oauth2 / Request a token` for OAuth client credentials. A successful token response stores its token in `crd_access_token`. `Service / Ping` does not require a token. Other included operations inherit the collection's bearer token.\n\n## Execute and monitor a schedule\n\nSet `crd_schedule_id` and `crd_schedule_type` to the exact values returned by CRD. Send `Schedule / ExecuteScheduleAsync`; the response script stores `ExecutionId` in `crd_execution_id`. Use `Schedule / GetExecutionStatus` to inspect the run. The collection does not automatically poll, retry, or renew tokens. Review result data and confirm delivery separately.\n\n## State-changing requests\n\nRequests that create, update, delete, execute, clone, cancel, terminate, or change scheduler state are blocked unless `crd_allow_mutations` is set to `true`. Requests with missing required variables or `REPLACE_ME` body values are also skipped. Send requests individually and review each target before enabling a mutation.\n\n## CRD-specific scope\n\nThe collection follows the CRD OpenAPI contract. Requests whose schemas are explicitly Power BI-specific for report or package creation are omitted, as are the Power BI bursting-schedule create operation. The import operation is included only as a raw CRD-exported JSON payload because its nested schema is not defined. Use the API reference for the full contract.\n\n## Environment variables\n\nThe environment template leaves credentials, tokens, and identifiers empty. It includes `crd_base_url` with the local default from the OpenAPI file; replace it with the API origin for your installation. Schedule types are left blank because the OpenAPI schema does not enumerate valid values.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{crd_access_token}}",
        "type": "string"
      }
    ]
  },
  "item": [
    {
      "name": "api",
      "item": [
        {
          "name": "Folder",
          "item": [
            {
              "name": "List Folder records (GET)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Folder/Get/{{crd_folder_id}}",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Folder",
                    "Get",
                    "{{crd_folder_id}}"
                  ],
                  "variable": [
                    {
                      "key": "crd_folder_id",
                      "value": "",
                      "description": "OpenAPI path parameter: id"
                    }
                  ]
                },
                "description": "Retrieve a folder by its identifier.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_folder_id\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "GetSubFolders",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Folder/GetSubFolders/{{crd_folder_id}}",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Folder",
                    "GetSubFolders",
                    "{{crd_folder_id}}"
                  ],
                  "variable": [
                    {
                      "key": "crd_folder_id",
                      "value": "",
                      "description": "OpenAPI path parameter: id"
                    }
                  ]
                },
                "description": "List the child folders for a folder.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_folder_id\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "GetSchedules",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Folder/GetSchedules/{{crd_folder_id}}",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Folder",
                    "GetSchedules",
                    "{{crd_folder_id}}"
                  ],
                  "variable": [
                    {
                      "key": "crd_folder_id",
                      "value": "",
                      "description": "OpenAPI path parameter: id"
                    }
                  ]
                },
                "description": "List schedules in a folder.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_folder_id\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "GetUniqueIdFromPath",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Folder/GetUniqueIdFromPath",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Folder",
                    "GetUniqueIdFromPath"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"path\": \"{{crd_folder_path}}\",\n  \"scheduleName\": \"{{crd_schedule_name}}\",\n  \"scheduleType\": \"{{crd_schedule_type}}\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Find a schedule identifier using its folder path, schedule name and schedule type.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_folder_path\", \"crd_schedule_name\", \"crd_schedule_type\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "GetFolderFromPath",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Folder/GetFolderFromPath",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Folder",
                    "GetFolderFromPath"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"path\": \"{{crd_folder_path}}\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Retrieve a folder using its path.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_folder_path\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "CreateFolder",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Folder/CreateFolder",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Folder",
                    "CreateFolder"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"FolderName\": \"{{crd_folder_name}}\",\n  \"FolderParent\": \"{{crd_parent_folder_id}}\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Create a folder under the specified parent folder.\n\nState-changing request. The environment template blocks it unless crd_allow_mutations is set to true. Review the target and effect before enabling it.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_folder_name\", \"crd_parent_folder_id\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (String(pm.variables.get(\"crd_allow_mutations\") || \"\").toLowerCase() !== \"true\") missing.push(\"crd_allow_mutations=true (required for this state-changing request)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            }
          ]
        },
        {
          "name": "Login",
          "item": [
            {
              "name": "Request a token",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Login/token",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Login",
                    "token"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"username\": \"{{crd_username}}\",\n  \"password\": \"{{crd_password}}\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "auth": {
                  "type": "noauth"
                },
                "description": "Authenticate with a CRD user account and return a user token.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_username\", \"crd_password\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            }
          ]
        },
        {
          "name": "Package",
          "item": [
            {
              "name": "Clone",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Package/Clone?Id={{crd_package_id}}",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Package",
                    "Clone"
                  ],
                  "query": [
                    {
                      "key": "Id",
                      "value": "{{crd_package_id}}",
                      "description": "Package identifier."
                    }
                  ]
                },
                "description": "Clone a package schedule.\n\nState-changing request. The environment template blocks it unless crd_allow_mutations is set to true. Review the target and effect before enabling it.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_package_id\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (String(pm.variables.get(\"crd_allow_mutations\") || \"\").toLowerCase() !== \"true\") missing.push(\"crd_allow_mutations=true (required for this state-changing request)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "GetReportsInPackage",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Package/GetReportsInPackage/{{crd_package_id}}",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Package",
                    "GetReportsInPackage",
                    "{{crd_package_id}}"
                  ],
                  "variable": [
                    {
                      "key": "crd_package_id",
                      "value": "",
                      "description": "OpenAPI path parameter: Id"
                    }
                  ]
                },
                "description": "List the reports included in a package.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_package_id\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "List Package records (GET)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Package/Get/{{crd_package_id}}",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Package",
                    "Get",
                    "{{crd_package_id}}"
                  ],
                  "variable": [
                    {
                      "key": "crd_package_id",
                      "value": "",
                      "description": "OpenAPI path parameter: Id"
                    }
                  ]
                },
                "description": "Retrieve a package schedule by its identifier.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_package_id\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            }
          ]
        },
        {
          "name": "Schedule",
          "item": [
            {
              "name": "RenameSchedule",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Schedule/RenameSchedule",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Schedule",
                    "RenameSchedule"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ScheduleType\": \"{{crd_schedule_type}}\",\n  \"UniqueId\": \"{{crd_schedule_id}}\",\n  \"RunBy\": \"{{crd_run_by}}\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Rename a schedule.\n\nState-changing request. The environment template blocks it unless crd_allow_mutations is set to true. Review the target and effect before enabling it.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_schedule_type\", \"crd_schedule_id\", \"crd_run_by\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (String(pm.variables.get(\"crd_allow_mutations\") || \"\").toLowerCase() !== \"true\") missing.push(\"crd_allow_mutations=true (required for this state-changing request)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "ExecuteSchedule",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Schedule/ExecuteSchedule",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Schedule",
                    "ExecuteSchedule"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ScheduleType\": \"{{crd_schedule_type}}\",\n  \"UniqueId\": \"{{crd_schedule_id}}\",\n  \"RunBy\": \"{{crd_run_by}}\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Execute a schedule and wait for its result.\n\nState-changing request. The environment template blocks it unless crd_allow_mutations is set to true. Review the target and effect before enabling it.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_schedule_type\", \"crd_schedule_id\", \"crd_run_by\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (String(pm.variables.get(\"crd_allow_mutations\") || \"\").toLowerCase() !== \"true\") missing.push(\"crd_allow_mutations=true (required for this state-changing request)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "ExecuteScheduleOnTimeAsync",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Schedule/ExecuteScheduleOnTimeAsync",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Schedule",
                    "ExecuteScheduleOnTimeAsync"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ScheduleType\": \"{{crd_schedule_type}}\",\n  \"UniqueId\": \"{{crd_schedule_id}}\",\n  \"RunBy\": \"{{crd_run_by}}\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Execute a schedule asynchronously and advance its next run time.\n\nState-changing request. The environment template blocks it unless crd_allow_mutations is set to true. Review the target and effect before enabling it.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_schedule_type\", \"crd_schedule_id\", \"crd_run_by\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (String(pm.variables.get(\"crd_allow_mutations\") || \"\").toLowerCase() !== \"true\") missing.push(\"crd_allow_mutations=true (required for this state-changing request)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "ExecuteScheduleByEventAsync",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Schedule/ExecuteScheduleByEventAsync",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Schedule",
                    "ExecuteScheduleByEventAsync"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"AsyncData\": \"REPLACE_ME\",\n  \"EventName\": \"{{crd_event_name}}\",\n  \"EventId\": \"{{crd_event_id}}\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Start an asynchronous schedule execution with event context.\n\nState-changing request. The environment template blocks it unless crd_allow_mutations is set to true. Review the target and effect before enabling it.\n\nRequest body contains REPLACE_ME placeholders. Replace them with valid CRD values before sending; the pre-request script skips the request while placeholders remain.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_event_name\", \"crd_event_id\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (String(pm.variables.get(\"crd_allow_mutations\") || \"\").toLowerCase() !== \"true\") missing.push(\"crd_allow_mutations=true (required for this state-changing request)\");",
                      "missing.push(\"replace REPLACE_ME values in the request body\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "DisableSchedule",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Schedule/DisableSchedule",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Schedule",
                    "DisableSchedule"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ScheduleType\": \"{{crd_schedule_type}}\",\n  \"UniqueId\": \"{{crd_schedule_id}}\",\n  \"RunBy\": \"{{crd_run_by}}\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Disable a schedule.\n\nState-changing request. The environment template blocks it unless crd_allow_mutations is set to true. Review the target and effect before enabling it.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_schedule_type\", \"crd_schedule_id\", \"crd_run_by\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (String(pm.variables.get(\"crd_allow_mutations\") || \"\").toLowerCase() !== \"true\") missing.push(\"crd_allow_mutations=true (required for this state-changing request)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "EnableSchedule",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Schedule/EnableSchedule",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Schedule",
                    "EnableSchedule"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ScheduleType\": \"{{crd_schedule_type}}\",\n  \"UniqueId\": \"{{crd_schedule_id}}\",\n  \"RunBy\": \"{{crd_run_by}}\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Enable a schedule.\n\nState-changing request. The environment template blocks it unless crd_allow_mutations is set to true. Review the target and effect before enabling it.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_schedule_type\", \"crd_schedule_id\", \"crd_run_by\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (String(pm.variables.get(\"crd_allow_mutations\") || \"\").toLowerCase() !== \"true\") missing.push(\"crd_allow_mutations=true (required for this state-changing request)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "ExecuteScheduleAsync",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Schedule/ExecuteScheduleAsync",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Schedule",
                    "ExecuteScheduleAsync"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ScheduleType\": \"{{crd_schedule_type}}\",\n  \"UniqueId\": \"{{crd_schedule_id}}\",\n  \"RunBy\": \"{{crd_run_by}}\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Start an asynchronous schedule execution and return its execution identifier.\n\nState-changing request. The environment template blocks it unless crd_allow_mutations is set to true. Review the target and effect before enabling it.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_schedule_type\", \"crd_schedule_id\", \"crd_run_by\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (String(pm.variables.get(\"crd_allow_mutations\") || \"\").toLowerCase() !== \"true\") missing.push(\"crd_allow_mutations=true (required for this state-changing request)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                },
                {
                  "listen": "test",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "pm.environment.unset(\"crd_execution_id\");",
                      "if (pm.response.code >= 200 && pm.response.code < 300) {",
                      "  try { const data = pm.response.json(); if (data.ExecutionId) pm.environment.set(\"crd_execution_id\", data.ExecutionId); }",
                      "  catch (error) { console.error(\"Execution response did not contain JSON.\"); }",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "GetNumberOfFreeThreads",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Schedule/GetNumberOfFreeThreads",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Schedule",
                    "GetNumberOfFreeThreads"
                  ]
                },
                "description": "Return the number of currently available execution threads.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "CancelExecution",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Schedule/CancelExecution?ExecutionId={{crd_execution_id}}",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Schedule",
                    "CancelExecution"
                  ],
                  "query": [
                    {
                      "key": "ExecutionId",
                      "value": "{{crd_execution_id}}",
                      "description": "Execution identifier returned when an asynchronous execution is accepted."
                    }
                  ]
                },
                "description": "Cancel an execution by execution identifier.\n\nState-changing request. The environment template blocks it unless crd_allow_mutations is set to true. Review the target and effect before enabling it.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_execution_id\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (String(pm.variables.get(\"crd_allow_mutations\") || \"\").toLowerCase() !== \"true\") missing.push(\"crd_allow_mutations=true (required for this state-changing request)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "GetExecutionStatus",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Schedule/GetExecutionStatus?ExecutionId={{crd_execution_id}}",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Schedule",
                    "GetExecutionStatus"
                  ],
                  "query": [
                    {
                      "key": "ExecutionId",
                      "value": "{{crd_execution_id}}",
                      "description": "Execution identifier returned when an asynchronous execution is accepted."
                    }
                  ]
                },
                "description": "Retrieve the status of an asynchronous execution.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_execution_id\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "TerminateSchedule",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Schedule/TerminateSchedule?ProcessId={{crd_process_id}}",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Schedule",
                    "TerminateSchedule"
                  ],
                  "query": [
                    {
                      "key": "ProcessId",
                      "value": "{{crd_process_id}}",
                      "description": "Operating system process identifier."
                    }
                  ]
                },
                "description": "Terminate a running process by process identifier.\n\nState-changing request. The environment template blocks it unless crd_allow_mutations is set to true. Review the target and effect before enabling it.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_process_id\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (String(pm.variables.get(\"crd_allow_mutations\") || \"\").toLowerCase() !== \"true\") missing.push(\"crd_allow_mutations=true (required for this state-changing request)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "GetExecutionQueue",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Schedule/GetExecutionQueue",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Schedule",
                    "GetExecutionQueue"
                  ]
                },
                "description": "List execution status records in the queue.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "importScheduleJSON",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Schedule/importScheduleJSON",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Schedule",
                    "importScheduleJSON"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{{crd_import_schedule_json}}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Import a compatible schedule definition as JSON.\n\nSupply a JSON payload exported from your CRD installation in crd_import_schedule_json. No schedule import structure is invented in this collection.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_import_schedule_json\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "GetAllWithFilter",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Schedule/GetAllWithFilter",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Schedule",
                    "GetAllWithFilter"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"FilterValues\": [],\n  \"FilterOperator\": \"REPLACE_ME\",\n  \"MatchType\": \"REPLACE_ME\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "List schedules filtered by their keywords.\n\nRequest body contains REPLACE_ME placeholders. Replace them with valid CRD values before sending; the pre-request script skips the request while placeholders remain.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "missing.push(\"replace REPLACE_ME values in the request body\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            }
          ]
        },
        {
          "name": "Scheduleinfo",
          "item": [
            {
              "name": "LastRunResult",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Scheduleinfo/LastRunResult",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Scheduleinfo",
                    "LastRunResult"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"Id\": \"{{crd_schedule_id}}\",\n  \"ScheduleType\": \"{{crd_schedule_type}}\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Retrieve the most recent run result for a schedule.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_schedule_id\", \"crd_schedule_type\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "GetFailedSchedules",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Scheduleinfo/GetFailedSchedules/{{crd_schedule_id}}",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Scheduleinfo",
                    "GetFailedSchedules",
                    "{{crd_schedule_id}}"
                  ],
                  "variable": [
                    {
                      "key": "crd_schedule_id",
                      "value": "",
                      "description": "OpenAPI path parameter: id"
                    }
                  ]
                },
                "description": "List recently failed schedules.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_schedule_id\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            }
          ]
        },
        {
          "name": "Service",
          "item": [
            {
              "name": "Ping",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Service/Ping",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Service",
                    "Ping"
                  ]
                },
                "auth": {
                  "type": "noauth"
                },
                "description": "Check API service connectivity.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "StopScheduler",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Service/StopScheduler",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Service",
                    "StopScheduler"
                  ]
                },
                "description": "Stop the scheduler service.\n\nState-changing request. The environment template blocks it unless crd_allow_mutations is set to true. Review the target and effect before enabling it.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (String(pm.variables.get(\"crd_allow_mutations\") || \"\").toLowerCase() !== \"true\") missing.push(\"crd_allow_mutations=true (required for this state-changing request)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "StartScheduler",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Service/StartScheduler",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Service",
                    "StartScheduler"
                  ]
                },
                "description": "Start the scheduler service.\n\nState-changing request. The environment template blocks it unless crd_allow_mutations is set to true. Review the target and effect before enabling it.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (String(pm.variables.get(\"crd_allow_mutations\") || \"\").toLowerCase() !== \"true\") missing.push(\"crd_allow_mutations=true (required for this state-changing request)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "IsSchedulerRunning",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Service/IsSchedulerRunning",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Service",
                    "IsSchedulerRunning"
                  ]
                },
                "description": "Check whether the scheduler is running.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "UpdateCollaborationSettings",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/Service/UpdateCollaborationSettings",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "Service",
                    "UpdateCollaborationSettings"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"IsCollaborationEnabled\": false,\n  \"CollaborationId\": 0,\n  \"CollaborationLeader\": \"REPLACE_ME\",\n  \"ConType\": \"REPLACE_ME\",\n  \"ConString\": \"{{crd_connection_string}}\",\n  \"ConString2\": \"{{crd_connection_string2}}\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Update collaboration settings.\n\nState-changing request. The environment template blocks it unless crd_allow_mutations is set to true. Review the target and effect before enabling it.\n\nRequest body contains REPLACE_ME placeholders. Replace them with valid CRD values before sending; the pre-request script skips the request while placeholders remain.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_connection_string\", \"crd_connection_string2\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (String(pm.variables.get(\"crd_allow_mutations\") || \"\").toLowerCase() !== \"true\") missing.push(\"crd_allow_mutations=true (required for this state-changing request)\");",
                      "missing.push(\"replace REPLACE_ME values in the request body\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            }
          ]
        },
        {
          "name": "SystemMonitor",
          "item": [
            {
              "name": "AllDue",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/SystemMonitor/AllDue",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "SystemMonitor",
                    "AllDue"
                  ]
                },
                "description": "List schedules currently due to run.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "GetCurrentlyExecuting",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/SystemMonitor/GetCurrentlyExecuting",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "SystemMonitor",
                    "GetCurrentlyExecuting"
                  ]
                },
                "description": "List schedules currently executing.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            }
          ]
        },
        {
          "name": "UserGroups",
          "item": [
            {
              "name": "List UserGroups records (GET)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/UserGroups/Get",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "UserGroups",
                    "Get"
                  ]
                },
                "description": "List user groups.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            }
          ]
        },
        {
          "name": "BurstingSchedule",
          "item": [
            {
              "name": "GetReportColumns",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/BurstingSchedule/GetReportColumns",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "BurstingSchedule",
                    "GetReportColumns"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ReportPath\": \"{{crd_report_path}}\",\n  \"UseReportCredentials\": true,\n  \"ServerName\": \"{{crd_server_name}}\",\n  \"DatabaseName\": \"{{crd_database_name}}\",\n  \"UserID\": \"{{crd_report_user_id}}\",\n  \"Password\": \"{{crd_password}}\",\n  \"UseIntegratedSecurity\": false\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "List report columns that can be used for bursting.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_report_path\", \"crd_server_name\", \"crd_database_name\", \"crd_report_user_id\", \"crd_password\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "GetGroupValues",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/BurstingSchedule/GetGroupValues",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "BurstingSchedule",
                    "GetGroupValues"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ReportPath\": \"{{crd_report_path}}\",\n  \"ColumnName\": \"{{crd_column_name}}\",\n  \"UseReportCredentials\": true,\n  \"ServerName\": \"{{crd_server_name}}\",\n  \"DatabaseName\": \"{{crd_database_name}}\",\n  \"UserID\": \"{{crd_report_user_id}}\",\n  \"Password\": \"{{crd_password}}\",\n  \"UseIntegratedSecurity\": false\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "List values for a report grouping column.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_report_path\", \"crd_column_name\", \"crd_server_name\", \"crd_database_name\", \"crd_report_user_id\", \"crd_password\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            }
          ]
        },
        {
          "name": "PackageSchedule",
          "item": [
            {
              "name": "Delete",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/PackageSchedule/Delete/{{crd_package_id}}",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "PackageSchedule",
                    "Delete",
                    "{{crd_package_id}}"
                  ],
                  "variable": [
                    {
                      "key": "crd_package_id",
                      "value": "",
                      "description": "OpenAPI path parameter: Id"
                    }
                  ]
                },
                "description": "Delete a package schedule.\n\nState-changing request. The environment template blocks it unless crd_allow_mutations is set to true. Review the target and effect before enabling it.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_package_id\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (String(pm.variables.get(\"crd_allow_mutations\") || \"\").toLowerCase() !== \"true\") missing.push(\"crd_allow_mutations=true (required for this state-changing request)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "List PackageSchedule records (GET)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/PackageSchedule/Get/{{crd_package_id}}",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "PackageSchedule",
                    "Get",
                    "{{crd_package_id}}"
                  ],
                  "variable": [
                    {
                      "key": "crd_package_id",
                      "value": "",
                      "description": "OpenAPI path parameter: Id"
                    }
                  ]
                },
                "description": "Retrieve a package schedule.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_package_id\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "List PackageSchedule records (GET)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/PackageSchedule/GetAll",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "PackageSchedule",
                    "GetAll"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"FilterValues\": [],\n  \"FilterOperator\": \"REPLACE_ME\",\n  \"MatchType\": \"REPLACE_ME\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Search package schedules.\n\nRequest body contains REPLACE_ME placeholders. Replace them with valid CRD values before sending; the pre-request script skips the request while placeholders remain.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "missing.push(\"replace REPLACE_ME values in the request body\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            }
          ]
        },
        {
          "name": "SingleSchedule",
          "item": [
            {
              "name": "Clone",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/SingleSchedule/Clone?Id={{crd_schedule_id}}",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "SingleSchedule",
                    "Clone"
                  ],
                  "query": [
                    {
                      "key": "Id",
                      "value": "{{crd_schedule_id}}",
                      "description": "Schedule identifier."
                    }
                  ]
                },
                "description": "Clone a single-report schedule.\n\nState-changing request. The environment template blocks it unless crd_allow_mutations is set to true. Review the target and effect before enabling it.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_schedule_id\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (String(pm.variables.get(\"crd_allow_mutations\") || \"\").toLowerCase() !== \"true\") missing.push(\"crd_allow_mutations=true (required for this state-changing request)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "Delete",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/SingleSchedule/Delete?Id={{crd_schedule_id}}",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "SingleSchedule",
                    "Delete"
                  ],
                  "query": [
                    {
                      "key": "Id",
                      "value": "{{crd_schedule_id}}",
                      "description": "Schedule identifier."
                    }
                  ]
                },
                "description": "Delete a single-report schedule.\n\nState-changing request. The environment template blocks it unless crd_allow_mutations is set to true. Review the target and effect before enabling it.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_schedule_id\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (String(pm.variables.get(\"crd_allow_mutations\") || \"\").toLowerCase() !== \"true\") missing.push(\"crd_allow_mutations=true (required for this state-changing request)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "AddEmailDestination",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/SingleSchedule/AddEmailDestination?clearExisting={{crd_clearexisting}}",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "SingleSchedule",
                    "AddEmailDestination"
                  ],
                  "query": [
                    {
                      "key": "clearExisting",
                      "value": "{{crd_clearexisting}}",
                      "description": "Whether existing email destinations should be cleared before adding this destination. Defaults to false.",
                      "disabled": true
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"DestinationName\": \"REPLACE_ME\",\n  \"DestinationType\": \"REPLACE_ME\",\n  \"OutputFormat\": \"REPLACE_ME\",\n  \"CustomOutputFileName\": \"REPLACE_ME\",\n  \"CustomOutputExtension\": \"REPLACE_ME\",\n  \"Enabled\": false,\n  \"ParentId\": 0,\n  \"To\": [\n    \"REPLACE_ME\"\n  ],\n  \"Cc\": [\n    \"REPLACE_ME\"\n  ],\n  \"Bcc\": [\n    \"REPLACE_ME\"\n  ],\n  \"Subject\": \"REPLACE_ME\",\n  \"Body\": \"REPLACE_ME\",\n  \"BodyFormat\": \"REPLACE_ME\",\n  \"EmbedReport\": false,\n  \"EmbedFormat\": \"REPLACE_ME\",\n  \"CustomSenderName\": \"REPLACE_ME\",\n  \"CustomerSenderAddress\": \"REPLACE_ME\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Add an email destination to a schedule.\n\nState-changing request. The environment template blocks it unless crd_allow_mutations is set to true. Review the target and effect before enabling it.\n\nRequest body contains REPLACE_ME placeholders. Replace them with valid CRD values before sending; the pre-request script skips the request while placeholders remain.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (String(pm.variables.get(\"crd_allow_mutations\") || \"\").toLowerCase() !== \"true\") missing.push(\"crd_allow_mutations=true (required for this state-changing request)\");",
                      "missing.push(\"replace REPLACE_ME values in the request body\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "DeleteEmailDestination",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/SingleSchedule/DeleteEmailDestination?destinationId={{crd_destination_id}}",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "SingleSchedule",
                    "DeleteEmailDestination"
                  ],
                  "query": [
                    {
                      "key": "destinationId",
                      "value": "{{crd_destination_id}}",
                      "description": "Email destination identifier."
                    }
                  ]
                },
                "description": "Delete an email destination from a schedule.\n\nState-changing request. The environment template blocks it unless crd_allow_mutations is set to true. Review the target and effect before enabling it.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_destination_id\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (String(pm.variables.get(\"crd_allow_mutations\") || \"\").toLowerCase() !== \"true\") missing.push(\"crd_allow_mutations=true (required for this state-changing request)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "UpdateEmailDestination",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/SingleSchedule/UpdateEmailDestination",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "SingleSchedule",
                    "UpdateEmailDestination"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"DestinationName\": \"REPLACE_ME\",\n  \"DestinationId\": \"{{crd_destination_id}}\",\n  \"DestinationType\": \"REPLACE_ME\",\n  \"OutputFormat\": \"REPLACE_ME\",\n  \"CustomOutputFileName\": \"REPLACE_ME\",\n  \"CustomOutputExtension\": \"REPLACE_ME\",\n  \"Enabled\": false,\n  \"ParentId\": 0,\n  \"To\": [\n    \"REPLACE_ME\"\n  ],\n  \"Cc\": [\n    \"REPLACE_ME\"\n  ],\n  \"Bcc\": [\n    \"REPLACE_ME\"\n  ],\n  \"Subject\": \"REPLACE_ME\",\n  \"Body\": \"REPLACE_ME\",\n  \"BodyFormat\": \"REPLACE_ME\",\n  \"EmbedReport\": false,\n  \"EmbedFormat\": \"REPLACE_ME\",\n  \"CustomSenderName\": \"REPLACE_ME\",\n  \"CustomerSenderAddress\": \"REPLACE_ME\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Update an email destination.\n\nState-changing request. The environment template blocks it unless crd_allow_mutations is set to true. Review the target and effect before enabling it.\n\nRequest body contains REPLACE_ME placeholders. Replace them with valid CRD values before sending; the pre-request script skips the request while placeholders remain.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_destination_id\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (String(pm.variables.get(\"crd_allow_mutations\") || \"\").toLowerCase() !== \"true\") missing.push(\"crd_allow_mutations=true (required for this state-changing request)\");",
                      "missing.push(\"replace REPLACE_ME values in the request body\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "List SingleSchedule records (GET)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/SingleSchedule/Get/{{crd_schedule_id}}",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "SingleSchedule",
                    "Get",
                    "{{crd_schedule_id}}"
                  ],
                  "variable": [
                    {
                      "key": "crd_schedule_id",
                      "value": "",
                      "description": "OpenAPI path parameter: Id"
                    }
                  ]
                },
                "description": "Retrieve a single-report schedule.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_schedule_id\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "List SingleSchedule records (GET)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/SingleSchedule/GetAll",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "SingleSchedule",
                    "GetAll"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"FilterValues\": [],\n  \"FilterOperator\": \"REPLACE_ME\",\n  \"MatchType\": \"REPLACE_ME\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Search single-report schedules.\n\nRequest body contains REPLACE_ME placeholders. Replace them with valid CRD values before sending; the pre-request script skips the request while placeholders remain.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "missing.push(\"replace REPLACE_ME values in the request body\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "Search SingleSchedule records (POST)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/SingleSchedule/GetAll",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "SingleSchedule",
                    "GetAll"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"FilterValues\": [],\n  \"FilterOperator\": \"REPLACE_ME\",\n  \"MatchType\": \"REPLACE_ME\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Search single-report schedules.\n\nRequest body contains REPLACE_ME placeholders. Replace them with valid CRD values before sending; the pre-request script skips the request while placeholders remain.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "missing.push(\"replace REPLACE_ME values in the request body\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "UpdateParameter",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/SingleSchedule/UpdateParameter",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "SingleSchedule",
                    "UpdateParameter"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"ScheduleName\": \"{{crd_schedule_name}}\",\n  \"FolderPath\": \"{{crd_folder_path}}\",\n  \"UniqueId\": \"{{crd_schedule_id}}\",\n  \"Description\": \"REPLACE_ME\",\n  \"Keywords\": \"REPLACE_ME\",\n  \"Schedule\": {\n    \"Frequency\": \"REPLACE_ME\",\n    \"StartDate\": \"REPLACE_ME\",\n    \"HasEndDate\": false,\n    \"EndDate\": \"REPLACE_ME\",\n    \"ExecutionTime\": \"REPLACE_ME\",\n    \"Repeat\": false,\n    \"RepeatInterval\": 0,\n    \"RepeatUnit\": \"REPLACE_ME\",\n    \"RepeatUntil\": \"REPLACE_ME\",\n    \"Enabled\": false,\n    \"ScheduleId\": \"{{crd_schedule_id}}\",\n    \"NextRunEpochUtc\": 0,\n    \"ParentId\": 0,\n    \"Description\": \"REPLACE_ME\",\n    \"Keywords\": \"REPLACE_ME\",\n    \"DailyRepeatInterval\": 0,\n    \"WeeklyOptions\": {\n      \"WeeklyRepeatInterval\": 0,\n      \"SelectedDaysOfWeek\": []\n    },\n    \"MonthlyOptions\": {\n      \"UseOptions\": false,\n      \"NthDayOfMonth\": \"REPLACE_ME\",\n      \"SelectedDayOfMonth\": \"REPLACE_ME\",\n      \"SelectedMonthsOfyear\": []\n    },\n    \"OtherOptions\": {\n      \"RepeatInterval\": 0,\n      \"IntervalType\": \"REPLACE_ME\"\n    }\n  },\n  \"EmailDestinations\": [],\n  \"DiskDestinations\": [],\n  \"ReportParameter\": [],\n  \"PackId\": 0,\n  \"Owner\": \"REPLACE_ME\",\n  \"ClientDestinations\": []\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Update report parameter values for a schedule.\n\nState-changing request. The environment template blocks it unless crd_allow_mutations is set to true. Review the target and effect before enabling it.\n\nRequest body contains REPLACE_ME placeholders. Replace them with valid CRD values before sending; the pre-request script skips the request while placeholders remain.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\", \"crd_schedule_name\", \"crd_folder_path\", \"crd_schedule_id\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (String(pm.variables.get(\"crd_allow_mutations\") || \"\").toLowerCase() !== \"true\") missing.push(\"crd_allow_mutations=true (required for this state-changing request)\");",
                      "missing.push(\"replace REPLACE_ME values in the request body\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            },
            {
              "name": "GetSample",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{crd_base_url}}/api/SingleSchedule/GetSample",
                  "host": [
                    "{{crd_base_url}}"
                  ],
                  "path": [
                    "api",
                    "SingleSchedule",
                    "GetSample"
                  ]
                },
                "description": "Return a sample schedule JSON document.\n\nReference: https://crd-for-crystal.readme.io/reference"
              },
              "response": [],
              "event": [
                {
                  "listen": "prerequest",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const required = [\"crd_base_url\", \"crd_access_token\"];",
                      "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                      "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                      "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                      "if (missing.length) {",
                      "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                      "  pm.execution.skipRequest();",
                      "}"
                    ]
                  }
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "name": "oauth2",
      "item": [
        {
          "name": "Request a token",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{crd_base_url}}/api/OAuth2/token",
              "host": [
                "{{crd_base_url}}"
              ],
              "path": [
                "api",
                "OAuth2",
                "token"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"grant_type\": \"client_credentials\",\n  \"client_id\": \"{{crd_client_id}}\",\n  \"client_secret\": \"{{crd_client_secret}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "auth": {
              "type": "noauth"
            },
            "description": "Exchange client credentials for a bearer token.\n\nReference: https://crd-for-crystal.readme.io/reference"
          },
          "response": [],
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const required = [\"crd_base_url\", \"crd_client_id\", \"crd_client_secret\"];",
                  "const missing = required.filter((name) => { const value = pm.variables.get(name); return value === undefined || value === null || String(value).trim() === \"\"; });",
                  "const origin = String(pm.variables.get(\"crd_base_url\") || \"\");",
                  "if (!/^https?:\\/\\/[^/?#]+$/.test(origin)) missing.push(\"crd_base_url (protocol and host/port only; no /api or trailing slash)\");",
                  "if (missing.length) {",
                  "  console.error(\"Request skipped. Configure: \" + [...new Set(missing)].join(\", \"));",
                  "  pm.execution.skipRequest();",
                  "}"
                ]
              }
            }
          ]
        }
      ]
    }
  ]
}
