- New: list_template_fields, add_template_fields, update_template_fields, remove_template_fields and
reorder_template_fields read and edit a template's fields (
Field), with all their settings and their own conditional logic (dependencies). A field'syis measured from the top of its page. - New: a template's
predefined_fields(PredefinedField) andpredefined_fields_sample_data, the field names that people using the embedded template editor choose from. get_template returns them, and create_template and update_template set them. - New: a template's
field_groups(FieldGroup), the groups that its fields' names make, with their titles and the settings of lists (min_items,max_items,allow_additional_items). get_template returns them, and update_template changes them. - New: get_template_page_images returns an image of each page of a PDF template (
TemplatePageImages), to see where fields go. - New: get_template_diff says what changed in a template's draft since its latest published version, or in a published
version since the one before it (
TemplateDiff). - New: validate_submission checks a submission's data and settings as create_submission does, without creating the
submission or using credits (
SubmissionValidation). It doesn't check your account's credits. - New: the
pngoutput format, an image of each page of a submission's PDF (files.png.pages). Add it tooutput_formatsin create_submission or create_submission_batch (it addspdf), or to a processed submission with generate_submission_files. - create_template and update_template_document take a
document_url(DocSpring downloads it) or adocument_base64instead of acache_id. While the URL downloads, the template'sdocument.stateisdownloading; if it can't be downloaded, it'sdownload_failedanddocument.error_messagesays why.
- BREAKING CHANGE: This version calls DocSpring API v2 (
/api/v2). The 3.x versions call API v1, which keeps working. Every change is in the migration guide: https://docspring.com/docs/api-guide/migrating-to-api-v2/ - BREAKING CHANGE: If you set the API's full base URL yourself, change
/api/v1in it to/api/v2. The client only picks the version in the URLs it builds from a region or host. - BREAKING CHANGE: Operations are named after the resource they act on. generate_pdf is create_submission,
batch_generate_pdfs is create_submission_batch, combine_pdfs is create_combined_pdf, create_html_template and
create_pdf_template_from_upload are create_template (with a
template_type), create_pdf_template (which uploads a PDF file) is upload_template, get_full_template is get_template (which returns the template, without its fields for now), update_template_document (which uploads a PDF file) is upload_template_document, update_template_document_from_upload is update_template_document, generate_preview is generate_submission_preview, get_combined_submission is get_combined_pdf, list_combined_submissions is list_combined_pdfs, expire_combined_submission is expire_combined_pdf, move_template_to_folder is move_template and move_folder_to_folder is move_folder. New: get_folder, list_custom_files, get_custom_file and delete_custom_file. A template's fields, and adding fields to a template, aren't in API v2 yet. - BREAKING CHANGE: Data requests are called signature requests.
get_data_request,update_data_request,create_data_request_tokenandcreate_data_request_eventareget_signature_request,update_signature_request,create_signature_request_tokenandcreate_signature_request_event(at/signature_requests), and their models areSignatureRequest,SignatureRequestTokenandSignatureRequestEvent. A submission'sdata_requestsissignature_requests(also when you create one),data_request_idissignature_request_id, a token'sdata_request_urlissignature_request_url, thewaiting_for_data_requestsstate iswaiting_for_signature_requests, and a template'sadd_data_request_submission_id_footersisadd_signature_request_submission_id_footers. New ones get IDs that start withsrq_instead ofdrq_. - BREAKING CHANGE: A response is the resource itself, with no
statusor wrapper key. Lists returndataandnext_cursor: passnext_cursorascursorto get the next page, andlimit(1 to 100, default 50) for its size.pageandper_pageare gone. Every create returns 201. - BREAKING CHANGE: Every error has one shape,
{"error": {"code", "message", "details", "request_id"}}, with acodeto check (validation_failed,not_found,insufficient_credits,rate_limited, ...), and each detail has apointerto the body value it's about, or aparameterwith the query parameter's name. - BREAKING CHANGE: Requests are validated strictly: an unknown property or query parameter, or a value of the wrong
type, is a 422 instead of being ignored. Request bodies must be JSON (
Content-Type: application/json, or it's a 415), except the PDF uploads. Request bodies are flat, with notemplate,folderorwebhookkey around them. - BREAKING CHANGE: Submission data is checked more strictly. An empty
datais validated like any other, date fields takeYYYY-MM-DD(or the template's date format whenparse_dates_using_template_date_formatis on), and a signature request'sfieldsmust be fields on the template (setignore_unknown_fieldsto leave out the others). A submission that fails because of the template is still saved asinvalid_data, and the 422 includes itssubmission_id. - BREAKING CHANGE: A submission's or combined PDF's files are in
files, by format.files.pdfhasstate,error_message,download_url,permanent_url,filename,content_type,sizeandsha256, and replacesdownload_url,permanent_download_urlandpdf_hash. A submission'sfiles.audit_trailandfiles.preview, with the same properties, replaceaudit_trail_download_urlandpreview_download_url. A file made after its submission was processed is listed while it's being made, so check itsstatebefore using its links. Combined submissions are combined PDFs (CombinedPdf), a template'sdocument_urlisdocument.download_url, and a custom file'surlisdownload_url. - BREAKING CHANGE: A template's
embed_domainsis a list of domains, not a comma-separated string, and each entry is checked. Copying a template withparent_folder_idnull puts the copy at the root (leave it out to keep the template's folder). A template's schema and model code describe the version that submissions use by default (the latest published version), not the draft: passversionfor another one. - BREAKING CHANGE: Every property name is snake_case, including template
defaults(font_size, wasfontSize),html_engine_options(margin_top), a field dependency condition'srange_max, and the field settings in a submission'sfield_overrides. - BREAKING CHANGE:
field_overridestakes aFieldOverrideper field name (Map<String, FieldOverride>), with every setting an override can change (required,font_size,color, ...), so a misspelt setting or a value of the wrong type is caught before the request is sent. - BREAKING CHANGE: A combined PDF's
source_pdfsand a rule'sconditionstake a model per kind, with only the properties that kind uses (another kind's property is a 422not_allowed).CombinedPdfSourceInputis aSubmissionSourcePdf,CombinedPdfSourcePdf,TemplateSourcePdf,CustomFileSourcePdforUrlSourcePdf, picked by itstype.TemplateFieldDependencyConditionInputis aFieldPresenceCondition(present,blank),FieldEqualsCondition(equals,not_equals),FieldInCondition(in, with a list),FieldComparisonCondition(gt,gte,lt,lte, on a number field) orFieldRangeCondition(range), picked by itsoperator. Pass the model to the union's constructor; a model sets its owntype(andFieldInConditionandFieldRangeConditiontheiroperator):new CombinedPdfSourceInput(new UrlSourcePdf().url(url)). A template returns its conditions with only the properties their operators use, in the shape an update takes. - BREAKING CHANGE: Templates:
readyand adocumentobject (with itsstate,page_countandpage_dimensions) replacedocument_processed,document_state,document_parse_errorand thepage_*fields.list_templatesreturns template summaries. Templates have nowebhook_urlorwebhook_options: create a webhook withtemplate_idsinstead. - BREAKING CHANGE: Secrets are write-only. A submission's or combined PDF's
passwordand a template'sencrypt_pdfs_passwordandslack_webhook_urlaren't returned;has_password,has_encrypt_pdfs_passwordandhas_slack_webhook_urlsay whether one is set. - BREAKING CHANGE: Webhooks created with this version send payload version 4,
{"id", "event_type", "created_at", "data"}, wheredatais the resource as API v2 returns it. Their events have API v2's names (combined_pdf.processed,signature_request.completed). Webhooks created with 3.x or in the dashboard keep their payload version. - BREAKING CHANGE: Models are named after the API's resources (
Submission,CombinedPdf,Template,TemplateSummary,SignatureRequest), request bodies after their operation (CreateSubmissionRequest), and enums are their own types (SubmissionState,WebhookEventType). - BREAKING CHANGE: Enum types are final classes instead of Java
enums, so they can hold a value added to the API after this release. The constants (SubmissionState.PROCESSED) are the values this version knows,getValue()returns the value as the API sent it,isKnown()is false for a newer one,fromValuekeeps any value,values()lists the known ones, and equality is by value. Aswitchon one needsgetValue().UNKNOWN_DEFAULT_OPEN_APIis gone. - The client checks each request against the API's request schemas before sending it, so an invalid request fails
without a round trip, with the details the API's 422 response would have. A request the API would reject throws a
com.docspring.ValidationException(anIllegalArgumentException), whosegetDetails()areErrorDetails with a code, a message and a pointer into the body (or a parameter). Turn the check off withapiClient.setValidateRequests(false). - A waited request to
sync.api.docspring.comthat times out returns a 504polling_timeouterror with the resource's ID, so you can get it later. Without an ID, the request got no answer in time: check whether the resource was created before you send it again. - Lists you don't set are left out of requests instead of being sent as empty lists.
- BREAKING CHANGE: URLs are
Strings instead ofjava.net.URI, which couldn't hold every URL the API returns. Free-form objects (data,metadata) areMap<String, Object>, and lists of unique values areSets. - Depends on Jackson 2.21 (was 2.17) and jackson-databind-nullable 0.2.12.
- An empty API token ID or secret counts as not set, so the client reads
DOCSPRING_TOKEN_IDorDOCSPRING_TOKEN_SECRETinstead. It was sent as an empty string. - Templates: new
default_form_modesetting (web,visualordual), when you create or update a template. It's the hosted form that/templates/<id>/formopens when the link has nomodeparameter: the web form, the visual form (filled in on the PDF), or both in tabs. HTML templates have no visual form, so they only acceptweb. - Templates:
defaultscan setrequired_field_background_color, the background colour that visual forms and signature requests give required fields. PDFs don't draw it. - Templates: new
allow_skipping_optional_fieldssetting (boolean), when you create or update a template. Visual forms and signature requests then show the Continue button as soon as the required fields are filled in, without visiting each optional field. TheallowSkippingOptionalFieldsembed option overrides it. - Templates: when you replace a template's PDF,
reimport_fields(boolean) replaces the template's fields with the fillable fields in the new PDF (or in its current PDF when you don't upload one). A PDF with no fillable fields keeps the template's fields. - Fields:
shape_typecan betriangleorpolygon, withshape_sides(3 to 12) for a polygon. Text fields can setkeep_leading_spacesto keep the spaces at the start of each line in the PDF. - Templates: create_template and upload_template take
detect_fields(boolean, default false). DocSpring then sets up the PDF's fields as the "Automatically detect fields" upload option does: it imports or detects them, names them with AI and sets up conditional logic.field_source(auto,pdf_detectionorpdf_form_fields),field_naming(aiorpreserve) andfield_logic(aiornone) choose how, like the Set Up Fields choices in the template editor. Withpdf_form_fields,preserveandnone, the PDF's form fields are imported with their own names and no AI. Each account gets free AI pages every month, and further pages are paid from credits. See https://docspring.com/docs/template-editor/automatic-field-detection/. - Templates: new
ai_field_naming_languagesetting (auto,englishorform_language) for PDF templates, when you create or update one: the language AI uses for field names. It's null for HTML templates. - Templates: a template's
documentincludeshas_fillable_fields,page_processing_statuses(how processing is going on each page: its image, its fields and AI naming) andfield_logic_status(the AI logic step that runs once every page's fields are done, and can still rename fields and add rules). Field setup is finished whendocument.stateisprocessedandfield_logic_statusisn'tpendingorprocessing. - Java:
createPdfTemplate(multipart) takes the newdetect_fields,field_source,field_naming,field_logicandai_field_naming_languageform fields as its last five arguments, so existing calls need five more arguments (nullto leave them out).
- Submissions and combined submissions can be in the new
insufficient_creditsstate: a live PDF that your credit balance can't cover is saved and processed once you add credits. See https://docspring.com/docs/api-guide/credits-and-rate-limits/. - generate_pdf, batch_generate_pdfs and combine_pdfs document the 402 response for insufficient credits. Their
responses can include a
code, which isinsufficient_creditson a 402. - generate_pdf, batch_generate_pdfs, create_pdf_template, create_pdf_template_from_upload, create_html_template and
copy_template document a 403 response with a
codeofupgrade_required(the plan doesn't include it) oraccount_suspended.
- Response models keep fields this version doesn't know: read them with
getAdditionalProperties(). - In an enum that can be null (such as a webhook's
mode), a value this version doesn't know now reads asUNKNOWN_DEFAULT_OPEN_APIinstead of null. - Templates: new
parse_dates_using_template_date_formatsetting, when you create or update a template. When it's true, date values sent as NN/NN/YYYY (with slashes, dashes or dots) are read in the order of the template's default date format: month first for%m/%d/%Y, day first for%d/%m/%Y. When it's false, they're read day first. - A new README: installing, a quick start, every API method, errors, and how API changes are handled. The repository also has an AGENTS.md for coding agents.
- Submissions and data requests can now be in the
declinedstate, when a signer declines to sign. Data requests have a newdeclined_attimestamp. Earlier versions raise an error when they read a declined submission or data request. - New API methods for webhooks: create_webhook, list_webhooks, get_webhook, update_webhook and delete_webhook.
- New API method: get_template_model_code, which generates typed model code for a template's submission data, so your app can catch mistakes before it calls the API.
- Templates:
- Field dependencies:
field_dependencieswhen you create or update a template, anddependencieson the fields you add with add_fields_to_template. - add_fields_to_template accepts the
initialsfield type and aneditablesetting for each field. - Embedded template editor settings:
embed_edit_allow_document_replacement,embed_edit_allow_settings,embed_edit_allow_versioningandembed_edit_token. - New
template_schema_versionattribute. - A template's
pathis never null. - Individual template
defaultscan be null (for examplefontSizeafter it's cleared in the template editor). last_changed_by_typecan beexternal_user(a change made in the embedded template editor), withlast_changed_by_external_id,last_changed_by_external_nameandlast_changed_by_external_email.- Template versions say who published them with
published_by_type,published_by_user_id,published_by_name,published_by_emailandpublished_by_external_id. These replacepublished_by_id, which the API no longer returns. - The JSON schema from get_template_schema includes
$id,allOfanddependencies.
- Field dependencies:
- copy_template accepts a template
version, andparent_folder_idis now optional. move_template_to_folder also accepts aversion. - Pass a null
parent_folder_idto move_template_to_folder or move_folder_to_folder to move it to the root folder. - Submissions and submission actions include an
error_messagewhen processing fails. - combine_pdfs:
delete_custom_filesnow deletes the custom files once the merged PDF is processed (it used to be ignored).testhas no effect and is deprecated. new Client()readsDOCSPRING_TOKEN_ID,DOCSPRING_TOKEN_SECRET,DOCSPRING_HOSTandDOCSPRING_REGION(US or EU) from the environment, for any credentials or host not already set on the default ApiClient. New constructors:Client(apiTokenId, apiTokenSecret)andClient(apiTokenId, apiTokenSecret, host, region).- An enum value added to the API after this release (e.g. a new submission state) deserializes as
UNKNOWN_DEFAULT_OPEN_APIinstead of throwing, or asnullfor an attribute that can be null. Enums have the newUNKNOWN_DEFAULT_OPEN_APIconstant, so an exhaustiveswitchover one needs a case for it. source,referreranddataare optional on submissions, because get_submission, list_submissions and list_template_submissions only return them withinclude_data.getSource()is now@Nullable.
- Accidentally had a hard-coded 2.x version in the user agent string for v3.0.0
- All our API clients are now 100% end-to-end tested against our real server.
- Added support for Template Versioning parameters:
- Optional version parameter in submission requests (e.g., 1.2.3, draft, latest)
- New API methods: publish_template_version, restore_template_version
- Updated copy_template and delete_template methods to accept template version strings
- BREAKING CHANGE: Updated default host to our new synchronous API subdomain: sync.api.docspring.com. (EU customers should use sync.api-eu.docspring.com). Removed all custom polling code from library since this logic is now handled by the API service running on our sync subdomain
- Fixed User-Agent header: docspring-java-x.x.x
- Added 'password' parameter to Generate PDF and Combine PDF API endpoints. You can now encrypt each generated PDF with a unique password.
- Added "sort_order" property for Submission Data Requests
- Updated OpenAPI Generator to v3.3.0.
- Fixed MultipartBody.Part annotation issue for
createPDFTemplate. Added Java code example to docs.
- Fixed the "include_data=true" option for the "Get Submission" API endpoint. Added the "data" property to the Submission model so that this is parsed and returned correctly when requested
- Renamed some internal models for template creation API endpoints. (CreateTemplateData / CreateTemplateData1 renamed to CreateHtmlTemplateData and CreateTemplateFromUploadData)
- BREAKING CHANGE: Renamed createTemplate operation to createPDFTemplate
- Added createHTMLTemplate operation. (This uses the same API endpoint as createPDFTemplate, but the example shows how to set html, scss, etc. fields)
- Added updateTemplate operation, to update a PDF or HTML template
- Renamed FormAPI to DocSpring. (View the CHANGELOG in the original FormAPI API client for prior releases.)