Skip to main content

Signing Flow Options

Configure how documents are presented to signers with email delivery, embedded signing, and routing options.

Delivery Methods

MethodUse CaseUser Experience
EmailExternal parties, asyncSigner receives email, clicks link
EmbeddedIn-app signingSigner signs within your application
HybridMix of internal/externalSome embedded, some via email

Email Signing

Flow Diagram

Basic Email Signing

curl -X POST "https://api.propper.ai/restapi/v2.1/accounts/{accountId}/envelopes" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"emailSubject": "Please sign: Service Agreement",
"emailBlurb": "Please review and sign this document at your earliest convenience.",
"status": "sent",
"documents": [{
"documentId": "1",
"name": "Agreement.pdf",
"documentBase64": "JVBERi0xLjQK..."
}],
"recipients": {
"signers": [{
"email": "client@example.com",
"name": "John Smith",
"recipientId": "1",
"routingOrder": "1"
}]
}
}'

Customizing Email Content

{
"emailSubject": "Action Required: {{documentName}} needs your signature",
"emailBlurb": "Dear {{recipientName}},\n\nPlease review and sign the attached document.\n\nThis link will expire in 7 days.\n\nBest regards,\nThe Acme Team",
"brandId": "brand_abc123"
}

Email Notifications

Configure notification preferences per recipient:

{
"recipients": {
"signers": [{
"email": "signer@example.com",
"name": "John Smith",
"recipientId": "1",
"emailNotification": {
"emailSubject": "Custom subject for this recipient",
"emailBody": "Custom body text",
"supportedLanguage": "en"
}
}]
}
}

Embedded Signing

For embedded signing, see the dedicated Embedded Signing Guide.

Quick summary:

Key requirement: Set clientUserId on recipients to enable embedded signing.

Signing Order

Sequential Signing

Signers must sign in order. Signer 2 won't receive notification until Signer 1 completes.

{
"recipients": {
"signers": [
{
"email": "ceo@company.com",
"name": "CEO",
"recipientId": "1",
"routingOrder": "1"
},
{
"email": "cfo@company.com",
"name": "CFO",
"recipientId": "2",
"routingOrder": "2"
},
{
"email": "legal@company.com",
"name": "Legal",
"recipientId": "3",
"routingOrder": "3"
}
]
}
}

Parallel Signing

Multiple signers can sign simultaneously by using the same routingOrder.

{
"recipients": {
"signers": [
{
"email": "party-a@example.com",
"name": "Party A",
"recipientId": "1",
"routingOrder": "1"
},
{
"email": "party-b@example.com",
"name": "Party B",
"recipientId": "2",
"routingOrder": "1"
},
{
"email": "notary@example.com",
"name": "Notary",
"recipientId": "3",
"routingOrder": "2"
}
]
}
}

Mixed Routing

Combine sequential and parallel:

{
"recipients": {
"signers": [
{ "email": "employee@company.com", "routingOrder": "1" },
{ "email": "manager@company.com", "routingOrder": "2" },
{ "email": "hr@company.com", "routingOrder": "2" },
{ "email": "legal@company.com", "routingOrder": "3" }
]
}
}

Flow: Employee → (Manager AND HR in parallel) → Legal

Recipient Types

TypeDescriptionCan SignReceives Copy
signersMust sign the documentYesYes
carbonCopiesReceives copy when completeNoYes
certifiedDeliveriesMust confirm receiptNoYes
viewersCan view but not signNoOptional

Adding CC Recipients

{
"recipients": {
"signers": [{
"email": "signer@example.com",
"name": "Main Signer",
"recipientId": "1",
"routingOrder": "1"
}],
"carbonCopies": [{
"email": "legal@company.com",
"name": "Legal Department",
"recipientId": "2",
"routingOrder": "2"
}]
}
}

Reminders

Automatic Reminders

Configure automatic reminders in the envelope:

{
"notification": {
"useAccountDefaults": false,
"reminders": {
"reminderEnabled": true,
"reminderDelay": "2",
"reminderFrequency": "2"
},
"expirations": {
"expireEnabled": true,
"expireAfter": "120",
"expireWarn": "3"
}
}
}
FieldDescription
reminderDelayDays before first reminder
reminderFrequencyDays between reminders
expireAfterDays until expiration
expireWarnDays before expiry to warn

Manual Reminders

curl -X POST "https://api.propper.ai/restapi/v2.1/accounts/{accountId}/envelopes/{envelopeId}/recipients/{recipientId}/reminder" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"reminderMessage": "Friendly reminder: Please sign the document at your earliest convenience."
}'

Document Expiration

Setting Expiration

{
"emailSubject": "Time-sensitive: Contract expires soon",
"status": "sent",
"notification": {
"expirations": {
"expireEnabled": true,
"expireAfter": "7",
"expireWarn": "2"
}
}
}

Handling Expired Documents

When a document expires:

  1. Webhook document.expired is triggered
  2. Signers can no longer access the document
  3. You can create a new envelope to resend
// Handle expiration webhook
if (event.type === 'document.expired') {
const { envelopeId } = event.data.document;

// Option 1: Create new envelope with same content
const newEnvelope = await resendEnvelope(envelopeId);

// Option 2: Notify your team
await notifyTeam(`Envelope ${envelopeId} has expired`);
}

Voiding Envelopes

Cancel an envelope that's been sent:

curl -X PUT "https://api.propper.ai/restapi/v2.1/accounts/{accountId}/envelopes/{envelopeId}" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"status": "voided",
"voidedReason": "Contract terms changed - sending updated version"
}'
warning

Voiding is irreversible. Recipients will be notified that the document has been voided.

Resending Envelopes

Resend signing notifications to recipients who haven't signed:

curl -X PUT "https://api.propper.ai/restapi/v2.1/accounts/{accountId}/envelopes/{envelopeId}?resend_envelope=true" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{}'

Status Transitions

StatusDescriptionCan Modify
createdDraft envelopeYes
sentSent to recipientsLimited
deliveredViewed by recipientNo
completedAll signatures collectedNo
declinedRecipient refusedNo
voidedCancelled by senderNo

Next Steps