{
  "opencollection": "1.0.0",
  "info": {
    "name": "Credentially Public Compliance-packages Placements API",
    "version": "2.0.0"
  },
  "items": [
    {
      "info": {
        "name": "Placements",
        "type": "folder"
      },
      "items": [
        {
          "info": {
            "name": "Assign a placement to a stage",
            "type": "http"
          },
          "http": {
            "method": "PUT",
            "url": "https://app.credentially.io/gateway/api/placements/:id/stage",
            "headers": [
              {
                "name": "X-API-Version",
                "value": ""
              }
            ],
            "params": [
              {
                "name": "id",
                "value": "",
                "type": "path"
              }
            ],
            "body": {
              "type": "json",
              "data": "{}"
            },
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Idempotent upsert of the placement's board position. Optional position; 409 on stage disabled or version conflict.\n\n**Rate Limit:** `remove-placement-stage` (25 req / 1s)"
        },
        {
          "info": {
            "name": "Remove a placement from the stages board",
            "type": "http"
          },
          "http": {
            "method": "DELETE",
            "url": "https://app.credentially.io/gateway/api/placements/:id/stage",
            "headers": [
              {
                "name": "X-API-Version",
                "value": ""
              }
            ],
            "params": [
              {
                "name": "id",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Idempotent — 204 whether or not the placement was on the board.\n\n**Rate Limit:** `remove-placement-stage` (25 req / 1s)"
        },
        {
          "info": {
            "name": "Get a placement by public id",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "https://app.credentially.io/gateway/api/placements/:id",
            "headers": [
              {
                "name": "X-API-Version",
                "value": ""
              }
            ],
            "params": [
              {
                "name": "id",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "\n\n**Rate Limit:** `delete-placement` (25 req / 1s)"
        },
        {
          "info": {
            "name": "Update a placement's mutable fields",
            "type": "http"
          },
          "http": {
            "method": "PUT",
            "url": "https://app.credentially.io/gateway/api/placements/:id",
            "headers": [
              {
                "name": "X-API-Version",
                "value": ""
              }
            ],
            "params": [
              {
                "name": "id",
                "value": "",
                "type": "path"
              }
            ],
            "body": {
              "type": "json",
              "data": "{}"
            },
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "\n\n**Rate Limit:** `delete-placement` (25 req / 1s)"
        },
        {
          "info": {
            "name": "Hard-delete a placement",
            "type": "http"
          },
          "http": {
            "method": "DELETE",
            "url": "https://app.credentially.io/gateway/api/placements/:id",
            "headers": [
              {
                "name": "X-API-Version",
                "value": ""
              }
            ],
            "params": [
              {
                "name": "id",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Allowed only when PENDING and the start date has not passed; otherwise 409 — use cancel instead.\n\n**Rate Limit:** `delete-placement` (25 req / 1s)"
        },
        {
          "info": {
            "name": "Move placement to the previous enabled stage",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "https://app.credentially.io/gateway/api/placements/:id/stage/prev",
            "headers": [
              {
                "name": "X-API-Version",
                "value": ""
              }
            ],
            "params": [
              {
                "name": "id",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "\n\n**Rate Limit:** `move-placement-stage` (25 req / 1s)"
        },
        {
          "info": {
            "name": "Move placement to the next enabled stage",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "https://app.credentially.io/gateway/api/placements/:id/stage/next",
            "headers": [
              {
                "name": "X-API-Version",
                "value": ""
              }
            ],
            "params": [
              {
                "name": "id",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "\n\n**Rate Limit:** `move-placement-stage` (25 req / 1s)"
        },
        {
          "info": {
            "name": "Cancel (soft-delete) a placement",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "https://app.credentially.io/gateway/api/placements/:id/cancel",
            "headers": [
              {
                "name": "X-API-Version",
                "value": ""
              }
            ],
            "params": [
              {
                "name": "id",
                "value": "",
                "type": "path"
              }
            ],
            "body": {
              "type": "json",
              "data": "{}"
            },
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Sets status to CANCELLED with the supplied reason. Allowed from PENDING or ACTIVE; 409 from COMPLETED.\n\n**Rate Limit:** `cancel-placement` (25 req / 1s)"
        },
        {
          "info": {
            "name": "Approve a placement",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "https://app.credentially.io/gateway/api/placements/:id/approve",
            "headers": [
              {
                "name": "X-API-Version",
                "value": ""
              }
            ],
            "params": [
              {
                "name": "id",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Records the calling user as approver + timestamp. Allowed only while PENDING and not already approved.\n\n**Rate Limit:** `approve-placement` (25 req / 1s)"
        },
        {
          "info": {
            "name": "List placements (paginated, filterable)",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "https://app.credentially.io/gateway/api/placements",
            "headers": [
              {
                "name": "X-API-Version",
                "value": ""
              }
            ],
            "params": [
              {
                "name": "employeePublicId",
                "value": "",
                "type": "query",
                "description": "Filter by employee public id (singular). Mutually exclusive with employeePublicIds."
              },
              {
                "name": "employeePublicIds",
                "value": "",
                "type": "query",
                "description": "Filter by employee public ids (plural, max 50). Mutually exclusive with employeePublicId."
              },
              {
                "name": "locationPublicIds",
                "value": "",
                "type": "query",
                "description": "Filter by location public ids (plural, max 50)"
              },
              {
                "name": "jurisdictionPublicIds",
                "value": "",
                "type": "query",
                "description": "Filter by jurisdiction public ids (plural, max 50)"
              },
              {
                "name": "rolePublicIds",
                "value": "",
                "type": "query",
                "description": "Filter by role public ids (plural, max 50)"
              },
              {
                "name": "status",
                "value": "",
                "type": "query",
                "description": "Filter by lifecycle status"
              },
              {
                "name": "complianceStatus",
                "value": "",
                "type": "query",
                "description": "Filter by compliance status"
              },
              {
                "name": "startDateFrom",
                "value": "",
                "type": "query",
                "description": "Absolute start date floor (inclusive). Mutually exclusive with startsWithinDays."
              },
              {
                "name": "startDateTo",
                "value": "",
                "type": "query",
                "description": "Absolute start date ceiling (inclusive). Mutually exclusive with startsWithinDays."
              },
              {
                "name": "startsWithinDays",
                "value": "",
                "type": "query",
                "description": "Relative start window — N days from today (inclusive). Mutually exclusive with startDateFrom/To."
              },
              {
                "name": "page",
                "value": "",
                "type": "query"
              },
              {
                "name": "size",
                "value": "",
                "type": "query"
              },
              {
                "name": "sort",
                "value": "",
                "type": "query"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Unified filter contract — see the per-parameter docs. Default sort is startDate DESC; override with ?sort=field,dir.\n\n**Rate Limit:** `list-placements` (100 req / 1s)"
        },
        {
          "info": {
            "name": "Create a placement",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "https://app.credentially.io/gateway/api/placements",
            "headers": [
              {
                "name": "X-API-Version",
                "value": ""
              }
            ],
            "body": {
              "type": "json",
              "data": "{}"
            },
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Created in PENDING status. jobPositionId is optional (auto-resolved when omitted).\n\n**Rate Limit:** `list-placements` (100 req / 1s)"
        },
        {
          "info": {
            "name": "List all placement notes for the organisation (paginated)",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "https://app.credentially.io/gateway/api/placements/notes",
            "headers": [
              {
                "name": "X-API-Version",
                "value": ""
              }
            ],
            "params": [
              {
                "name": "page",
                "value": "",
                "type": "query"
              },
              {
                "name": "size",
                "value": "",
                "type": "query"
              },
              {
                "name": "sort",
                "value": "",
                "type": "query"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "\n\n**Rate Limit:** `list-placement-notes-org` (100 req / 1s)"
        }
      ]
    }
  ],
  "bundled": true
}