Skip to main content

FacilityCredentialingWorkflow

APIs for managing facility credentialing workflows

📄️List facility credentialing workflows with filters

Returns a paginated, tenant-scoped list of facility credentialing workflows matching the supplied filter and sort criteria. **When to use:** Use this endpoint to browse or search workflows in bulk. For a single known workflow, use `GET /facility-credentialing-workflows/{workflowId}` instead. **Pagination:** Two mutually exclusive modes are supported. Offset-based: supply `page` (0-based, default 0) and `size` (default 50). Cursor-based: supply `startAfterId` (forward) or `endAtId` (backward) using an `id` value from a previous response page — do not mix cursor and offset params in the same request. **Sorting:** If `order` is omitted, a tenant-level default sort is applied automatically. **Returns:** A paginated envelope containing the matching workflow records, a total count, and cursor fields for the next/previous page. Query params are forwarded to the DAL with the same tenant-id force/override pattern as practitioner workflow list. This endpoint does not accept skipEnrichment.

📄️Create a single facility credentialing workflow

Creates a new facility credentialing workflow for one facility and immediately hydrates it with facility data from upstream systems. **When to use:** Use this to onboard an individual facility into the credentialing process. For multiple facilities at once, use `POST /facility-credentialing-workflows/v2/bulk-create` (preferred) or `POST /facility-credentialing-workflows/bulk-create`. **Preconditions:** The facility identified by `certifyFacilityId` in the request body must already exist in the system. Only one active workflow per facility is allowed — if an active workflow exists, a `409 Conflict` is returned. **Returns:** `201 Created` with the full, hydrated `GetFacilityCredentialingWorkflowResponse` in the body, including facility data populated from upstream. On business-rule violations (e.g., invalid facility state), a `422 Unprocessable Entity` is returned.

📄️Bulk-assign or unassign facility credentialing workflows

Assigns one or more facility credentialing workflows to a set of users in a single call, distributing workflows evenly across the supplied user IDs using round-robin. **When to use:** Use to reassign a batch of workflows or to clear all assignees at once. To assign a single workflow, use `POST /facility-credentialing-workflows/{id}/assignments`. **Key behaviors:** * Existing assignees are replaced by the new assignment — this is not additive. * To unassign all workflows in the batch, pass an empty array for `assignedTo`. * Each workflow is processed independently; the response contains separate `successful` and `failed` arrays — inspect both. * * **Returns:** `200 OK` with bulk-result arrays listing which workflow IDs succeeded and which failed.

📄️Asynchronously create workflows for multiple facilities (v1)

Accepts a list of facility identifiers and begins creating a credentialing workflow for each in the background. Processing starts immediately; the endpoint returns `202 Accepted` without waiting for completion. **When to use:** Prefer `POST /facility-credentialing-workflows/v2/bulk-create` for new integrations — v2 provides reliable processing via a queue and a trackable bulk-request record. Use v1 only for legacy compatibility. **Preconditions:** Each facility must already exist in the system. Facilities that do not exist will fail silently during background processing. **Side effects:** Each workflow is created independently with automatic facility data hydration. Failures are logged server-side but are not surfaced to the caller — there is no completion notification, callback, or polling mechanism. **Returns:** `202 Accepted` immediately. Individual results are not returned.

📄️Internal Cloud Tasks callback — create one facility workflow

Internal endpoint called by the v2 bulk-create Cloud Tasks queue to create a single facility credentialing workflow and record the result against the parent bulk-request item. **When to use:** This endpoint is invoked automatically by the platform's task queue as part of `POST /v2/bulk-create` processing. It is not intended for direct API consumer use. **Authentication:** **Required body fields:** `certifyFacilityId` (string), `tenantFacilityId` (string), `credentialingWorkflowBulkRequestId` (string), `credentialingWorkflowBulkRequestItemId` (string). Optional: `data` (object) — workflow creation payload. **Returns:** `201 Created` with the created workflow on success. Returns `401` for a missing or invalid API key.

📄️Replay missed webhooks for facility workflows

Triggers a background re-delivery of webhooks that were not received or processed for the specified facility credentialing workflows. **When to use:** Use when a downstream system missed webhook events for one or more facility workflows — for example, after a consumer outage. Supply the target `workflowIds` in the request body; the replay runs asynchronously. **Side effects:** Webhook events are re-emitted in the background. There is no completion notification — the caller cannot determine when replay has finished. **Returns:** `202 Accepted` once the replay job is enqueued. Returns `400` if the request body is malformed.

📄️Change status of multiple facility workflows via timeline events

Creates a timeline event for each supplied facility credentialing workflow in a single synchronous call, advancing each workflow's `credentialingStatus` to the requested state. **When to use:** Use to transition multiple workflows at once — for example, moving a cohort of facilities to a new credentialing stage. For a single workflow, use `POST /facility-credentialing-workflows/{workflowId}/timeline-events`. To discover which status values are permitted for a given workflow, call `GET /{workflowId}/timeline-events/status-options` first. **Preconditions:** Each workflow must belong to the caller's tenant. Permitted status transitions depend on the workflow's current state and the caller's permissions. **Each workflow is processed independently:** the response contains `successful` and `failed` arrays — inspect both even on `200 OK`. **Returns:** `200 OK` with bulk-result arrays.

📄️Queue bulk facility workflow creation with progress tracking (v2)

Accepts a bulk workflow creation request, creates a trackable bulk-request record, and enqueues one creation task per facility for reliable background processing. Returns immediately with `202 Accepted`. **When to use:** Prefer this over `POST /bulk-create` (v1) for new integrations. v2 records a bulk-request entry that can be used to track per-facility progress. For a single facility, use `POST /facility-credentialing-workflows`. **Preconditions:** Each facility must already exist in the system. **Side effects:** Individual creation tasks are dispatched to a background queue. Each task calls the `POST /cloud-create` internal callback. Processing is asynchronous — the caller receives `202 Accepted` before any workflow is created. **Returns:** `202 Accepted`.

📄️Assign a facility credentialing workflow to a user

Creates an assignment record for the specified facility credentialing workflow, associating it with the given user and appending an entry to the assignment history. **When to use:** Use to assign (or reassign) a single workflow to one user. To assign multiple workflows at once, use `POST /facility-credentialing-workflows/assignments`. **Preconditions:** The caller must hold the `FACILITY_CREDENTIALING_WORKFLOW_ASSIGN` or `ASSIGN_SELF` permission. The target user must have the required permissions to be assigned; if not, `422 Unprocessable Entity` is returned — select a different assignee or ensure the target user's permissions are elevated. **Side effects:** An assignment history entry (`FacilityAssignmentHistoryResponse`) is created. **Returns:** `201 Created` with the new `FacilityAssignmentHistoryResponse` in the body.

📄️Retrieve the latest PSV PDF path for a facility workflow

Returns the path to the most recently generated PSV PDF document for the specified facility credentialing workflow, or indicates that generation is still in progress. **When to use:** Call after `POST /facility-credentialing-workflows/{id}/generate-psv` to retrieve the completed document. 'Latest' is determined by the most recent PSV-related timeline event. **Returns:** * `200 OK` — body contains `{ workflowId, psvPdfPath }`. * `202 Accepted` — body contains `{ workflowId, status: 'GENERATING' }`, meaning PDF generation is still in progress. Poll this endpoint again until `200 OK` is returned.

📄️Replace a facility credentialing workflow (Deprecated)

**Deprecated.** This operation is deprecated and should not be used in new integrations. Use the targeted section-update endpoints (e.g., `PUT /{workflowId}/facility-overview`, `PUT /{workflowId}/specialties`, etc.) to update specific parts of a workflow. Performs a full-document replacement of the specified facility credentialing workflow. All fields not included in the request body will be cleared. **Returns:** `200 OK` with the replaced workflow document.

📄️Fetch a single facility credentialing workflow

Returns the full, hydrated details of a single facility credentialing workflow by its ID. **When to use:** Use when you already know the workflow ID. To search or filter across many workflows, use `GET /facility-credentialing-workflows`. **Preconditions:** The workflow must belong to the caller's tenant — cross-tenant access is blocked by an ownership guard. **Returns:** `200 OK` with a fully populated `GetFacilityCredentialingWorkflowResponse`, including hydrated facility data and the current credentialing status.

📄️Replace all accreditations on a facility workflow

Replaces the entire accreditations list for the specified facility credentialing workflow with the array provided in the request body. **When to use:** Use when you want to set the canonical accreditation state for a workflow. Supply the complete desired list — omitting an existing item removes it. To clear all accreditations, send an empty array `[]`. **Preconditions:** The workflow must belong to the caller's tenant. **Returns:** `200 OK` with the updated workflow section. Returns `404` if the workflow is not found, `400` if the request body is invalid.

📄️Replace all addresses on a facility workflow

Replaces the entire addresses array for the specified facility credentialing workflow with the list provided in the request body. **When to use:** Supply the complete desired list of addresses — omitting an existing address removes it. To clear all addresses, send an empty array `[]`. **Preconditions:** The workflow must belong to the caller's tenant. **Returns:** `200 OK` with the updated workflow section. Returns `404` if the workflow is not found, `400` if the request body is invalid.

📄️Replace all app verifications on a facility workflow

Replaces the entire app verifications list for the specified facility credentialing workflow with the array provided in the request body. **When to use:** Supply the complete desired list — omitting an existing item removes it. To clear all app verifications, send an empty array `[]`. **Preconditions:** The workflow must belong to the caller's tenant. **Returns:** `200 OK` with the updated workflow section. Returns `404` if the workflow is not found, `400` if the request body is invalid.

📄️Upload an attachment to a facility workflow record

Uploads a file attachment and associates it with a specific section row of the facility credentialing workflow. **When to use:** Use to attach supporting files (e.g., scanned certificates, signed forms) to a specific record within the workflow. The `id` form field identifies the target section row using the format `{section}-{index}` (e.g., `licenses-0`). To attach a file at the workflow level rather than a row level, use `POST /facility-credentialing-workflows/{workflowId}/supporting-documents`. **Request:** Multipart form data with fields: `id` (section-index string, required), `file` (binary, required), `expirationDate` (optional). **Side effects:** File is stored in Cloud Storage. The attachment record is created in the workflow. **Returns:** `201 Created` with the attachment record. Returns `400` for a malformed request, `404` if the workflow is not found.

📄️Replace all certificates on a facility workflow

Replaces the entire certificates list for the specified facility credentialing workflow with the array provided in the request body. **When to use:** Supply the complete desired list — omitting an existing item removes it. To clear all certificates, send an empty array `[]`. **Preconditions:** The workflow must belong to the caller's tenant. **Returns:** `200 OK` with the updated workflow section. Returns `404` if the workflow is not found, `400` if the request body is invalid.

📄️Update the credentialing cycle on a facility workflow

Sets the credentialing cycle for the specified facility credentialing workflow. Valid values are `INITIAL` (the facility's first credentialing) and `RECREDENTIALING` (a subsequent periodic review). **When to use:** Set to `INITIAL` when the facility is being credentialed for the first time; change to `RECREDENTIALING` when the workflow represents a renewal cycle. **Side effects:** **Idempotency:** Setting the same cycle value again is a no-op. **Returns:** `200 OK`.

📄️Replace all emails on a facility workflow

Replaces the entire email list for the specified facility credentialing workflow with the array provided in the request body (replace-all / desired-state semantics). **When to use:** Supply the complete desired final list of emails. Omitting an existing email removes it. To clear all emails, send an empty array `[]`. **Preconditions:** The workflow must belong to the caller's tenant. **Returns:** `200 OK` with the updated workflow. Returns `404` if the workflow is not found.

📄️Update the file type classification of a facility workflow

Sets the file type classification for the specified facility credentialing workflow. Valid values are `CLEAN`, `NON_CLEAN`, and `PENDING`. **When to use:** Update this field when a compliance review determines the facility's file status. `CLEAN` indicates no outstanding issues; `NON_CLEAN` indicates unresolved issues requiring follow-up; `PENDING` indicates review is not yet complete. **Returns:** `200 OK` with a change-summary object.

📄️Update facility overview fields on a workflow

Updates selected overview fields on the facility credentialing workflow. Supported fields: `dba`, `name`, `primaryEmail`, `npi`, `tin`, `externalId`, `facilityType`, `attestationDate`. **When to use:** Use to correct or refresh basic facility metadata stored on the workflow. Fields omitted from the request body are left unchanged (null fields are ignored). **Note on semantics:** Although this is a `PUT`, the endpoint behaves like a partial update — only fields explicitly provided are modified. This is non-standard for `PUT`; treat the supplied fields as the desired state for those specific fields only. **Returns:** `200 OK` with the updated workflow.

📄️Replace all liability insurance records on a facility workflow

Replaces the entire liability insurance list for the specified facility credentialing workflow with the array provided in the request body. **When to use:** Supply the complete desired list — omitting an existing item removes it. To clear all liability insurance records, send an empty array `[]`. **Preconditions:** The workflow must belong to the caller's tenant. **Returns:** `200 OK` with the updated workflow section. Returns `404` if the workflow is not found, `400` if the request body is invalid.

📄️Replace all state licenses on a facility workflow

Replaces the entire state licenses list for the specified facility credentialing workflow with the array provided in the request body. **When to use:** Supply the complete desired list — omitting an existing item removes it. To clear all state licenses, send an empty array `[]`. **Preconditions:** The workflow must belong to the caller's tenant. **Returns:** `200 OK` with the updated workflow section. Returns `404` if the workflow is not found, `400` if the request body is invalid.

📄️Replace all Medicare star ratings on a facility workflow

Replaces the entire Medicare star ratings list for the specified facility credentialing workflow with the array provided in the request body. **When to use:** Supply the complete desired list — omitting an existing item removes it. To clear all Medicare star ratings, send an empty array `[]`. **Preconditions:** The workflow must belong to the caller's tenant. **Returns:** `200 OK` with the updated workflow section. Returns `404` if the workflow is not found, `400` if the request body is invalid.

📄️Replace all NPDB reports on a facility workflow

Replaces the entire NPDB (National Practitioner Data Bank) reports list for the specified facility credentialing workflow with the array provided in the request body. **When to use:** Supply the complete desired list — omitting an existing item removes it. To clear all NPDB reports, send an empty array `[]`. **Preconditions:** The workflow must belong to the caller's tenant. **Returns:** `200 OK` with the updated workflow section. Returns `404` if the workflow is not found, `400` if the request body is invalid.

📄️Create a PSV-completed override event on a facility workflow

Creates an override timeline event of type `PSV_COMPLETED` for the specified facility credentialing workflow, allowing a workflow to advance past a PSV step that has a blocker reason on file. **When to use:** Use only when the caller holds the `FACILITY_CREDENTIALING_WORKFLOW_MOVE_PSV_COMPLETE_WITH_BLOCKER_REASON` permission and the workflow has an outstanding blocker that must be manually overridden. For standard status transitions, use `POST /facility-credentialing-workflows/{workflowId}/timeline-ev ents`. **Constraints:** The event type must be `PSV_COMPLETED`. The request must include `isOverride: true` and a non-blank `overrideReason`. **Preconditions:** The workflow must be the latest version for this facility — if not, `409 Conflict` is returned, meaning another workflow has since been created for the same facility. To resolve, fetch the latest workflow ID and retry. **Returns:** `201 Created` with the created override timeline event.

📄️Replace all performance indicators on a facility workflow

Replaces the entire performance indicators list for the specified facility credentialing workflow with the array provided in the request body. **When to use:** Supply the complete desired list — omitting an existing item removes it. To clear all performance indicators, send an empty array `[]`. **Preconditions:** The workflow must belong to the caller's tenant. **Returns:** `200 OK` with the updated workflow section. Returns `404` if the workflow is not found, `400` if the request body is invalid.

📄️Replace all phone numbers on a facility workflow

Replaces the entire phone numbers list for the specified facility credentialing workflow with the array provided in the request body (replace-all / desired-state semantics). **When to use:** Supply the complete desired final list. Omitting an existing phone number removes it. To clear all phone numbers, send an empty array `[]`. **Preconditions:** The workflow must belong to the caller's tenant. **Returns:** `200 OK` with the updated workflow. Returns `404` if the workflow is not found.

📄️Mark a workflow section record as verified

Marks a specific record within a facility credentialing workflow section as verified, stamping it with the current user's identity (`verifiedBy`) and the current timestamp (`verifiedDate`). **When to use:** Call after a reviewer has confirmed the accuracy of a record in a specific section. Call `GET /{workflowId}` first to locate the record and confirm it is not already verified. `recordId` format: `{section}-{index}`, e.g., `specialties-0`, `licenses-1`. Valid section names match the section PUT endpoints (accreditations, app-verifications, certificates, liability-insurance, licenses, medicare-star-ratings, npdb-reports, performance-indicators, sanctions, site-visits, specialties). **Concurrency warning:** This operation uses a read-modify-write pattern on the entire workflow document. Concurrent writes to other parts of the document may result in lost updates. **Returns:** `200 OK` with the verification result.

📄️Replace all sanctions on a facility workflow

Replaces the entire sanctions list for the specified facility credentialing workflow with the array provided in the request body. **When to use:** Supply the complete desired list — omitting an existing item removes it. To clear all sanctions, send an empty array `[]`. **Preconditions:** The workflow must belong to the caller's tenant. **Returns:** `200 OK` with the updated workflow section. Returns `404` if the workflow is not found, `400` if the request body is invalid.

📄️Replace all site visits on a facility workflow

Replaces the entire site visits list for the specified facility credentialing workflow with the array provided in the request body. **When to use:** Supply the complete desired list — omitting an existing item removes it. To clear all site visits, send an empty array `[]`. **Preconditions:** The workflow must belong to the caller's tenant. **Returns:** `200 OK` with the updated workflow section. Returns `404` if the workflow is not found, `400` if the request body is invalid.

📄️Replace all specialties on a facility workflow

Replaces the entire specialties list for the specified facility credentialing workflow with the array provided in the request body. **When to use:** Supply the complete desired list — omitting an existing item removes it. To clear all specialties, send an empty array `[]`. **Preconditions:** The workflow must belong to the caller's tenant. **Returns:** `200 OK` with the updated workflow section. Returns `404` if the workflow is not found, `400` if the request body is invalid.

📄️Replace all supporting documents on a facility workflow

Replaces the entire supporting documents array for the specified facility credentialing workflow with the provided list (replace-all / desired-state semantics). **When to use:** Supply the complete desired list of supporting documents. Documents not included in the request will be removed. To clear all supporting documents, send an empty array `[]`. To append a new document without affecting others, use `POST /facility-credentialing-workflows/{workflowId}/supporting-documents`. **Preconditions:** The workflow must belong to the caller's tenant. **Returns:** `200 OK` with the updated supporting documents. Returns `404` if the workflow is not found.

📄️Upload a supporting document to a facility workflow

Uploads a new file as a supporting document and appends it to the facility credentialing workflow's supporting documents list. **When to use:** Use to add a single supporting document without affecting existing documents. To replace the entire supporting documents list, use `PUT /facility-credentialing-workflows/{workflowId}/supporting-documents`. For attachments scoped to a specific section row rather than the whole workflow, use `POST /facility-credentialing-workflows/{workflowId}/attachments`. **Request:** Multipart form data. Fields: `file` (binary, required), `fileType` (required), `state` (optional), `expirationDate` (optional). **Side effects:** File is stored in Cloud Storage. **Returns:** `201 Created` with the created supporting document record.

📄️List timeline events for a facility workflow

Returns the list of timeline events for the specified facility credentialing workflow. Timeline events represent status transitions and other tracked changes to the workflow over its lifecycle. **When to use:** Use to retrieve the audit trail or status history of a workflow. Scoped to the workflow's tenant. **Filtering and sorting:** Both `filter` and `order` accept JSON strings. **Returns:** `200 OK` with a list of timeline event records. Filter values must be string maps only; in and nin filter forms are dropped by the api-layer parser and have no effect.

📄️Advance a facility workflow status via a timeline event

Creates a new timeline event for the specified facility credentialing workflow, driving a status transition and updating the workflow's `credentialingStatus` and relevant dates. **When to use:** Call this to move a workflow from one credentialing status to another. Before calling, use `GET /facility-credentialing-workflows/{workflowId}/timelin e-events/status-options` to discover which statuses are available for the workflow's current state and the caller's permissions. For overriding a PSV step with a blocker, use `POST /{workflowId}/override-timeline-events` instead. **Preconditions:** The workflow must exist and belong to the caller's tenant. **Side effects:** The workflow's `credentialingStatus`, status dates, and related fields are updated as a result of the transition. **Returns:** `201 Created` with the created timeline event and the updated workflow status reflected in the response body.

📄️List permitted next statuses for a facility workflow

Returns the status values the caller is permitted to transition the specified workflow to, along with the required request parameters for each transition. **When to use:** Call this before `POST /facility-credentialing-workflows/{workflowId}/timeline-events` to discover which status transitions are available given the workflow's current state and the calling user's roles. Results are filtered per the caller's permissions — statuses the caller cannot apply will not appear. **Returns:** `200 OK` with a `FacilityStatusOptionsResponse` listing available target statuses and, for each, the fields required in the timeline event request body.

📄️Update credentialing-date fields on a CRED_APPROVED timeline event

Partially updates an existing `CRED_APPROVED` timeline event and its associated workflow in a single atomic transaction. **When to use:** Use to record or correct the next credentialing date after a `CRED_APPROVED` event has been created. This endpoint only works for events of type `CRED_APPROVED` — requests for other event types will be rejected. **Updatable fields** (all optional in a given call): `nextCredentialingDate`, `nextCredentialingDateSource`, `changeReason`, `nextCredentialingDateChangeLog`. **Side effects:** Both the timeline event and the associated workflow document are updated atomically within a single transaction. **Returns:** `200 OK` with the updated timeline event and workflow fields. Returns `400` if the event type is not `CRED_APPROVED` or if business rules are violated.

📄️Replace user-defined fields on a facility workflow

Replaces the entire `userDefinedFields` object on the specified facility credentialing workflow with the object provided in the request body (replace-all / RESTful PUT semantics). **When to use:** Use to set or update custom metadata for a workflow. Omitting a key removes it. To clear all user-defined fields, send an empty object `{}`. **Constraints:** This field cannot be modified once the workflow reaches a completed or invalid status — a `400 Bad Request` is returned in that case (`WorkflowCompletedException` or `WorkflowStatusInvalidException`). **Schema:** **Returns:** `200 OK`. Returns `400` if the workflow is in a terminal status or if the input is otherwise invalid.

📄️Add one record to a section of a facility workflow

Appends one record to the named section of the specified facility credentialing workflow and leaves every other record in the section as it is. **When to use:** Use this to add a single record (for example one state license) without resending the whole section. Only the record in the request body is validated, against the same rules as one element of that section's replace-all `PUT`, so stored records that are incomplete do not block the save. Verification fields in the body are ignored. **Preconditions:** The workflow must belong to the caller's tenant. Supported sections: specialties, licenses, liability-insurance, sanctions, accreditations, certificates, npdb-reports, site-visits, medicare-star-ratings, app-verifications, performance-indicators, addresses, emails, phone-numbers. **Returns:** `200 OK` with the workflow ID, the section, the new record's `index` and a message. Returns `400` if the section is unknown or the record is invalid, `404` if the workflow is not found.

📄️Update one record in a section of a facility workflow

Merges the request body onto the record at the given position in the named section of the specified facility credentialing workflow and leaves every other record as it is. **When to use:** Use this to edit a single record (for example one state license) without resending the whole section. Fields the body leaves out keep their stored value; a field the body sends as `null` is removed from the stored record, which is how an optional field is cleared. The body is validated against the same rules as one element of that section's replace-all `PUT`, so the section's required fields must be present and cannot be `null`; stored records that are incomplete do not block the save. If the record's content changes, its verification is cleared; verification fields in the body are ignored. **Preconditions:** The workflow must belong to the caller's tenant. `index` is the record's 0-based position in the section. Supported sections: specialties, licenses, liability-insurance, sanctions, accreditations, certificates, npdb-reports, site-visits, medicare-star-ratings, app-verifications, performance-indicators, addresses, emails, phone-numbers. **Returns:** `200 OK` with the workflow ID, the section, the `index` and a message. Returns `400` if the section is unknown, the index is not a non-negative integer inside the section, or the record is invalid, `404` if the workflow is not found.

📄️Delete one record from a section of a facility workflow

Removes the record at the given position from the named section of the specified facility credentialing workflow and leaves every other record as it is; later records move up one position. **When to use:** Use this to remove a single record (for example one state license) without resending the whole section. The delete is not idempotent: repeating it removes the record that has moved into that position, or fails once the position is past the end. **Preconditions:** The workflow must belong to the caller's tenant. `index` is the record's 0-based position in the section. Supported sections: specialties, licenses, liability-insurance, sanctions, accreditations, certificates, npdb-reports, site-visits, medicare-star-ratings, app-verifications, performance-indicators, addresses, emails, phone-numbers. **Returns:** `200 OK` with the workflow ID, the section, the deleted `index` and a message. Returns `400` if the section is unknown or the index is not a non-negative integer inside the section, `404` if the workflow is not found.