Opens a document you were asked to sign, using your signing link.
Opens a document you were asked to sign, using your signing link.
GET /v1/esign/o/{org}/sign/{token}
| Address | https://api.hanzo.ai/v1/esign/o/{org}/sign/{token} |
| Method | GET |
| Operation | get_esign_o_by_org_sign_by_token |
| Auth | Authorization: Bearer $HANZO_API_KEY |
Opens a document you were asked to sign, using your signing link.
It answers the document, the recipient the link identifies, the fields THAT recipient must fill, and the PDF to display. The first open also marks the recipient as having opened it and records that on the audit trail, so this read has a side effect by design.
This door takes NO account: the signing token is the entire credential, and it names the recipient, so a signer sees only their own fields and never the other recipients' tokens. The token resolves to its owning tenant FIRST, before any per-tenant store is opened, and the org segment is only checked against that answer. An unknown or wrong-org token is one and the same 404, never a hint that some other document exists.
Request
2 fields.
| Field | In | Type | Required | Description |
|---|---|---|---|---|
org | path | string | yes | |
token | path | string | yes |
Response
| Status | Body | Meaning |
|---|---|---|
200 | esignSession | ok |
200 body — 23 fields.
| Field | In | Type | Always | Description |
|---|---|---|---|---|
document | body | esignState | — | |
document.id | body | string | — | ID is the document id. |
document.status | body | string | — | Status is PENDING while it is out for signature. |
document.title | body | string | — | Title is the document's name. |
fields | body | esignField[] | — | Fields is only the fields this recipient must fill — never another party's, so the layout a signer sees cannot reveal what anyone else was asked for. |
fields[].customText | body | string | — | CustomText is the value a non-signature field was filled with, empty until it is. |
fields[].fieldMeta | body | any | — | FieldMeta is the caller's own metadata for this field, stored verbatim at placement and never interpreted. |
fields[].height | body | number | — | Height is the field's height, -1 when the renderer is to choose one. |
fields[].id | body | string | — | ID is the field id. |
fields[].inserted | body | boolean | — | Inserted is whether this field has been filled in. |
fields[].page | body | number | — | Page is the 1-based page the field sits on. |
fields[].positionX | body | number | — | PositionX is the field's horizontal position on that page. |
fields[].positionY | body | number | — | PositionY is the field's vertical position on that page. |
fields[].recipientId | body | string | — | RecipientID is who must fill this field. |
fields[].type | body | string | — | Type is what the field collects — SIGNATURE, DATE, NAME, EMAIL, TEXT and the rest. |
fields[].width | body | number | — | Width is the field's width, -1 when the renderer is to choose one. |
pdfBase64 | body | string | — | PdfBase64 is the PDF to display, base64-encoded. |
recipient | body | esignSigner | — | |
recipient.email | body | string | — | Email is the address the link was issued to. |
recipient.id | body | string | — | ID is the recipient id. |
recipient.name | body | string | — | Name is the display name recorded for them, empty when none was given. |
recipient.role | body | string | — | Role is the role they were added with. |
recipient.signingStatus | body | string | — | SigningStatus is NOT_SIGNED until they finish or decline. |
Failure carries the platform error shape — see Errors.
Examples
hanzo esign o sign get <org> <token>import { Configuration, EsignApi } from 'hanzoai';
const api = new EsignApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.getEsignOByOrgSignByToken({ org: 'org', token: 'token' });from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import EsignApi
client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = EsignApi(client).get_esign_o_by_org_sign_by_token(org='org', token='token')cfg := cloud.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := cloud.NewAPIClient(cfg)
resp, _, err := client.EsignAPI.GetEsignOByOrgSignByToken(context.Background()).Execute()
if err != nil {
return err
}use hanzo_cloud::apis::{configuration::Configuration, esign_api};
let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();
let result = esign_api::get_esign_o_by_org_sign_by_token(&cfg, Default::default()).await?;import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.EsignApi;
ApiClient client = new ApiClient();
client.setRequestInterceptor(b -> b.header("Authorization", "Bearer " + System.getenv("HANZO_API_KEY")));
var result = new EsignApi(client).getEsignOByOrgSignByToken();The method above is the one at the current release of the document. [email protected] (PyPI) was generated from an earlier release, where this operation carried a different id, so it spells the method differently — regenerating the clients is what makes the two agree. SDKs →
curl https://api.hanzo.ai/v1/esign/o/<org>/sign/<token> \
-H "Authorization: Bearer $HANZO_API_KEY"The door reaches esign through the esign tool, which names its 9 operations with its own verbs — this one among them, under a name only the door declares. describe explains any of them:
curl -X POST https://api.hanzo.ai/v1/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "describe",
"arguments": {
"op": "list_esign_documents"
}
}
}'How is this guide?