Test cases
Drive test cases through lifecycle states without manual intervention. POST /test/cases/{id}/advance activates or closes a test case in a single call, triggering the real webhook pipeline so your handlers can be verified end-to-end. Hard-delete by ID or tag to keep CI environments clean between runs.
- Base URL
https://collectionpartner-api.debitura.com- Authentication
- API key in the
XApiKeyheader
Advance a test case to a known lifecycle state.
/test/cases/{id}/advanceDrives a test case to a well-known lifecycle state in a single call.
Purpose: Enables CI pipelines and integrators to exercise the full collection lifecycle — including real webhooks and events — without manual intervention.
Target States:
Active— Activates the case from PendingVerification or PendingVerificationInternal. No-op if already Active or Closed.Closed:Paid— Records a payment foramountand closes the case as Paid. Activates the case first if needed.amountis required.Closed:NoPayment— Closes the case with PreLegalExhaustedNoPayment. Activates the case first if needed.
Guards:
- Returns 400 if the case is not a test case (Classification != Test).
- Returns 400 if
amountis missing whentoisClosed:Paid. - Returns 400 if
tois not one of the valid values. - Returns 400 if the case is already closed with a different close code (e.g. already Closed:NoPayment when requesting Closed:Paid).
- Returns 404 if the case is not found or not owned by the calling partner.
No-op behaviour:
If the case is already at the requested state, the call returns 200 with advanced: false and the current state — no changes are made.
Webhooks: Transitions use the real internal service pipeline. Webhook delivery per target:
→ Active: firescase.updatedto Creditor, ReferralPartner, and Collection Partner subscriptions.→ Closed:Paid: firespayment.createdto Creditor and Collection Partner; firescase.updatedandcase.closedto Creditor, ReferralPartner, and Collection Partner subscriptions.→ Closed:NoPayment: firescase.updatedandcase.closedto Creditor, ReferralPartner, and Collection Partner subscriptions.
Note: case.closed is delivered to Collection Partner subscriptions on both close paths.
All events carry classification: test and are only delivered to webhook subscriptions registered with classification: test.
How to Test:
-
Create a test case —
POST /managed-caseswithisTest: true(optionally atagfor scoped cleanup). Note the returnedid. -
Register a test webhook subscription — subscribe to the events you want to assert on (
case.updated,payment.created,case.closed) withclassification: testand point the URL to your test receiver (e.g. a local ngrok tunnel or a CI webhook sink). -
Advance to Active —
POST /test/cases/{id}/advancewith{ "to": "Active" }. Expect{ advanced: true, state: "Active" }and acase.updatedevent on your Collection Partner subscription. -
Advance to Closed:Paid —
POST /test/cases/{id}/advancewith{ "to": "Closed:Paid", "amount": 1000.00 }. Expect{ advanced: true, state: "Closed:Paid" }and apayment.createdevent on your Collection Partner subscription.- Alternatively: advance straight from any pre-active state — the endpoint activates the case first automatically.
-
Verify final state —
GET /cases/{id}and assertlifecycle: ClosedandcloseCode: Paid. -
Test no-op — Call the same advance again. Expect
{ advanced: false, state: "Closed:Paid" }and no new webhook events. -
Test mismatch error — With the case closed as Paid, call
{ "to": "Closed:NoPayment" }. Expect 400 with a message describing the conflict. -
Test Closed:NoPayment path — Create a fresh test case, call
{ "to": "Closed:NoPayment" }directly (no amount needed). Expectcase.updatedandcase.closedon your Collection Partner subscription. -
Reset between runs — Delete the test case via
DELETE /test/cases/{id}(orDELETE /test/cases?tag={tag}to clear a whole tag) or create a new one per test run to keep assertions clean.
Path parameters
iduuidRequired
Request body
tostringnullableRequiredThe target state to advance the case to. Valid values: "Active", "Closed:Paid", "Closed:NoPayment"
amountnumbernullablePayment amount (required when To is "Closed:Paid"). Must be a positive value in the case currency.
Returns
200 Advance result (advanced=true if state changed, advanced=false if already there)
advancedbooleanTrue if the case was advanced in this call; false if it was already at or past the target state (no-op).
statestringnullableThe current state of the case after this call. One of: "Active", "Closed:Paid", "Closed:NoPayment", "Closed" (for other close codes).
Errors
400 | Validation error — non-test case, missing amount, or unknown target state |
404 | Case not found or not owned by this collection partner |
500 | Internal server error |
See Error handling.
curl -X POST https://collectionpartner-api.debitura.com/test/cases/3f2b6c1e-8a4d-4b7f-9c2e-5d1a0b9e7f31/advance \-H "XApiKey: $DEBITURA_API_KEY" \-H "Content-Type: application/json" \-d '{"to": "Active","amount": 1500}'
{"advanced": true,"state": "string"}
Hard-delete a single test case by ID.
/test/cases/{id}Permanently removes a test case and all its child entities (payments, chats, files, timeline entries, webhook delivery records) from the database.
This is a hard-delete. The row is removed entirely — there is no soft-delete or recovery path. This is intentional for CI environments that create many test cases per day.
Guards:
- Returns 400 if the case is classified as Production. Only Test cases may be deleted via this endpoint.
- Returns 404 if the case is not found or not owned by the calling partner.
Idempotent: Returns 204 even if the case is already deleted (no-op).
Path parameters
iduuidRequired
Returns
204 Case deleted (or already absent — idempotent) — no response body.
Errors
400 | Case is a Production case — deletion rejected |
404 | Case not found or not owned by this collection partner |
500 | Internal server error |
See Error handling.
curl -X DELETE https://collectionpartner-api.debitura.com/test/cases/3f2b6c1e-8a4d-4b7f-9c2e-5d1a0b9e7f31 \-H "XApiKey: $DEBITURA_API_KEY"
204 Case deleted (or already absent — idempotent). No response body.
Hard-delete all test cases with the given tag.
/test/casesPermanently removes all test cases created with the specified tag (and all their child entities) from the database.
Scoped cleanup: Each CI pipeline run should create cases with a unique tag (e.g. suite-run-{uuid}) and use this endpoint at the end of the run to clean up, without affecting cases from parallel pipeline runs.
This is a hard-delete. Rows are removed entirely with no recovery path. This is intentional for CI environments.
Guards:
- Returns 400 if any matched case is classified as Production. The entire operation is rejected and nothing is deleted.
- Returns 400 if the tag query parameter is missing or blank.
Idempotent: Returns 204 even if no cases match the tag — no error is raised.
Query parameters
tagstring
Returns
204 Cases deleted (or none matched — idempotent, no response body) — no response body.
Errors
400 | Tag is missing/blank, or matched cases include a Production case |
500 | Internal server error |
See Error handling.
curl -X DELETE https://collectionpartner-api.debitura.com/test/cases \-H "XApiKey: $DEBITURA_API_KEY"
204 Cases deleted (or none matched — idempotent, no response body). No response body.
Replay the most recent webhook event for a test case.
/test/cases/{id}/replay-last-event<b>Collection Partner API only</b> — this endpoint is a convenience stopgap that existed
before GET /webhooks/events was available. It remains here for backward compatibility
and because it is a thin wrapper over POST /webhooks/events/{eventId}/replay.
<b>Design note:</b> This endpoint was added when the Collection Partner API had no
delivery-history endpoint (`GET /webhooks/events`), making it impossible to look up
event IDs for replay. It is a stopgap: "give me the last event without having to know its ID."
Now that `GET /webhooks/events` exists, integrators can use the full
history + replay-by-id pattern instead. This endpoint is intentionally <b>not</b> ported
to the Customer API — the stopgap only exists because it was needed before history existed.
Path parameters
iduuidRequired
Returns
200 Event re-enqueued for delivery
eventIduuidThe ID of the webhook event that was re-enqueued.
subscriptionIduuidThe subscription the event was re-enqueued to.
eventTypestringnullableThe event type that was replayed (e.g. "case.updated").
Errors
400 | Validation error — non-test case or not owned by this partner |
404 | Case not found, or no webhook events recorded yet for this case |
See Error handling.
curl -X POST https://collectionpartner-api.debitura.com/test/cases/3f2b6c1e-8a4d-4b7f-9c2e-5d1a0b9e7f31/replay-last-event \-H "XApiKey: $DEBITURA_API_KEY"
{"eventId": "3f2b6c1e-8a4d-4b7f-9c2e-5d1a0b9e7f31","subscriptionId": "3f2b6c1e-8a4d-4b7f-9c2e-5d1a0b9e7f31","eventType": "string"}