Authentication
Cache access tokens. OAuth2 tokens are valid for the duration specified inexpires_in
(typically 300 seconds). Cache the token and reuse it across requests. Requesting a new token on
every API call is unnecessary and may be rate-limited by your IDP.
Use the refresh token. When a token expires, use the refresh_token to obtain a new access
token without re-authenticating with your full credentials.
Include a User-Agent. Every request must include a User-Agent header with a non-empty value.
The default user agent for curl or wget may be blocked by the Web Application Firewall:
Request format
Always use valid JSON. The Web Application Firewall validates all JSON before it reaches the API. It will reject requests containing:- Inline comments (
//or/* */) - Trailing commas
- Any other malformed JSON
Document limits
Keep document sizes within these limits to ensure reliable processing:
Large files can affect signing performance depending on the signer’s internet connection. Compress
PDFs where possible before uploading.
All uploaded documents must be valid, conforming files. The API performs best-effort conversions,
but uploading non-standard documents produces undefined behavior.
Error handling
Trust the HTTP status code first. The status code tells you whether a request succeeded or failed:
Read the error body for details. When a
4xx response is returned, the body is an array of
structured error objects:
Resource.Error:parameter. Use the ErrorCode value in your logic -
the ErrorMessage text is for diagnostic purposes only and may change between versions.
Retry strategy. 5xx errors may be transient. Apply exponential backoff for retries. Do not
retry 4xx errors automatically - they indicate a problem with the request itself that must be
fixed first.
Pagination
Some list endpoints return paginated results. Two pagination styles are used: Page-based (Packages, Actors):pageNumber (zero-indexed) and pageSize to navigate through results. Increment pageNumber
until you have retrieved all items or Items in the response is empty.
Token-based (Configuration endpoints):
continuationToken. Pass it in the next request to retrieve the following
page. Stop when no continuationToken is returned.
Package lifecycle
Steps must be performed in order. The following operations are only valid on packages inDraft
status:
- Upload documents
- Add stakeholders
- Create actors and place signing elements
- Set status to
pendingto activate
Pending or later) package will
result in a 409 Conflict error.
Choosing the initiator
Every package has anInitiator: the email address of the user who sends it. The initiator must
be a known user in the WebPortal - an unknown address is rejected with Package.InitiatorInvalid.
By default the package lands in that user’s personal My Documents folder, and the initiator is
the account the package is attributed to in the WebPortal.
Who you choose as the initiator shapes how the package behaves day to day:
A real user. The package appears in that person’s WebPortal account, and they are treated as
its owner. Consider this when a specific employee genuinely owns the signing request and is
expected to manage it from the WebPortal.
A technical (service) user. A dedicated, non-personal account exists only to drive the API.
Consider this for fully API-driven flows: a service account does not leave when an employee
does, so packages are not tied to a personal mailbox that may later be deactivated. For a
hands-off integration, pair the service-user initiator with the controls below so the package is
driven entirely by your system rather than by WebPortal email:
- Set
SuppressNotificationson each actor to stop NSEV emailing them directly (see below). - Set a
CallBackUrlso your system is told about status changes instead of relying on WebPortal notifications - see Callbacks and redirects.
SuppressNotifications is a per-actor setting; its default is false, meaning notifications are
sent. Setting it to true suppresses the package notifications NSEV would send that actor - but
the actor still receives automatic reminders and expiration reminders if those are enabled on the
package.Use ExternalReference
Most objects you create - packages, stakeholders, elements - accept an optionalExternalReference: a free-text value (maximum length 256) that NSEV stores but never uses
itself. Use it to carry your own system’s identifier on the NSEV object, so you can correlate a
package, signer, or field back to the record it came from without maintaining a separate mapping
table.
ExternalReference also surfaces in redirect flows. When an actor finishes and is redirected back
to your application, NSEV appends the stakeholder’s value as ExternalReference and the package’s
value as PackageExternalReference to the redirect URL’s query parameters. Setting meaningful
references therefore lets your return endpoint identify which package and signer just completed -
see Callbacks and redirects for the redirect
parameters and The package model
for which objects carry a reference.
Security
- Store credentials in environment variables or a secrets manager - never in source code or version control
- Use HTTPS for all API calls - plain HTTP is not acceptable
- Request signer action URLs just before redirecting users to them. URLs have a limited lifetime (default: 1 day) and may be single-use depending on your instance configuration
- Rotate credentials if they are accidentally exposed