The same NDAs over plain JSON at /api/v1: the routes, the envelope every answer comes in, and its errors.

05

Agents and the API

The API reaches the same NDAs as the tools, over plain JSON: the ones you sent and the ones sent to your verified email address. Each tool is one of its routes under another name, so a route and its tool answer the same thing.

Sign in

Send an API token from the Agents page, or the OAuth token of an app you connected, as a bearer token:

GET https://sendnda.com/api/v1/ndas
Authorization: Bearer YOUR_TOKEN
Accept: application/json

The token acts as you. The limit is the one the MCP server has: 120 requests per minute per account, and five new NDAs a minute.

The routes

Each takes the fields its tool takes, as a query string on a GET and as a JSON body otherwise.

RouteToolDoes
GET /api/v1/ndaslist-ndasLists the NDAs you sent and received
POST /api/v1/ndascreate-ndaCreates an NDA and emails both parties at once
GET /api/v1/ndas/{uuid}get-ndaReads one NDA with its agreement text and document_sha256
PATCH /api/v1/ndas/{uuid}amend-ndaChanges the terms of an NDA you sent
POST /api/v1/ndas/{uuid}/recipientset-recipient-detailsFills in your details on an NDA you received
POST /api/v1/ndas/{uuid}/signsign-ndaSigns on your side, once you said so
POST /api/v1/ndas/{uuid}/resendresend-ndaEmails the recipient their link again
DELETE /api/v1/ndas/{uuid}delete-ndaDeletes an NDA you sent, until either of you signs

Signing over the API is the same act as on the page: consent must be true, document_sha256 must be the hash of the text the person read, and the signing record credits the token, as api_token or oauth_token.

The envelope

Every answer is one JSON object. sendnda is the version of this contract, then data on success or error on a failure:

{
  "sendnda": 1,
  "data": { "uuid": "…", "role": "sender", "status": "completed", "next_action": "completed", … }
}

data holds the fields the tools describe: on GET /api/v1/ndas a list of summaries, on the others one NDA.

Errors

{
  "sendnda": 1,
  "error": { "kind": "not_found", "message": "No NDA with this uuid exists on this account. …" }
}

kind is what to branch on; message says what happened in words.

KindStatusMeans
usage400, 401, 403, 409, 422The request was wrong, the token can't do it, or the NDA is past the step it asks for. A 422 carries detail, the messages per field.
not_found404No such route, or no NDA under that uuid you're a party to. Someone else's NDA answers the same as one that doesn't exist.
throttled429A limit is spent. retry_after and the Retry-After header say how many seconds to wait.
source500 and upSend NDA couldn't answer. Ask again later.

Checked against the code on 7 November 2026.