Credentially Stage Placements API
Placements scoped to a Kanban stage — board column reads + bulk-move.
Placements scoped to a Kanban stage — board column reads + bulk-move.
openapi: 3.1.0
info:
title: Credentially Public Compliance-packages Stage Placements API
description: Public API Proxy with Rate Limiting and Audit
version: 2.0.0
servers:
- url: https://app.credentially.io/gateway
description: Generated server url
tags:
- name: Stage Placements
description: Placements scoped to a Kanban stage — board column reads + bulk-move.
paths:
/api/stages/{stagePublicId}/placements/bulk:
post:
tags:
- Stage Placements
summary: Bulk-add placements to this stage
description: 'Per-row execution — one failure doesn''t poison the batch. Returns moved + skipped breakdown. Capped at 200 ids.
**Rate Limit:** `bulk-add-stage-placements` (25 req / 1s)'
operationId: bulkAdd
parameters:
- name: stagePublicId
in: path
required: true
schema:
type: string
format: uuid
- name: X-API-Version
in: header
schema:
type: string
default: 2.0.0
enum:
- 2.0.0
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/BulkAddRequest'
required: true
responses:
'200':
description: Bulk move completed.
content:
'*/*':
schema:
$ref: '#/components/schemas/BulkAddResponse'
'400':
description: Body validation failure (empty/oversized list)
'404':
description: Stage not found in this organisation
'409':
description: Stage is disabled; bulk-add not permitted.
'429':
description: Too many requests - the rate limit for this endpoint has been exceeded. Use the Retry-After header to determine when to retry.
headers:
Retry-After:
description: Number of seconds to wait before retrying the request.
schema:
type: integer
format: int32
example: 1
security:
- bearer-key: []
/api/stages/{stagePublicId}/placements:
get:
tags:
- Stage Placements
summary: List placements assigned to this stage (paginated, filterable)
description: 'Board-column read with the unified filter chip set (no employee filters). Default sort is position ASC.
**Rate Limit:** `list-stage-placements` (100 req / 1s)'
operationId: list_3
parameters:
- name: stagePublicId
in: path
required: true
schema:
type: string
format: uuid
- name: locationPublicIds
in: query
description: Filter by location public ids (plural, max 50)
required: false
schema:
type: array
description: Filter by location public ids (plural, max 50)
items:
type: string
format: uuid
description: Filter by location public ids (plural, max 50)
maxItems: 50
minItems: 0
- name: jurisdictionPublicIds
in: query
description: Filter by jurisdiction public ids (plural, max 50)
required: false
schema:
type: array
description: Filter by jurisdiction public ids (plural, max 50)
items:
type: string
format: uuid
description: Filter by jurisdiction public ids (plural, max 50)
maxItems: 50
minItems: 0
- name: rolePublicIds
in: query
description: Filter by role public ids (plural, max 50)
required: false
schema:
type: array
description: Filter by role public ids (plural, max 50)
items:
type: string
format: uuid
description: Filter by role public ids (plural, max 50)
maxItems: 50
minItems: 0
- name: complianceStatus
in: query
description: Filter by compliance status
required: false
schema:
type: string
description: Filter by compliance status
enum:
- COMPLIANT
- NOT_COMPLIANT
- COMPLIANT
- NOT_COMPLIANT
- name: startDateFrom
in: query
description: Absolute start date floor (inclusive). Mutually exclusive with startsWithinDays.
required: false
schema:
type: string
format: date
description: Absolute start date floor (inclusive). Mutually exclusive with startsWithinDays.
- name: startDateTo
in: query
description: Absolute start date ceiling (inclusive). Mutually exclusive with startsWithinDays.
required: false
schema:
type: string
format: date
description: Absolute start date ceiling (inclusive). Mutually exclusive with startsWithinDays.
- name: startsWithinDays
in: query
description: Relative start window — N days from today (inclusive). Mutually exclusive with startDateFrom/To.
required: false
schema:
type: integer
format: int32
description: Relative start window — N days from today (inclusive). Mutually exclusive with startDateFrom/To.
- name: page
in: query
required: false
schema:
type: integer
format: int32
default: 0
- name: size
in: query
required: false
schema:
type: integer
format: int32
default: 50
- name: sort
in: query
required: false
schema:
type: array
items:
type: string
- name: X-API-Version
in: header
schema:
type: string
default: 2.0.0
enum:
- 2.0.0
responses:
'200':
description: Page of placements assigned to this stage.
content:
'*/*':
schema:
$ref: '#/components/schemas/PlacementPageDto'
'400':
description: Filter validation failure
'404':
description: Stage not found in this organisation
'429':
description: Too many requests - the rate limit for this endpoint has been exceeded. Use the Retry-After header to determine when to retry.
headers:
Retry-After:
description: Number of seconds to wait before retrying the request.
schema:
type: integer
format: int32
example: 1
security:
- bearer-key: []
components:
schemas:
PlacementResponseDto:
type: object
properties:
publicId:
type: string
format: uuid
employeePublicId:
type: string
format: uuid
jobPositionId:
type: integer
format: int64
rolePublicId:
type: string
format: uuid
locationPublicId:
type: string
format: uuid
jurisdictionPublicId:
type: string
format: uuid
status:
type: string
enum:
- PENDING
- ACTIVE
- COMPLETED
- CANCELLED
complianceStatus:
type: string
enum:
- COMPLIANT
- NOT_COMPLIANT
compliancePercentage:
type: integer
format: int32
complianceEvaluationSeq:
type: integer
format: int64
complianceEvaluatedAsOf:
type: string
format: date
startDate:
type: string
format: date
endDate:
type: string
format: date
approvalDueDate:
type: string
format: date
approvedBy:
type: string
format: uuid
approvedAt:
type: string
format: date-time
stagePublicId:
type: string
format: uuid
notesCount:
type: integer
format: int32
latestNotes:
type: array
items:
$ref: '#/components/schemas/PlacementNotePreviewDto'
createdAt:
type: string
format: date-time
createdBy:
type: string
format: uuid
updatedAt:
type: string
format: date-time
updatedBy:
type: string
format: uuid
BulkAddResponse:
type: object
properties:
moved:
type: integer
format: int32
skipped:
type: array
items:
$ref: '#/components/schemas/Skipped'
PlacementNotePreviewDto:
type: object
properties:
content:
type: string
createdAt:
type: string
format: date-time
Skipped:
type: object
properties:
publicId:
type: string
format: uuid
reason:
type: string
PlacementPageDto:
type: object
properties:
content:
type: array
items:
$ref: '#/components/schemas/PlacementResponseDto'
totalPages:
type: integer
format: int32
totalElements:
type: integer
format: int64
size:
type: integer
format: int32
number:
type: integer
format: int32
BulkAddRequest:
type: object
properties:
placementPublicIds:
type: array
items:
type: string
format: uuid
maxItems: 200
minItems: 0
required:
- placementPublicIds
securitySchemes:
bearer-key:
type: http
scheme: bearer
bearerFormat: JWT