InkSeal · Schema
EnvelopeDetail
One envelope in full, as `GET /envelopes/{envelopeId}` publishes it.
E-SignatureDeveloper APICredit Pricing
Properties
| Name | Type | Description |
|---|---|---|
| id | string | |
| status | object | |
| subject | stringnull | |
| message | stringnull | Body text carried in the invitation email. |
| signingOrder | string | |
| emailVerification | boolean | Whether a signer must pass an emailed one-time code before signing. |
| template | object | |
| document | object | |
| signers | array | |
| readiness | object | |
| values | object | |
| completedPdfHash | stringnull | SHA-256 of the executed PDF. Null until the envelope completes. |
| sentAt | stringnull | |
| completedAt | stringnull | |
| expiresAt | stringnull | |
| createdAt | string | |
| pendingApproval | objectnull | The approval a person still has to give before this draft is sent, on a workspace whose `agentSendApproval` setting is `required`. Null on every other envelope. This is what an agent polls after `send |
| activeStep | integernull | The step whose signers may act now, or null once every signer has signed. |
| steps | array | The routing chain, however the envelope was created. |
| creditCost | integer | Credits sending this envelope costs: one for the envelope, one for each signer who is not the sender, and one more when `emailVerification` is on. An unmetered workspace is quoted the same price and c |
| creditLines | array | The same total broken into its lines. |
| attachments | array | Unsigned files carried by signing request emails, in caller order. |
| publicLinkId | stringnull | The originating public link id, or null. |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/inkseal-net/json-schema/inkseal-net-envelope-detail-schema.json",
"title": "EnvelopeDetail",
"description": "One envelope in full, as `GET /envelopes/{envelopeId}` publishes it.",
"x-generated": "2026-11-12",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/inkseal-net-openapi.json#/components/schemas/EnvelopeDetail",
"type": "object",
"required": [
"id",
"status",
"subject",
"message",
"signingOrder",
"emailVerification",
"template",
"document",
"signers",
"readiness",
"values",
"completedPdfHash",
"sentAt",
"completedAt",
"expiresAt",
"createdAt",
"pendingApproval",
"activeStep",
"steps",
"creditCost",
"creditLines",
"attachments",
"publicLinkId"
],
"properties": {
"id": {
"type": "string"
},
"status": {
"$ref": "#/$defs/EnvelopeStatus"
},
"subject": {
"type": [
"string",
"null"
]
},
"message": {
"type": [
"string",
"null"
],
"description": "Body text carried in the invitation email."
},
"signingOrder": {
"type": "string",
"enum": [
"parallel",
"sequential"
]
},
"emailVerification": {
"type": "boolean",
"description": "Whether a signer must pass an emailed one-time code before signing."
},
"template": {
"$ref": "#/$defs/EnvelopeTemplateProvenance"
},
"document": {
"$ref": "#/$defs/EnvelopeDocumentSummary"
},
"signers": {
"type": "array",
"items": {
"$ref": "#/$defs/SignerDetail"
}
},
"readiness": {
"$ref": "#/$defs/EnvelopeReadiness"
},
"values": {
"$ref": "#/$defs/NamedFieldValues"
},
"completedPdfHash": {
"type": [
"string",
"null"
],
"description": "SHA-256 of the executed PDF. Null until the envelope completes."
},
"sentAt": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"completedAt": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"expiresAt": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"pendingApproval": {
"type": [
"object",
"null"
],
"description": "The approval a person still has to give before this draft is sent, on a workspace whose `agentSendApproval` setting is `required`. Null on every other envelope. This is what an agent polls after `sendEnvelope` answers `pending_approval`: the block clears and the status leaves `draft` once a person approves.",
"required": [
"id",
"requestedBy",
"requestedAt",
"expiresAt"
],
"additionalProperties": false,
"properties": {
"id": {
"type": "string",
"description": "The approval's public id, as returned by `sendEnvelope`."
},
"requestedBy": {
"type": [
"string",
"null"
],
"description": "The agent identity of the credential that asked."
},
"requestedAt": {
"type": "string",
"format": "date-time"
},
"expiresAt": {
"type": "string",
"format": "date-time",
"description": "When the request lapses if nobody answers it."
}
}
},
"activeStep": {
"type": [
"integer",
"null"
],
"description": "The step whose signers may act now, or null once every signer has signed."
},
"steps": {
"type": "array",
"description": "The routing chain, however the envelope was created.",
"items": {
"$ref": "#/$defs/EnvelopeSigningStep"
}
},
"creditCost": {
"type": "integer",
"description": "Credits sending this envelope costs: one for the envelope, one for each signer who is not the sender, and one more when `emailVerification` is on. An unmetered workspace is quoted the same price and charged nothing."
},
"creditLines": {
"type": "array",
"description": "The same total broken into its lines.",
"items": {
"$ref": "#/$defs/CreditLine"
}
},
"attachments": {
"type": "array",
"items": {
"$ref": "#/$defs/EnvelopeAttachment"
},
"description": "Unsigned files carried by signing request emails, in caller order."
},
"publicLinkId": {
"type": [
"string",
"null"
],
"description": "The originating public link id, or null."
}
},
"$defs": {
"CreditLine": {
"type": "object",
"description": "One line of what an envelope costs to send. The envelope line is always present; a signer line appears when the envelope has signers the workspace pays for, and an `otp` line when it asks for a one-time code.",
"required": [
"kind",
"quantity",
"unitCredits",
"credits"
],
"properties": {
"kind": {
"type": "string",
"enum": [
"envelope",
"signer",
"otp"
]
},
"quantity": {
"type": "integer",
"description": "How many units this line charges for."
},
"unitCredits": {
"type": "integer",
"description": "Credits per unit."
},
"credits": {
"type": "integer",
"description": "`quantity` times `unitCredits`."
}
}
},
"EnvelopeAttachment": {
"type": "object",
"required": [
"id",
"filename",
"contentType",
"sizeBytes"
],
"properties": {
"id": {
"type": "string"
},
"filename": {
"type": "string"
},
"contentType": {
"type": "string"
},
"sizeBytes": {
"type": "integer"
}
}
},
"EnvelopeDocumentSummary": {
"type": "object",
"description": "The document the envelope was built from, as the envelope routes publish it: the public id and the original upload filename, nothing else.",
"required": [
"id",
"filename"
],
"properties": {
"id": {
"type": "string",
"description": "Public document id."
},
"filename": {
"type": "string",
"description": "The filename as uploaded."
}
}
},
"EnvelopeReadiness": {
"type": "object",
"description": "Computed send readiness. It is never persisted and may change after a draft edit.",
"required": [
"canSend",
"issues"
],
"properties": {
"canSend": {
"type": "boolean",
"description": "True when no readiness issue blocks sending. Credit availability is separate."
},
"issues": {
"type": "array",
"items": {
"$ref": "#/$defs/ReadinessIssue"
}
}
}
},
"EnvelopeSigningStep": {
"type": "object",
"additionalProperties": false,
"description": "One step of the routing chain. Everyone in it is emailed together.",
"required": [
"step",
"signers"
],
"properties": {
"step": {
"type": "integer",
"minimum": 1
},
"status": {
"type": "string",
"enum": [
"completed",
"active",
"pending"
],
"description": "Where this step sits relative to the step the envelope is on."
},
"signers": {
"type": "array",
"items": {
"type": "string"
},
"description": "Public ids of the signers in this step."
}
}
},
"EnvelopeStatus": {
"type": "string",
"description": "Where the envelope is in its lifecycle. `sending` and `completing` are transient; `completed`, `declined`, `voided`, and `expired` are terminal.",
"enum": [
"draft",
"sending",
"pending",
"completing",
"completed",
"declined",
"voided",
"expired"
]
},
"EnvelopeTemplateProvenance": {
"type": [
"object",
"null"
],
"required": [
"id",
"version"
],
"properties": {
"id": {
"type": [
"string",
"null"
],
"description": "Null after the source template is deleted."
},
"version": {
"type": "integer",
"minimum": 1
}
}
},
"FieldDetail": {
"type": "object",
"description": "A field with its fill state, as `GET /envelopes/{envelopeId}` publishes it. The stored value is never returned; only whether and when it was filled.",
"required": [
"id",
"type",
"required",
"pageIndex",
"filled",
"filledAt"
],
"properties": {
"id": {
"type": "string"
},
"type": {
"$ref": "#/$defs/FieldType"
},
"required": {
"type": "boolean",
"description": "Whether the signer must fill this field to complete."
},
"pageIndex": {
"type": "integer",
"minimum": 0
},
"filled": {
"type": "boolean",
"description": "True once the field carries a value."
},
"filledAt": {
"type": [
"string",
"null"
],
"format": "date-time"
}
}
},
"FieldType": {
"type": "string",
"description": "How the field is filled and rendered. Values are stored as strings; signature and initials use images.",
"enum": [
"signature",
"initials",
"text",
"date",
"checkbox",
"number",
"email",
"select",
"radio",
"textarea"
]
},
"InvalidSenderValueIssue": {
"type": "object",
"required": [
"code",
"fieldId",
"name",
"detail"
],
"properties": {
"code": {
"type": "string",
"enum": [
"invalid_sender_value"
]
},
"fieldId": {
"type": "string"
},
"name": {
"type": [
"string",
"null"
]
},
"detail": {
"type": "string",
"description": "Safe, human-readable validation detail."
}
}
},
"MissingSenderValueIssue": {
"type": "object",
"required": [
"code",
"fieldId",
"name",
"label"
],
"properties": {
"code": {
"type": "string",
"enum": [
"missing_sender_value"
]
},
"fieldId": {
"type": "string"
},
"name": {
"type": [
"string",
"null"
]
},
"label": {
"type": [
"string",
"null"
]
}
}
},
"NamedFieldValues": {
"type": "object",
"description": "Named field values keyed by the stable field name. Unnamed fields are omitted. Values keep their stored string representation; an unfilled field is null.",
"additionalProperties": {
"type": [
"string",
"null"
]
}
},
"NoSignerFieldsIssue": {
"type": "object",
"required": [
"code"
],
"properties": {
"code": {
"type": "string",
"enum": [
"no_signer_fields"
]
}
}
},
"ReadinessIssue": {
"oneOf": [
{
"$ref": "#/$defs/MissingSenderValueIssue"
},
{
"$ref": "#/$defs/InvalidSenderValueIssue"
},
{
"$ref": "#/$defs/UnassignedFieldIssue"
},
{
"$ref": "#/$defs/NoSignerFieldsIssue"
}
]
},
"SignerDetail": {
"type": "object",
"description": "A signer with routing position, lifecycle timestamps, and the fields assigned to them.",
"required": [
"id",
"name",
"email",
"role",
"status",
"order",
"viewedAt",
"signedAt",
"declinedAt",
"declineReason",
"fields",
"identityVerification",
"identityVerifiedAt",
"roleKey"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"email": {
"type": "string",
"format": "email"
},
"role": {
"$ref": "#/$defs/SignerRole"
},
"status": {
"$ref": "#/$defs/SignerStatus"
},
"order": {
"type": "integer",
"minimum": 1,
"description": "Normalized 1-based routing position. On a parallel envelope it is still assigned but does not gate anything."
},
"identityVerification": {
"type": "boolean",
"description": "Whether the sender required this signer to verify a government ID through Stripe Identity."
},
"identityVerifiedAt": {
"type": [
"string",
"null"
],
"format": "date-time",
"description": "When Stripe Identity confirmed the signer's ID. Null until then, and always null when no ID was required."
},
"viewedAt": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"signedAt": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"declinedAt": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"declineReason": {
"type": [
"string",
"null"
],
"description": "What the signer typed when declining, when they gave a reason."
},
"fields": {
"type": "array",
"items": {
"$ref": "#/$defs/FieldDetail"
}
},
"roleKey": {
"type": [
"string",
"null"
],
"pattern": "^[a-z][a-z0-9_]{0,31}$",
"description": "Key of the template role this signer was created for, such as `client`. Null when the envelope was not created from a template or public link, and for signers added to it afterwards. Distinct from `role`, which is what the recipient is asked to do."
}
}
},
"SignerRole": {
"type": "string",
"description": "What the recipient is asked to do. `signer` executes the document and must be assigned at least one field. `approver` approves or declines and may hold fields. `reviewer` acknowledges having read it and may hold none. Defaults to `signer`.",
"enum": [
"signer",
"approver",
"reviewer"
]
},
"SignerStatus": {
"type": "string",
"description": "Where one recipient is. `pending` means not yet invited, which on a sequential envelope is normal for everyone behind the current turn. `signed`, `approved` and `acknowledged` are the three positive terminal states, one per role: a signer signs, an approver approves, a reviewer acknowledges.",
"enum": [
"pending",
"sent",
"viewed",
"signed",
"approved",
"acknowledged",
"declined"
]
},
"UnassignedFieldIssue": {
"type": "object",
"description": "Reserved for forward compatibility. Current persisted envelopes do not produce this issue.",
"required": [
"code",
"fieldId"
],
"properties": {
"code": {
"type": "string",
"enum": [
"unassigned_field"
]
},
"fieldId": {
"type": "string"
}
}
}
}
}
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/inkseal-net-envelope-detail"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.