Skip to content

Packets ​

A packet is a set of documents generated from a packet template and sent to one or more signers.

Endpoints ​

MethodPathDescription
GET/api/packetsList packets
GET/api/packets/:idGet a packet
POST/api/packetsCreate a packet
POST/api/packets/:id/sendSend a packet
POST/api/packets/:id/voidVoid a packet
GET/api/packets/:id/statusGet packet status
GET/api/packets/:id/archiveArchive a packet
GET/api/packets/:id/restoreRestore a packet

Packet statuses ​

StatusMeaning
draftCreated, not yet sent.
sentSent to signers.
viewedAt least one signer has opened it.
awaiting_signaturesAt least one signer has signed and others are outstanding.
completeEvery signer has signed.
voidedCancelled.

The packet object ​

List responses return the summary fields. Single-packet responses add the detail fields.

Summary fields ​

FieldTypeDescription
idintegerPacket ID.
namestringPacket name.
statusstringOne of the packet statuses.
submitter_namestringName of the primary signer.
submitter_emailstringEmail of the primary signer.
sent_attimestampWhen the packet was sent.
completed_attimestampWhen the last signer signed.
voided_attimestampWhen the packet was voided.
void_reasonstringReason given when voiding.
archived_attimestampWhen the packet was archived.
created_attimestamp
updated_attimestamp

Detail fields ​

FieldTypeDescription
slugstringPublic identifier for the packet.
packet_template_idintegerTemplate the packet was created from.
signersarrayEach signer's name, email and role.
signed_document_urlstringDownload URL for the signed PDF. null until complete.
certificate_urlstringDownload URL for the audit trail. null until complete.
metadataobjectReference data stored on the packet. Echoed in webhook payloads.
variablesobjectValues merged into the documents.
cc_emailsarrayAddresses copied on completion.
cc_attach_pdfbooleanWhether the signed PDF is attached to the CC email.
cc_notified_attimestampWhen CC recipients were notified.
test_modebooleanWhether the packet is a test packet.
reminders_enabledbooleanWhether reminder emails are on.
first_reminder_daysintegerDays before the first reminder.
repeat_remindersbooleanWhether reminders repeat.
repeat_interval_daysintegerDays between repeat reminders.
reminder_countintegerReminders sent so far.
last_reminder_sent_attimestamp

List packets ​

GET /api/packets

Accepts the standard list parameters. Archived packets are excluded unless you send filters[include_archived]=true.

bash
curl "https://app.docrunner.io/api/packets?per_page=50" \
  -H "X-API-Key: $DOCRUNNER_API_KEY"
json
{
  "packets": [
    {
      "id": 123,
      "name": "Lease for 123 Main St",
      "status": "sent",
      "completed_at": null,
      "submitter_email": "jane@example.com",
      "submitter_name": "Jane Doe",
      "archived_at": null,
      "voided_at": null,
      "void_reason": null,
      "sent_at": "2026-04-06T10:00:00Z",
      "created_at": "2026-04-06T09:58:12Z",
      "updated_at": "2026-04-06T10:00:00Z"
    }
  ],
  "meta": { "current_page": 1, "total_pages": 1, "total_count": 1, "per_page": 50 }
}

Get a packet ​

GET /api/packets/:id

Returns the packet with its detail fields.

bash
curl https://app.docrunner.io/api/packets/123 \
  -H "X-API-Key: $DOCRUNNER_API_KEY"

Returns 404 with { "error": "Packet 123 not found" } if the packet is not in your account.

Create a packet ​

POST /api/packets

Creates a draft packet. Creating a packet does not send it. Call send next.

Body ​

All fields go inside a packet object.

FieldTypeRequiredDescription
packet_template_idintegerYesThe template to build from.
packet_namestringNoName for the packet.
rolesobjectYesSigners grouped by role key. See below.
cc_emailsarrayNoAddresses to copy when the packet completes. Invalid addresses are dropped.
cc_attach_pdfbooleanNoAttach the signed PDF to the CC email. Defaults to false.

Roles ​

roles is an object keyed by role. Each value is an array of signers with name and email.

  • Each key must match a role key on the packet template. Read them from recipient_roles on the packet template.
  • A role accepts up to its max_count signers.
  • name and email are both required for every signer.

Supported role keys

The API currently accepts the role keys owner, tenant and pm. Other keys are ignored.

Example ​

bash
curl -X POST https://app.docrunner.io/api/packets \
  -H "X-API-Key: $DOCRUNNER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "packet": {
      "packet_template_id": 9,
      "packet_name": "Lease for 123 Main St",
      "cc_emails": ["office@example.com"],
      "cc_attach_pdf": true,
      "roles": {
        "tenant": [
          { "name": "Jane Doe", "email": "jane@example.com" },
          { "name": "Sam Doe", "email": "sam@example.com" }
        ],
        "owner": [{ "name": "John Smith", "email": "john@example.com" }]
      }
    }
  }'

The response is the new packet with its detail fields.

Errors ​

Returned as 422 with the reasons joined in error.

MessageCause
Packet template 9 not foundNo template with that ID in your account.
This packet template is archived. Restore it before creating a packet.
This packet template has no documents.
Unknown role: landlordThe role key is not defined on the template.
Too many signers for role tenant (max 2)
Name and email are required for role tenant

Send a packet ​

POST /api/packets/:id/send

Sends a draft packet to its signers.

Body ​

FieldTypeRequiredDescription
packet.send_email_bodystringYesMessage included in the signing invitation email.
bash
curl -X POST https://app.docrunner.io/api/packets/123/send \
  -H "X-API-Key: $DOCRUNNER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "packet": { "send_email_body": "Please review and sign." } }'
json
{
  "packet": {
    "id": 123,
    "success_info": { "message": "Packet sent for signing!" }
  }
}

Test mode ​

For a test-mode packet, no email is sent. The response lists a signing URL for each signer who is up next, alongside a message:

json
{
  "packet": {
    "id": 123,
    "success_info": {
            "test_signing_urls": ["https://app.docrunner.io/sign/sign_abc123"]
    }
  }
}

If sending fails, the response is 422 with { "error": "Failed to send: ..." }.

Void a packet ​

POST /api/packets/:id/void

Cancels a packet. If it was already sent, signers are notified. Voiding also archives the packet.

Body ​

FieldTypeRequiredDescription
packet.void_reasonstringYesReason shown to signers.
bash
curl -X POST https://app.docrunner.io/api/packets/123/void \
  -H "X-API-Key: $DOCRUNNER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "packet": { "void_reason": "Lease terms changed." } }'
json
{
  "packet": {
    "id": 123,
    "success_info": { "message": "Document has been voided and submitters have been notified." }
  }
}

Get packet status ​

GET /api/packets/:id/status

A lightweight check that returns only the ID, name and status.

json
{
  "packet": { "id": 123, "name": "Lease for 123 Main St", "status": "sent" }
}

Archive and restore ​

GET /api/packets/:id/archive
GET /api/packets/:id/restore

Archiving hides a packet from list responses. Restoring brings it back. Both return the packet ID:

json
{ "packet": { "id": 123 } }

Questions? Email hello@docrunner.io