NAV
shell php javascript

Introduction

The ProNotary API allows you to access essential information related to Notaries, Clients, Transactions, and Documents. This documentation will guide you on how to leverage our API to enhance your workflow and integrate ProNotary functionality into your applications.

You may explore code examples on the right side of this page. Use the tabs in the top right to switch between programming languages and view examples in your preferred language.

API Root

The ProNotary API Root is the starting point for all your requests. Make sure to prefix your endpoint paths with the following base URL:

https://api.pronotary.com/api/p/v1

Authentication

Example authenticated request:

# With shell, you can just pass the correct header with each request
curl --user 'YOUR_API_KEY_ID:YOUR_API_KEY' \
  https://api.pronotary.com/api/p/v1/API_ENDPOINT
<?php
// Set up cURL
$ch = curl_init('https://api.pronotary.com/api/p/v1/API_ENDPOINT');

// Set the cURL options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Authorization: Basic ' . base64_encode("YOUR_API_KEY_ID:YOUR_API_KEY")
));

// Execute cURL and get the response
$response = curl_exec($ch);

// Check for cURL errors
if (curl_errno($ch)) {
    echo 'Curl error: ' . curl_error($ch);
}

// Close cURL session
curl_close($ch);

// Output the response
echo $response;
?>
// Encode the API key and ID for basic authentication
const encodedCredentials = btoa("YOUR_API_KEY_ID:YOUR_API_KEY");

// Make the HTTP request using the fetch API
fetch(apiUrl, {
  method: "GET",
  headers: {
    Authorization: `Basic ${encodedCredentials}`,
  },
})
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error("Error:", error));

Make sure to replace YOUR_API_KEY_ID:YOUR_API_KEY with your API ID and key.

ProNotary uses HTTP basic authentication for authorizing API requests. To authenticate your API requests, ensure to include your API key ID as the HTTP auth username and your API key as the corresponding password.

You can create API keys from the Admin panel.

An authenticated API request should have a header that looks like the following:

Authorization: Basic encodedapikeyidandapikey

Errors

The ProNotary API uses the following error codes:

Error Code Meaning
400 Bad Request -- Your request is invalid.
401 Unauthorized -- Your API key is wrong.
403 Forbidden -- You are not authorized to access the requested resource.
404 Not Found -- The specified resource could not be found.
405 Method Not Allowed -- You tried to access a resource with an invalid method.
406 Not Acceptable -- You requested a format that isn't json.
410 Gone -- The requested resource has been removed from our servers.
429 Too Many Requests -- You're making too many requests!
500 Internal Server Error -- We had a problem with our server. Try again later.
503 Service Unavailable -- We're temporarily offline for maintenance. Please try again later.

Rate Limiting

We use rate limiting to keep our API safe and stable. The default rate limiter allows up to 50 requests per minute.

Any request over the limit will return a 429 Too Many Requests error.

IP Address Whitelist

If you are calling our API with fixed IP addresses and want an additional layer of security beyond API key based authorization, you can restrict the IPs that ProNotary accepts requests from. To add IP addresses to the whitelist, visit the API Key Details Section within the Admin dashboard.

API Logs

You can view a history of your API requests in the API section of the Admin Dashboard - API > API Logs. These logs include details such as the associated API key's Key ID, the originating IP address of the request, the specific endpoint invoked, the request's status (either success or failure), the corresponding status code and the timestamp indicating the date of the request.

We encourage you to always review this logs to get detailed overview of your API interactions, facilitating effective monitoring and analysis of your Pronotary integration.

Clients

The client represents an individual that wants to perform a document notarization. Below you can find endpoints to create a client, fetch a list of clients and get the details of an individual client.

Create a Client

curl --user 'YOUR_API_KEY_ID:YOUR_API_KEY' \
  --request POST \
  --url https://api.pronotary.com/api/p/v1/clients \
  --header 'Content-Type: application/json' \
  --data '{
    "first_name": "John",
    "middle_name": "",
    "last_name": "Doe",
    "suffix": "",
    "title": "",
    "company": "",
    "email": "[email protected]",
    "password": "secret*Password1",
    "address": "Nowhere",
    "zip_code": "12345",
    "city": "City",
    "state": "TX",
    "county": "Dallas",
    "country": "US",
    "phone": "0123456789"
  }'

<?php

$data = [
    'first_name' => 'John',
    'middle_name' => '',
    'last_name' => 'Doe',
    'suffix' => '',
    'title' => '',
    'company' => '',
    'email' => '[email protected]',
    'password' => 'secret*Password1',
    'address' => 'Nowhere',
    'zip_code' => '12345',
    'city' => 'City',
    'state' => 'TX',
    'county' => 'Dallas',
    'country' => 'US',
    'phone' => '0123456789',
];

// Encode data as JSON
$dataJson = json_encode($data);

// Set up cURL
$ch = curl_init('https://api.pronotary.com/api/p/v1/clients');

// Set cURL options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'Authorization: Basic ' . base64_encode("YOUR_API_KEY_ID:YOUR_API_KEY"),
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $dataJson);

// Execute cURL and get the response
$response = curl_exec($ch);

// Check for cURL errors
if (curl_errno($ch)) {
    echo 'Curl error: ' . curl_error($ch);
}

// Close cURL session
curl_close($ch);

// Output the response
echo $response;

?>
const data = {
  first_name: "John",
  middle_name: "",
  last_name: "Doe",
  suffix: "",
  title: "",
  company: "",
  email: "[email protected]",
  password: "secret*Password1",
  address: "Nowhere",
  zip_code: "12345",
  city: "City",
  state: "TX",
  county: "Dallas",
  country: "US",
  phone: "0123456789",
};

// Make the HTTP request using the fetch API
fetch("https://api.pronotary.com/api/p/v1/clients", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: `Basic ${btoa("YOUR_API_KEY_ID:YOUR_API_KEY")}`,
  },
  body: JSON.stringify(data),
})
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error("Error:", error));

Make sure to replace YOUR_API_KEY_ID:YOUR_API_KEY with your API ID and key.

The above request will return a response similar to the following:

{
  "success": true,
  "message": "success",
  "client": {
    "id": 1072,
    "full_name": "John Doe",
    "first_name": "John",
    "last_name": "Doe",
    "email": "[email protected]"
  }
}

Create a new client with the given details.

HTTP Request

POST /clients

Request Body Parameters

Parameter Required Default Description
first_name true null First name of the Client
middle_name false null Middle name of the Client
last_name true null Last name of the Client
suffix false null Name suffix of the Client
title false null The title of the Client
company false null The Client's company
email true null The Client's email
password true null The Client's password.
address true null The Client's email address
zip_code true null The Client's Zip code
city true null The Client's city
state true null The Client's State
county true null The Client's county
country true null The Client's Country
phone true null The Client's phone number

List Clients

curl --user 'YOUR_API_KEY_ID:YOUR_API_KEY' \
  --url https://api.pronotary.com/api/p/v1/clients
<?php
// Set up cURL
$ch = curl_init('https://api.pronotary.com/api/p/v1/clients');

// Set the cURL options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Authorization: Basic ' . base64_encode("YOUR_API_KEY_ID:YOUR_API_KEY")
));

// Execute cURL and get the response
$response = curl_exec($ch);

// Check for cURL errors
if (curl_errno($ch)) {
    echo 'Curl error: ' . curl_error($ch);
}

// Close cURL session
curl_close($ch);

// Output the response
echo $response;

?>
// Make the HTTP request using the fetch API
fetch("https://api.pronotary.com/api/p/v1/clients", {
  method: "GET",
  headers: {
    Authorization: `Basic ${btoa("YOUR_API_KEY_ID:YOUR_API_KEY")}`,
  },
})
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error("Error:", error));

Make sure to replace YOUR_API_KEY_ID:YOUR_API_KEY with your API ID and key.

The above request will return a response similar to the following:

{
  "success": true,
  "message": "ok",
  "clients": [
    {
      "id": 1072,
      "first_name": "John",
      "last_name": "Doe"
    },
    {
      "id": 1071,
      "first_name": "Jan",
      "last_name": "Doe"
    }
    // ...
  ],
  "total": 559
}

Returns a list of clients.

HTTP Request

GET /clients

Request Query Parameters

Parameter Required Default Description
page false 1 The page number to fetch
limit false 10 The number of clients to return

Get Client Details

curl --user 'YOUR_API_KEY_ID:YOUR_API_KEY' \
  --url 'https://api.pronotary.com/api/p/v1/clients/{{Client ID}}'
<?php

$clientID = '1072'; // Replace with the actual client ID

// Set up cURL
$ch = curl_init("https://api.pronotary.com/api/p/v1/clients/$clientID");

// Set the cURL options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Authorization: Basic ' . base64_encode("YOUR_API_KEY_ID:YOUR_API_KEY")
));

// Execute cURL and get the response
$response = curl_exec($ch);

// Check for cURL errors
if (curl_errno($ch)) {
    echo 'Curl error: ' . curl_error($ch);
}

// Close cURL session
curl_close($ch);

// Output the response
echo $response;

?>
const clientID = "1072"; // Replace with the actual client ID

// Make the HTTP request using the fetch API
fetch(`https://api.pronotary.com/api/p/v1/clients/${clientID}`, {
  method: "GET",
  headers: {
    Authorization: `Basic ${btoa("YOUR_API_KEY_ID:YOUR_API_KEY")}`,
  },
})
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error("Error:", error));

Make sure to replace YOUR_API_KEY_ID:YOUR_API_KEY with your API ID and key.

The above request will return a response similar to the following:

{
  "success": true,
  "message": "ok",
  "client": {
    "id": 1072,
    "first_name": "John",
    "middle_name": null,
    "last_name": "Doe",
    "full_name": "John Doe",
    "suffix": null,
    "title": null,
    "email": "[email protected]",
    "company": null
  }
}

Returns the details of a given client.

HTTP Request

GET /clients/{ClientID}

Request URI Parameters

Parameter Required Default Description
ClientID true null The ID of the client

Notaries

The notary represents a registered notary on ProNotary. Below you can find endpoints to create a notary, fetch a list of notaries and get the details of an individual notary.

Create a Notary

curl --user 'YOUR_API_KEY_ID:YOUR_API_KEY' \
  --request POST \
  --url https://api.pronotary.com/api/p/v1/notaries \
  --header 'Content-Type: application/json' \
  --data '{
    "first_name": "Jan",
    "middle_name": "",
    "last_name": "Doe",
    "suffix": "",
    "title": "",
    "company": "",
    "email": "[email protected]",
    "password": "secret*Password1",
    "address": "Nowhere",
    "zip_code": "12345",
    "city": "City",
    "state": "TX",
    "county": "Dallas",
    "country": "US",
    "phone": "0123456789"
  }'

<?php

$data = [
    'first_name' => 'Jan',
    'middle_name' => '',
    'last_name' => 'Doe',
    'suffix' => '',
    'title' => '',
    'company' => '',
    'email' => '[email protected]',
    'password' => 'secret*Password1',
    'address' => 'Nowhere',
    'zip_code' => '12345',
    'city' => 'City',
    'state' => 'TX',
    'county' => 'Dallas',
    'country' => 'US',
    'phone' => '0123456789',
];

// Encode data as JSON
$dataJson = json_encode($data);

// Set up cURL
$ch = curl_init('https://api.pronotary.com/api/p/v1/notaries');

// Set cURL options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'Authorization: Basic ' . base64_encode("YOUR_API_KEY_ID:YOUR_API_KEY"),
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $dataJson);

// Execute cURL and get the response
$response = curl_exec($ch);

// Check for cURL errors
if (curl_errno($ch)) {
    echo 'Curl error: ' . curl_error($ch);
}

// Close cURL session
curl_close($ch);

// Output the response
echo $response;

?>
const data = {
  first_name: "Jan",
  middle_name: "",
  last_name: "Doe",
  suffix: "",
  title: "",
  company: "",
  email: "[email protected]",
  password: "secret*Password1",
  address: "Nowhere",
  zip_code: "12345",
  city: "City",
  state: "TX",
  county: "Dallas",
  country: "US",
  phone: "0123456789",
};

// Make the HTTP request using the fetch API
fetch("https://api.pronotary.com/api/p/v1/notaries", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: `Basic ${btoa("YOUR_API_KEY_ID:YOUR_API_KEY")}`,
  },
  body: JSON.stringify(data),
})
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error("Error:", error));

Make sure to replace YOUR_API_KEY_ID:YOUR_API_KEY with your API ID and key.

The above request will return a response similar to the following:

{
  "success": true,
  "message": "success",
  "notary": {
    "id": 1065,
    "full_name": "Jan Doe",
    "first_name": "Jan",
    "last_name": "Doe",
    "email": "[email protected]"
  }
}

Create a new notary with the given details.

HTTP Request

POST /notaries

Request Body Parameters

Parameter Required Default Description
first_name true null First name of the Notary
middle_name false null Middle name of the Notary
last_name true null Last name of the Notary
suffix false null Name suffix of the Notary
title false null The title of the Notary
company false null The Notary's company
email true null The Notary's email
password true null The Notary's password.
address true null The Notary's email address
zip_code true null The Notary's Zip code
city true null The Notary's city
state true null The Notary's State
county true null The Notary's county
country true null The Notary's Country
phone true null The Notary's phone number

List Notaries

curl --user 'YOUR_API_KEY_ID:YOUR_API_KEY' \
  --url https://api.pronotary.com/api/p/v1/notaries
<?php
// Set up cURL
$ch = curl_init('https://api.pronotary.com/api/p/v1/notaries');

// Set the cURL options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Authorization: Basic ' . base64_encode("YOUR_API_KEY_ID:YOUR_API_KEY")
));

// Execute cURL and get the response
$response = curl_exec($ch);

// Check for cURL errors
if (curl_errno($ch)) {
    echo 'Curl error: ' . curl_error($ch);
}

// Close cURL session
curl_close($ch);

// Output the response
echo $response;

?>
// Make the HTTP request using the fetch API
fetch("https://api.pronotary.com/api/p/v1/notaries", {
  method: "GET",
  headers: {
    Authorization: `Basic ${btoa("YOUR_API_KEY_ID:YOUR_API_KEY")}`,
  },
})
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error("Error:", error));

Make sure to replace YOUR_API_KEY_ID:YOUR_API_KEY with your API ID and key.

The above request will return a response similar to the following:

{
  "success": true,
  "message": "ok",
  "notaries": [
    {
      "id": 1065,
      "first_name": "Jan",
      "last_name": "Doe"
    },
    {
      "id": 1064,
      "first_name": "John",
      "last_name": "Doe"
    }
    // ...
  ],
  "total": 579
}

Returns a list of notaries.

HTTP Request

GET /notaries

Request Query Parameters

Parameter Required Default Description
page false 1 The page number to fetch
limit false 10 The number of notaries to return

Get Notary Details

curl --user 'YOUR_API_KEY_ID:YOUR_API_KEY' \
  --url 'https://api.pronotary.com/api/p/v1/notaries/{{Notary ID}}'
<?php

$notaryID = '1065'; // Replace with the actual notary ID

// Set up cURL
$ch = curl_init("https://api.pronotary.com/api/p/v1/notaries/$notaryID");

// Set the cURL options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Authorization: Basic ' . base64_encode("YOUR_API_KEY_ID:YOUR_API_KEY")
));

// Execute cURL and get the response
$response = curl_exec($ch);

// Check for cURL errors
if (curl_errno($ch)) {
    echo 'Curl error: ' . curl_error($ch);
}

// Close cURL session
curl_close($ch);

// Output the response
echo $response;

?>
const notaryID = "1065"; // Replace with the actual notary ID

// Make the HTTP request using the fetch API
fetch(`https://api.pronotary.com/api/p/v1/notaries/${notaryID}`, {
  method: "GET",
  headers: {
    Authorization: `Basic ${btoa("YOUR_API_KEY_ID:YOUR_API_KEY")}`,
  },
})
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error("Error:", error));

Make sure to replace YOUR_API_KEY_ID:YOUR_API_KEY with your API ID and key.

The above request will return a response similar to the following:

{
  "success": true,
  "message": "ok",
  "notary": {
    "id": 1065,
    "first_name": "Jan",
    "middle_name": null,
    "last_name": "Doe",
    "full_name": "Jan Doe",
    "suffix": null,
    "title": null,
    "email": "[email protected]",
    "company": null
  }
}

Returns the details of a given notary.

HTTP Request

GET /notaries/{NotaryID}

Request URI Parameters

Parameter Required Default Description
NotaryID true null The ID of the notary

Transactions

A transaction encapsulates the details of a notarization action within ProNotary.

Create a Transaction

curl --user 'YOUR_API_KEY_ID:YOUR_API_KEY' \
  --url 'https://api.pronotary.com/api/p/v1/transactions?type=ron' \
  --request POST
<?php

// Set up cURL
$ch = curl_init("https://api.pronotary.com/api/p/v1/transactions?type=ron");

// Set the cURL options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Authorization: Basic ' . base64_encode("YOUR_API_KEY_ID:YOUR_API_KEY")
));

// Execute cURL and get the response
$response = curl_exec($ch);

// Check for cURL errors
if (curl_errno($ch)) {
    echo 'Curl error: ' . curl_error($ch);
}

// Close cURL session
curl_close($ch);

// Output the response
echo $response;

?>
// Make the HTTP request using the fetch API
fetch("https://api.pronotary.com/api/p/v1/transactions?type=ron", {
  method: "POST",
  headers: {
    Authorization: `Basic ${btoa("YOUR_API_KEY_ID:YOUR_API_KEY")}`,
  },
})
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error("Error:", error));

Make sure to replace YOUR_API_KEY_ID:YOUR_API_KEY with your API ID and key.

The above request will return a response similar to the following:

{
  "success": true,
  "message": "ok",
  "transaction": {
    "id": 256,
    "action": "notarize",
    "status": "pending"
  }
}

Create a new transaction.

HTTP Request

POST /transactions

Request Query Parameters

Parameter Required Default Description
type true null The type of transaction you would like to create.

Create a Template

curl --user 'YOUR_API_KEY_ID:YOUR_API_KEY' \
  --url 'https://api.pronotary.com/api/p/v1/templates' \
  --request POST \
  --form 'password=YourPassword' \
  --form 'file=@/path/to/your/file.pdf'

<?php

// Sample data payload
$data = array(
    'password' => 'YourPassword',
    'file' => new CURLFile('/path/to/your/file.txt')
);

// Set up cURL
$ch = curl_init('https://api.pronotary.com/api/p/v1/templates');

// Set the cURL options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Authorization: Basic ' . base64_encode("YOUR_API_KEY_ID:YOUR_API_KEY")
));

// Execute cURL and get the response
$response = curl_exec($ch);

// Check for cURL errors
if (curl_errno($ch)) {
    echo 'Curl error: ' . curl_error($ch);
}

// Close cURL session
curl_close($ch);

// Output the response
echo $response;

?>
// Sample data payload
const formData = new FormData();
formData.append("password", "YourPassword");
formData.append("file", fs.createReadStream("/path/to/your/file.pdf"));

// Make the HTTP request using the fetch API
fetch("https://api.pronotary.com/api/p/v1/templates", {
  method: "POST",
  headers: {
    Authorization: `Basic ${btoa(`YOUR_API_KEY_ID:YOUR_API_KEY`)}`,
  },
  body: formData,
})
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error("Error:", error));

Make sure to replace YOUR_API_KEY_ID:YOUR_API_KEY with your API ID and key.

The above request will return a response similar to the following:

{
  "success": false,
  "message": "success",
  "template": {
    "id": 52,
    "file": "file-1xxxxx.pdf"
  }
}

Create a new template.

HTTP Request

POST /templates

Request Body Parameters

Parameter Required Default Description
password false null Document password (If the document is encrypted).
file true null The PDF document to be uploaded as template

Upload a Document

curl --user 'YOUR_API_KEY_ID:YOUR_API_KEY' \
  --url 'https://api.pronotary.com/api/p/v1/transactions/upload-document' \
  --request POST \
  --form 'file=@/path/to/your/file.pdf' \
  --form 'password=YourPassword' \
  --form 'transaction_id=123'
<?php

// Sample data payload
$data = array(
    'file' => new CURLFile('/path/to/your/file.pdf'),
    'password' => 'YourPassword',
    'transaction_id' => 123
);

// Set up cURL
$ch = curl_init('https://api.pronotary.com/api/p/v1/transactions/upload-document');

// Set the cURL options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Authorization: Basic ' . base64_encode("YOUR_API_KEY_ID:YOUR_API_KEY")
));

// Execute cURL and get the response
$response = curl_exec($ch);

// Check for cURL errors
if (curl_errno($ch)) {
    echo 'Curl error: ' . curl_error($ch);
}

// Close cURL session
curl_close($ch);

// Output the response
echo $response;

?>
// Sample data payload
const formData = new FormData();
formData.append("file", fs.createReadStream("/path/to/your/file.pdf"));
formData.append("password", "YourPassword");
formData.append("transaction_id", 123);

// Make the HTTP request using the fetch API
fetch("https://api.pronotary.com/api/p/v1/transactions/upload-document", {
  method: "POST",
  headers: {
    Authorization: `Basic ${btoa("YOUR_API_KEY_ID:YOUR_API_KEY")}`,
  },
  body: formData,
})
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error("Error:", error));

Make sure to replace YOUR_API_KEY_ID:YOUR_API_KEY with your API ID and key.

The above request will return a response similar to the following:

{
  "success": true,
  "message": "ok",
  "document": {
    "id": 316,
    "status": "draft",
    "draft_file": "https://api.pronotary.com/storage/uploads/documents/fole-17xxxx.pdf"
  }
}

Upload a document to a transaction

HTTP Request

POST /transactions/upload-document

Request Body Parameters

Parameter Required Default Description
transaction_id true null The ID of the transaction you want to upload documents to.
password false null Document password (If the document is encrypted).
file true null The PDF document to upload

Assign Clients

curl --user 'YOUR_API_KEY_ID:YOUR_API_KEY' \
  --url 'https://api.pronotary.com/api/p/v1/transactions/assign-clients' \
  --request POST \
  --header 'Content-Type: application/json' \
  --data '{"transaction_id": 123, "client_ids": [456, 789]}'

<?php
// Sample data payload
$data = array(
    'transaction_id' => 123,
    'client_ids' => [456, 789]
);

// Convert the data array to JSON
$jsonData = json_encode($data);

// Set up cURL
$ch = curl_init('https://api.pronotary.com/api/p/v1/transactions/assign-clients');

// Set the cURL options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Authorization: Basic ' . base64_encode("YOUR_API_KEY_ID:YOUR_API_KEY")
));

// Execute cURL and get the response
$response = curl_exec($ch);

// Check for cURL errors
if (curl_errno($ch)) {
    echo 'Curl error: ' . curl_error($ch);
}

// Close cURL session
curl_close($ch);

// Output the response
echo $response;
?>
// Sample data payload
const data = {
  transaction_id: 123,
  client_ids: [1072, 1071],
};

// Make the HTTP request using the fetch API
fetch("https://api.pronotary.com/api/p/v1/transactions/assign-clients", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: `Basic ${btoa(`YOUR_API_KEY_ID:YOUR_API_KEY`)}`,
  },
  body: JSON.stringify(data),
})
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error("Error:", error));

Make sure to replace YOUR_API_KEY_ID:YOUR_API_KEY with your API ID and key.

The above request will return a response similar to the following:

{
  "success": true,
  "message": "ok",
  "transaction": {
    "id": 247,
    "status": "draft",
    "clients": [
      {
        "id": 1072,
        "name": "John Doe"
      },
      {
        "id": 1071,
        "name": "Jan Doe"
      }
    ]
  }
}

Assign clients to a transaction

HTTP Request

POST /transactions/assign-clients

Request Body Parameters

Parameter Required Default Description
transaction_id true null The ID of the transaction you want to assign clients to.
client_ids[] true null An array of client IDs to assign to the transaction.

Update Transaction

curl -X POST \
  -H "Content-Type: application/json" \
  -d '{"schedule_date":"2023-11-15","start_time":"03:00","end_time":"05:00","reference":"8uadulaj"}' \
  -u "YOUR_API_KEY_ID:YOUR_API_KEY" \
  'https://api.pronotary.com/api/p/v1/transactions/{{Transaction ID}}'
<?php

$transactionId = 123;

$data = [
    'schedule_date' => '2023-11-15',
    'start_time' => '03:00',
    'end_time' => '05:00',
    'reference' => '8uadulaj'
];

$curl = curl_init("https://api.pronotary.com/api/p/v1/transactions/$transactionId");
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'Authorization: Basic ' . base64_encode('YOUR_API_KEY_ID:YOUR_API_KEY')
]);

$response = curl_exec($curl);

if ($response === false) {
    // Handle error
    echo "Error occurred: " . curl_error($curl);
} else {
    // Process $response
    echo $response;
}

curl_close($curl);

?>
const transactionId = 123;

const data = {
  schedule_date: "2023-11-15",
  start_time: "03:00",
  end_time: "05:00",
  reference: "8uadulaj",
};

fetch(`https://api.pronotary.com/api/p/v1/transactions/${transactionId}`, {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: `Basic ${btoa("YOUR_API_KEY_ID:YOUR_API_KEY")}`,
  },
  body: JSON.stringify(data),
})
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error("Error:", error));

Make sure to replace YOUR_API_KEY_ID:YOUR_API_KEY with your API ID and key.

The above request will return a response similar to the following:

{
  "success": true,
  "message": "ok",
  "transaction": {
    "id": 247,
    "schedule_date": "2023-11-15",
    "start_time": "03:00",
    "end_time": "05:00",
    "reference": "8uadulaj"
  }
}

Update a transaction

HTTP Request

PUT /transactions/{TransactionID}

Request URI Parameters

Parameter Required Default Description
TransactionID true null The ID of the transaction to update.

Request Body Parameters

Parameter Required Default Description
schedule_date false null The schedule date of the transaction. Must be a valid date.
start_time false null Scheduled start time of the transaction. Must be of the formoat xx:xx.
end_time false null Scheduled end time of the transaction. Must be of the formoat xx:xx.
reference false null A string to use as reference for the transaction

Tag a Document

curl --user 'YOUR_API_KEY_ID:YOUR_API_KEY' \
  --url 'https://api.pronotary.com/api/p/v1/transactions/add-tags' \
  --request POST \
  --header 'Content-Type: application/json' \
  --data '{"type": "fullname", "notary_id": 1, "document_id": 306, "page_num": 1, "pos_x": 0, "pos_y": 0, "size_w": 200, "size_h": 1}'
<?php

// Sample data payload
$data = array(
    'type' => 'fullname',
    'notary_id' => 1,
    'document_id' => 306,
    'page_num' => 1,
    'pos_x' => 0,
    'pos_y' => 0,
    'size_w' => 200,
    'size_h' => 1
);

// Convert the data array to JSON
$jsonData = json_encode($data);

// Set up cURL
$ch = curl_init('https://api.pronotary.com/api/p/v1/transactions/add-tags');

// Set the cURL options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Authorization: Basic ' . base64_encode("YOUR_API_KEY_ID:YOUR_API_KEY")
));

// Execute cURL and get the response
$response = curl_exec($ch);

// Check for cURL errors
if (curl_errno($ch)) {
    echo 'Curl error: ' . curl_error($ch);
}

// Close cURL session
curl_close($ch);

// Output the response
echo $response;

?>
// Sample data payload
const data = {
  type: "fullname",
  notary_id: 1,
  document_id: 306,
  page_num: 1,
  pos_x: 0,
  pos_y: 0,
  size_w: 200,
  size_h: 1,
};

// Make the HTTP request using the fetch API
fetch("https://api.pronotary.com/api/p/v1/transactions/add-tags", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: `Basic ${btoa(`YOUR_API_KEY_ID:YOUR_API_KEY`)}`,
  },
  body: JSON.stringify(data),
})
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error("Error:", error));

Make sure to replace YOUR_API_KEY_ID:YOUR_API_KEY with your API ID and key.

The above request will return a response similar to the following:

{
  "success": true,
  "message": "ok",
  "tag": {
    "type": "fullname",
    "font_color": "#000000",
    "font_family": "free-serief",
    "font_size": 13,
    "border_color": "#ffaa00",
    "page_num": "1",
    "pos_x": "0",
    "pos_y": "0",
    "size_w": "200",
    "size_h": "1",
    "notary_id": "1",
    "document_id": "306",
    "updated_at": "2023-12-01 17:42:08",
    "created_at": "2023-12-01 17:42:08",
    "id": 747
  }
}

Tag a Document

HTTP Request

POST /transactions/add-tags

Request Body Parameters

Parameter Required Default Description
type true null Type of the tag to be added.
notary_id false null ID of the associated notary.
client_id false null ID of the associated client.
document_id false null Document ID where the tag should be placed.
template_id false null Template ID where the tag should be placed.
page_num true null Page number on the document for the tag placement.
pos_x true null X coordinate of the tag (0-800).
pos_y true null Y coordinate of the tag (0-800).
size_w true null Width of the tag (10-800).
size_h true null Height of the tag (1-500).

Available tag types:

Type Description
fullname Field for the full name of a client or notary.
shortname Field for a short or abbreviated name.
signature Space for capturing a signature.
initial Field for capturing initials.
text General text field.
checkmark Checkbox for marking selections.
notaryseal Space for a notary seal.
county Field for county of the client or notary.
state Field for state of the client or notary.
company Field for the company name of the client or notary.
title Field for the title of a client or notary.
ron Field for capturing the Remote Online Notarization (RON) disclaimer.
date-only Field for capturing date information without the time.
date Field for capturing date and time information.
date-day Field for capturing the day of the date.
date-month Field for capturing the month of the date.
date-year Field for capturing the year of the date.
date-short-year Field for capturing a short-form year in the date.
date-time Field for capturing date and time information.
white Field to white out or hide an area in the document.
curl --user 'YOUR_API_KEY_ID:YOUR_API_KEY' \
  --url 'https://api.pronotary.com/api/p/v1/transactions/{TransactionId}/create-auto-link' \
  --request POST \
  --header 'Content-Type: application/json' \
  --data '{"client_id": 1071, "expires_in": 24}'
<?php

$transactionId = 'YOUR_TRANSACTION_ID'; // Replace with actual transaction ID

// Sample data payload
$data = array(
    'client_id' => 1071,
    'expires_in' => 24
);

// Convert the data array to JSON
$jsonData = json_encode($data);

// Set up cURL
$ch = curl_init("https://api.pronotary.com/api/p/v1/transactions/{$transactionId}/create-auto-link");

// Set the cURL options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Authorization: Basic ' . base64_encode("YOUR_API_KEY_ID:YOUR_API_KEY")
));

// Execute cURL and get the response
$response = curl_exec($ch);

// Check for cURL errors
if (curl_errno($ch)) {
    echo 'Curl error: ' . curl_error($ch);
}

// Close cURL session
curl_close($ch);

// Output the response
echo $response;

?>
const transactionId = "YOUR_TRANSACTION_ID"; // Replace with actual transaction ID

// Sample data payload
const data = {
  client_id: 1071,
  expires_in: 24,
};

// Make the HTTP request using the fetch API
fetch(
  `https://api.pronotary.com/api/p/v1/transactions/${transactionId}/create-auto-link`,
  {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: `Basic ${btoa(`YOUR_API_KEY_ID:YOUR_API_KEY`)}`,
    },
    body: JSON.stringify(data),
  }
)
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error("Error:", error));

Make sure to replace YOUR_API_KEY_ID:YOUR_API_KEY with your API ID and key.

The above request will return a response similar to the following:

{
  "success": true,
  "message": "ok",
  "link": "https://api.pronotary.com/client/signin-with-link?tid=247&t=0fa0f70e6dab4c26b2097faf810e92d5d287d858c319ecce75ab7903debf028f"
}

Create Auto Sign-on Link

HTTP Request

POST /transactions/{TransactionId}/create-auto-link

Request URI Parameters

Parameter Required Default Description
TransactionId true null ID of the transaction to create an auto sign-on link for

Request Body Parameters

Parameter Required Default Description
client_id false null ID of the client associated with the link.
expires_in false null Duration of the link's validity in hours (2-48).

Export Transaction Assets

curl --user 'YOUR_API_KEY_ID:YOUR_API_KEY' \
  --url 'https://api.pronotary.com/api/p/v1/transactions/{TransactionId}/export-assets' \
  --request GET
<?php

$transactionId = 'YOUR_TRANSACTION_ID'; // Replace with actual transaction ID

// Set up cURL
$ch = curl_init("https://api.pronotary.com/api/p/v1/transactions/{$transactionId}/export-assets");

// Set the cURL options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Authorization: Basic ' . base64_encode("YOUR_API_KEY_ID:YOUR_API_KEY")
));

// Execute cURL and get the response
$response = curl_exec($ch);

// Check for cURL errors
if (curl_errno($ch)) {
    echo 'Curl error: ' . curl_error($ch);
}

// Close cURL session
curl_close($ch);

// Output the response
echo $response;

?>
const transactionId = "YOUR_TRANSACTION_ID"; // Replace with actual transaction ID

// Make the HTTP request using the fetch API
fetch(
  `https://api.pronotary.com/api/p/v1/transactions/${transactionId}/export-assets`,
  {
    method: "GET",
    headers: {
      Authorization: `Basic ${btoa(`YOUR_API_KEY_ID:YOUR_API_KEY`)}`,
    },
  }
)
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error("Error:", error));

Make sure to replace YOUR_API_KEY_ID:YOUR_API_KEY with your API ID and key.

The above request will return a response similar to the following:

{
  "success": true,
  "fileName": "transaction-219-files.zip",
  "downloadUrl": "https://api.pronotary.com/storage/zips/transaction-219-files.zip"
}

Export notarized documents, audit logs and video recordings of completed transactions.

HTTP Request

GET /transactions/{TransactionId}/export-assets

Request URI Parameters

Parameter Required Default Description
TransactionId true null ID of the transaction

Webhooks

Webhooks can notify your service about events that happen in a notarization transaction. See Types of Events for a description of supported events.

To set up Webhooks, go to Webhooks in the Admin Dashboard.

Only enabled events in a given webhook will be sent to your application. You can use a tool like ngrok to test webhooks in a local or sandbox environment.

Webhook events are sent via POST. Objects in the payload use the same schema as their API resource endpoints.

Example event from webhook:

{
  "eventName": "transaction.updated",
  "payload": {
    "id": 257,
    "reference": null,
    "notary_id": 1,
    "organization_id": 3,
    "session_id": null,
    "action": "notarize",
    "status": "draft",
    "screen_recording": null,
    "created_at": "2023-12-02 19:23:45",
    "updated_at": "2023-12-02 19:23:45",
    "country": null,
    "unique_digit": "61958370",
    "company": null,
    "closing_type": null,
    "property_address": null,
    "address2": null,
    "county": null,
    "state": null,
    "city": null,
    "zip_code": null,
    "id_verification_method": null,
    "schedule_date": null,
    "start_time": null,
    "end_time": null,
    "type": "ron"
  }
}

Best Practices

Sample code for checking signatures:

# We currently do not provide sample code for checking
# signatures in shell scripts.
# Please refer to the PHP and JavaScript examples
# to find guidance for those languages.
<?php
$webhookSignature = $request->headers["ProNotary-Signature"];
$sigParams = [];

foreach (explode(",", $webhookSignature) as $pair) {
    list($key, $value) = explode("=", $pair);
    $sigParams[$key] = $value;
}

if (isset($sigParams['t']) && isset($sigParams['hs'])) {
    $webhookSecret = 'YOUR_WEBHOOK_SECRET';
    $calculatedHmac = hash_hmac('sha256', $sigParams['t'] . '.' . $request->body, $webhookSecret);

    if (hash_equals($calculatedHmac, $sigParams['hs'])) {
        // Handle verified webhook event
    }
}
?>
const sigParams = {};
request.headers["ProNotary-Signature"].split(",").forEach((pair) => {
  const [key, value] = pair.split("=");
  sigParams[key] = value;
});

if (sigParams.t && sigParams.hs) {
  const hmac = crypto
    .createHmac("sha256", "YOUR_WEBHOOK_SECRET")
    .update(`${sigParams.t}.${request.body}`)
    .digest("hex");

  if (crypto.timingSafeEqual(Buffer.from(hmac), Buffer.from(sigParams.hs))) {
    // Handle verified webhook event
  }
}

Handling duplicate events

Occasionally, your webhook endpoints might receive duplicate events. This is primarily due to the nature of network connectivity. To address this, we strongly recommend implementing idempotent handling for your event processing. One way of doing this involves logging processed events and incorporating logic to skip the processing of already-logged events.

Checking Signatures

Requests from webhooks will contain a ProNotary-Signature header with an HMAC. You should check that any request is authentic and safe to process by comparing this value with your own digest, computed from the request body and your webhook secret. Your webhook secret can be found in the Webhooks section of the Admin Dashboard.

The ProNotary-Signature header contains two comma-separated key-value pairs encoding information about the request. The first key-value pair will be in the form t=unix_timestamp and represents the unix time that the request was sent. The second key-value pair will be in the form hs=signature, where the signature is computed from your webhook secret and a dot-separated string composed of the unix timestamp joined with the request body.

Types of Events

Events are actions in ProNotary that you can use to trigger Webhooks.

The following is a list of all the events that currently may be emitted by ProNotary.

Events

transaction.created payload is a Transaction
Occurs whenever a transaction is created.

transaction.updated payload is a Transaction
Occurs whenever a transaction is updated.

transaction.completed payload is a Transaction
Occurs whenever a transaction is completed.

document.locked payload is a Document
Occurs whenever a document is locked.

credential.success payload is a Client
Occurs whenever a client passes a credential analysis check.

credential.failed payload is a Client
Occurs whenever a client fails a credential analysis check.

kba.success payload is a Client
Occurs whenever a client passes a Knowledge-Based Authentication (KBA) check.

kba.failed payload is a Client
Occurs whenever a client fails a KBA check.