NextSign API
V3

Migrating from v2

Field-by-field mapping from POST /api/v2/{company}/case/create to POST /v3/api/cases, and every behavioural difference.

This page maps v2 Case Create onto v3 Create a Case and lists the behaviour that differs.

v2 is not deprecated and is not changing. You can migrate case creation to v3 and keep using v2 for listing, updating, forms, documents and webhooks — both surfaces read and write the same data.

Start here

Three changes will affect almost every existing payload:

  1. Unknown fields are rejected. Anything v2 quietly ignored is now a 400. Expect your first v3 request to fail, and read the details array — it names every field at once.
  2. recipients[].signing now defaults to true. In v2 it defaults to false. If you relied on that, set "signing": false explicitly on observers.
  3. Cases expire in 30 days by default, not 90. Send settings.expiresInDays if you depended on v2's default.

Endpoint and envelope

v2v3
URLPOST /api/v2/{company}/case/createPOST /v3/api/cases
Hosthttps://www.nextsign.dkhttps://api.nextsign.dk
Companypath, body, or queryfrom the API key
Body wrapperbody or body.values both acceptedbody only
Success200 { data, notices }201 { case } + Location header
Failure{ errors: [{ message }] }, sometimes with 200{ error, details }, always 4xx

Field mapping

Case

v2v3Note
title or nametitleThe name alias is gone
referenceIdreferenceId
typenot acceptedEvery v3 case is Simple sign
autoSendsettings.autoSend
stateNew: draft creates without sending
folderfolderNow rejects a name that does not exist
rolesremovedAlways taken from the folder
settings.langsettings.language
settings.availability.dayssettings.expiresInDaysDefault changed: 90 → 30
settings.reminders.sendsettings.reminders.send
settings.reminders.amountsettings.reminders.amountNow bounded 120
settings.reminders.daysBetweensettings.reminders.daysBetweenNow bounded 1365
reminderAutoSendsettings.reminders.autoSend
settings.deletionnot availableCompany default applies
settings.allowRecipientsViewOthersnot availableCompany default applies
templatesettings.template
emailtemplate or emailTemplatemessageTemplateIdNow verified to belong to your company
customMessage + messagesettings.messageSending settings.message is enough
usersenderIdNow verified to be a company member
user_emailsenderEmailStill looks a user up, but they must be a company member
user_namenot acceptedThe display name comes from the sender's profile
signingSchemassettings.signingSchemasUnknown values now rejected
tagstags
signingPage.logosettings.logo
integrations.microsoft.returnPathsettings.integrations.microsoft.returnPathMust now begin with /
realtimenot available
presetIdNew: applies your company's preset

Recipients

v2v3Note
group or ordergroupThe order alias is gone
signingsigningDefault changed: falsetrue
templatemessageTemplateId
type: "phone"type: "sms"
everything elseunchanged

Documents

v2v3
file + fileIsBlob: truecontent
file + fileIsBlob: falseurl
document_idnot accepted
documentId + versionId — attach from your document library
name optionalname required

Behaviour differences

Things that will change your results

Cases expire in 30 days by default, not 90. v2's 90 was an API-only outlier; every other part of NextSign uses 30.

recipients[].signing defaults to true. Omitting it in v2 creates a case nobody can sign, with no warning.

The signing page language follows your company, then falls back to Danish. v2 always used Danish for API-created cases regardless of company settings.

Sequential signing works. v2 never set the group cursor on API-created cases, so group ordering did not gate correctly. v3 sets it, and it is returned as activeGroup.

An unknown folder is an error. v2 silently files the case in the default folder — which has a different role list, so the case ends up visible to a different set of colleagues.

Unrecognised file content is rejected — when you send the bytes. v2 stored anything it could not identify as a PDF, so a JPEG became a "PDF" that broke the signing page later. v3 inspects content and rejects anything that is not a PDF or a real .docx. A document sent as a url is still stored by reference and not inspected, in v3 as in v2.

roles cannot be sent. In v2 a client-supplied roles array widens who inside your company can see the case, bypassing the folder's access list.

Sender attribution never guesses silently. With no user, v2 assigns the case to whichever company user sorts first. v3 uses the user you name in senderId or senderEmail; with neither, it falls back to the person who created the key and tells you so in notices. A key with no user behind it is rejected outright.

You cannot set a sender name or email freely. v2 takes user_name and user_email straight from the payload, so a case can claim to come from any address. In v3 those values are read from the named user's NextSign profile.

Things that make failures easier to handle

A 4xx means nothing was created. v2 can return 500 for a case that exists and has already been emailed, because sending happens after the save and is not isolated — retry that and you get a duplicate. v3 has no such window; see Errors.

Send failures are reported, not thrown. A failed email comes back as delivery.email.ok: false on a 201.

One contact failure no longer fails the case. v2 aborts the whole creation if a recipient cannot be written to your contact list.

All validation errors arrive together, each with a field path.

Response differences

v2v3
Case iddata._idcase.id
Signing linkdata.recipients[].urlcase.recipients[].signingUrl
Recipient handledata.recipients[].uidcase.recipients[].uid — and case.recipients[].id is its _id
Document linkdata.documents[].filecase.documents[].url
Signing statusdata.recipients[].signedcase.recipients[].status
Send outcomenot reportedcase.delivery

v3 returns a defined object rather than the raw database document, so signingToken, nextSignKey, encrypted cpr, signer, logs, events, roles and __v are no longer present.

If your integration reads signingToken to build signing links itself, switch to signingUrl. Hand-built links break when the signing domain, language prefix or template number changes — all three are resolved per case on our side.

Worked example

v2:

{
  "title": "Lejeaftale",
  "user_email": "info@example.com",
  "settings": {
    "lang": "da",
    "availability": { "days": 14 },
    "reminders": { "send": true, "amount": 2, "daysBetween": 3 }
  },
  "recipients": [
    { "name": "Andreas", "email": "al@example.com", "signing": true, "order": 0 }
  ],
  "documents": [
    { "name": "Lejekontrakt.pdf", "file": "JVBERi0...", "fileIsBlob": true }
  ]
}

v3:

{
  "title": "Lejeaftale",
  "senderEmail": "anna@example.com",
  "settings": {
    "language": "da",
    "expiresInDays": 14,
    "reminders": { "send": true, "amount": 2, "daysBetween": 3 }
  },
  "recipients": [
    { "name": "Andreas", "email": "al@example.com", "group": 0 }
  ],
  "documents": [
    { "name": "Lejekontrakt.pdf", "content": "JVBERi0..." }
  ]
}

user_email in v2 is a display value. senderEmail in v3 looks up a colleague, so it has to be the address of a NextSign user in your company — a generic info@ mailbox that nobody signs in with is rejected with sender-user-not-found.

Suggested rollout

Create a separate key

Mint a new API key for the v3 integration, so you can revoke it without touching anything else.

Send your existing payload

Post it to /v3/api/cases in the test environment and read the details array. Every wrong field is named at once.

Rename until it passes

Then compare the created case in the dashboard against one made through v2 — folder, sender, signing order, documents.

Move production traffic

Keep the v2 path available to fall back to until you are confident.