Anvil API Client for Node
Anvil is a suite of tools for managing document-based workflows:
- Anvil Workflows converts your PDF forms into simple, intuitive websites that fill the PDFs and gather signatures for you.
- Anvil PDF Filling API allows you to fill any PDF with JSON data.
Currently, this node client only supports our PDF filling API.
Usage
yarn add @anvilco/anvil
npm install @anvilco/anvil
A basic example converting your JSON to a filled PDF, then saving the PDF to a file:
import fs from 'fs'
import Anvil from '@anvilco/anvil'
const pdfTemplateID = 'kA6Da9CuGqUtc6QiBDRR'
const apiKey = '7j2JuUWmN4fGjBxsCltWaybHOEy3UEtt'
const exampleData = {
"title": "My PDF Title",
"fontSize": 10,
"textColor": "#CC0000",
"data": {
"someFieldId": "Hello World!"
}
}
const anvilClient = new Anvil({ apiKey })
const { statusCode, data } = await anvilClient.fillPDF(pdfTemplateID, exampleData)
console.log(statusCode)
fs.writeFileSync('output.pdf', data, { encoding: null })
API
Instance Methods
new Anvil(options)
Creates an Anvil client instance.
options
(Object) - Options for the Anvil Client instance.
const anvilClient = new Anvil({ apiKey: 'abc123' })
fillPDF(pdfTemplateID, payload[, options])
Fills a PDF template with your JSON data.
First, you will need to have uploaded a PDF to Anvil. You can find the PDF template's id on the API Info
tab of your PDF template's page:
An example:
const fs = require('fs')
const pdfTemplateID = 'kA6Da9CuGqUtc6QiBDRR'
const apiKey = '7j2JuUWmN4fGjBxsCltWaybHOEy3UEtt'
const payload = {
"title": "My PDF Title",
"fontSize": 10,
"textColor": "#CC0000",
"data": {
"someFieldId": "Hello World!"
}
}
const options = {
"dataType": "buffer"
}
const anvilClient = new Anvil({ apiKey })
const { statusCode, data } = await anvilClient.fillPDF(pdfTemplateID, payload, options)
fs.writeFileSync('filled.pdf', data, { encoding: null })
pdfTemplateID
(String) - The id of your PDF template from the Anvil UIpayload
(Object) - The JSON data that will fill the PDF template
title
(String) - optional Set the title encoded into the PDF documentfontSize
(Number) - optional Set the fontSize of all filled text. Default is 10.color
(String) - optional Set the text color of all filled text. Default is dark blue.data
(Object) - The data to fill the PDF. The keys in this object will correspond to a field's ID in the PDF. These field IDs and their types are available on the API Info
tab on your PDF template's page in the Anvil dashboard.
- For example
{ "someFieldId": "Hello World!" }
options
(Object) - optional Any additional options for the request
dataType
(Enum[String]) - optional Set the type of the data
value that is returned in the resolved Promise
. Defaults to 'buffer'
, but 'stream'
is also supported.
- Returns a
Promise
that resolves to an Object
statusCode
(Number) - the HTTP status code; 200
is successdata
(Buffer | Stream) - The raw binary data of the filled PDF if success. Will be either a Buffer or a Stream, depending on dataType
option supplied to the request.errors
(Array of Objects) - Will be present if status >= 400. See Errors
generatePDF(payload[, options])
Dynamically generate a new PDF with your JSON data. Useful for agreements, invoices, disclosures, or any other text-heavy documents. This does not require you do anything in the Anvil UI other than setup your API key, just send it data, get a PDF. See the generate PDF docs for full details.
An example:
const fs = require('fs')
const apiKey = '7j2JuUWmN4fGjBxsCltWaybHOEy3UEtt'
const payload = {
title: 'Example Invoice',
data: [{
label: 'Name',
content: 'Sally Jones',
}, {
content: 'Lorem **ipsum** dolor sit _amet_',
}, {
table: {
firstRowHeaders: true,
rows: [
['Description', 'Quantity', 'Price'],
['4x Large Widgets', '4', '$40.00'],
['10x Medium Sized Widgets in dark blue', '10', '$100.00'],
['10x Small Widgets in white', '6', '$60.00'],
],
},
}],
}
const options = {
"dataType": "buffer"
}
const anvilClient = new Anvil({ apiKey })
const { statusCode, data } = await anvilClient.generatePDF(payload, options)
fs.writeFileSync('generated.pdf', data, { encoding: null })
payload
(Object) - The JSON data that will fill the PDF template
title
(String) - optional Set the title encoded into the PDF documentdata
(Array of Objects) - The data that generates the PDF. See the docs for all supported objects
- For example
[{ "label": "Hello World!", "content": "Test" }]
options
(Object) - optional Any additional options for the request
dataType
(Enum[String]) - optional Set the type of the data
value that is returned in the resolved Promise
. Defaults to 'buffer'
, but 'stream'
is also supported.
- Returns a
Promise
that resolves to an Object
statusCode
(Number) - the HTTP status code; 200
is successdata
(Buffer | Stream) - The raw binary data of the filled PDF if success. Will be either a Buffer or a Stream, depending on dataType
option supplied to the request.errors
(Array of Objects) - Will be present if status >= 400. See Errors
createEtchPacket(options)
Creates an Etch Packet and optionally sends it to the first signer.
options
(Object) - An object with the following structure:
getEtchPacket(options)
Gets the details of an Etch Packet.
options
(Object) - An object with the following structure:
variables
(Object) - Requires eid
eid
(String) - your Etch Packet eid
responseQuery
(String) - optional A GraphQL Query compliant query to use for the data desired in the query response. Can be left out to use default.
generateEtchSignUrl(options)
Generates an Etch sign URL for an Etch Packet signer. The Etch Packet and its signers must have already been created.
options
(Object) - An object with the following structure:
variables
(Object) - Requires clientUserId
and signerEid
clientUserId
(String) - your user eidsignerEid
(String) - the eid of the Etch Packet signer, found in the response of the createEtchPacket
instance method
downloadDocuments(documentGroupEid[, options])
Returns a Buffer or Stream of the document group specified by the documentGroupEid in Zip file format.
documentGroupEid
(string) - the eid of the document group to downloadoptions
(Object) - optional Any additional options for the request
dataType
(Enum[String]) - optional Set the type of the data
value that is returned in the resolved Promise
. Defaults to 'buffer'
, but 'stream'
is also supported.
- Returns a
Promise
that resolves to an Object
statusCode
(Number) - the HTTP status code, 200
is successresponse
(Object) - the Response object resulting from the client's request to the Anvil appdata
(Buffer | Stream) - The raw binary data of the downloaded documents if success. Will be in the format of either a Buffer or a Stream, depending on dataType
option supplied to the request.errors
(Array of Objects) - Will be present if status >= 400. See Errors
Class Methods
prepareGraphQLFile(pathOrStreamLikeThing[, options])
A nice helper to prepare a Stream-backed or Buffer-backed file upload for use with our GraphQL API.
pathOrStreamLikeThing
(String | Stream | Buffer) - An existing Stream
, Buffer
or other Stream-like thing supported by FormData.append OR a string representing a fully resolved path to a file to be read into a new Stream
.options
(Object) - Anything supported by FormData.append. Likely required when providing a non-common stream. From the form-data
docs:
Form-Data can recognize and fetch all the required information from common types of streams (fs.readStream, http.response and mikeal's request), for some other types of streams you'd need to provide "file"-related information manually
- Returns an
Object
that is properly formatted to be coerced by the client for use against our GraphQL API wherever an Upload
type is required.
Types
Options
Options for the Anvil Client. Defaults are shown after each option key.
{
apiKey: <your_api_key>,
requestLimit: 40,
requestLimitMS: 1000,
}
Rate Limits
Our API has request rate limits in place. This API client handles 429 Too Many Requests
errors by waiting until it can retry again, then retrying the request. The client attempts to avoid 429
errors by throttling requests after the number of requests within the specified time period has been reached.
See the Anvil API docs for more information on the specifics of the rate limits.
API Documentation
Our general API Documentation can be found here. It's the best resource for up-to-date information about our API and its capabilities.
See the PDF filling API docs for more information about the fillPDF
method.
Examples
Check out the example folder for running usage examples!
Development
First install the dependencies
yarn install
Running tests
yarn test
yarn test:watch
Building with babel will output in the /lib
directory.
yarn test
yarn test:watch