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 agreement.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 === 'agreement.expired') {
// agreementId is the same ID as envelopeId in the envelopes API
const envelopeId = event.data.agreementId;

// 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​