Ceremonies
After a signing request has been accepted, the ceremony API allows your application to add participants, prepare the document, and create a SignumEra widget session.
Ceremony operations require the
ceremony.create OAuth scope.
Typical Ceremony Flow
- Create the signing request.
- Add any additional participants.
- Prepare the signing request.
- Create a widget session.
- Open the returned widget URL.
- Monitor the signing request for completion.
Add a Participant
POST
/api/v1/signing-requests/{id}/participants
Required Scope
ceremony.create
Request
{
"participant_type": "signer",
"is_internal": false,
"role": "Signer",
"name": "Jane Smith",
"email": "jane@example.com",
"signing_order": 2
}
| Field | Required | Description |
|---|---|---|
participant_type |
Yes |
signer or observer.
|
is_internal |
No |
Boolean. Defaults to false.
|
role |
Yes | Maximum 100 characters. |
name |
Yes | Maximum 255 characters. |
email |
Yes | Valid email address. |
signing_order |
No | Integer greater than or equal to 1. |
Example
curl -X POST \
"https://api.signumera.com/api/v1/signing-requests/REQUEST_ID/participants" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-d '{
"participant_type": "signer",
"is_internal": false,
"role": "Signer",
"name": "Jane Smith",
"email": "jane@example.com",
"signing_order": 2
}'
201 Response
{
"id": "REQUEST_ID",
"participant": {
"participant_id": "PARTICIPANT_ID",
"participant_type": "signer",
"is_internal": false,
"role": "Signer",
"name": "Jane Smith",
"email": "jane@example.com",
"signing_order": 2
}
}
Prepare the Ceremony
POST
/api/v1/signing-requests/{id}/prepare
Required Scope
ceremony.create
Preparation finalizes the document state required to launch the ceremony.
This endpoint does not require a JSON request body.
Example
curl -X POST \
"https://api.signumera.com/api/v1/signing-requests/REQUEST_ID/prepare" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
Success Response
{
"id": "REQUEST_ID",
"status": "prepared",
"document": {
"revision": 1,
"sha256": "DOCUMENT_SHA256"
}
}
The returned SHA-256 value identifies the prepared document content used by the ceremony.
Create a Widget Session
POST
/api/v1/signing-requests/{id}/widget-session
Required Scope
ceremony.create
After preparation, create a widget session to launch the SignumEra signing interface.
This endpoint does not require a JSON request body.
Example
curl -X POST \
"https://api.signumera.com/api/v1/signing-requests/REQUEST_ID/widget-session" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
Success Response
{
"id": "REQUEST_ID",
"widget_url": "https://...",
"expires_in_seconds": 900
}
Widget URLs are temporary. Your application should use the
value of
expires_in_seconds rather than assuming
a fixed lifetime.
Monitor the Ceremony
Use the signing-request status endpoint to monitor the ceremony:
GET
/api/v1/signing-requests/{id}
The response can include:
{
"submission_status": "accepted",
"status": "in_progress",
"document": {
"status": "prepared"
},
"evidence": {
"ready": false
},
"prepared_at": "2026-10-03T14:30:00Z",
"opened_at": "2026-10-03T14:31:00Z",
"finalized_at": null
}
Ceremony Errors
| HTTP | Code | Description |
|---|---|---|
| 404 | signing_request_not_found |
The signing request does not exist or is not available to the current application. |
| 409 | signing_request_not_ready |
The signing request has not reached the state required for the operation. |
| 403 | participant_forbidden |
The client cannot modify this signing request. |
| 409 | participant_conflict |
The participant conflicts with the ceremony state or signing sequence. |
| 422 | invalid_participant_request |
The participant request is invalid. |
| 403 | prepare_forbidden |
The client cannot prepare this signing request. |
| 409 | prepare_conflict |
The signing request cannot be prepared in its current state. |
| 422 | invalid_prepare_request |
The preparation request is invalid. |
| 403 | widget_session_forbidden |
The client is not authorized to launch this signing request. |
| 409 | widget_session_conflict |
A widget session cannot be created in the current signing state. |
| 422 | invalid_widget_session_request |
The widget launch request is invalid. |
| 503 | upstream_unavailable |
The SignumEra signing service is temporarily unavailable. |