{
  "info": {
    "name": "Gantlog API pública v1",
    "description": "API pública de Gantlog (HU-93). Autenticación: `Authorization: Bearer glk_…` (una clave de API de la empresa, con alcances). Errores Problem Details, paginación, `ETag`/`If-Match` e `Idempotency-Key` según las convenciones de la API. Límites por plan con `RateLimit-Limit`, `RateLimit-Remaining` y `RateLimit-Reset` en cada respuesta y `429 rate-limited` con `Retry-After`.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{apiKey}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://app.gantlog.com"
    },
    {
      "key": "apiKey",
      "value": "glk_…"
    }
  ],
  "item": [
    {
      "name": "calendar",
      "item": [
        {
          "name": "calendarOfUser",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/users/:userId/calendar",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "users",
                ":userId",
                "calendar"
              ],
              "variable": [
                {
                  "key": "userId",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `users:read`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "workScheduleOverview",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/users/:userId/work-schedules",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "users",
                ":userId",
                "work-schedules"
              ],
              "variable": [
                {
                  "key": "userId",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `users:read`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "calendarList",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/calendars",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "calendars"
              ],
              "variable": [],
              "query": []
            },
            "description": "Alcance: `users:read`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "calendarHolidays",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/calendars/:id/holidays",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "calendars",
                ":id",
                "holidays"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": ""
                }
              ],
              "query": [
                {
                  "key": "year",
                  "value": "",
                  "disabled": false,
                  "description": ""
                }
              ]
            },
            "description": "Alcance: `users:read`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "absenceList",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/absences",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "absences"
              ],
              "variable": [],
              "query": [
                {
                  "key": "userId",
                  "value": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "from",
                  "value": "",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "to",
                  "value": "",
                  "disabled": false,
                  "description": ""
                }
              ]
            },
            "description": "Alcance: `users:read`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "absenceTypes",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/absence-types",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "absence-types"
              ],
              "variable": [],
              "query": []
            },
            "description": "Alcance: `users:read`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "calendarGet",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/calendars/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "calendars",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `users:read`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "absenceGet",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/absences/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "absences",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `users:read`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "workScheduleCapacity",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/users/:userId/capacity",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "users",
                ":userId",
                "capacity"
              ],
              "variable": [
                {
                  "key": "userId",
                  "value": "",
                  "description": ""
                }
              ],
              "query": [
                {
                  "key": "from",
                  "value": "",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "to",
                  "value": "",
                  "disabled": false,
                  "description": ""
                }
              ]
            },
            "description": "Alcance: `users:read`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        }
      ]
    },
    {
      "name": "control",
      "item": [
        {
          "name": "alertList",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/alerts",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "alerts"
              ],
              "variable": [],
              "query": [
                {
                  "key": "projectId",
                  "value": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "status",
                  "value": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "size",
                  "value": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "cursor",
                  "value": "",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "Alcance: `projects:read`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "alertSummary",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/alerts/summary",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "alerts",
                "summary"
              ],
              "variable": [],
              "query": []
            },
            "description": "Alcance: `projects:read`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        }
      ]
    },
    {
      "name": "execution",
      "item": [
        {
          "name": "workLogCreate",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/work-logs",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "work-logs"
              ],
              "variable": [],
              "query": []
            },
            "description": "Alcance: `time:write`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"hours\": 0,\n  \"taskId\": \"00000000-0000-0000-0000-000000000000\",\n  \"workDate\": \"2027-01-04\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 201 o un Problem Details', function () {",
                  "  if (pm.response.code === 201) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "progressList",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/tasks/:taskId/progress-updates",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "tasks",
                ":taskId",
                "progress-updates"
              ],
              "variable": [
                {
                  "key": "taskId",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `projects:read`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "progressCreate",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "If-Match",
                "value": "",
                "description": "ETag de la última lectura"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/tasks/:taskId/progress-updates",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "tasks",
                ":taskId",
                "progress-updates"
              ],
              "variable": [
                {
                  "key": "taskId",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `time:write`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"progressPct\": 0\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "workLogUpdate",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/merge-patch+json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/work-logs/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "work-logs",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `time:write`.",
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "workLogDelete",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/work-logs/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "work-logs",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `time:write`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 204 o un Problem Details', function () {",
                  "  if (pm.response.code === 204) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "workLogList",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/tasks/:taskId/work-logs",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "tasks",
                ":taskId",
                "work-logs"
              ],
              "variable": [
                {
                  "key": "taskId",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `projects:read`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        }
      ]
    },
    {
      "name": "identity",
      "item": [
        {
          "name": "userList",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/users",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "users"
              ],
              "variable": [],
              "query": []
            },
            "description": "Alcance: `users:read`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        }
      ]
    },
    {
      "name": "integration",
      "item": [
        {
          "name": "webhookList",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/webhooks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks"
              ],
              "variable": [],
              "query": []
            },
            "description": "Alcance: `webhooks:manage`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "webhookCreate",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/webhooks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks"
              ],
              "variable": [],
              "query": []
            },
            "description": "Alcance: `webhooks:manage`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"events\": [],\n  \"url\": \"\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 201 o un Problem Details', function () {",
                  "  if (pm.response.code === 201) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "webhookResend",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/webhooks/:id/deliveries/:deliveryId/actions/resend",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks",
                ":id",
                "deliveries",
                ":deliveryId",
                "actions",
                "resend"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": ""
                },
                {
                  "key": "deliveryId",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `webhooks:manage`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 202 o un Problem Details', function () {",
                  "  if (pm.response.code === 202) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "webhookTest",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/webhooks/:id/actions/test",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks",
                ":id",
                "actions",
                "test"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `webhooks:manage`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 202 o un Problem Details', function () {",
                  "  if (pm.response.code === 202) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "webhookRotateSecret",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/webhooks/:id/actions/rotate-secret",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks",
                ":id",
                "actions",
                "rotate-secret"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `webhooks:manage`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "webhookTriggerWorkLogCreated",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/webhooks/triggers/work-log-created",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks",
                "triggers",
                "work-log-created"
              ],
              "variable": [],
              "query": []
            },
            "description": "Alcance: `webhooks:manage`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 201 o un Problem Details', function () {",
                  "  if (pm.response.code === 201) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "webhookTriggerTimeApproved",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/webhooks/triggers/time-approved",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks",
                "triggers",
                "time-approved"
              ],
              "variable": [],
              "query": []
            },
            "description": "Alcance: `webhooks:manage`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 201 o un Problem Details', function () {",
                  "  if (pm.response.code === 201) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "webhookTriggerTaskStatusChanged",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/webhooks/triggers/task-status-changed",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks",
                "triggers",
                "task-status-changed"
              ],
              "variable": [],
              "query": []
            },
            "description": "Alcance: `webhooks:manage`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 201 o un Problem Details', function () {",
                  "  if (pm.response.code === 201) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "webhookTriggerTaskCreated",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/webhooks/triggers/task-created",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks",
                "triggers",
                "task-created"
              ],
              "variable": [],
              "query": []
            },
            "description": "Alcance: `webhooks:manage`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 201 o un Problem Details', function () {",
                  "  if (pm.response.code === 201) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "webhookTriggerAlertRaised",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/webhooks/triggers/alert-raised",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks",
                "triggers",
                "alert-raised"
              ],
              "variable": [],
              "query": []
            },
            "description": "Alcance: `webhooks:manage`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 201 o un Problem Details', function () {",
                  "  if (pm.response.code === 201) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "webhookGet",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/webhooks/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `webhooks:manage`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "webhookUpdate",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/merge-patch+json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/webhooks/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `webhooks:manage`.",
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "webhookDelete",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/webhooks/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `webhooks:manage`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 204 o un Problem Details', function () {",
                  "  if (pm.response.code === 204) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "webhookDeliveries",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/webhooks/:id/deliveries",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks",
                ":id",
                "deliveries"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": ""
                }
              ],
              "query": [
                {
                  "key": "before",
                  "value": "",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "Alcance: `webhooks:manage`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "webhookEventTypes",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/webhooks/event-types",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "webhooks",
                "event-types"
              ],
              "variable": [],
              "query": []
            },
            "description": "Alcance: `webhooks:manage`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "devActivityOfTask",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/tasks/:id/dev-activity",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "tasks",
                ":id",
                "dev-activity"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": ""
                }
              ],
              "query": [
                {
                  "key": "kind",
                  "value": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "page",
                  "value": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "size",
                  "value": "",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "Alcance: `projects:read`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        }
      ]
    },
    {
      "name": "planning",
      "item": [
        {
          "name": "dependencyReplace",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/tasks/:taskId/predecessors",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "tasks",
                ":taskId",
                "predecessors"
              ],
              "variable": [
                {
                  "key": "taskId",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `projects:write`.",
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "assignmentList",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/tasks/:taskId/assignments",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "tasks",
                ":taskId",
                "assignments"
              ],
              "variable": [
                {
                  "key": "taskId",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `projects:read`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "assignmentReplace",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/tasks/:taskId/assignments",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "tasks",
                ":taskId",
                "assignments"
              ],
              "variable": [
                {
                  "key": "taskId",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `assignments:write`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"assignments\": []\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "projectList",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/projects",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "projects"
              ],
              "variable": [],
              "query": []
            },
            "description": "Alcance: `projects:read`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "projectCreate",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/projects",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "projects"
              ],
              "variable": [],
              "query": []
            },
            "description": "Alcance: `projects:write`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"code\": \"\",\n  \"kind\": \"\",\n  \"name\": \"\",\n  \"pmId\": \"00000000-0000-0000-0000-000000000000\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 201 o un Problem Details', function () {",
                  "  if (pm.response.code === 201) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "taskPlan",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/projects/:projectId/tasks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "projects",
                ":projectId",
                "tasks"
              ],
              "variable": [
                {
                  "key": "projectId",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `projects:read`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "taskCreate",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/projects/:projectId/tasks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "projects",
                ":projectId",
                "tasks"
              ],
              "variable": [
                {
                  "key": "projectId",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `projects:write`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"kind\": \"\",\n  \"name\": \"\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 201 o un Problem Details', function () {",
                  "  if (pm.response.code === 201) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "taskUpdate",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/merge-patch+json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/tasks/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "tasks",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `projects:write`.",
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "taskDelete",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/tasks/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "tasks",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": ""
                }
              ],
              "query": [
                {
                  "key": "confirmed",
                  "value": "",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "Alcance: `projects:write`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 204 o un Problem Details', function () {",
                  "  if (pm.response.code === 204) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "projectGet",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/projects/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "projects",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `projects:read`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "projectUpdate",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/merge-patch+json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/projects/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "projects",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `projects:write`.",
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "taskPlanWithSummary",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/projects/:projectId/plan",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "projects",
                ":projectId",
                "plan"
              ],
              "variable": [
                {
                  "key": "projectId",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `projects:read`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "taskOffPlan",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/projects/:projectId/off-plan-tasks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "projects",
                ":projectId",
                "off-plan-tasks"
              ],
              "variable": [
                {
                  "key": "projectId",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `projects:read`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        }
      ]
    },
    {
      "name": "progress",
      "item": [
        {
          "name": "progressCurveGet",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/projects/:projectId/progress-curve",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "projects",
                ":projectId",
                "progress-curve"
              ],
              "variable": [
                {
                  "key": "projectId",
                  "value": "",
                  "description": ""
                }
              ],
              "query": []
            },
            "description": "Alcance: `projects:read`."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('responde 200 o un Problem Details', function () {",
                  "  if (pm.response.code === 200) { return; }",
                  "  pm.expect(pm.response.code).to.be.within(400, 599);",
                  "  pm.expect(pm.response.json()).to.have.property('code');",
                  "});",
                  "pm.test('trae las cabeceras RateLimit', function () {",
                  "  pm.expect(pm.response.headers.has('RateLimit-Limit')).to.be.true;",
                  "});"
                ]
              }
            }
          ]
        }
      ]
    }
  ]
}
