{"_id":"@assinafy/sdk","_rev":"12-34e67fe9645df9b79988c9cc199a6a66","name":"@assinafy/sdk","dist-tags":{"latest":"2.5.1"},"versions":{"1.4.0":{"name":"@assinafy/sdk","version":"1.4.0","keywords":["assinafy","assinafy-api","assinatura-eletronica","assinatura-digital","assinatura","digital-signature","electronic-signature","signature","pdf","webhook","sdk","api-client","typescript","brazil"],"author":{"name":"Assinafy API Team"},"license":"MIT","_id":"@assinafy/sdk@1.4.0","maintainers":[{"name":"billm950","email":"billm@billm.org"}],"homepage":"https://github.com/assinafy/typescript-sdk/#readme","bugs":{"url":"https://github.com/assinafy/typescript-sdk/issues"},"dist":{"shasum":"98b1f9e20746cc970185147140519f444a196b67","tarball":"https://registry.npmjs.org/@assinafy/sdk/-/sdk-1.4.0.tgz","fileCount":7,"integrity":"sha512-NL3ZtPkz33ZlPZul2q7RPpCYO94A6Nom9apXJDYx1AM2GEFWXr+dpGu4sfptSsH4/x7nIuhNmDiuLI8YSnoiIA==","signatures":[{"sig":"MEYCIQCTl2ph6Bwotd/4hElcMJ0KS/k/qUecUxDMMj6NZAyHxAIhALhxGI4HV5iDQqNM5c/YI1qYRXrWXmP92xUdWpa7KDRX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":231584},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"b623b216b55060459f4b2f27a6a6bf2227feb0f9","scripts":{"lint":"eslint src --ext .ts","test":"bun test","build":"tsup src/index.ts --format cjs,esm --dts --clean","release":"bun run typecheck && bun run lint && bun test && bun run build && npm publish --access public && npm publish --registry=https://npm.pkg.github.com","lint:fix":"eslint src --ext .ts --fix","typecheck":"tsc --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"billm950","email":"billm@billm.org"},"repository":{"url":"git+https://github.com/assinafy/typescript-sdk.git","type":"git"},"_npmVersion":"10.8.2","description":"TypeScript SDK for Assinafy API - Digital signature platform","directories":{},"_nodeVersion":"20.20.2","dependencies":{"axios":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","eslint":"^8.0.0","@types/bun":"^1.3.0","typescript":"^5.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.4.0_1779984055433_0.7690392251484262","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@assinafy/sdk","version":"1.5.0","keywords":["assinafy","assinafy-api","assinatura-eletronica","assinatura-digital","assinatura","digital-signature","electronic-signature","signature","pdf","webhook","sdk","api-client","typescript","brazil"],"author":{"name":"Assinafy API Team"},"license":"MIT","_id":"@assinafy/sdk@1.5.0","maintainers":[{"name":"billm950","email":"billm@billm.org"}],"homepage":"https://github.com/assinafy/typescript-sdk/#readme","bugs":{"url":"https://github.com/assinafy/typescript-sdk/issues"},"dist":{"shasum":"8c43e05091599b92ed19b2fc9f90697329f5d45b","tarball":"https://registry.npmjs.org/@assinafy/sdk/-/sdk-1.5.0.tgz","fileCount":7,"integrity":"sha512-9dlN2OwJHtgHVpR26djm8xsQ7Mo15bvbJxBVjdmhlaEPktmJl8zqCJLMlFm3LC+lpjab2gvNjKrpqQwoNdN9WQ==","signatures":[{"sig":"MEYCIQCgC1ECgL1fy39GMyTRVSLvPeEWkXL3yytuwphlW4pmHAIhAMvFUFtApgPuXbZNe13hQ/qorJuxOTQXNw5D3m8OG/WO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@assinafy%2fsdk@1.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":259624},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"b83d0473f10a13b9b1e0abe1f4c91f4920b515f9","scripts":{"lint":"eslint src","test":"bun test","build":"tsup src/index.ts --format cjs,esm --dts --clean","release":"bun run typecheck && bun run lint && bun test && bun run build && npm publish --access public && npm publish --registry=https://npm.pkg.github.com","lint:fix":"eslint src --fix","typecheck":"tsc --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"billm950","email":"billm@billm.org"},"overrides":{"esbuild":"0.27.0"},"repository":{"url":"git+https://github.com/assinafy/typescript-sdk.git","type":"git"},"_npmVersion":"10.9.8","description":"TypeScript SDK for Assinafy API - Digital signature platform","directories":{},"_nodeVersion":"22.22.3","dependencies":{"axios":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","eslint":"^9.0.0","@eslint/js":"^9.0.0","@types/bun":"^1.3.0","typescript":"^5.0.0","typescript-eslint":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.5.0_1780695786421_0.6676871912782494","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@assinafy/sdk","version":"2.0.0","keywords":["assinafy","assinafy-api","assinatura-eletronica","assinatura-digital","assinatura","digital-signature","electronic-signature","signature","pdf","webhook","sdk","api-client","typescript","brazil"],"author":{"name":"Assinafy API Team"},"license":"MIT","_id":"@assinafy/sdk@2.0.0","maintainers":[{"name":"billm950","email":"billm@billm.org"}],"homepage":"https://github.com/assinafy/typescript-sdk/#readme","bugs":{"url":"https://github.com/assinafy/typescript-sdk/issues"},"dist":{"shasum":"c1dd332d3d4adf0c46d2cb953bd9feeaee5c1543","tarball":"https://registry.npmjs.org/@assinafy/sdk/-/sdk-2.0.0.tgz","fileCount":7,"integrity":"sha512-q3CwEgbPsE4W+vMbp0C1Kabtu6VVRINdM5sTm5eUd2VMWLtkmUkolnRlxGXx9cs/OAZ1lkK3SR57fgZvk/LsZw==","signatures":[{"sig":"MEUCIQCDt8KoXy1H1vVblkDs9VEemhdbex26H7h+NBiWLyknkAIgOtNx8x3atyDliGKoaO6zW04k6T2xDta0Idv1nnXRLvw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@assinafy%2fsdk@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":311279},"main":"dist/index.js","type":"commonjs","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./package.json":"./package.json"},"gitHead":"8894ca00037ac80b6698d5199753e79c4fc5083b","scripts":{"lint":"eslint src","test":"bun test","build":"tsup src/index.ts --format cjs,esm --dts --clean","release":"bun run typecheck && bun run lint && bun test && bun run build && npm publish --access public && npm publish --registry=https://npm.pkg.github.com","lint:fix":"eslint src --fix","lint:pkg":"publint --strict && attw --pack .","typecheck":"tsc --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"billm950","email":"billm@billm.org"},"repository":{"url":"git+https://github.com/assinafy/typescript-sdk.git","type":"git"},"_npmVersion":"11.16.0","description":"TypeScript SDK for Assinafy API - Digital signature platform","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"axios":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","eslint":"^9.0.0","publint":"^0.3.21","@eslint/js":"^9.0.0","@types/bun":"^1.3.0","typescript":"^5.0.0","@types/node":"^26.1.1","typescript-eslint":"^8.0.0","@arethetypeswrong/cli":"^0.18.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_2.0.0_1784153052906_0.43333859969527455","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"@assinafy/sdk","version":"2.1.1","keywords":["assinafy","assinafy-api","assinatura-eletronica","assinatura-digital","assinatura","digital-signature","electronic-signature","signature","pdf","webhook","sdk","api-client","typescript","brazil"],"author":{"name":"Assinafy API Team"},"license":"MIT","_id":"@assinafy/sdk@2.1.1","maintainers":[{"name":"billm950","email":"billm@billm.org"}],"homepage":"https://github.com/assinafy/typescript-sdk/#readme","bugs":{"url":"https://github.com/assinafy/typescript-sdk/issues"},"dist":{"shasum":"cb405cabb3a17005d88f7d1a055be17a942ec93a","tarball":"https://registry.npmjs.org/@assinafy/sdk/-/sdk-2.1.1.tgz","fileCount":12,"integrity":"sha512-VLGTDsiMo2XhQCQ4ySTpTm++DhO7/Rmo7YH96/JO9Dv3ACMMMX4Bj66rHTttTIFnNqnJmQOM0OOW+9dRM7a5cA==","signatures":[{"sig":"MEUCIQCqDXQ/LUwiMAe5kORtG4LnAiSaxGV88Klwy4JB79t6IgIgFxSxbm+jAHMfdueFcb54vSw17qZrYZLA6JD3uYP+xHs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@assinafy%2fsdk@2.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":912635},"main":"dist/index.js","type":"commonjs","_from":"file:assinafy-sdk-2.1.1.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./package.json":"./package.json"},"scripts":{"lint":"eslint src scripts --max-warnings=0","test":"bun test","audit":"bun audit","build":"tsup src/index.ts --format cjs,esm --dts --clean","verify":"bun run typecheck && bun run lint && bun run test:coverage && bun run build && bun run lint:pkg","prepack":"bun run build","lint:fix":"eslint src scripts --fix","lint:pkg":"publint --strict && attw --pack .","audit:api":"bun scripts/api-contract-audit.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.scripts.json && tsc --noEmit -p tsconfig.tests.json","test:coverage":"bun test --coverage","prepublishOnly":"bun run verify && bun run audit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a1da692e-6e98-428b-83a7-1f52fd2a5cbc"}},"_resolved":"/home/runner/work/typescript-sdk/typescript-sdk/assinafy-sdk-2.1.1.tgz","overrides":{"esbuild":"0.28.1","brace-expansion":"5.0.9"},"_integrity":"sha512-VLGTDsiMo2XhQCQ4ySTpTm++DhO7/Rmo7YH96/JO9Dv3ACMMMX4Bj66rHTttTIFnNqnJmQOM0OOW+9dRM7a5cA==","repository":{"url":"git+https://github.com/assinafy/typescript-sdk.git","type":"git"},"_npmVersion":"11.17.0","description":"TypeScript SDK for Assinafy API - Digital signature platform","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"axios":"^1.19.0"},"_hasShrinkwrap":false,"packageManager":"bun@1.3.14","devDependencies":{"tsup":"^8.5.1","eslint":"^10.8.0","publint":"^0.3.23","@eslint/js":"^10.0.1","@types/bun":"^1.3.14","typescript":"^6.0.3","@types/node":"^22.20.1","typescript-eslint":"^8.66.0","@arethetypeswrong/cli":"^0.18.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_2.1.1_1787243991322_0.32850590982107497","host":"s3://npm-registry-packages-npm-production"}},"2.1.2":{"name":"@assinafy/sdk","version":"2.1.2","keywords":["assinafy","assinafy-api","assinatura-eletronica","assinatura-digital","assinatura","digital-signature","electronic-signature","signature","pdf","webhook","sdk","api-client","typescript","brazil"],"author":{"name":"Assinafy API Team"},"license":"MIT","_id":"@assinafy/sdk@2.1.2","maintainers":[{"name":"billm950","email":"billm@billm.org"}],"homepage":"https://github.com/assinafy/typescript-sdk/#readme","bugs":{"url":"https://github.com/assinafy/typescript-sdk/issues"},"dist":{"shasum":"8c455acd7f4571f7b789af68869368ef9b7ee15a","tarball":"https://registry.npmjs.org/@assinafy/sdk/-/sdk-2.1.2.tgz","fileCount":12,"integrity":"sha512-JpYViji77LAHwqarOr/ZtM98wSf4fPBsviJZk17cBkJjNDgw26ljYeWF6vyoburVyqXT91XHXLt9pwIZThg09Q==","signatures":[{"sig":"MEUCIQCvj1ONwoCWSkflmbiGHtZWxmqyBbQdg/1F0PAeO2a9bwIgCpFozdXte5bBc8uJBaJqwn4UsGwxJnLlO58p7Gj0jOU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@assinafy%2fsdk@2.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1066015},"main":"dist/index.js","type":"commonjs","_from":"file:assinafy-sdk-2.1.2.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./package.json":"./package.json"},"scripts":{"lint":"eslint src scripts --max-warnings=0","test":"bun test","audit":"bun audit","build":"tsup src/index.ts --format cjs,esm --dts --clean","verify":"bun run typecheck && bun run lint && bun run test:coverage && bun run build && bun run lint:pkg","prepack":"bun run build","lint:fix":"eslint src scripts --fix","lint:pkg":"publint --strict && attw --pack .","audit:api":"bun scripts/api-contract-audit.ts","typecheck":"bun ./node_modules/@typescript/native/bin/tsc --noEmit && bun ./node_modules/@typescript/native/bin/tsc --noEmit -p tsconfig.scripts.json && bun ./node_modules/@typescript/native/bin/tsc --noEmit -p tsconfig.tests.json","test:coverage":"bun test --coverage","prepublishOnly":"bun run verify && bun run audit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a1da692e-6e98-428b-83a7-1f52fd2a5cbc"}},"_resolved":"/home/runner/work/typescript-sdk/typescript-sdk/assinafy-sdk-2.1.2.tgz","overrides":{"esbuild":"0.28.2","brace-expansion":"5.0.9"},"_integrity":"sha512-JpYViji77LAHwqarOr/ZtM98wSf4fPBsviJZk17cBkJjNDgw26ljYeWF6vyoburVyqXT91XHXLt9pwIZThg09Q==","repository":{"url":"git+https://github.com/assinafy/typescript-sdk.git","type":"git"},"_npmVersion":"11.17.0","description":"TypeScript SDK for Assinafy API - Digital signature platform","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"axios":"^1.20.0"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.0","devDependencies":{"tsup":"^8.5.1","eslint":"^10.9.1","publint":"^0.3.24","@eslint/js":"^10.0.1","@types/bun":"^1.4.0","typescript":"^6.0.3","@types/node":"^22.20.1","typescript-eslint":"^8.68.0","@typescript/native":"npm:typescript@^7.0.2","@arethetypeswrong/cli":"^0.18.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_2.1.2_1787793441876_0.9116458175502595","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@assinafy/sdk","version":"2.2.0","keywords":["assinafy","assinafy-api","assinatura-eletronica","assinatura-digital","assinatura","digital-signature","electronic-signature","signature","pdf","webhook","sdk","api-client","typescript","brazil"],"author":{"name":"Assinafy API Team"},"license":"MIT","_id":"@assinafy/sdk@2.2.0","maintainers":[{"name":"billm950","email":"billm@billm.org"}],"homepage":"https://github.com/assinafy/typescript-sdk/#readme","bugs":{"url":"https://github.com/assinafy/typescript-sdk/issues"},"dist":{"shasum":"f2eafd75b967f09ef7a6fdb59948d6dcd31ba62d","tarball":"https://registry.npmjs.org/@assinafy/sdk/-/sdk-2.2.0.tgz","fileCount":12,"integrity":"sha512-UYvfEm2O3YLJQKkwXGTXIAFKCQdd2N0WmFZZOBk1ozV6DhizX+VFO8UXQbfReeljp+obBEP21TM+sg1bzd0KHw==","signatures":[{"sig":"MEUCIBvH/Ux1/+13GJa48ZlCPMG6vRub3JhR0gijYI/9F/FmAiEA35AYuJA4IZ4tfaFdLUF4m3k0WctkW7b52Yt7jF26V8w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@assinafy%2fsdk@2.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1078741},"main":"dist/index.js","type":"commonjs","_from":"file:assinafy-sdk-2.2.0.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./package.json":"./package.json"},"scripts":{"lint":"eslint src scripts --max-warnings=0","test":"bun test","audit":"bun audit","build":"tsup src/index.ts --format cjs,esm --dts --clean","verify":"bun run typecheck && bun run lint && bun run test:coverage && bun run build && bun run lint:pkg","prepack":"bun run build","lint:fix":"eslint src scripts --fix","lint:pkg":"publint --strict && attw --pack .","audit:api":"bun scripts/api-contract-audit.ts","typecheck":"bun ./node_modules/@typescript/native/bin/tsc --noEmit && bun ./node_modules/@typescript/native/bin/tsc --noEmit -p tsconfig.scripts.json && bun ./node_modules/@typescript/native/bin/tsc --noEmit -p tsconfig.tests.json","test:coverage":"bun test --coverage","prepublishOnly":"bun run verify && bun run audit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a1da692e-6e98-428b-83a7-1f52fd2a5cbc"}},"_resolved":"/home/runner/work/typescript-sdk/typescript-sdk/assinafy-sdk-2.2.0.tgz","overrides":{"esbuild":"0.28.2","brace-expansion":"5.0.9"},"_integrity":"sha512-UYvfEm2O3YLJQKkwXGTXIAFKCQdd2N0WmFZZOBk1ozV6DhizX+VFO8UXQbfReeljp+obBEP21TM+sg1bzd0KHw==","repository":{"url":"git+https://github.com/assinafy/typescript-sdk.git","type":"git"},"_npmVersion":"11.17.0","description":"TypeScript SDK for Assinafy API - Digital signature platform","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"axios":"^1.20.0"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.0","devDependencies":{"tsup":"^8.5.1","eslint":"^10.9.1","publint":"^0.3.24","@eslint/js":"^10.0.1","@types/bun":"^1.4.0","typescript":"^6.0.3","@types/node":"^22.20.1","typescript-eslint":"^8.68.0","@typescript/native":"npm:typescript@^7.0.2","@arethetypeswrong/cli":"^0.18.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_2.2.0_1787868496760_0.02280637096625404","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"@assinafy/sdk","version":"2.3.0","keywords":["assinafy","assinafy-api","assinatura-eletronica","assinatura-digital","assinatura","digital-signature","electronic-signature","signature","pdf","webhook","sdk","api-client","typescript","brazil"],"author":{"name":"Assinafy API Team"},"license":"MIT","_id":"@assinafy/sdk@2.3.0","maintainers":[{"name":"billm950","email":"billm@billm.org"}],"homepage":"https://github.com/assinafy/typescript-sdk/#readme","bugs":{"url":"https://github.com/assinafy/typescript-sdk/issues"},"dist":{"shasum":"c35ae33c6e1dc2075d2149199911ba1f07a73f54","tarball":"https://registry.npmjs.org/@assinafy/sdk/-/sdk-2.3.0.tgz","fileCount":13,"integrity":"sha512-rWJ5R+k9zxCeFe21aLO5UYFWDyhoV/arx5S6gFbnoITW9vnB6XIRzvX/EPpfCzO+mItSOHwXEWFP5dVdLNdkug==","signatures":[{"sig":"MEYCIQDeoKbiC603G7IoGmDE0Sx+yYR0bFgj68CV7gm+FLwjygIhAKDyr8+NPzN1aJh2QECe5m6s4zMP1qTtY968UwY399pi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCkzHcsjh3plkyFMOn5qQEkVLrTVXsXKUY8llPGRhoIMwIgI7s2TxW3RKw1S/KC9W+xBNunX/p+TVwk/ozienQffE4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@assinafy%2fsdk@2.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1297398},"main":"dist/index.js","type":"commonjs","_from":"file:assinafy-sdk-2.3.0.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./package.json":"./package.json"},"scripts":{"lint":"eslint src scripts --max-warnings=0","test":"bun test","audit":"bun audit","build":"tsup src/index.ts --format cjs,esm --dts --clean","verify":"bun run typecheck && bun run lint && bun run test:coverage && bun run build && bun run lint:pkg","prepack":"bun run build","lint:fix":"eslint src scripts --fix","lint:pkg":"publint --strict && attw --pack .","audit:api":"bun scripts/api-contract-audit.ts","typecheck":"bun ./node_modules/@typescript/native/bin/tsc --noEmit && bun ./node_modules/@typescript/native/bin/tsc --noEmit -p tsconfig.scripts.json && bun ./node_modules/@typescript/native/bin/tsc --noEmit -p tsconfig.tests.json","test:coverage":"bun test --coverage","prepublishOnly":"bun run verify && bun run audit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a1da692e-6e98-428b-83a7-1f52fd2a5cbc"}},"_resolved":"/home/runner/work/typescript-sdk/typescript-sdk/assinafy-sdk-2.3.0.tgz","overrides":{"esbuild":"0.28.2","brace-expansion":"5.0.9"},"_integrity":"sha512-rWJ5R+k9zxCeFe21aLO5UYFWDyhoV/arx5S6gFbnoITW9vnB6XIRzvX/EPpfCzO+mItSOHwXEWFP5dVdLNdkug==","repository":{"url":"git+https://github.com/assinafy/typescript-sdk.git","type":"git"},"_npmVersion":"11.19.0","description":"TypeScript SDK for Assinafy API - Digital signature platform","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"axios":"^1.20.0"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.0","devDependencies":{"tsup":"^8.5.1","eslint":"^10.9.1","publint":"^0.3.24","@eslint/js":"^10.0.1","@types/bun":"^1.4.0","typescript":"^6.0.3","@types/node":"^22.20.1","typescript-eslint":"^8.68.0","@typescript/native":"npm:typescript@^7.0.2","@arethetypeswrong/cli":"^0.18.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_2.3.0_1789942450742_0.0836958635360332","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"@assinafy/sdk","version":"2.4.0","keywords":["assinafy","assinafy-api","assinatura-eletronica","assinatura-digital","assinatura","digital-signature","electronic-signature","signature","pdf","webhook","sdk","api-client","typescript","brazil"],"author":{"name":"Assinafy API Team"},"license":"MIT","_id":"@assinafy/sdk@2.4.0","maintainers":[{"name":"billm950","email":"billm@billm.org"}],"homepage":"https://github.com/assinafy/typescript-sdk/#readme","bugs":{"url":"https://github.com/assinafy/typescript-sdk/issues"},"dist":{"shasum":"0783ad30dbbbd2b4b4f92f56bec42ef638f70592","tarball":"https://registry.npmjs.org/@assinafy/sdk/-/sdk-2.4.0.tgz","fileCount":13,"integrity":"sha512-NMCl4eM1bpCDpnwRebqSfM91KjwhBIjI8xftWNUrBbCNBvVjcvdE6hBb3rK3n5eeKT0eALYRkXAAhZpRGkEZjg==","signatures":[{"sig":"MEYCIQDv6DCcc7a9UfOr5Zx1IcybI4rwVCWHK0s3fM2xV2i4igIhAJHH7q/4fb7Y27ywBOa2dCpGKbgDLwYVymRfqw1wNY5Y","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD8yJjKJ8J21NajjkL3cMXzMcH/v4yog70ASir+riBIOAIhAKORaF8EZSbU+M/zHLBxEhvuxj8vw8W2tPUab/m+KUFZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@assinafy%2fsdk@2.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1298866},"main":"dist/index.js","type":"commonjs","_from":"file:assinafy-sdk-2.4.0.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./package.json":"./package.json"},"scripts":{"lint":"eslint src scripts --max-warnings=0","test":"bun test","audit":"bun audit","build":"tsup src/index.ts --format cjs,esm --dts --clean","verify":"bun run typecheck && bun run lint && bun run test:coverage && bun run build && bun run lint:pkg","prepack":"bun run build","lint:fix":"eslint src scripts --fix","lint:pkg":"publint --strict && attw --pack .","audit:api":"bun scripts/api-contract-audit.ts","typecheck":"bun ./node_modules/@typescript/native/bin/tsc --noEmit && bun ./node_modules/@typescript/native/bin/tsc --noEmit -p tsconfig.scripts.json && bun ./node_modules/@typescript/native/bin/tsc --noEmit -p tsconfig.tests.json","test:coverage":"bun test --coverage","prepublishOnly":"bun run verify && bun run audit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a1da692e-6e98-428b-83a7-1f52fd2a5cbc"}},"_resolved":"/home/runner/work/typescript-sdk/typescript-sdk/assinafy-sdk-2.4.0.tgz","overrides":{"esbuild":"0.28.2","brace-expansion":"5.0.9"},"_integrity":"sha512-NMCl4eM1bpCDpnwRebqSfM91KjwhBIjI8xftWNUrBbCNBvVjcvdE6hBb3rK3n5eeKT0eALYRkXAAhZpRGkEZjg==","repository":{"url":"git+https://github.com/assinafy/typescript-sdk.git","type":"git"},"_npmVersion":"11.19.0","description":"TypeScript SDK for Assinafy API - Digital signature platform","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"axios":"^1.20.0"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.0","devDependencies":{"tsup":"^8.5.1","eslint":"^10.9.1","publint":"^0.3.24","@eslint/js":"^10.0.1","@types/bun":"^1.4.0","typescript":"^6.0.3","@types/node":"^22.20.1","typescript-eslint":"^8.68.0","@typescript/native":"npm:typescript@^7.0.2","@arethetypeswrong/cli":"^0.18.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_2.4.0_1790010259924_0.4318901509220645","host":"s3://npm-registry-packages-npm-production"}},"2.4.1":{"name":"@assinafy/sdk","version":"2.4.1","keywords":["assinafy","assinafy-api","assinatura-eletronica","assinatura-digital","assinatura","digital-signature","electronic-signature","signature","pdf","webhook","sdk","api-client","typescript","brazil"],"author":{"name":"Assinafy API Team"},"license":"MIT","_id":"@assinafy/sdk@2.4.1","maintainers":[{"name":"billm950","email":"billm@billm.org"}],"homepage":"https://github.com/assinafy/typescript-sdk/#readme","bugs":{"url":"https://github.com/assinafy/typescript-sdk/issues"},"dist":{"shasum":"9147c1030f727cdf6b99c33922f8ec7e9ba07608","tarball":"https://registry.npmjs.org/@assinafy/sdk/-/sdk-2.4.1.tgz","fileCount":13,"integrity":"sha512-fFw/TvJ8w0jD+hYwBNIBToRcppPDPiBzaC5rAcED+ZTsLBbQO67VLz91HVZQT4pljRBmbOC83M1Bnhc9WV7h+A==","signatures":[{"sig":"MEQCIEtpchfR1QLvtyCBXIidC7hym3SM1eOqQuvXjpH0N6ucAiA7+uTKHOTna710xd6WAJTmIFWvWFSpRs9yjnd+c6kgEA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIB4Xx+toNY/gJqvUskjVAWz0+N55vYrRoA7aI7NOWd87AiBznjGfTKUkoz0k6uMWaPzFCJkCUHUlWBiTfRgwAXeccQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@assinafy%2fsdk@2.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1301829},"main":"dist/index.js","type":"commonjs","_from":"file:assinafy-sdk-2.4.1.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./package.json":"./package.json"},"scripts":{"lint":"eslint src scripts --max-warnings=0","test":"bun test","audit":"bun audit","build":"tsup src/index.ts --format cjs,esm --dts --clean","verify":"bun run typecheck && bun run lint && bun run test:coverage && bun run build && bun run lint:pkg","prepack":"bun run build","lint:fix":"eslint src scripts --fix","lint:pkg":"publint --strict && attw --pack .","audit:api":"bun scripts/api-contract-audit.ts","typecheck":"bun ./node_modules/@typescript/native/bin/tsc --noEmit && bun ./node_modules/@typescript/native/bin/tsc --noEmit -p tsconfig.scripts.json && bun ./node_modules/@typescript/native/bin/tsc --noEmit -p tsconfig.tests.json","test:coverage":"bun test --coverage","prepublishOnly":"bun run verify && bun run audit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a1da692e-6e98-428b-83a7-1f52fd2a5cbc"}},"_resolved":"/home/runner/work/typescript-sdk/typescript-sdk/assinafy-sdk-2.4.1.tgz","overrides":{"esbuild":"0.28.2","brace-expansion":"5.0.9"},"_integrity":"sha512-fFw/TvJ8w0jD+hYwBNIBToRcppPDPiBzaC5rAcED+ZTsLBbQO67VLz91HVZQT4pljRBmbOC83M1Bnhc9WV7h+A==","repository":{"url":"git+https://github.com/assinafy/typescript-sdk.git","type":"git"},"_npmVersion":"11.19.0","description":"TypeScript SDK for Assinafy API - Digital signature platform","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"axios":"^1.20.0"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.0","devDependencies":{"tsup":"^8.5.1","eslint":"^10.9.1","publint":"^0.3.24","@eslint/js":"^10.0.1","@types/bun":"^1.4.0","typescript":"^6.0.3","@types/node":"^22.20.1","typescript-eslint":"^8.68.0","@typescript/native":"npm:typescript@^7.0.2","@arethetypeswrong/cli":"^0.18.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_2.4.1_1790205683974_0.45762020942299975","host":"s3://npm-registry-packages-npm-production"}},"2.4.2":{"name":"@assinafy/sdk","version":"2.4.2","keywords":["assinafy","assinafy-api","assinatura-eletronica","assinatura-digital","assinatura","digital-signature","electronic-signature","signature","pdf","webhook","sdk","api-client","typescript","brazil"],"author":{"name":"Assinafy API Team"},"license":"MIT","_id":"@assinafy/sdk@2.4.2","maintainers":[{"name":"billm950","email":"billm@billm.org"}],"homepage":"https://github.com/assinafy/typescript-sdk/#readme","bugs":{"url":"https://github.com/assinafy/typescript-sdk/issues"},"dist":{"shasum":"d6703e1a7b50472b80345cfc0e64665c4948e386","tarball":"https://registry.npmjs.org/@assinafy/sdk/-/sdk-2.4.2.tgz","fileCount":13,"integrity":"sha512-DpSJB7aHhbzBQ4n72ol4YCWx8BjGXiMPef5GGtsOEj36t7Bbz3GbuUkeE9XG4/HgPBpCqglH5ZHI57jYzVdk5A==","signatures":[{"sig":"MEUCIQCfolr6KvVxA5rsdD303mFomC3GnsJ1U8BT4qvP8CczVAIgSFWOen6Y5aJ3kUOGYa3CGbDU96kzYF1Je/8+UzsfV9Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDJ+xINLh8LwqZfyIXzHPsnx3v2EMZ6kstcDXLGMknJRAIgB7vdk+o0bhZgCkZQGd+by2kkKsVCWQXeIvubWdroLec=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@assinafy%2fsdk@2.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1300565},"main":"dist/index.js","type":"commonjs","_from":"file:assinafy-sdk-2.4.2.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./package.json":"./package.json"},"scripts":{"lint":"eslint src scripts --max-warnings=0","test":"bun test","audit":"bun audit","build":"tsup src/index.ts --format cjs,esm --dts --clean","verify":"bun run typecheck && bun run lint && bun run test:coverage && bun run build && bun run lint:pkg","prepack":"bun run build","lint:fix":"eslint src scripts --fix","lint:pkg":"publint --strict && attw --pack .","audit:api":"bun scripts/api-contract-audit.ts","typecheck":"bun ./node_modules/@typescript/native/bin/tsc --noEmit && bun ./node_modules/@typescript/native/bin/tsc --noEmit -p tsconfig.scripts.json && bun ./node_modules/@typescript/native/bin/tsc --noEmit -p tsconfig.tests.json","test:coverage":"bun test --coverage","prepublishOnly":"bun run verify && bun run audit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a1da692e-6e98-428b-83a7-1f52fd2a5cbc"}},"_resolved":"/home/runner/work/typescript-sdk/typescript-sdk/assinafy-sdk-2.4.2.tgz","overrides":{"esbuild":"0.28.2","brace-expansion":"5.0.9"},"_integrity":"sha512-DpSJB7aHhbzBQ4n72ol4YCWx8BjGXiMPef5GGtsOEj36t7Bbz3GbuUkeE9XG4/HgPBpCqglH5ZHI57jYzVdk5A==","repository":{"url":"git+https://github.com/assinafy/typescript-sdk.git","type":"git"},"_npmVersion":"11.19.0","description":"TypeScript SDK for Assinafy API - Digital signature platform","directories":{},"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"axios":"^1.20.0"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.0","devDependencies":{"tsup":"^8.5.1","eslint":"^10.9.1","publint":"^0.3.24","@eslint/js":"^10.0.1","@types/bun":"^1.4.0","typescript":"^6.0.3","@types/node":"^22.20.1","typescript-eslint":"^8.68.0","@typescript/native":"npm:typescript@^7.0.2","@arethetypeswrong/cli":"^0.18.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_2.4.2_1790211030515_0.5174781843586624","host":"s3://npm-registry-packages-npm-production"}},"2.5.0":{"name":"@assinafy/sdk","version":"2.5.0","keywords":["assinafy","assinafy-api","assinatura-eletronica","assinatura-digital","assinatura","digital-signature","electronic-signature","signature","pdf","webhook","sdk","api-client","typescript","brazil"],"author":{"name":"Assinafy API Team"},"license":"MIT","_id":"@assinafy/sdk@2.5.0","maintainers":[{"name":"billm950","email":"billm@billm.org"}],"homepage":"https://github.com/assinafy/typescript-sdk/#readme","bugs":{"url":"https://github.com/assinafy/typescript-sdk/issues"},"dist":{"shasum":"cd7e095699350e52c83137f4d2372b45271d10e8","tarball":"https://registry.npmjs.org/@assinafy/sdk/-/sdk-2.5.0.tgz","fileCount":13,"integrity":"sha512-vAbf3VEZAaJwrfVqaIBjBZ7gYFOB2LtkbvKp2JM4MNVyya9pGV2QMMYn9G+aXgA+9X0CwfiuhsQMc9bxHPGrBw==","signatures":[{"sig":"MEUCIEqEMKu4en/zy4GK04eR0aoIr/+lo7rKCTj/nc0xd9ugAiEAt6AsASW+mXekgwL1lOj47Z7KdIp2Bzf7ZWh3TWJ6430=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCptclllWVVDOzkZBtaniGV1XjZ6HOOvSGYie0JJuD7EAIgNQLrI6lmN+ldmw0iRuuEUXq/FR3inKkaGT4542Z0WuY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@assinafy%2fsdk@2.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1306845},"main":"dist/index.js","type":"commonjs","_from":"file:assinafy-sdk-2.5.0.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./package.json":"./package.json"},"scripts":{"lint":"eslint src scripts --max-warnings=0","test":"bun test","audit":"bun audit","build":"tsup src/index.ts --format cjs,esm --dts --clean","verify":"bun run typecheck && bun run lint && bun run test:coverage && bun run build && bun run lint:pkg","prepack":"bun run build","lint:fix":"eslint src scripts --fix","lint:pkg":"publint --strict && attw --pack .","audit:api":"bun scripts/api-contract-audit.ts","typecheck":"bun ./node_modules/@typescript/native/bin/tsc --noEmit && bun ./node_modules/@typescript/native/bin/tsc --noEmit -p tsconfig.scripts.json && bun ./node_modules/@typescript/native/bin/tsc --noEmit -p tsconfig.tests.json","test:coverage":"bun test --coverage","prepublishOnly":"bun run verify && bun run audit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a1da692e-6e98-428b-83a7-1f52fd2a5cbc"}},"_resolved":"/home/runner/work/typescript-sdk/typescript-sdk/assinafy-sdk-2.5.0.tgz","overrides":{"esbuild":"0.28.2","brace-expansion":"5.0.9"},"_integrity":"sha512-vAbf3VEZAaJwrfVqaIBjBZ7gYFOB2LtkbvKp2JM4MNVyya9pGV2QMMYn9G+aXgA+9X0CwfiuhsQMc9bxHPGrBw==","repository":{"url":"git+https://github.com/assinafy/typescript-sdk.git","type":"git"},"_npmVersion":"11.19.0","description":"TypeScript SDK for Assinafy API - Digital signature platform","directories":{},"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"axios":"^1.20.0"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.0","devDependencies":{"tsup":"^8.5.1","eslint":"^10.9.1","publint":"^0.3.24","@eslint/js":"^10.0.1","@types/bun":"^1.4.0","typescript":"^6.0.3","@types/node":"^22.20.1","typescript-eslint":"^8.68.0","@typescript/native":"npm:typescript@^7.0.2","@arethetypeswrong/cli":"^0.18.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_2.5.0_1790362615878_0.851209356165413","host":"s3://npm-registry-packages-npm-production"}},"2.5.1":{"_id":"@assinafy/sdk@2.5.1","bugs":{"url":"https://github.com/assinafy/typescript-sdk/issues"},"dist":{"shasum":"3b4a851cf683c81d3c21ad7dad09f7e7874ab246","tarball":"https://registry.npmjs.org/@assinafy/sdk/-/sdk-2.5.1.tgz","fileCount":13,"integrity":"sha512-ijNZSmW71bQ7P5MEz1r5rZ/Ug4g7pfAHXukFitmA9/sOJrubWthg8S5VfI049H4kJNH9Sdf6KQ20rGRvpyOQHA==","signatures":[{"sig":"MEUCIQDOVJgFWVRHvDl9kLwLsCgUEqIfH0uf9+XW33SYMuovRQIgL7A9KxctdUPEu/u+O6R2csnlG6R5mVhg/+0AYzuEpBk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIDiEY8x0Xqd7g5RLcCf/J5ZZr8lD8o/x8+YlxaQ5wYR7AiEAhJCCF6+eATJS1rVBsbCWIVv60EZZ8TnObQiDOxxYyho="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@assinafy%2fsdk@2.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1326155},"main":"dist/index.js","name":"@assinafy/sdk","type":"commonjs","_from":"file:assinafy-sdk-2.5.1.tgz","types":"dist/index.d.ts","author":{"name":"Assinafy API Team"},"module":"dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./package.json":"./package.json"},"license":"MIT","scripts":{"lint":"eslint src scripts --max-warnings=0","test":"bun test","audit":"bun audit","build":"tsup src/index.ts --format cjs,esm --dts --clean","verify":"bun run typecheck && bun run lint && bun run test:coverage && bun run build && bun run lint:pkg","prepack":"bun run build","lint:fix":"eslint src scripts --fix","lint:pkg":"publint --strict && attw --pack .","audit:api":"bun scripts/api-contract-audit.ts","typecheck":"bun ./node_modules/@typescript/native/bin/tsc --noEmit && bun ./node_modules/@typescript/native/bin/tsc --noEmit -p tsconfig.scripts.json && bun ./node_modules/@typescript/native/bin/tsc --noEmit -p tsconfig.tests.json","test:coverage":"bun test --coverage","prepublishOnly":"bun run verify && bun run audit"},"version":"2.5.1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a1da692e-6e98-428b-83a7-1f52fd2a5cbc"}},"homepage":"https://github.com/assinafy/typescript-sdk/#readme","keywords":["assinafy","assinafy-api","assinatura-eletronica","assinatura-digital","assinatura","digital-signature","electronic-signature","signature","pdf","webhook","sdk","api-client","typescript","brazil"],"_resolved":"/home/runner/work/typescript-sdk/typescript-sdk/assinafy-sdk-2.5.1.tgz","overrides":{"esbuild":"0.28.2","brace-expansion":"5.0.9"},"_integrity":"sha512-ijNZSmW71bQ7P5MEz1r5rZ/Ug4g7pfAHXukFitmA9/sOJrubWthg8S5VfI049H4kJNH9Sdf6KQ20rGRvpyOQHA==","repository":{"url":"git+https://github.com/assinafy/typescript-sdk.git","type":"git"},"_npmVersion":"11.19.0","description":"TypeScript SDK for Assinafy API - Digital signature platform","directories":{},"maintainers":[{"name":"billm950","email":"billm@billm.org"}],"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"axios":"^1.20.0"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.0","devDependencies":{"tsup":"^8.5.1","eslint":"^10.9.1","publint":"^0.3.24","@eslint/js":"^10.0.1","@types/bun":"^1.4.0","typescript":"^6.0.3","@types/node":"^22.20.1","typescript-eslint":"^8.68.0","@typescript/native":"npm:typescript@^7.0.2","@arethetypeswrong/cli":"^0.18.5"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_2.5.1_1790603688082_0.8033862396015794"}}},"time":{"created":"2026-05-28T16:00:55.164Z","modified":"2026-09-28T13:54:48.574Z","1.4.0":"2026-05-28T16:00:55.599Z","1.5.0":"2026-06-05T21:43:06.604Z","2.0.0":"2026-07-15T22:04:13.103Z","2.1.1":"2026-08-20T16:39:51.487Z","2.1.2":"2026-08-27T01:17:22.079Z","2.2.0":"2026-08-27T22:08:16.909Z","2.3.0":"2026-09-20T22:14:10.834Z","2.4.0":"2026-09-21T17:04:20.031Z","2.4.1":"2026-09-23T23:21:24.079Z","2.4.2":"2026-09-24T00:50:30.614Z","2.5.0":"2026-09-25T18:56:56.001Z","2.5.1":"2026-09-28T13:54:48.199Z"},"bugs":{"url":"https://github.com/assinafy/typescript-sdk/issues"},"author":{"name":"Assinafy API Team"},"license":"MIT","homepage":"https://github.com/assinafy/typescript-sdk/#readme","keywords":["assinafy","assinafy-api","assinatura-eletronica","assinatura-digital","assinatura","digital-signature","electronic-signature","signature","pdf","webhook","sdk","api-client","typescript","brazil"],"repository":{"url":"git+https://github.com/assinafy/typescript-sdk.git","type":"git"},"description":"TypeScript SDK for Assinafy API - Digital signature platform","maintainers":[{"name":"billm950","email":"billm@billm.org"}],"readme":"# @assinafy/sdk\n\n*Português · [Read in English](README.en.md)*\n\nSDK oficial em TypeScript para a [API Assinafy](https://api.assinafy.com.br/v1/docs) — plataforma\nbrasileira de assinatura eletrônica de documentos.\n\nCobre as 93 operações do documento OpenAPI oficial: contas, autenticação, aplicações OAuth 2.1,\nusuários, documentos, assignments, signatários, fluxos do lado do signatário, templates, tags,\ncampos, webhooks, identidade visual, estatísticas e o fluxo de alto nível\n`uploadAndRequestSignatures`. Cinco rotas adicionais de gestão de templates usadas por integrações\nexistentes e dois helpers de URL de navegador são mantidos por compatibilidade.\n\nO mapa operação a operação está em [docs/API_COVERAGE.md](docs/API_COVERAGE.md); as variações por\ndeploy, em [docs/COMPATIBILITY.md](docs/COMPATIBILITY.md).\n\n## Sumário\n\nEste documento vai da instalação ao fluxo completo de assinatura e, depois, ao detalhe de cada\nrecurso. Leia na ordem na primeira vez; use como referência depois.\n\n**Preparação** — [Requisitos](#requisitos) · [Instalação](#instalação) ·\n[Início rápido](#início-rápido) · [Autenticação](#autenticação) ·\n[Aplicações OAuth](#aplicações-oauth) · [Configuração](#configuração)\n([limite de requisições](#limite-de-requisições), [fábricas](#fábricas)) ·\n[Cobertura de endpoints](#cobertura-de-endpoints)\n\n**O fluxo ponta a ponta** — [Ciclo de vida do documento](#ciclo-de-vida-do-documento):\n[envio do PDF](#1-envie-o-pdf) → [signatários](#2-crie-ou-reaproveite-os-signatários-por-e-mail) →\n[orçamento e pedido de assinatura](#3-orce-depois-peça-as-assinaturas) →\n[o lado do signatário](#4-conclua-o-fluxo-do-signatário-por-e-mail) →\n[conclusão e artefatos](#5-acompanhe-a-conclusão-e-baixe-os-artefatos)\n\n**Detalhe por recurso** — [Referência de recursos](#referência-de-recursos):\n[documentos](#documentos) · [signatários](#signatários) · [assignments](#assignments) ·\n[ramos pagos de assinatura](#ramos-pagos-de-assinatura) · [templates](#templates) · [tags](#tags) ·\n[workspaces](#workspaces) · [definições de campo](#definições-de-campo) ·\n[autenticação e chaves de API](#autenticação--gestão-de-chaves-de-api) ·\n[usuário autenticado](#usuário-autenticado) · [webhooks](#webhooks)\n([verificação](#verificação-de-webhooks)) ·\n[endpoints do signatário](#endpoints-do-signatário)\n\n**O restante** — [Helper de alto nível](#helper-de-alto-nível) · [Erros](#erros) ·\n[Ambientes](#ambientes) · [Desenvolvimento](#desenvolvimento) · [Licença](#licença)\n\n## Requisitos\n\n- Node.js 22+ (usa as APIs nativas `FormData` / `Blob` para upload). Os imports CJS e ESM\n  empacotados são testados no 22 (LTS de manutenção), 24 (LTS ativo) e 26 (Current). O Node 20\n  chegou ao fim da vida em abril de 2026 e não é suportado.\n- ou Bun 1.4.0 (versão fixada no desenvolvimento e na CI)\n- HTTPS com TLS 1.2 ou superior, exigido pela API; o Node.js 22+ e o Bun já negociam isso por padrão\n\n## Instalação\n\n```bash\nnpm install @assinafy/sdk\n# ou\nbun add @assinafy/sdk\n```\n\nO pacote é publicado no [npmjs.com](https://www.npmjs.com/package/@assinafy/sdk) e no\n[GitHub Packages](https://github.com/assinafy/typescript-sdk/packages). Para instalar do GitHub\nPackages, adicione ao seu `.npmrc`:\n\n```\n@assinafy:registry=https://npm.pkg.github.com\n//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}\n```\n\n## Início rápido\n\n```ts\nimport { AssinafyClient } from '@assinafy/sdk';\n\nconst baseUrl = process.env.ASSINAFY_BASE_URL ?? 'https://api.assinafy.com.br/v1';\nconst client = new AssinafyClient({\n  apiKey: process.env.ASSINAFY_API_KEY!,\n  accountId: process.env.ASSINAFY_ACCOUNT_ID!,\n  baseUrl,\n});\n\nconst resultado = await client.uploadAndRequestSignatures({\n  source: { filePath: './contrato.pdf' },\n  signers: [\n    { name: 'João Silva', email: 'joao@exemplo.com.br' },\n    { name: 'Maria Souza', email: 'maria@exemplo.com.br' },\n  ],\n  message: 'Por favor, assine este contrato',\n});\n\nconsole.log('ID do documento:', resultado.document.id);\nconsole.log('ID do assignment:', resultado.assignment.id);\n```\n\nEsse caminho usa verificação e notificação por e-mail para todos os signatários. WhatsApp e\ncertificado digital ICP-Brasil têm pré-requisitos e custos próprios — veja\n[Ramos pagos de assinatura](#ramos-pagos-de-assinatura) antes de habilitar qualquer um dos dois.\n\n## Autenticação\n\nA API aceita três credenciais. A escolha depende de **em qual workspace** você está agindo.\n\n| Credencial | Age sobre | Use quando |\n| --- | --- | --- |\n| `apiKey` (`X-Api-Key`) | **Seu próprio** workspace | Você automatiza a sua conta. Recomendada para serviços de back-end. |\n| `token` (`Authorization: Bearer`) | O usuário autenticado | Você obteve uma sessão com `auth.login()`. |\n| Token de acesso OAuth (`Authorization: Bearer`) | O workspace **de outra pessoa**, com autorização dela | Você constrói um app que outras pessoas conectam. Veja [Aplicações OAuth](#aplicações-oauth). |\n\nPrefira `apiKey` para integração servidor a servidor — corresponde ao header `X-Api-Key`\nrecomendado pela Assinafy.\n\n```ts\n// Preferido: header X-Api-Key\nnew AssinafyClient({ apiKey: 'k_xxx', accountId: 'acc_xxx' });\n\n// Token de acesso: Authorization: Bearer <token>\nnew AssinafyClient({ token: 'jwt_xxx', accountId: 'acc_xxx' });\n```\n\nAs credenciais são opcionais na construção. Um cliente sem credenciais usa um transporte separado,\nsem autenticação, para as operações públicas e as que usam código de acesso do signatário — assim\numa chave de API ou token Bearer nunca é anexada por acidente:\n\n```ts\nconst clientePublico = new AssinafyClient({\n  baseUrl: 'https://api.assinafy.com.br/v1',\n});\n\nawait clientePublico.auth.login('eu@exemplo.com.br', 'senha');\nawait clientePublico.documents.getPublic(documentId);\nawait clientePublico.signerDocuments.self(signerAccessCode);\n```\n\nMétodos protegidos continuam exigindo `apiKey` ou `token`; sem credencial, a API devolve o `401`\nnormal.\n\nTodos os transportes do SDK — inclusive os públicos e os por código de acesso — enviam\n`User-Agent: Assinafy-Typescript-SDK/v<VERSÃO>`, onde `<VERSÃO>` é a versão instalada do pacote. O\nvalor exato também é exportado como `SDK_USER_AGENT`.\n\n## Aplicações OAuth\n\nUse OAuth quando o seu produto for conectado **pelos usuários dele** aos workspaces **deles** na\nAssinafy, sem que você jamais tenha a senha ou a chave de API dessas pessoas. Para automatizar o seu\npróprio workspace nada disso é necessário — continue com a chave de API.\n\nRegistre a aplicação no app da Assinafy em **Configurações → Aplicações OAuth → Nova aplicação**.\nVocê define as URIs de redirecionamento (`https://`, sem fragmento, comparadas caractere a\ncaractere), as permissões máximas que a aplicação poderá pedir, e se ela é **confidencial** (roda no\nseu servidor e recebe um `client_secret`) ou **pública** (roda no dispositivo do usuário, só PKCE).\nAplicações não são criadas pela API.\n\nO fluxo passa por dois hosts de propósito: a tela de consentimento fica no servidor de autorização\n(`https://auth.assinafy.com.br`), enquanto os endpoints de token, revogação e userinfo ficam nesta\nAPI. Leia os dois da descoberta em vez de fixá-los no código.\n\n```ts\nimport { AssinafyClient, OAuthError } from '@assinafy/sdk';\n\nconst client = new AssinafyClient();                  // nenhuma credencial necessária\n\n// 1 — antes de redirecionar o usuário. Guarde a requisição inteira na sessão dele:\n//     `state` e `issuer` provam que o callback é seu, `codeVerifier` completa o\n//     PKCE e `nonce` valida o id_token.\nconst requisicao = await client.oauth.createAuthorizationUrl({\n  clientId: process.env.ASSINAFY_CLIENT_ID!,\n  redirectUri: 'https://meuapp.exemplo.com.br/oauth/callback',\n  scopes: ['documents:read', 'documents:write', 'offline_access'],\n});\nsessao.oauth = requisicao;\nresposta.redirect(requisicao.url);                    // navegação de página inteira\n\n// 2 — em https://meuapp.exemplo.com.br/oauth/callback\nconst { code } = client.oauth.readAuthorizationCallback(query, sessao.oauth);\nconst tokens = await client.oauth.exchangeCode({\n  code,\n  codeVerifier: sessao.oauth.codeVerifier,\n  redirectUri: 'https://meuapp.exemplo.com.br/oauth/callback',\n  clientId: process.env.ASSINAFY_CLIENT_ID!,\n  clientSecret: process.env.ASSINAFY_CLIENT_SECRET,   // só aplicações confidenciais\n});\n// → { access_token, token_type: 'Bearer', expires_in: 3600,\n//     scope: 'documents:read documents:write',\n//     refresh_token?, id_token? }\n\n// 3 — um token vale para EXATAMENTE UM workspace: o que o usuário escolheu.\nconst conectado = new AssinafyClient({ token: tokens.access_token });\nconst { data } = await conectado.workspaces.list();\nconst accountId = data[0]?.id;                        // guarde junto com os tokens\n\n// 4 — renove antes de completar uma hora (exige `offline_access`)\nconst renovado = await client.oauth.refreshToken({\n  refreshToken: conexao.refreshToken,\n  clientId: process.env.ASSINAFY_CLIENT_ID!,\n  clientSecret: process.env.ASSINAFY_CLIENT_SECRET,\n});\nawait conexao.save({ refreshToken: renovado.refresh_token });  // ANTES de usar\n\n// 5 — quando o usuário desconectar: revogue o token salvo mais recentemente\nconst atual = await conexao.load();                   // nunca uma cópia aposentada\nawait client.oauth.revokeToken({\n  token: atual.refreshToken,\n  tokenTypeHint: 'refresh_token',\n  clientId: process.env.ASSINAFY_CLIENT_ID!,\n  clientSecret: process.env.ASSINAFY_CLIENT_SECRET,\n});\n```\n\nDescoberta e identidade, quando precisar:\n\n```ts\nawait client.oauth.getProtectedResourceMetadata();    // RFC 9728, na raiz do host da API\nawait client.oauth.getAuthorizationServerMetadata();  // RFC 8414, em auth.assinafy.com.br\nawait client.oauth.getUserInfo(tokens.access_token);  // claims OIDC; exige `openid`\n```\n\n### Permissões (escopos)\n\n| Escopo | Permite ao seu app |\n| --- | --- |\n| `documents:read` | Ler documentos, seus signatários, assignments e atividades |\n| `documents:write` | Criar documentos e enviá-los para assinatura |\n| `templates:read` | Ler templates |\n| `templates:write` | Criar e alterar templates |\n| `account:read` | Ler perfil, tema e logotipo do workspace |\n| `webhooks:write` | Atualizar ou inativar a assinatura de webhooks do workspace |\n| `openid` | Receber um `id_token` identificando o usuário |\n| `profile` | Ler o nome do usuário |\n| `email` | Ler o e-mail do usuário e se está verificado |\n| `offline_access` | Receber um refresh token |\n\nPeça o mínimo: o usuário aprova todos ou nenhum. Leia o `scope` devolvido pelo endpoint de token em\nvez de supor que o pedido foi atendido por inteiro — `offline_access` nunca aparece ali, porque é um\nsinal de requisição, não uma permissão. Faturamento, membros do workspace, credenciais e\nadministração nunca são alcançáveis por um token OAuth, quaisquer que sejam seus escopos.\n\n### O que o SDK garante para você\n\n- Um verificador RFC 7636 (S256) e um `state` novos a cada tentativa.\n- `state` comparado em tempo constante e `iss` conferido (RFC 9207) **antes** de qualquer confiança\n  na resposta.\n- O `issuer` do documento RFC 8414 conferido contra a URL de onde ele veio.\n- `redirect_uri` obrigatoriamente `https://` absoluta e sem fragmento.\n- O indicador de recurso RFC 8707 preenchido com a origem da API configurada e mantido idêntico\n  entre a etapa de autorização e a de token.\n\n### Tratamento de falhas\n\n```ts\ntry {\n  await conectado.documents.upload({ filePath: './contrato.pdf' });\n} catch (erro) {\n  if (erro instanceof ApiError && erro.challenge?.error === 'insufficient_scope') {\n    // Reconecte pedindo erro.challenge.scope — por exemplo 'documents:write'.\n  }\n}\n```\n\n| Situação | O que você vê | O que fazer |\n| --- | --- | --- |\n| O usuário recusou | `OAuthError` com `error: 'access_denied'` em `readAuthorizationCallback` | Nada; avise o usuário |\n| Código usado, expirado (60 s) ou divergente | `OAuthError` `invalid_grant` | Recomece o fluxo de autorização |\n| Refresh token reutilizado ou expirado | `OAuthError` `invalid_grant` | A conexão inteira acabou; peça para reconectar |\n| `client_id`/segredo errado, app desativado | `OAuthError` `invalid_client` | Corrija a configuração; repetir não resolve |\n| Token expirado ou revogado | `ApiError` `401` | Renove; se falhar, peça para reconectar |\n| Falta de permissão | `ApiError` `403` com `challenge.error === 'insufficient_scope'` | Reconecte pedindo `challenge.scope` |\n| `403` sem challenge | `ApiError` `403` | Outro workspace, ou área que OAuth não alcança |\n\nRefresh tokens **rotacionam**: cada renovação devolve um novo e aposenta o anterior, e reutilizar um\ntoken aposentado encerra a conexão inteira. Persista o novo valor antes de usar a resposta, trate um\ntimeout como \"talvez tenha funcionado\" e nunca renove a mesma conexão duas vezes em paralelo. Após\num timeout, releia o token guardado; se ainda for o enviado, nunca o envie de novo — peça ao\nusuário para reconectar. Só uma falha que comprovadamente ocorreu antes do envio (DNS, conexão\nrecusada, handshake TLS) pode ser repetida. Um refresh token vale 30 dias, e cada renovação\ndevolve um novo com mais 30 dias: a conexão só expira se o seu app passar 30 dias sem renová-la, e\naí o usuário precisa conectar de novo. Os endpoints de autorização e token aceitam 50 requisições\npor minuto por IP.\n\nAssistentes de IA como Claude, Claude Code e ChatGPT se conectam à Assinafy pelas próprias\nconfigurações de conector; seus usuários não precisam que você registre nada para eles.\n\n## Configuração\n\n| Opção           | Tipo     | Padrão                           | Descrição |\n| --------------- | -------- | -------------------------------- | --------- |\n| `apiKey`        | string   | —                                | Credencial preferida (enviada como `X-Api-Key`). |\n| `token`         | string   | —                                | Token de acesso (enviado como `Authorization: Bearer`). Serve também para tokens OAuth. |\n| `accountId`     | string   | —                                | ID padrão da conta / workspace. |\n| `baseUrl`       | string   | `https://api.assinafy.com.br/v1` | Base absoluta da API, sem credenciais, query ou fragmento. Precisa ser `https`, salvo em loopback. |\n| `webhookSecret` | string   | —                                | Segredo HMAC opcional usado pelo `WebhookVerifier`; veja a [ressalva de contrato](docs/COMPATIBILITY.md#webhook-signature-verification-is-not-in-the-openapi-contract). |\n| `timeout`       | number   | `30000`                          | Timeout da requisição, em milissegundos. |\n| `maxRetries`    | number   | `2`                              | Retenta automaticamente respostas `429` elegíveis, respeitando `Retry-After`. `0` desativa. |\n| `logger`        | `Logger` | no-op                            | Logger opcional `{debug,info,warn,error}`. |\n\n### Limite de requisições\n\nEm um HTTP `429` o cliente retenta até `maxRetries` vezes, aguardando o `Retry-After` (ou\n`X-Rate-Limit-Reset`) devolvido pelo servidor antes de cada tentativa. A repetição automática vale\napenas para `GET`, `HEAD`, `OPTIONS` e `DELETE`, que são seguros de repetir. `GET /sign` fica de\nfora porque registra que o signatário visualizou o assignment. Escritas não são repetidas por\npadrão. Um `Idempotency-Key` não vazio inscreve uma requisição customizada na repetição do SDK, mas\nele **não** faz parte do contrato OpenAPI atual: confirme antes que a rota alvo de fato deduplica\nessa chave no servidor. Nenhum outro status é retentado.\n\n### Fábricas\n\n```ts\n// Fábrica posicional\nconst client = AssinafyClient.create('chave-de-api', 'id-da-conta');\n\n// A partir de um objeto simples (aceita chaves snake_case ou camelCase)\nconst client = AssinafyClient.fromConfig({\n  api_key: process.env.ASSINAFY_API_KEY!,\n  account_id: process.env.ASSINAFY_ACCOUNT_ID!,\n});\n```\n\n## Cobertura de endpoints\n\nAs 93 operações documentadas em https://api.assinafy.com.br/v1/docs estão cobertas. A tabela abaixo\né o resumo por recurso; o mapa detalhado por operação está em\n[docs/API_COVERAGE.md](docs/API_COVERAGE.md).\n\n| Recurso | Endpoints |\n| --- | --- |\n| `client.documents` | list, search, upload, details, get, rename, activities, waitUntilReady, download, thumbnail, downloadPage, statuses, delete, verify, createFromTemplate, estimateCostFromTemplate, getPublic, sendToken, listTags, replaceTags, addTags, detachTag, isFullySigned, getSigningProgress |\n| `client.signers` | create, get, list, update, delete, findByEmail |\n| `client.assignments` | list, create, estimateCost, resetExpiration, resendNotification, estimateResendCost, listWhatsAppNotifications |\n| `client.templates` | create, list, get, update, delete, downloadPage |\n| `client.tags` | list, create, update, delete |\n| `client.workspaces` | create, list, get, update, delete, getTheme, downloadLogo, uploadLogo, deleteLogo, getStats |\n| `client.webhooks` | register, get, inactivate, listEventTypes, listDispatches, retryDispatch |\n| `client.fields` | create, list, get, update, delete, validate, validateMultiple, listTypes |\n| `client.oauth` | **getProtectedResourceMetadata**, **getAuthorizationServerMetadata**, **createAuthorizationUrl**, **readAuthorizationCallback**, **exchangeCode**, **refreshToken**, **revokeToken**, **getUserInfo** |\n| `client.auth` | getSocialLoginUrl, getSocialLoginCallbackUrl, login, socialLogin, linkSocialLogin, createApiKey, getApiKey, deleteApiKey, changePassword, requestPasswordReset, resetPassword |\n| `client.users` | getCurrent, getStats, getNotificationPreferences, updateNotificationPreferences |\n| `client.signerDocuments` | getCurrent, list, search, download, signMultiple, declineMultiple, self, acceptTerms, verifyEmail, confirmData, uploadSignature, downloadSignature, getAssignment, sign, decline |\n| `client.webhookVerifier` | verify, extractEvent, getEventType, getEventData |\n\nTodo wrapper HTTP tem tipos de requisição e resposta verificados pelo TypeScript e JSDoc por método,\ncobrindo o payload de rede, o formato de retorno, validação, erros relevantes da API e um exemplo\ncopiável. As declarações acompanham o pacote.\n\n## Ciclo de vida do documento\n\nA integração normal tem uma fase do dono da conta, uma fase do signatário e uma fase final de\nartefatos. O exemplo abaixo mantém todos os signatários no e-mail e usa um assignment `virtual`,\nentão não exige coordenadas de página nem canal pago de notificação.\n\n### 1. Envie o PDF\n\n```ts\nconst enviado = await client.documents.upload({ filePath: './contrato.pdf' });\n```\n\nO corpo multipart oficial contém a parte `file`. O SDK também aceita um nome de exibição (usado como\nnome de arquivo dessa parte) e uma parte JSON `metadata` opcional, para deploys que a aceitem. A\nresposta de sucesso é `IDocumentUploadResponse`:\n\n```ts\n{\n  resource?: string;\n  id: string;\n  account_id: string;\n  template_id: string | null;\n  name: string;\n  status: DocumentStatus;\n  assignment?: IAssignment | null;\n  artifacts: {\n    original: string;\n    certificated?: string;\n    'certificate-page'?: string;\n    pades?: string;\n    bundle?: string;\n    thumbnail?: string;\n  };\n  signing_url?: string;\n  pages: Array<{ id: string; number: number; height: number; width: number; download_url: string }>;\n  tags?: Array<{ id: string; name: string; color?: string | null }>;\n  created_at: string;\n  updated_at: string;\n  is_closed: boolean;\n  decline_reason: string | null;\n  declined_by: ISigner | null;\n}\n```\n\n`DocumentStatus` cobre `uploading`, `uploaded`, `metadata_processing`, `metadata_ready`,\n`pending_signature`, `expired`, `certificating`, `certificated`, `rejected_by_signer`,\n`rejected_by_user` e `failed`.\n\nO envio precisa ser um PDF de no máximo 25 MB e 2.000 páginas. O SDK confere extensão, tamanho e o\ncabeçalho `%PDF-` antes de enviar. Um upload novo pode ter `pages` vazio até o processamento de\nmetadados terminar. Espere antes de criar um assignment `collect`, porque seus campos referenciam\nIDs de páginas renderizadas; um assignment `virtual` pode ser criado imediatamente.\n\n```ts\nconst preparado = await client.documents.waitUntilReady(enviado.id, {\n  maxWaitMs: 30_000,\n  pollIntervalMs: 2_000,\n});\n```\n\n### 2. Crie ou reaproveite os signatários por e-mail\n\n```ts\nconst signatarioA = await client.signers.create({\n  full_name: 'João Silva',\n  email: 'joao@exemplo.com.br',\n});\nconst signatarioB = await client.signers.create({\n  full_name: 'Maria Souza',\n  email: 'maria@exemplo.com.br',\n});\n```\n\nO corpo de rede é `{ full_name, email }`. Cada resposta é um `ISigner`:\n\n```ts\n{\n  resource?: string;\n  id: string;\n  full_name: string;\n  email: string | null;\n  whatsapp_phone_number?: string | null;\n  cpf?: string | null;                // tipo de compatibilidade; a API não devolve\n  has_accepted_terms?: boolean;\n  has_signature?: boolean;            // só na resposta de signers/self\n  has_initial?: boolean;              // só na resposta de signers/self\n  is_signature_reusable?: boolean;    // só na resposta de signers/self\n  metadata?: Record<string, unknown>;\n}\n```\n\nQuando há e-mail, `signers.create()` primeiro procura esse endereço no workspace e reaproveita o\nsignatário correspondente; uma requisição só com nome ou só com telefone sempre cria um novo.\n\n### 3. Orce, depois peça as assinaturas\n\nA estimativa de custo recebe descritores de canal, não IDs de signatário:\n\n```ts\nconst estimativa = await client.assignments.estimateCost(enviado.id, {\n  method: 'virtual',\n  signers: [{}, {}], // `{}` seleciona Email para cada signatário\n});\n\nif (!estimativa.has_sufficient_resources) {\n  throw new Error(estimativa.blocking_reason ?? estimativa.message ?? 'Recursos insuficientes');\n}\n```\n\nA resposta é `ICostEstimate`:\n\n```ts\n{\n  documents: number;\n  credits: number;\n  needs_extra_document: boolean;\n  extra_document_cost: number;\n  total_credits: number;\n  breakdown: Array<{ code: string; name: string; cost: number; quantity?: number; unit_cost?: number }>;\n  document_balance: number;\n  credit_balance: number;\n  has_sufficient_resources: boolean;\n  blocking_reason: 'PendingPayment' | 'InsufficientDocuments' | 'InsufficientCredits' | null;\n  message: string | null;\n}\n```\n\nCrie o assignment por e-mail só depois de aceitar essa estimativa:\n\n```ts\nconst assignment = await client.assignments.create(enviado.id, {\n  method: 'virtual',\n  signers: [\n    { id: signatarioA.id, verification_method: 'Email', notification_methods: ['Email'] },\n    { id: signatarioB.id, verification_method: 'Email', notification_methods: ['Email'] },\n  ],\n  message: 'Por favor, revise e assine',\n  expires_at: '2027-12-31T23:59:00Z',\n});\n```\n\nA requisição devolve um `IAssignment`:\n\n```ts\n{\n  resource?: string;\n  id: string;\n  sender_email?: string;\n  method: 'virtual' | 'collect';\n  expires_at?: string | null;\n  expiration?: string;\n  message?: string | null;\n  signers: IAssignmentSigner[];\n  copy_receivers?: Array<Record<string, unknown>>;\n  items?: IAssignmentItem[];\n  summary?: {\n    signer_count: number;\n    completed_count: number;\n    signers: Array<ISigner & { completed?: boolean }>;\n  };\n  signing_urls?: Array<{ signer_id: string; url: string }>;\n}\n```\n\nAs URLs e as mensagens entregues contêm credenciais do signatário; trate-as como segredo.\n\n### 4. Conclua o fluxo do signatário por e-mail\n\nA Assinafy envia a cada signatário um link com o código de acesso dele e manda o código de\nverificação de uso único pelo canal escolhido. Nenhum dos dois valores é devolvido como campo\nautônomo do lado do dono da conta. Um portal de assinatura próprio precisa obter os dois pelo fluxo\nde entrega ao signatário; não os fabrique nem os registre em log.\n\n```ts\n// Cliente do signatário: nenhuma credencial da conta é necessária nem enviada.\nconst clienteSignatario = new AssinafyClient({ baseUrl });\n\nconst self = await clienteSignatario.signerDocuments.self(accessCode); // ISignerSelf\n\n// Query: signer-access-code=<accessCode>\n// Corpo: { 'verification-code': '<código de seis dígitos>' }\nawait clienteSignatario.signerDocuments.verifyEmail({\n  signerAccessCode: accessCode,\n  verificationCode,\n}); // Promise<void>\n\nconst confirmado = await clienteSignatario.signerDocuments.confirmData(\n  enviado.id,\n  accessCode,\n  { full_name: self.full_name, email: self.email ?? undefined },\n); // ISigner\n\nconst assinavel = await clienteSignatario.signerDocuments.getAssignment(accessCode, true);\n// `getAssignment` devolve IDocumentDetailsResponse e registra que o signatário\n// visualizou o assignment. Não use como simples healthcheck.\n\nawait clienteSignatario.signerDocuments.signMultiple([assinavel.id], accessCode);\n// Corpo de rede: { document_ids: [assinavel.id] }; o reconhecimento não traz dados.\n```\n\nRepita esta fase separadamente para cada signatário, com o código de acesso e o código de uso único\ndele. Os dois signatários deste exemplo compartilham o passo padrão e podem assinar em paralelo.\n\n`signMultiple` serve apenas a assignments `virtual`. Para `collect`, leia `assinavel.assignment.items`\ne chame `sign(documentId, assignmentId, accessCode, entries)` com um array não vazio de\n`{ itemId, fieldId, pageId, value }`. Um signatário virtual precisa confirmar os dados antes de\nassinar. Um signatário `DigitalCertificate` não pode usar `sign`; esse ramo passa pelo fluxo de\ncertificado da Assinafy, descrito em\n[Certificado digital ICP-Brasil](#certificado-digital-icp-brasil).\n\n### 5. Acompanhe a conclusão e baixe os artefatos\n\nAssine o evento `document_ready` para saber da conclusão por evento, ou consulte\n`documents.details(documentId)` até `status === 'certificated'`. As entregas de webhook podem se\nrepetir — use o `id` numérico como chave de idempotência. Concluído:\n\n```ts\nconst documentoFinal = await client.documents.details(enviado.id);\nconst pdfAssinado = await client.documents.download(enviado.id, 'certificated');\nconst paginaCertificado = await client.documents.download(enviado.id, 'certificate-page');\nconst pacoteZip = await client.documents.download(enviado.id, 'bundle');\n\n// Valide um hash de assinatura Assinafy que o seu fluxo tenha extraído.\nconst validacao = await client.documents.verify(documentSignatureHash);\n```\n\n`original`, `certificated` e `certificate-page` são PDFs. `bundle` é um ZIP com esses três artefatos\ne também o `pades` quando o documento teve signatário por certificado ICP-Brasil. O PDF `pades`\nexiste apenas nesses documentos. Um artefato pode devolver `404` antes de terminar de ser gerado.\n`decline_reason` só aparece nos detalhes do documento quando o token pertence a quem criou o\ndocumento.\n\n## Referência de recursos\n\nA maioria dos métodos com escopo de conta aceita um `accountId` opcional que sobrepõe o padrão do\ncliente. Os métodos de workspace `get`, `update`, `delete`, identidade visual e estatísticas sempre\nexigem um ID de conta explícito.\n\n### Documentos\n\n```ts\n// Envio a partir de um caminho de arquivo (recomendado)\nconst doc = await client.documents.upload(\n  { filePath: './contrato.pdf' },\n  { name: 'Contrato de prestação', metadata: { tipo: 'servico' } },\n);\n// `name` e `metadata` são partes multipart de compatibilidade, fora do schema\n// oficial (que só define o arquivo). `name` é opcional e assume o nome do\n// arquivo. A API deriva o nome de exibição do arquivo enviado e acrescenta\n// `.pdf` quando falta, então o documento acima é salvo como\n// 'Contrato de prestação.pdf'. A API translitera acentos\n// ('Contrato de Serviço' → 'Contrato de Servico.pdf').\n// → {\n//   resource: 'document', id: '1031…', account_id: '102d…', template_id: null,\n//   name: 'Contrato de prestacao.pdf', status: 'uploaded',\n//   artifacts: { original: 'https://…/download/original' },\n//   signing_url: 'https://app…/sign/1031…',\n//   pages: [],                 // preenchido quando o status chega a `metadata_ready`\n//   tags: [], is_closed: false, created_at: '2026-…', updated_at: '2026-…'\n// }\n\n// …ou a partir de um Buffer já em memória\nawait client.documents.upload({ buffer, fileName: 'contrato.pdf' });\n\n// Listagem → { data: IDocumentListItem[], meta?: { current_page, per_page, total, last_page } }\nconst { data, meta } = await client.documents.list({ page: 1, 'per-page': 20, sort: 'updated_at' });\n\n// `search` é a alternativa leve a `list`: mesmo formato de item, mas a API não\n// expande `assignment`/`pages`. Prefira-a para buscar por nome.\nconst achados = await client.documents.search({ search: 'contrato', status: 'pending_signature', 'per-page': 20 });\n\nawait client.documents.details(doc.id);\nawait client.documents.activities(doc.id);\nawait client.documents.waitUntilReady(doc.id, { maxWaitMs: 30_000 });\n\n// Renomear. A API responde 400 enquanto o documento está em\n// `metadata_processing`, então chame waitUntilReady() antes em um upload novo.\n// (Passar `name` ao upload() evita tanto a ida extra quanto a corrida.)\nawait client.documents.rename(doc.id, 'Contrato assinado.pdf');\n\nawait client.documents.download(doc.id, 'certificated');    // PDF assinado\nawait client.documents.download(doc.id, 'certificate-page');\nawait client.documents.download(doc.id, 'bundle');          // ZIP\n// `pades` existe apenas quando algum signatário usou DigitalCertificate.\nawait client.documents.download(doc.id, 'pades');\nawait client.documents.thumbnail(doc.id);\nawait client.documents.downloadPage(doc.id, pageId);\n\nawait client.documents.statuses();                          // todos os códigos de status + flag deletable\nawait client.documents.isFullySigned(doc.id);\nawait client.documents.getSigningProgress(doc.id);\nawait client.documents.delete(doc.id);\n\n// Verifique um documento assinado pelo hash de assinatura Assinafy\nawait client.documents.verify('FE32EDDADE7CBDDCBB934E7402047450B0E59C02');\n\n// Endpoints públicos (sem autenticação)\nawait client.documents.getPublic(doc.id);\n// Corpo oficial: { email: 'maria@exemplo.com.br' }\nawait client.documents.sendToken(doc.id, 'maria@exemplo.com.br');\n\n// Sobrecarga explícita de compatibilidade para deploys mais antigos:\n// { recipient: '+5548999990000', channel: 'whatsapp' }\nawait client.documents.sendToken(doc.id, '+5548999990000', 'whatsapp');\n\n// O contrato OpenAPI atual exige IDs de tags já existentes.\nconst tagContratos = await client.tags.create({ name: 'Contratos' });\nconst tagTrimestre = await client.tags.create({ name: '2026-T1' });\nconst tagUrgente = await client.tags.create({ name: 'Urgente' });\nawait client.documents.listTags(doc.id);\nawait client.documents.replaceTags(doc.id, [tagContratos.id, tagTrimestre.id]); // [] desanexa tudo\nawait client.documents.addTags(doc.id, [tagUrgente.id]);                          // acrescenta\nawait client.documents.detachTag(doc.id, tagUrgente.id); // → { detached: true }\n```\n\nOs uploads são validados localmente: só arquivos `.pdf` de até 25 MB cujos bytes começam com o\ncabeçalho mágico (`%PDF-`) são aceitos. A API também limita o documento a 2.000 páginas.\n\nAs URLs de página e de artefato embutidas nas respostas JSON continuam exigindo a mesma autenticação\nde conta das operações de download. Prefira `documents.downloadPage()` e `documents.download()`,\nque aplicam a credencial e devolvem um `Buffer`. `bundle` contém `original`, `certificated` e\n`certificate-page`, mais o `pades` quando existir.\n\nAs listagens devolvem `{ data, meta }`, com `meta` preenchido a partir dos headers\n`X-Pagination-*`. Dois comportamentos da API merecem atenção porque são silenciosos, não erros:\n\n- Só o `per-page` com hífen é lido. `per_page` é aceito e ignorado, caindo para 20 linhas — por isso\n  o SDK reescreve `per_page` como `per-page` em toda listagem, e um `per-page` explícito vence\n  quando os dois são enviados.\n- `per-page` é limitado a **50**. Pedir 100 devolve 50 linhas com `200`. A constante exportada\n  `MAX_LIST_PAGE_SIZE` é esse teto; pagine com `page` em vez de pedir páginas maiores, e confie no\n  `meta.per_page` mais do que no valor pedido.\n\n### Signatários\n\n```ts\nawait client.signers.create({\n  full_name: 'João Silva',\n  email: 'joao@exemplo.com.br',\n  cpf: '123.456.789-00', // entrada de compatibilidade; não dígitos são removidos\n});\n// → { id: '19e6…', full_name: 'João Silva', email: 'joao@exemplo.com.br',\n//     whatsapp_phone_number: null, has_accepted_terms: false }\n// (observação: `cpf` é aceito na entrada, mas a API nunca o devolve)\n\n// Ambos os contatos são opcionais. Um signatário só com nome não pode ser\n// notificado até que um contato seja adicionado.\nawait client.signers.create({ full_name: 'Contato Pendente' });\n\nawait client.signers.get(signerId);\nawait client.signers.list({ page: 1, 'per-page': 50, search: 'joao' });\nawait client.signers.update(signerId, {\n  full_name: 'João da Silva',\n  government_id: '390.533.447-05', // campo oficial de atualização; enviado só com dígitos\n});\nawait client.signers.delete(signerId);\n\nconst existente = await client.signers.findByEmail('joao@exemplo.com.br');\n```\n\nQuando um `email` é informado, `signers.create()` é idempotente por e-mail: reaproveita o signatário\nexistente com o mesmo endereço no workspace. Signatários sem e-mail são sempre criados do zero. Veja\n[Ramos pagos de assinatura](#ramos-pagos-de-assinatura) para signatários só com telefone.\n\n### Assignments\n\n```ts\n// Lista todos os assignments do workspace.\n// → { data: IAssignment[], meta?: { current_page, per_page, total, last_page } }\nconst { data, meta } = await client.assignments.list({ page: 1, 'per-page': 20 });\n\n// Signatários podem ser ids ou objetos — o SDK normaliza para o formato da API.\nawait client.assignments.create(documentId, {\n  method: 'virtual',\n  signers: ['signer-1', 'signer-2'],\n  message: 'Por favor, revise e assine',\n  expires_at: '2027-12-31T23:59:00Z',\n  copy_receivers: ['id-do-signatario-em-copia'],\n});\n\n// Assinatura sequencial: `step` controla a ordem (paralelo dentro de um passo).\nawait client.assignments.create(documentId, {\n  method: 'virtual',\n  signers: [\n    { id: 'signer-1', step: 1 },\n    { id: 'signer-2', step: 2 }, // notificado só depois que o passo 1 terminar\n  ],\n});\n\n// Campos de `collect` usam pixels da imagem de página a 150 DPI, medidos do canto superior esquerdo.\nawait client.assignments.create(documentId, {\n  method: 'collect',\n  signers: [{ id: signerId }],\n  entries: [{\n    page_id: pageId,\n    fields: [{\n      signer_id: signerId,\n      field_id: fieldId,\n      display_settings: {\n        left: 69, top: 282, width: 421, height: 45.86, fontSize: 22,\n        fontFamily: 'Arial', backgroundColor: '#D5EBFF',\n      },\n    }],\n  }],\n});\n\n// Estimativa de custo (o endpoint orça descritores de canal, não IDs) → ICostEstimate\nawait client.assignments.estimateCost(documentId, { signers: [{}] }); // Email padrão\n// → {\n//   documents: 1, credits: 0, needs_extra_document: false, extra_document_cost: 0,\n//   total_credits: 0, breakdown: [], document_balance: 67, credit_balance: 0,\n//   has_sufficient_resources: true, blocking_reason: null, message: null\n// }\n\nawait client.assignments.resetExpiration(documentId, assignmentId, '2027-06-30T00:00:00Z');\n// Só compatibilidade: a requisição publicada exige uma data-hora.\n// Confirme o suporte do destino antes de usar `null` para limpar a expiração.\nawait client.assignments.resetExpiration(documentId, assignmentId, null);\n\nawait client.assignments.resendNotification(documentId, assignmentId, signerId);\n// → { is_sent: true, document_id: '…', signer_id: '…' }\n\nconst custoReenvio = await client.assignments.estimateResendCost(documentId, assignmentId, signerId);\n// Resposta oficial: ICostEstimate. Deploys antigos podem devolver o ramo compacto\n// IResendCostEstimate, com `total` e `has_sufficient_credits`; estreite com\n// `'total_credits' in custoReenvio` antes de ler campos específicos de um ramo.\n```\n\nA resposta de `create` é um `IAssignment`: `{ id, method, signers: [...],\nitems: [{ display_settings, ... }], signing_urls: [{ signer_id, url }], … }`.\n\nPor compatibilidade, o SDK também aceita os payloads antigos `signer_ids` e `signerIds` e os\nreescreve no formato atual `signers: [{ id }]` esperado pela API.\n\n**Cancelar um pedido de assinatura.** A Assinafy não tem endpoint de cancelamento do lado do\nworkspace. Para interromper um pedido pendente, apague o documento (quando o status permitir) ou\npeça que o signatário recuse:\n\n```ts\nawait client.documents.delete(documentId);                                       // lado do workspace\nawait client.signerDocuments.decline(documentId, assignmentId, accessCode, 'Não é mais necessário'); // lado do signatário\n```\n\n### Ramos pagos de assinatura\n\nMantenha o fluxo por e-mail como padrão. Habilite os ramos abaixo apenas depois de confirmar que a\nconta tem o plano ou recurso necessário e que a estimativa de custo é aceitável.\n\nO método de verificação e o de notificação são **acoplados**: envie um, os dois ou nenhum — o lado\nque faltar é inferido. Sem nenhum dos dois, ambos assumem `Email`.\n\n| Verificação | Como o signatário prova quem é | Notificação permitida | Custo por signatário |\n| --- | --- | --- | --- |\n| `Email` *(padrão)* | Código de uso único (OTP) por e-mail | `Email` | Gratuito |\n| `Whatsapp` | Código de uso único (OTP) por WhatsApp | `Whatsapp` | 0,45 crédito (a notificação), só em planos pagos |\n| `DigitalCertificate` | O signatário assina com o **próprio certificado ICP-Brasil — A1 ou A3 —** pela extensão Web PKI, gerando uma assinatura **PAdES qualificada** | `Email` **ou** `Whatsapp` | 2 créditos + a notificação |\n\nApenas um método de notificação por signatário. O SDK recusa uma combinação inválida antes da\nrequisição; a API responderia `400`.\n\n#### Verificação e notificação por WhatsApp\n\nDisponível apenas em assinaturas pagas, a 0,45 crédito por notificação. Crie um signatário só com\ntelefone (ou adicione telefone a um existente) e peça o canal `Whatsapp` explicitamente:\n\n```ts\nconst signatarioTelefone = await client.signers.create({\n  full_name: 'Signatário Mobile',\n  whatsapp_phone_number: '+5511999990000',\n});\n\nconst custoWhatsapp = await client.assignments.estimateCost(documentId, {\n  method: 'virtual',\n  signers: [{ verification_method: 'Whatsapp', notification_methods: ['Whatsapp'] }],\n});\n\nconst assignmentWhatsapp = await client.assignments.create(documentId, {\n  method: 'virtual',\n  signers: [{\n    id: signatarioTelefone.id,\n    verification_method: 'Whatsapp',\n    notification_methods: ['Whatsapp'],\n  }],\n});\n\nconst avisos = await client.assignments.listWhatsAppNotifications(\n  documentId,\n  assignmentWhatsapp.id,\n);\n// IWhatsAppNotification[]:\n// [{ sent_at, header, body, buttons: [{ text, url? }], phone_number, signer_id }]\n```\n\nO helper de alto nível escolhe esse ramo pago automaticamente para um signatário que tenha telefone\ne não tenha e-mail. As URLs dos botões podem conter credenciais do signatário — não registre em log\nnem encaminhe fora do fluxo de assinatura.\n\n#### Certificado digital ICP-Brasil\n\n`DigitalCertificate` exige o recurso **Certificado Digital** na conta (planos Standard e Pro), CPF ou\nCNPJ em `government_id` do signatário, e exatamente **um signatário por certificado naquele passo de\nassinatura**. Custa 2 créditos por signatário, além do custo da notificação escolhida.\n\n**A1 e A3 são mídias de certificado**, escolhidas pelo próprio signatário no navegador na hora de\nassinar: A1 fica em software (um arquivo na máquina) e A3 em hardware (token ou cartão). A API\nmodela as duas com o único valor `DigitalCertificate` — não existe campo `A1`/`A3` a enviar, e a\nassinatura PAdES resultante é qualificada nos dois casos.\n\nUm CPF exige o certificado daquela pessoa (e-CPF, ou e-CNPJ que a nomeie como representante legal);\num CNPJ exige um e-CNPJ da empresa, de qualquer um dos seus representantes.\n\n```ts\nconst signatarioCertificado = await client.signers.update(signerId, {\n  government_id: '390.533.447-05',\n});\n\nconst custoCertificado = await client.assignments.estimateCost(documentId, {\n  method: 'virtual',\n  signers: [{ verification_method: 'DigitalCertificate', notification_methods: ['Email'] }],\n});\n\nawait client.assignments.create(documentId, {\n  method: 'virtual',\n  signers: [{\n    id: signatarioCertificado.id,\n    step: 1,\n    verification_method: 'DigitalCertificate',\n    notification_methods: ['Email'],\n  }],\n});\n```\n\nAntes de abrir o assignment, o signatário precisa confirmar os dados de identidade e aceitar os\ntermos, com `confirmData(..., { has_accepted_terms: true })` ou `acceptTerms()`.\n\nO endpoint comum `sign()` **rejeita** signatários por certificado: a assinatura deles é produzida por\num handshake de dois passos com a extensão Web PKI, pela integração de navegador da Assinafy.\n\n```\nPOST /v1/signers/certificate/start     → data.token   (token da operação Web PKI)\n        ↓  o navegador assina o token com o certificado do signatário\nPOST /v1/signers/certificate/complete  → data.signerName\n```\n\n> Essas duas rotas são extensões implantadas **somente em produção**: o sandbox não as expõe e elas\n> não constam do documento OpenAPI publicado.\n\nConcluído o fluxo, `documents.download(documentId, 'pades')` devolve o artefato PAdES qualificado.\n\n### Templates\n\n`templates.list()` faz parte do documento OpenAPI atual. Integrações existentes também podem usar\ncinco rotas de gestão de templates — `create`, `get`, `update`, `delete` e `downloadPage` — ausentes\ndaquele documento; veja as\n[notas de compatibilidade](docs/COMPATIBILITY.md#template-management-extensions). A caixa do status\nde template varia por deploy; normalize com `template.status.toLowerCase()` antes de comparar.\n\n```ts\n// Cria um template enviando um PDF (multipart). O template começa enviado e\n// fica pronto quando suas páginas são processadas.\nconst criado = await client.templates.create(\n  { filePath: './nda.pdf' },          // ou { buffer, fileName: 'nda.pdf' }\n  { name: 'Template de NDA' },\n);\n// →\n// {\n//   resource: 'template', id: '1032...', name: 'nda.pdf',\n//   document_name: 'nda.pdf', message: null, status: 'Uploaded',\n//   roles: [{ id: '1032...', name: 'TemplateEditor', assignment_type: 'Editor' }],\n//   pages: [], tags: [], created_at: '2026-…', updated_at: '2026-…'\n// }\n\nconst { data, meta } = await client.templates.list({ search: 'NDA', 'per-page': 20 });\nconst template = await client.templates.get(criado.id);   // inclui pages[] + default_document_tags\nawait client.templates.update(criado.id, { name: 'NDA v2', message: 'Por favor, assine' });\nconst primeiraPagina = template.pages?.[0];\nif (primeiraPagina) await client.templates.downloadPage(criado.id, primeiraPagina.id); // → Buffer (JPEG)\nawait client.templates.delete(criado.id);\n\n// Cria um documento a partir de um template já configurado. Uploads novos têm\n// apenas o papel Editor; adicione papéis de signatário no editor da Assinafy antes.\nconst configurado = await client.templates.get(templateId);\nconst papelSignatario = configurado.roles?.find(\n  (papel) => typeof papel.assignment_type === 'string'\n    && papel.assignment_type.toLowerCase() !== 'editor',\n);\nif (!papelSignatario) throw new Error('O template não tem papel de signatário');\nawait client.documents.createFromTemplate(\n  templateId,\n  [{ role_id: papelSignatario.id, id: signerId, verification_method: 'Email', notification_methods: ['Email'] }],\n  { name: 'NDA - João Silva', message: 'Por favor, assine assim que puder.' },\n);\n\n// Estime o custo antes de criar → ICostEstimate\nawait client.documents.estimateCostFromTemplate(templateId, [\n  { role_id: 'role_id', verification_method: 'Email', notification_methods: ['Email'] },\n]);\n// → { documents: 1, total_credits: 0, document_balance: 67, credit_balance: 0,\n//     has_sufficient_resources: true, blocking_reason: null, breakdown: [], … }\n```\n\nOs descritores de signatário de template também aceitam\n`verification_method: 'DigitalCertificate'`, com os mesmos pré-requisitos de\n[Certificado digital ICP-Brasil](#certificado-digital-icp-brasil).\n\nCriar um template apenas envia o PDF e provisiona o papel de editor padrão — configure papéis e\ncampos no editor da Assinafy depois. Os `download_url` dos objetos de página do template são URLs\nprotegidas; prefira `templates.downloadPage()`, que anexa a credencial da API.\n\n### Tags\n\nRótulos com escopo de workspace que podem ser anexados a documentos e templates. Os nomes são únicos\npor workspace (sem diferenciar maiúsculas).\n\n```ts\nawait client.tags.list({ search: 'contrato' });           // ITag[]\nconst tag = await client.tags.create({ name: 'Contratos', color: 'ff8800' });\nawait client.tags.update(tag.id, { name: 'Contratos Comerciais' });\nawait client.tags.update(tag.id, { color: null });        // limpa a cor\nawait client.tags.delete(tag.id);                         // 409 se ainda estiver anexada\nawait client.tags.delete(tag.id, { force: true });        // desanexa de tudo e apaga\n```\n\nAnexe/desanexe tags em um documento específico com `client.documents.listTags / replaceTags /\naddTags / detachTag` (veja [Documentos](#documentos)).\n\n### Workspaces\n\nOs schemas oficiais de criação/atualização definem `name` e `notification_sender_type`. O sandbox\ntambém aceita os campos de cor abaixo; eles ficam mantidos como extensão de compatibilidade\ndocumentada.\n\n```ts\n// As cores são hex de 6 caracteres SEM '#' inicial (ao contrário das tags, que o removem).\n// '#ff0066' é rejeitado — os endpoints de conta querem exatamente 6 caracteres.\nawait client.workspaces.create({\n  name: 'Meu Workspace',\n  notification_sender_type: 'Account',\n  primary_color: 'ff0066',\n  secondary_color: '0066ff',\n});\n// → { id, name, primary_color: 'ff0066', secondary_color: '0066ff', created_at }\nawait client.workspaces.list();\nawait client.workspaces.get(accountId);\nawait client.workspaces.update(accountId, {\n  name: 'Renomeado',\n  notification_sender_type: 'User',\n  primary_color: '112233',\n});\n\n// Identidade visual\nconst tema = await client.workspaces.getTheme(accountId);\nconst logo = await client.workspaces.downloadLogo(accountId); // Buffer\nawait client.workspaces.uploadLogo(accountId, { filePath: './logo.png' });\nawait client.workspaces.uploadLogo(accountId, {\n  buffer: logoBuffer,\n  fileName: 'logo.png',\n  contentType: 'image/png',\n});\nawait client.workspaces.deleteLogo(accountId);\n\n// Últimos 12 meses por padrão; estatísticas diárias exigem um mês YYYY-MM.\nawait client.workspaces.getStats(accountId);\nawait client.workspaces.getStats(accountId, {\n  granularity: 'daily',\n  month: '2026-06',\n});\n\nawait client.workspaces.delete(accountId);\n// `force` cancela uma assinatura paga ativa como parte da exclusão da conta. Não\n// é um atalho geral para outras restrições de exclusão.\nawait client.workspaces.delete(contaRestrita, { force: true });\n```\n\n### Definições de campo\n\nTipos de campo personalizados usados por assignments com método `collect`.\n\n```ts\nawait client.fields.create({ type: 'text', name: 'Número do contrato' });\nawait client.fields.list({ include_inactive: true, include_standard: true });\nawait client.fields.get(fieldId);\nawait client.fields.update(fieldId, { name: 'Nome atualizado' });\nawait client.fields.delete(fieldId);\n\n// Valida um único valor (o código de acesso só é exigido nas chamadas do signatário)\nawait client.fields.validate(fieldId, '400.676.228-36', { signerAccessCode });\n\n// Valida vários valores de uma vez\nawait client.fields.validateMultiple(\n  [\n    { field_id: 'f1', value: '1111111111111' },\n    { field_id: 'f2', value: 'valor@exemplo.com.br' },\n  ],\n  { signerAccessCode },\n);\n\n// Catálogo de todos os tipos de campo reconhecidos pela plataforma\nawait client.fields.listTypes();\n```\n\n### Autenticação / gestão de chaves de API\n\nA maioria das integrações de servidor deve usar `X-Api-Key` diretamente. Use estes endpoints quando\nprecisar abrir uma sessão para uma pessoa. Para apps conectados por terceiros, use\n[Aplicações OAuth](#aplicações-oauth).\n\n```ts\n// OAuth de navegador (rota de compatibilidade): redirecione o usuário para esta URL.\n// O helper de callback devolve a URL de retorno da Assinafy para configurar o\n// provedor; nenhum dos dois segue o redirecionamento.\nconst inicioOauth = client.auth.getSocialLoginUrl('google');\nconst callbackOauth = client.auth.getSocialLoginCallbackUrl();\n\nconst { access_token, user, accounts } = await client.auth.login('eu@exemplo.com.br', 'senha');\nawait client.auth.socialLogin({ provider: 'google', token: 'google-id-token', has_accepted_terms: true });\nawait client.auth.linkSocialLogin({ provider: 'google', token: 'google-id-token' });\n\n// Chave de API pessoal\nawait client.auth.createApiKey('senha-atual');\nawait client.auth.getApiKey();                     // → { api_key: '****...nBNr' } ou null\nawait client.auth.deleteApiKey();\n\n// Ciclo de vida da senha\nawait client.auth.changePassword({ email, password: 'atual', new_password: 'nova' });\nawait client.auth.requestPasswordReset('eu@exemplo.com.br');\nawait client.auth.resetPassword({ email, token: 'tk', new_password: 'nova' });\n```\n\n### Usuário autenticado\n\n```ts\nconst usuario = await client.users.getCurrent();\n// → { id, name, email, telephone, government_id, is_email_verified,\n//     has_accepted_terms, created_at, to_be_deleted_at }\n\n// Funil de documentos entre contas, últimos 12 períodos mensais por padrão.\nconst mensal = await client.users.getStats();\nconst diario = await client.users.getStats({\n  granularity: 'daily',\n  month: '2026-06',\n});\n// Cada linha traz período, totais de envio/remessa/certificação, contagens de\n// notificação por e-mail/WhatsApp/bypass, contagens de verificação por\n// e-mail/WhatsApp/bypass/certificado digital, visualizados e concluídos.\n\nconst preferencias = await client.users.getNotificationPreferences();\nawait client.users.updateNotificationPreferences({\n  SignerDeclined: false,\n  DocumentExpired: false,\n});\n// A atualização é um merge: chaves omitidas mantêm o valor atual. Os dois\n// métodos devolvem o mapa completo de nove preferências.\n```\n\n### Webhooks\n\nTokens OAuth exigem `webhooks:write` para `register()` e `inactivate()`.\n\n```ts\nawait client.webhooks.register({\n  url: 'https://exemplo.com.br/webhooks/assinafy',\n  email: 'admin@exemplo.com.br',\n  is_active: true,\n  // `events` assume o conjunto padrão do SDK, abaixo\n  events: [\n    'document_ready',\n    'document_prepared',\n    'signer_signed_document',\n    'signer_rejected_document',\n    'document_processing_failed',\n  ],\n});\n\nawait client.webhooks.get();          // IWebhookSubscription | null\nawait client.webhooks.inactivate();   // interrompe entregas (não existe rota de exclusão)\nawait client.webhooks.listEventTypes();\nconst historico = await client.webhooks.listDispatches({\n  delivered: false,\n  page: 1,\n  'per-page': 20,\n}); // { data: IWebhookDispatch[], meta?: PaginationMeta }\nconst reenviado = await client.webhooks.retryDispatch(dispatchId); // IWebhookDispatch\n```\n\n`register` envia `{ events, is_active, url, email }` e devolve\n`{ events, is_active, url, email, updated_at? }`. A Assinafy entrega cada evento como um `POST` HTTP\ncom `Content-Type: application/json` e `Connection: close`. Qualquer `2xx` é sucesso. São no máximo\nduas tentativas automáticas, com três segundos de intervalo. Depois de dez eventos falhos\nconsecutivos, a entrega comum é pausada e cerca de 5% dos eventos seguintes são tentados até um dar\ncerto; use `retryDispatch()` para reenviar manualmente na hora. O histórico guarda apenas os\nprimeiros 2.000 caracteres do corpo de resposta do receptor.\n\nCada item do histórico (ou resultado de reenvio) é um `IWebhookDispatch`:\n\n```ts\n{\n  resource?: string;\n  id: string;\n  event: string;\n  activity_id: number;\n  endpoint: string | null;\n  payload: IWebhookPayload | Record<string, unknown> | null;\n  delivered: boolean;\n  http_status: number | null;\n  response_body: string | null;\n  error: string | null;\n  created_at: string;\n  updated_at?: string;\n}\n```\n\nTodo corpo de entrega usa este envelope:\n\n```ts\n{\n  id: number;                         // use para processamento idempotente\n  event: string;\n  message: string | null;\n  payload: Record<string, unknown> | null;\n  origin: { ip?: string; 'user-agent'?: string } | null;\n  created_at: number;                 // segundos Unix\n  subject: { type: 'User' | 'Signer' | 'Account' | 'Document' | 'Template'; [key: string]: unknown };\n  object: { type: 'User' | 'Signer' | 'Account' | 'Document' | 'Template'; [key: string]: unknown };\n  account_id: string;\n}\n```\n\nOs valores por evento são:\n\n| `event` | `subject.type` | `object.type` | chaves de `payload` |\n| --- | --- | --- | --- |\n| `document_uploaded` | `User` | `Document` | — |\n| `document_metadata_ready` | `User` | `Document` | — |\n| `document_prepared` | `User` | `Document` | — |\n| `assignment_created` | `User` | `Document` | `user_name`, `user_email`, `user_telephone` |\n| `document_ready` | `Account` | `Document` | — |\n| `document_processing_failed` | `Account` | `Document` | `error_message` |\n| `signature_requested` | `User` | `Document` | `signer_email`, `signer_full_name` ou `signer_whatsapp_phone_number`, conforme o canal |\n| `signer_created` | `User` | `Signer` | `signer_full_name` |\n| `signer_email_verified` | `Signer` | `Document` | `signer_email` |\n| `signer_whatsapp_verified` | `Signer` | `Document` | `signer_whatsapp_phone_number` |\n| `signer_data_confirmed` | `Signer` | `Document` | `signer_email` |\n| `signer_viewed_document` | `Signer` | `Document` | `signer_full_name` |\n| `signer_signed_document` | `Signer` | `Document` | `signer_full_name` |\n| `signer_rejected_document` | `Signer` | `Document` | `signer_full_name` |\n| `user_rejected_document` | `User` | `Document` | `user_name` |\n| `template_created` | `User` | `Template` | — |\n| `template_processed` | `User` | `Template` | — |\n| `template_processing_failed` | `Account` | `Template` | `error_message` |\n\n`payload`, `subject` e `object` dependem do evento. Aceite campos desconhecidos para compatibilidade\nfutura e só confirme o recebimento depois de um processamento durável e idempotente. Respostas\nnão-`2xx`, timeouts e falhas de conexão contam como entregas falhas. `assignment_created` e\n`document_metadata_ready` não têm ordem garantida. Para entidades de conta, a Assinafy remove a\npropriedade `integration` antes de entregar.\n\n### Verificação de webhooks\n\n`WebhookVerifier` é um utilitário HMAC-SHA256 opcional, para integrações cujo ambiente Assinafy\nforneça um segredo compartilhado e um header de assinatura. O documento OpenAPI oficial atual\n**não** define esquema nem nome de header de assinatura de webhook. Confirme o contrato de entrega\ndo seu ambiente antes de habilitar essa checagem; não rejeite callbacks de produção com base em um\nheader presumido. O exemplo abaixo usa um nome de header configurado pela aplicação.\n\n```ts\nimport express from 'express';\n\nconst webhookSecret = process.env.ASSINAFY_WEBHOOK_SECRET;\nconst signatureHeader = process.env.ASSINAFY_SIGNATURE_HEADER;\nif (!webhookSecret || !signatureHeader) {\n  throw new Error('Este ambiente não tem contrato confirmado de assinatura de webhook');\n}\n\nconst webhookClient = new AssinafyClient({ webhookSecret });\n\napp.post('/webhooks/assinafy', express.raw({ type: 'application/json' }), (req, res) => {\n  const assinatura = req.header(signatureHeader) ?? '';\n  const corpoBruto = req.body as Buffer;\n\n  if (!webhookClient.webhookVerifier.verify(corpoBruto, assinatura)) {\n    return res.status(401).send('Assinatura inválida');\n  }\n\n  const evento = webhookClient.webhookVerifier.extractEvent(corpoBruto);\n  const tipo = webhookClient.webhookVerifier.getEventType(evento);\n  const dados = webhookClient.webhookVerifier.getEventData(evento);\n\n  switch (tipo) {\n    case 'document_ready':             break;\n    case 'signer_signed_document':     break;\n    case 'signer_rejected_document':   break;\n    case 'document_processing_failed': break;\n  }\n  res.sendStatus(200);\n});\n```\n\n### Endpoints do signatário\n\nPara construir portais de assinatura próprios. Quase todas as chamadas exigem o parâmetro de URL\n`signer-access-code` que a Assinafy envia ao signatário por e-mail/WhatsApp. O download de artefato\né a exceção pública documentada; seu quarto argumento opcional de código de acesso existe apenas por\ncompatibilidade com deploys que ainda esperam a query antiga.\n\n```ts\nawait client.signerDocuments.self(accessCode);\nawait client.signerDocuments.verifyEmail({ signerAccessCode: accessCode, verificationCode: '123456' });\n\nawait client.signerDocuments.getCurrent(signerId, accessCode);\nconst { data } = await client.signerDocuments.list(signerId, accessCode, { 'per-page': 20 });\n// Equivalente a documents.search() do lado do signatário, autorizado pelo código de acesso.\nconst achados = await client.signerDocuments.search(signerId, accessCode, 'nota fiscal');\nawait client.signerDocuments.download(signerId, documentId, 'original');\n// Disponível só depois que um signatário por certificado ICP-Brasil concluir a assinatura.\nawait client.signerDocuments.download(signerId, documentId, 'pades');\n\nawait client.signerDocuments.confirmData(documentId, accessCode, {\n  email: 'eu@exemplo.com.br',\n  full_name: 'Signatário Exemplo',\n  government_id: '123.456.789-00',\n  has_accepted_terms: true,\n});\n// Como alternativa, aceite os termos separadamente antes de getAssignment():\n// await client.signerDocuments.acceptTerms(accessCode);\n\n// Gestão da imagem de assinatura ({ reuse: true } guarda para documentos futuros)\nawait client.signerDocuments.uploadSignature(accessCode, pngBuffer, { imageType: 'signature', reuse: true });\nawait client.signerDocuments.downloadSignature(accessCode, 'signature');\n\n// Assinar / recusar\nconst assinavel = await client.signerDocuments.getAssignment(accessCode);\n// `sign()` é para assignments collect e exige o valor de cada campo posicionado.\nawait client.signerDocuments.sign(documentId, assignmentId, accessCode, [\n  { itemId, fieldId, pageId, value: 'Assinado por João' },\n]);\nawait client.signerDocuments.decline(documentId, assignmentId, accessCode, 'Sem autorização');\n\n// `signMultiple()` é só para assignments virtual.\nawait client.signerDocuments.signMultiple(['doc-1', 'doc-2'], accessCode);\nawait client.signerDocuments.declineMultiple(['doc-1'], 'Condições desfavoráveis', accessCode);\n```\n\n`sign()` também exige que signatários virtuais já tenham confirmado os dados, mas assignments\nvirtuais normalmente devem usar `signMultiple()`. Signatários por certificado não podem usar\n`sign()`; veja [Ramos pagos de assinatura](#ramos-pagos-de-assinatura).\n\n## Helper de alto nível\n\nEnvia um PDF, reaproveita ou cria signatários por e-mail, cria um assignment virtual imediatamente e,\nopcionalmente, espera o processamento antes de retornar.\n\n```ts\nconst resultado = await client.uploadAndRequestSignatures({\n  source: { filePath: './contrato.pdf' },\n  signers: [\n    { name: 'João', email: 'joao@exemplo.com.br' },\n    { name: 'Maria', email: 'maria@exemplo.com.br' },\n  ],\n  message: 'Por favor, assine',\n  metadata: { ano: 2026 }, // parte de compatibilidade; omita para o formato só-arquivo\n  waitForReady: true,\n  waitOptions: { maxWaitMs: 30_000, pollIntervalMs: 1_000 },\n  expiresAt: '2027-12-31T00:00:00Z',\n  copyReceivers: ['id-de-signatario-em-copia'],\n});\n\nresultado.document;   // IDocumentDetailsResponse já processado (waitForReady: true, o padrão);\n                      // o IDocumentUploadResponse cru quando waitForReady: false\nresultado.assignment; // IAssignment\nresultado.signer_ids; // string[]\n```\n\n`waitForReady: false` pula a espera pós-assignment e devolve a resposta inicial do upload. Com o\npadrão `true`, o helper cria o assignment primeiro e só então espera os detalhes atuais do\ndocumento. Produção e sandbox permitem assignments virtuais em `uploaded` e `metadata_processing` e\nos promovem automaticamente; só assignments `collect` exigem páginas renderizadas. Todos os\nsignatários acima usam o canal de e-mail padrão. Um signatário só com telefone seleciona o ramo pago\nde WhatsApp descrito antes. `copyReceivers` aceita IDs de signatários existentes, não endereços de\ne-mail; confira o assignment devolvido antes de considerar uma cópia registrada.\n\nO helper não é transacional. Um erro depois do assignment inclui `documentId`, `assignmentId` e\n`signerIds` criados no `context` do erro (e em `ValidationError.errors` para timeouts); inspecione\nesses IDs antes de decidir se repete o fluxo.\n\n## Erros\n\nOs métodos HTTP rejeitam com uma subclasse de `AssinafyError`. Helpers síncronos como\n`getSocialLoginUrl()` e `readAuthorizationCallback()` podem lançar antes de qualquer requisição.\n\n| Classe | Quando | O que inspecionar |\n| --- | --- | --- |\n| `ValidationError` | O SDK recusou a entrada antes de enviar | `err.errors` |\n| `OAuthError` | Um endpoint OAuth devolveu `{ error, error_description }`, ou o callback trouxe `?error=` | `err.error`, `err.errorDescription` |\n| `ApiError` | A API respondeu com status de falha | `err.statusCode`, `err.responseData`, `err.challenge` |\n| `NetworkError` | DNS, conexão ou timeout | `err.message` (já sem credenciais) |\n| `AssinafyError` | Classe base de todas as acima | `err.context` |\n\n```ts\nimport { ApiError, OAuthError, ValidationError, NetworkError, AssinafyError } from '@assinafy/sdk';\n\ntry {\n  await client.documents.upload({ filePath: './x.pdf' });\n} catch (err) {\n  if (err instanceof ValidationError) {\n    console.error('Falha de validação:', err.errors);\n  } else if (err instanceof OAuthError) {\n    // OAuthError estende ApiError; ramifique pelo código RFC 6749, não pela mensagem.\n    console.error('Erro OAuth:', err.error, err.errorDescription);\n  } else if (err instanceof ApiError) {\n    console.error(`Erro da API ${err.statusCode}:`, err.responseData);\n    // `err.challenge` traz o header WWW-Authenticate já interpretado quando a API\n    // envia um — em um 403 ele nomeia o escopo OAuth que está faltando.\n  } else if (err instanceof NetworkError) {\n    console.error('Erro de rede:', err.message);\n  } else if (err instanceof AssinafyError) {\n    console.error('Erro do SDK:', err.message, err.context);\n  }\n}\n```\n\n## Ambientes\n\n| | |\n| --- | --- |\n| Produção | `https://api.assinafy.com.br/v1` |\n| Sandbox | `https://sandbox.assinafy.com.br/v1` |\n\nO sandbox tem servidor de autorização próprio em `https://auth-sandbox.assinafy.com.br`, com a tela\nde consentimento em `/oauth/authorize`. Os documentos de descoberta dele não são alcançáveis:\no nginx recusa caminhos iniciados por ponto, então informe os endpoints explicitamente:\n\n```ts\nconst client = new AssinafyClient({ baseUrl: 'https://sandbox.assinafy.com.br/v1' });\n\nconst requisicao = await client.oauth.createAuthorizationUrl({\n  clientId: process.env.ASSINAFY_CLIENT_ID!,\n  redirectUri: 'https://meuapp.exemplo.com.br/oauth/callback',\n  scopes: ['documents:read'],\n  issuer: 'https://auth-sandbox.assinafy.com.br',\n  authorizationEndpoint: 'https://auth-sandbox.assinafy.com.br/oauth/authorize',\n});\n```\n\nOs endpoints de token, revogação e userinfo seguem o `baseUrl` configurado. Confirme que o sandbox\nos expõe antes de rodar a etapa de troca por lá — veja\n[docs/COMPATIBILITY.md](docs/COMPATIBILITY.md).\n\n## Desenvolvimento\n\n```bash\nbun install --frozen-lockfile\nbun run typecheck    # tipos de src, scripts e testes\nbun run lint\nbun test             # suítes bun:test\nbun run test:coverage\nbun run build        # tsup → dist/ (CJS + ESM + .d.ts)\nbun run lint:pkg     # publint + arethetypeswrong\nbun run audit:api    # confere o SDK contra o OpenAPI publicado\nbun run verify       # portão completo de release local\n```\n\n## Documentação\n\n- **[README.en.md](README.en.md)** — a mesma referência completa, em inglês\n- [docs/API_COVERAGE.md](docs/API_COVERAGE.md) — mapa de operações\n- [docs/COMPATIBILITY.md](docs/COMPATIBILITY.md) — variações de requisição e resposta por deploy\n- [docs/RELEASING.md](docs/RELEASING.md) — processo de publicação\n- [Documentação da API](https://api.assinafy.com.br/v1/docs)\n\n## Licença\n\nDistribuído sob a licença [MIT](LICENSE).\n","readmeFilename":"README.md"}