NotaryLive API - IPEN Creation

Page last updated: July 22, 2026

Creating an IPEN Session

An IPEN (In-Person Electronic Notarization) is a notarization session that your notary conducts face-to-face with the signer. Creating an IPEN through the API prepares everything ahead of the meeting: the documents, the participants, and the assigned notary.

Below is an example request to create an IPEN order:

curl -X POST "https://notarylive.com/api/v1/ipen/create" \
    -H 'Content-Type: application/json' \
    -u '((your_ipen_api_id)):((your_ipen_api_key))' \
    -d $'{
        "internal_id": "((internal_order_id))",
        "notary": "((notary_user_id))",
        "document_urls": ["https://pdfobject.com/pdf/sample.pdf"],
        "participants": [{
            "email": "john.doe@notarylive.com",
            "first_name": "Johnny",
            "last_name": "Doe",
            "type": "signer"}]
        }'

A successful request will generate the following response:

{
    "success":1,
    "link_to_order":"https://notarylive.com/ipen/edit/{unique_ipen_identifier}"
}

Please note: Unlike our RON API, the link_to_order is intended for the notary you assigned to the order, not for the signer. The link opens the IPEN session editor, where your notary reviews the documents and conducts the in-person signing. The notary must be logged in to their NotaryLive notary account to open it.


Validation Failures

Invalid credentials will return a 401 response with the message: HTTP/1.0 401 Unauthorized

Invalid or missing payload data will return a 400 HTTP response with a JSON body containing success = 0 as well as an array of errors containing both a standardized error code, as well as a human-readable description of what caused the error:

If you continue having issues, please take a look at our troubleshooting guide.

curl -X POST "https://notarylive.com/api/v1/ipen/create" \
    -H 'Content-Type: application/json' \
    -u '((your_ipen_api_id)):((your_ipen_api_key))' \
    -d $'{
        "internal_id": "((internal_order_id))",
        "document_urls": ["https://pdfobject.com/pdf/sample.pdf"],
        "participants": [{
            "email": "john.doe@notarylive.com",
            "last_name": "Doe",
            "first_name": "Johnny"}]
        }'
{
    "success": 0,
    "errors": [
        {
            "code": "validation_failed",
            "message": "The notary field is required."
        },
        {
            "code": "validation_failed",
            "message": "The participants.0.type field is required."
        }
    ]
}

In addition to the validation_failed errors shown above, the following error codes can be returned when creating an IPEN order:

Error Code Description
invalid_credentials The supplied credentials are not IPEN API credentials. RON and eSign API credentials cannot be used with IPEN endpoints
invalid_notary The supplied notary is not an IPEN-approved notary in your organization
invalid_webhook_url The supplied webhook_url is not a working, publicly accessible URL
restricted_email_in_use One or more participant emails belong to an account type that is not allowed to sign
file_creation_failed We could not download or process one or more of the supplied documents

Attaching Documents

Every IPEN order requires at least one document, supplied through either document_urls or document_files.

via Document URL

To upload a document to notarize, pass in a comma-separated list of document urls as shown below:

curl -X POST "https://notarylive.com/api/v1/ipen/create" \
    -H 'Content-Type: application/json' \
    -u '((your_ipen_api_id)):((your_ipen_api_key))' \
    -d $'{
        "internal_id": "((internal_order_id))",
        "notary": "((notary_user_id))",
        "document_urls": [
            "https://pdfobject.com/pdf/sample.pdf",
            "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf"
        ],
        "participants": [{
            "email": "john.doe@notarylive.com",
            "first_name": "Johnny",
            "last_name": "Doe",
            "type": "signer"}]
        }'

Each file will be attached as a separate document and all documents will be notarized within the same in-person session with your notary.

via Direct File Upload

In the direct file upload approach, the file must exist on the same server infrastructure as where the API request is originating from. You will then reference the full file path to the document within the API call:

curl -X POST "https://notarylive.com/api/v1/ipen/create" \
    -u '((your_ipen_api_id)):((your_ipen_api_key))' \
    -H 'Content-Type: multipart/form-data' \
    -F "document_files[0]=@/path/to/document_1.pdf" \
    -F "document_files[1]=@/path/to/document_2.pdf" \
    -F "notary=((notary_user_id))" \
    -F "participants[0][first_name]=Johnny" \
    -F "participants[0][last_name]=Doe" \
    -F "participants[0][email]=john.doe@notarylive.com" \
    -F "participants[0][type]=signer" \
    -F "internal_id=internal_order_id"

Please note: The API will fail with an error message if the file does not exist or the full file path is not specified correctly.

Please note: API calls including large documents or multiple documents will take longer to process than API calls with smaller filesize documents.


Adding Participants

You can add signers and witnesses to the request in the IPEN API by using the participants parameter. The participants parameter accepts an array of objects representing participants, the first signer will always be treated as the primary signer. Each participant object must contain the following parameters:

  • first_name - The first name of the participant
  • last_name - The last name of the participant
  • email - The email address of the participant
  • type - The type of the participant, either signer or witness

For more information on the validation rules for participant names and emails, please click here.

You can add multiple signers and witnesses to the request in this manner:

curl -X POST "https://notarylive.com/api/v1/ipen/create" \
    -H 'Content-Type: application/json' \
    -u '((your_ipen_api_id)):((your_ipen_api_key))' \
    -d $'{
        "internal_id": "((internal_order_id))",
        "notary": "((notary_user_id))",
        "document_urls": ["https://pdfobject.com/pdf/sample.pdf"],
        "participants": [{
            "email": "john.doe@notarylive.com",
            "first_name": "Johnny",
            "last_name": "Doe",
            "type": "signer"
        }, {
            "email": "jane.doe@notarylive.com",
            "first_name": "Jane",
            "last_name": "Doe",
            "type": "witness"
        }]
    }'

Please note: Since the session happens in person, all participants must be physically present with your notary at the time of the signing.

Please note: Each additional signer or witness you add to the request increases the price of the order by $5 dollars.


Choosing the Notary

The notary parameter is required and must be set to the NotaryLive user ID of a notary who belongs to your organization and has been approved for IPEN. You can view your organization's notaries as well as their user IDs in your dashboard, under the Users tab.

Please note: Because the signing happens in person on your notary's device, the notary pool options available in our RON API (any_nl_notary and any_of_mine) are not supported for IPEN. Every IPEN order must be assigned to one specific notary.

If none of your notaries have been approved for IPEN yet, please reach out to us at support@notarylive.com for assistance activating IPEN.


Naming the Session

You can give the session a name that your team and your notary will recognize by supplying the session_name parameter. The session name is shown in your dashboard's session archive.

curl -X POST "https://notarylive.com/api/v1/ipen/create" \
    -H 'Content-Type: application/json' \
    -u '((your_ipen_api_id)):((your_ipen_api_key))' \
    -d $'{
        "internal_id": "((internal_order_id))",
        "notary": "((notary_user_id))",
        "session_name": "Smith Refinance Closing",
        "document_urls": ["https://pdfobject.com/pdf/sample.pdf"],
        "participants": [{
            "email": "john.doe@notarylive.com",
            "first_name": "Johnny",
            "last_name": "Doe",
            "type": "signer"}]
        }'

After the Session

Once your notary has met with the participants, completed the signing, and finalized the session, the documents are digitally sealed with the notary's certificate. At that point:

Please note: For orders created through this API, NotaryLive does not email the completed document(s) to the participants, the notary, or your Business Account. Retrieve the documents from the ipen_complete webhook event instead, and store them on your own infrastructure. The links it contains expire 30 minutes after the session is completed.


Billing

IPEN orders are always charged to your Business Account — there is no customer payment step. Only orders which complete the notarial event successfully will be charged to your account. Billing for these orders occurs at the end of the month and will be reflected in your monthly invoice.

Please note: Orders created with sandbox credentials are never billed, and the final document(s) produced by a sandbox session are watermarked.


Webhook Events

To receive status updates as the order moves through the system, supply a publicly accessible webhook_url in your create call. The following webhook events are sent during the IPEN order lifecycle:

Event Name JSON Payload
ipen_created
{
    "event": "ipen_created",
    "nl_ipen_id": "notarylive_ipen_id",
    "their_order_id": "your_company_order_id"
}
ipen_canceled
{
    "event": "ipen_canceled",
    "nl_ipen_id": "notarylive_ipen_id",
    "their_order_id": "your_company_order_id"
}
ipen_complete
{
    "event": "ipen_complete",
    "nl_ipen_id": "notarylive_ipen_id",
    "their_order_id": "your_company_order_id",
    "links_to_documents": [
        "https://notary-session-files.../document1.pdf",
        "https://notary-session-files.../document2.pdf"
    ]
}

Please note: the links_to_documents will only be accessible for 30 minutes. Please have a plan in place to download and store the documents on your own infrastructure, as NotaryLive does not email the completed document(s) to the participants, the notary, or your Business Account for orders created through this API.

Please note: If you supply a company_email instead of a webhook_url, the webhook event data will be emailed to that address instead. If both are supplied, the email is only sent when your webhook endpoint repeatedly fails to return a success response.


Webhook Security

All webhook messages sent by NotaryLive are sent over HTTPS to ensure messages are encrypted in transit.

While HMAC verification is a common security measure, integrating partners have had difficulty replicating the HMAC signature, especially when the Content-Type isn't application/json. For this reason, NotaryLive does not support HMAC signing for webhooks.

Instead, we recommend treating webhooks as simple notifications that the session order status has changed and then use the IPEN Status API to retrieve the details of the status change.


Internal ID

The internal_id parameter is used to identify the order in your internal systems. It is returned as the their_order_id field in every webhook event, and our support team can use it to locate the order if you ever need assistance.


Validation Rules

The following are the validation rules for all arguments within the IPEN creation API call:

Parameter Validation Rules
company_email Optional | Email | Max length: 100 characters | The email address NotaryLive will send status updates to, as an order moves through the system. If a webhook url is supplied and the webhook receives a 200-response from the server, the email will not be sent to this email address
document_files Optional | Array of files | Supported file types: pdf, doc, docx, png, jpg, jpeg, heic, heif | One of document_files or document_urls is required
document_urls Optional | Array of urls | Supported file types: pdf, doc, docx, png, jpg, jpeg, heic, heif | One of document_files or document_urls is required
internal_id Optional | String | A value you supply that helps identify this record in your internal systems. For more details, click here
notary Required | String | The NotaryLive user ID of an IPEN-approved notary in your organization. For more information, click here
participants Required | Array of objects | Must include at least one participant of the type signer
participants.*.email Required | Email | Max length: 100 characters | The email address of the participant
participants.*.first_name Required | String | Max length: 35 characters | Letters, commas, periods, hypens, apostrophes and spaces only | The first name of the participant
participants.*.last_name Required | String | Max length: 50 characters | Letters, commas, periods, hypens, apostrophes and spaces only | The last name of the participant
participants.*.type Required | String | Options: signer, witness | The type of the participant
session_name Optional | String | Max length: 191 characters | A name for the session, shown in your dashboard's session archive
webhook_url Optional | Url | Must be publicly accessible | The url NotaryLive will POST status updates to, as an order moves through the system. For more details, click here

Copyright © 2026, NotaryLive.com