Skip to main content

Create & Send Envelope (DocuSign-Compatible)

Create and send an envelope using the DocuSign-compatible REST API v2.1. Existing DocuSign integrations only need to change the base URL to migrate to Propper Sign.

Overview

This example demonstrates:

  1. Creating an envelope with documents and recipients
  2. Positioning signature fields using XY coordinates
  3. Positioning signature fields using anchor text
  4. Sending the envelope immediately or saving as draft
  5. Handling the response

Prerequisites

  • Propper API credentials (client ID and secret)
  • A PDF document to send for signing
  • Scope: sign:read sign:write

Endpoint

POST /restapi/v2.1/accounts/{accountId}/envelopes

Set status to "sent" to create AND send immediately, or "created" for a draft.

Example 1: XY-Positioned Tabs

Position signature fields using absolute x,y coordinates on the page.

curl -X POST "https://api.propper.ai/restapi/v2.1/accounts/$ACCOUNT_ID/envelopes" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"emailSubject": "Please sign: Employment Contract",
"emailBlurb": "Please review and sign the attached employment contract.",
"status": "sent",
"documents": [
{
"documentId": "1",
"name": "Employment_Contract.pdf",
"documentBase64": "<base64-encoded-pdf-content>",
"fileExtension": "pdf",
"order": "1"
}
],
"recipients": {
"signers": [
{
"email": "john.smith@example.com",
"name": "John Smith",
"recipientId": "1",
"routingOrder": "1",
"tabs": {
"signHereTabs": [
{
"tabLabel": "EmployeeSignature",
"documentId": "1",
"pageNumber": "3",
"xPosition": "100",
"yPosition": "500",
"scaleValue": "1.0"
}
],
"dateSignedTabs": [
{
"tabLabel": "EmployeeSignDate",
"documentId": "1",
"pageNumber": "3",
"xPosition": "350",
"yPosition": "500"
}
],
"textTabs": [
{
"tabLabel": "EmployeeTitle",
"documentId": "1",
"pageNumber": "1",
"xPosition": "200",
"yPosition": "300",
"width": "150",
"height": "20",
"required": "true",
"value": ""
}
],
"fullNameTabs": [
{
"tabLabel": "EmployeeFullName",
"documentId": "1",
"pageNumber": "1",
"xPosition": "200",
"yPosition": "250"
}
]
}
},
{
"email": "jane.doe@company.com",
"name": "Jane Doe",
"recipientId": "2",
"routingOrder": "2",
"tabs": {
"signHereTabs": [
{
"tabLabel": "ManagerSignature",
"documentId": "1",
"pageNumber": "3",
"xPosition": "100",
"yPosition": "600"
}
],
"dateSignedTabs": [
{
"tabLabel": "ManagerSignDate",
"documentId": "1",
"pageNumber": "3",
"xPosition": "350",
"yPosition": "600"
}
]
}
}
]
}
}'

Response

{
"envelopeId": "550e8400-e29b-41d4-a716-446655440000",
"status": "sent",
"statusDateTime": "2026-02-04T10:30:00.000Z",
"uri": "/envelopes/550e8400-e29b-41d4-a716-446655440000"
}

Example 2: Anchor Text Positioning

Position tabs relative to text found in the document. This is more resilient to document layout changes than XY coordinates.

tip

Use unique anchor markers like /sig1/, /date1/, /init1/ in your document templates for reliable positioning.

curl -X POST "https://api.propper.ai/restapi/v2.1/accounts/$ACCOUNT_ID/envelopes" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"emailSubject": "Please sign: Employment Contract",
"emailBlurb": "Please review and sign the attached employment contract.",
"status": "sent",
"documents": [
{
"documentId": "1",
"name": "Employment_Contract.pdf",
"documentBase64": "<base64-encoded-pdf-content>",
"fileExtension": "pdf",
"order": "1"
}
],
"recipients": {
"signers": [
{
"email": "john.smith@example.com",
"name": "John Smith",
"recipientId": "1",
"routingOrder": "1",
"tabs": {
"signHereTabs": [
{
"tabLabel": "EmployeeSignature",
"anchorString": "/sig1/",
"anchorXOffset": "0",
"anchorYOffset": "-10",
"anchorUnits": "pixels",
"anchorIgnoreIfNotPresent": "false",
"scaleValue": "1.0"
}
],
"dateSignedTabs": [
{
"tabLabel": "EmployeeSignDate",
"anchorString": "/date1/",
"anchorXOffset": "0",
"anchorYOffset": "0",
"anchorUnits": "pixels"
}
],
"textTabs": [
{
"tabLabel": "EmployeeTitle",
"anchorString": "Job Title:",
"anchorXOffset": "100",
"anchorYOffset": "0",
"anchorUnits": "pixels",
"width": "150",
"height": "20",
"required": "true"
},
{
"tabLabel": "StartDate",
"anchorString": "Start Date:",
"anchorXOffset": "100",
"anchorYOffset": "0",
"anchorUnits": "pixels",
"width": "100",
"required": "true"
}
],
"initialHereTabs": [
{
"tabLabel": "EmployeeInitials",
"anchorString": "/init1/",
"anchorXOffset": "0",
"anchorYOffset": "0",
"anchorUnits": "pixels",
"scaleValue": "0.5"
}
],
"checkboxTabs": [
{
"tabLabel": "AgreeToTerms",
"anchorString": "I agree to the terms",
"anchorXOffset": "-25",
"anchorYOffset": "0",
"anchorUnits": "pixels",
"required": "true"
}
]
}
},
{
"email": "jane.doe@company.com",
"name": "Jane Doe",
"recipientId": "2",
"routingOrder": "2",
"tabs": {
"signHereTabs": [
{
"tabLabel": "ManagerSignature",
"anchorString": "/sig2/",
"anchorXOffset": "0",
"anchorYOffset": "-10",
"anchorUnits": "pixels"
}
],
"dateSignedTabs": [
{
"tabLabel": "ManagerSignDate",
"anchorString": "/date2/",
"anchorXOffset": "0",
"anchorYOffset": "0",
"anchorUnits": "pixels"
}
]
}
}
]
}
}'

Tab Types Reference

Tab ArrayDescription
signHereTabsSignature field - recipient draws or types signature
initialHereTabsInitials field - recipient adds initials
dateSignedTabsAuto-populated date when recipient signs
textTabsText input field for free-form text
numberTabsNumeric input field
checkboxTabsCheckbox field
radioGroupTabsRadio button group
listTabsDropdown list selection
emailTabsEmail input field
emailAddressTabsAuto-populated from recipient email
fullNameTabsAuto-populated from recipient name
formulaTabsCalculated field based on other tab values

Positioning Options

XY Coordinates

FieldDescription
documentIdWhich document (matches documentId in documents array)
pageNumberPage number (1-indexed)
xPositionHorizontal position in pixels from left edge
yPositionVertical position in pixels from top edge

Anchor Text

FieldDescription
anchorStringText to search for in the document
anchorXOffsetHorizontal offset from anchor text in pixels
anchorYOffsetVertical offset from anchor text in pixels
anchorUnitsUnit of measurement (pixels, inches, mms, cms)
anchorIgnoreIfNotPresentIf "true", tab is skipped if anchor not found
anchorCaseSensitiveIf "true", anchor search is case-sensitive
anchorMatchWholeWordIf "true", anchor must match whole word

Common Tab Properties

PropertyDescription
tabLabelUnique identifier for the tab
required"true" or "false" - whether tab must be completed
locked"true" or "false" - whether tab value is read-only
width / heightTab dimensions in pixels
fontFont name (e.g., arial, helvetica)
fontSizeFont size (e.g., size9, size11, size14)
fontColorFont color (e.g., black, blue, #FF0000)
bold / italic / underlineText styling ("true" or "false")
scaleValueScale factor for signatures/initials (e.g., "0.5", "1.0")

Error Responses

StatusError CodeMessage
400INVALID_REQUEST_BODYEmail subject is required
400FEATURE_NOT_SUPPORTEDFeature 'compositeTemplates' is not supported by Propper Sign
401AUTHORIZATION_INVALID_TOKENInvalid or expired token

Limits

LimitValue
Max documents per envelope10
Max document size25 MB
Max recipients50
Max subject length200 characters
Max message length2,000 characters

Next Steps