<% if params[:status] == 'archived' %>
<%= t('archived_users') %>
@@ -55,8 +55,8 @@
<%= user.email %>
|
-
- <%= user.role %>
+
+ <%= t(user.role) %>
|
diff --git a/app/views/webhook_events/_drawer_events.html.erb b/app/views/webhook_events/_drawer_events.html.erb
new file mode 100644
index 00000000..9858be96
--- /dev/null
+++ b/app/views/webhook_events/_drawer_events.html.erb
@@ -0,0 +1,59 @@
+
+
+ <% webhook_attempts = webhook_event.webhook_attempts.sort_by { |e| -e.id } %>
+ <% if webhook_event.status == 'error' %>
+ <% last_attempt = webhook_attempts.select { |e| e.attempt < SendWebhookRequest::MANUAL_ATTEMPT }.max_by(&:attempt) %>
+ <% if webhook_event.webhook_attempts.none?(&:success?) && last_attempt.attempt <= 10 %>
+ -
+
+ <%= svg_icon('clock', class: 'w-4 h-4 shrink-0') %>
+
+
+ <%= t('next_attempt_in_time_in_words', time_in_words: distance_of_time_in_words(Time.current, last_attempt.created_at + (2**last_attempt.attempt).minutes)) %>
+
+
+ <% end %>
+ <% end %>
+ <% if webhook_attempts.present? %>
+ <% webhook_attempts.each do |webhook_attempt| %>
+ -
+
+ <%= svg_icon(webhook_attempt.success? ? 'check' : 'x', class: 'w-4 h-4 shrink-0') %>
+
+
+ <%= l(webhook_attempt.created_at.in_time_zone(current_account.timezone), format: :long, locale: current_account.locale) %>
+
+
+
+ <%= Rack::Utils::HTTP_STATUS_CODES[webhook_attempt.response_status_code] %>
+ <% if webhook_attempt.response_status_code.positive? %>
+ (<%= webhook_attempt.response_status_code %>)
+ <% end %>
+
+ <% unless webhook_attempt.success? %>
+
+ <%= webhook_attempt.response_body.presence || Rack::Utils::HTTP_STATUS_CODES[webhook_attempt.response_status_code] %>
+
+ <% end %>
+
+
+ <% end %>
+ <% else %>
+ -
+
+ <%= svg_icon('clock', class: 'w-4 h-4 shrink-0') %>
+
+
+ <%= l(webhook_event.created_at.in_time_zone(current_account.timezone), format: :long, locale: current_account.locale) %>
+
+
+ <% end %>
+
+ <% unless webhook_event.status == 'pending' %>
+
+
+ <%= button_to button_title(title: t('resend'), disabled_with: t('awaiting'), icon: svg_icon('rotate', class: 'w-4 h-4'), icon_disabled: svg_icon('loader', class: 'w-4 h-4 animate-spin')), resend_settings_webhook_event_path(webhook_url.id, webhook_event.uuid), form: { id: button_uuid = SecureRandom.uuid }, params: { button_id: button_uuid }, class: 'btn btn-neutral btn-sm text-white', method: :post %>
+
+
+ <% end %>
+
diff --git a/app/views/webhook_events/_event_row.html.erb b/app/views/webhook_events/_event_row.html.erb
new file mode 100644
index 00000000..2b45f393
--- /dev/null
+++ b/app/views/webhook_events/_event_row.html.erb
@@ -0,0 +1,30 @@
+
+
+
+
+ <% if webhook_event.status == 'success' %>
+
+ <%= svg_icon('check', class: 'w-4 h-4 shrink-0 stroke-2') %>
+ <%= webhook_event.webhook_attempts.max_by(&:id)&.response_status_code if local_assigns[:with_status] %>
+
+ <% elsif webhook_event.status == 'pending' %>
+
+ <%= svg_icon('clock', class: 'w-4 h-4 shrink-0 stroke-2') %>
+ <%= webhook_event.webhook_attempts.max_by(&:id)&.response_status_code if local_assigns[:with_status] %>
+
+ <% elsif webhook_event.status == 'error' %>
+
+ <%= svg_icon('x', class: 'w-4 h-4 shrink-0') %>
+ <%= webhook_event.webhook_attempts.max_by(&:id)&.response_status_code if local_assigns[:with_status] %>
+
+ <% end %>
+ <%= webhook_event.event_type %>
+
+
+
+ <%= button_to button_title(title: t('resend'), disabled_with: t('awaiting'), icon: svg_icon('rotate', class: 'w-4 h-4'), icon_disabled: svg_icon('loader', class: 'w-4 h-4 animate-spin')), resend_settings_webhook_event_path(webhook_url.id, webhook_event.uuid), form: { id: button_uuid = SecureRandom.uuid }, params: { button_id: button_uuid }, class: 'btn btn-neutral btn-xs h-2 text-white relative z-[1] hidden md:group-hover:inline-block', data: { turbo_frame: :drawer }, method: :post %>
+
+ <%= l(webhook_event.created_at, locale: current_account.locale, format: :short) %>
+
+
+
diff --git a/app/views/webhook_events/show.html.erb b/app/views/webhook_events/show.html.erb
new file mode 100644
index 00000000..12df5de0
--- /dev/null
+++ b/app/views/webhook_events/show.html.erb
@@ -0,0 +1,14 @@
+<%= render 'shared/turbo_drawer', title: @webhook_event.event_type, close_after_submit: false do %>
+
+ <%= render 'drawer_events', webhook_url: @webhook_url, webhook_event: @webhook_event %>
+ <% if @data %>
+
+ <% response = JSON.pretty_generate({ event_type: @webhook_event.event_type, timestamp: @webhook_event.created_at.as_json, data: @data }) %>
+
+ <%= render 'shared/clipboard_copy', icon: 'copy', text: response, class: 'btn btn-ghost text-white', icon_class: 'w-6 h-6 text-white', copy_title: t('copy'), copied_title: t('copied') %>
+
+ <%== HighlightCode.call(response, 'JSON', theme: 'base16.dark') %>
+
+ <% end %>
+
+<% end %>
diff --git a/app/views/webhook_settings/show.html.erb b/app/views/webhook_settings/show.html.erb
index 5937bff3..38b08f2c 100644
--- a/app/views/webhook_settings/show.html.erb
+++ b/app/views/webhook_settings/show.html.erb
@@ -4,7 +4,7 @@
Webhook
- <% if params[:action] == 'index' %>
+ <% if params[:action] == 'index' && (current_user == true_user || current_account.testing?) %>
<%= render 'shared/test_mode_toggle' %>
<% end %>
<% if @webhook_url.persisted? && params[:action] == 'index' %>
@@ -66,7 +66,9 @@
<%= f.fields_for :events do |ff| %>
@@ -79,8 +81,49 @@
<% end %>
- <% submitter = current_account.submitters.where.not(completed_at: nil).order(:id).last %>
- <% if submitter %>
+ <% if @webhook_events.present? || params[:status].present? %>
+
+ <%= t('events_log') %>
+
+ <%= link_to t('all'), url_for(params.to_unsafe_h.except(:status)), style: 'margin-bottom: -1px', class: "tab h-10 text-base #{params[:status].blank? ? 'tab-active tab-bordered' : 'pb-[3px]'}" %>
+ <%= link_to t('succeeded'), url_for(params.to_unsafe_h.merge(status: 'success')), style: 'margin-bottom: -1px', class: "tab h-10 text-base #{params[:status] == 'success' ? 'tab-active tab-bordered' : 'pb-[3px]'}" %>
+ <%= link_to t('failed'), url_for(params.to_unsafe_h.merge(status: 'error')), style: 'margin-bottom: -1px', class: "tab h-10 text-base #{params[:status] == 'error' ? 'tab-active tab-bordered' : 'pb-[3px]'}" %>
+
+ <% if @webhook_events.present? %>
+
+ <%= render partial: 'webhook_events/event_row', collection: @webhook_events, as: :webhook_event, locals: { webhook_url: @webhook_url } %>
+
+ <% else %>
+
+ <%= t('there_are_no_events') %>
+
+ <% end %>
+ <% if @pagy.pages > 1 %>
+
+
+ <%= "#{@pagy.from}-#{@pagy.to} events" %>
+
+
+
+ <% if @pagy.prev %>
+ <%= link_to '«', url_for(page: @pagy.prev, anchor: 'log'), class: 'join-item btn min-h-full h-10' %>
+ <% else %>
+ «
+ <% end %>
+
+ <%= "Page #{@pagy.page}" %>
+
+ <% if @pagy.next %>
+ <%= link_to '»', url_for(page: @pagy.next, anchor: 'log'), class: 'join-item btn min-h-full h-10' %>
+ <% else %>
+ »
+ <% end %>
+
+
+
+ <% end %>
+
+ <% elsif (submitter = current_account.submitters.where.not(completed_at: nil).order(:id).last) && can?(:read, submitter) %>
@@ -98,7 +141,7 @@
<%= render 'shared/clipboard_copy', icon: 'copy', text: code = JSON.pretty_generate({ event_type: 'form.completed', timestamp: Time.current.iso8601, data: Submitters::SerializeForWebhook.call(submitter) }).gsub(/^/, ' ').sub(/^\s+/, ''), class: 'btn btn-ghost text-white', icon_class: 'w-6 h-6 text-white', copy_title: t('copy'), copied_title: t('copied') %>
- <%= code %>
+ <%== HighlightCode.call(code, 'JSON', theme: 'base16.dark') %>
diff --git a/config/application.rb b/config/application.rb
index 758d2f81..bbfa0408 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -25,11 +25,15 @@ module DocuSeal
config.active_storage.draw_routes = ENV['MULTITENANT'] != 'true'
- config.i18n.available_locales = %i[en en-US en-GB es-ES fr-FR pt-PT de-DE it-IT es it de fr pl uk cs pt he nl ar ko]
+ config.i18n.available_locales = %i[en en-US en-GB es-ES fr-FR pt-PT de-DE it-IT nl-NL
+ es it de fr nl pl uk cs pt he ar ko ja]
config.i18n.fallbacks = [:en]
config.exceptions_app = ->(env) { ErrorsController.action(:show).call(env) }
+ config.content_security_policy_nonce_generator = ->(_) { SecureRandom.base64(16) }
+ config.content_security_policy_nonce_directives = %w[script-src]
+
config.action_view.frozen_string_literal = true
config.middleware.insert_before ActionDispatch::Static, Rack::Deflater
diff --git a/config/brakeman.ignore b/config/brakeman.ignore
index 0b0632ab..18d7601a 100644
--- a/config/brakeman.ignore
+++ b/config/brakeman.ignore
@@ -1,8 +1,28 @@
{
"ignored_warnings": [
{
- "fingerprint": "25f4ce5fee1e1180fa1919dc4ee78db3ab3457a956e4679503aa745771a43836",
+ "fingerprint": "bbd1bdad94998e53a48921859065e06cd1595502d4dc40362afcaa90307b591a",
"note": "Permitted parameters are necessary for creating submitters via API"
+ },
+ {
+ "fingerprint": "645f2f352a813105b8b2eeadc68101d2e7ea04b8e839aa1336616be56f1108ca",
+ "note": "Safe SQL"
+ },
+ {
+ "fingerprint": "5bcf4e6426d17b0efd98e47fde7c012f09500b9595af9cff226cf09341c023be",
+ "note": "Safe SQL"
+ },
+ {
+ "fingerprint": "8bf010d01d5cfabdc2124db1378ca14a24a675431047291488abc186d10ba314",
+ "note": "Safe SQL"
+ },
+ {
+ "fingerprint": "5f52190d03ee922bba9792012d8fcbeb7d4736006bb899b3be9cc10d679e0af1",
+ "note": "Safe Param"
+ },
+ {
+ "fingerprint": "dbbfb4a4ace7f43d8247cbb44afa8b628e005e6194ca5552e029b200f725a2d5",
+ "message": "Unescaped find_by!(uuid: params[:id]) is not risky"
}
]
}
diff --git a/config/environments/development.rb b/config/environments/development.rb
index b806a14f..bc9dc2d4 100644
--- a/config/environments/development.rb
+++ b/config/environments/development.rb
@@ -66,6 +66,8 @@ Rails.application.configure do
# Raise exceptions for disallowed deprecations.
config.active_support.disallowed_deprecation = :raise
+ config.active_storage.service_urls_expire_in = 240.minutes
+
# Tell Active Support which deprecation messages to disallow.
config.active_support.disallowed_deprecation_warnings = []
diff --git a/config/environments/production.rb b/config/environments/production.rb
index 9428c216..36b0bfaa 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -49,7 +49,7 @@ Rails.application.configure do
end
config.active_storage.resolve_model_to_route = :rails_storage_proxy if ENV['ACTIVE_STORAGE_PUBLIC'] != 'true'
- config.active_storage.service_urls_expire_in = 4.hours
+ config.active_storage.service_urls_expire_in = ENV.fetch('PRESIGNED_URLS_EXPIRE_MINUTES', '240').to_i.minutes
# Mount Action Cable outside main process or domain.
# config.action_cable.mount_path = nil
@@ -134,7 +134,15 @@ Rails.application.configure do
{}
end
+ resource = controller.instance_variable_get(:@submitter) ||
+ controller.instance_variable_get(:@submission) ||
+ controller.instance_variable_get(:@template) ||
+ controller.instance_variable_get(:@record)
+
+ current_user = controller.instance_variable_get(:@current_user)
+
{
+ host: controller.request.host,
fwd: controller.request.remote_ip,
params: {
id: params[:id],
@@ -148,8 +156,10 @@ Rails.application.configure do
params[:submit_form_slug] ||
params[:template_slug]).to_s.first(5)
}.compact_blank,
- host: controller.request.host,
- uid: controller.instance_variable_get(:@current_user).try(:id)
+ uid: current_user.try(:id),
+ aid: current_user.try(:account_id),
+ rid: resource.try(:id),
+ raid: resource.try(:account_id)
}
end
end
diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb
index 154deb25..d7b80f1a 100644
--- a/config/initializers/devise.rb
+++ b/config/initializers/devise.rb
@@ -321,7 +321,7 @@ Devise.setup do |config|
# apps is `200 OK` and `302 Found respectively`, but new apps are generated with
# these new defaults that match Hotwire/Turbo behavior.
# Note: These might become the new default in future versions of Devise.
- config.responder.error_status = :unprocessable_entity
+ config.responder.error_status = :unprocessable_content
config.responder.redirect_status = :see_other
# ==> Configuration for :registerable
diff --git a/config/initializers/pagy.rb b/config/initializers/pagy.rb
index dc79235a..45c364e8 100644
--- a/config/initializers/pagy.rb
+++ b/config/initializers/pagy.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+require 'pagy/extras/countless'
+
Pagy::DEFAULT[:limit] = 10
Pagy::DEFAULT.freeze
diff --git a/config/initializers/rouge.rb b/config/initializers/rouge.rb
new file mode 100644
index 00000000..e2c69ce7
--- /dev/null
+++ b/config/initializers/rouge.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+module Rouge
+ autoload :InheritableHash, 'rouge/util'
+ autoload :Token, 'rouge/token'
+ autoload :Lexer, 'rouge/lexer'
+ autoload :RegexLexer, 'rouge/regex_lexer'
+
+ module Lexers
+ autoload :JSON, 'rouge/lexers/json'
+ autoload :Shell, 'rouge/lexers/shell'
+ end
+
+ autoload :Formatter, 'rouge/formatter'
+
+ module Formatters
+ autoload :HTML, 'rouge/formatters/html'
+ autoload :HTMLInline, 'rouge/formatters/html_inline'
+ end
+
+ autoload :Theme, 'rouge/theme'
+end
diff --git a/config/locales/i18n.yml b/config/locales/i18n.yml
index 74d5d9f2..cb7de198 100644
--- a/config/locales/i18n.yml
+++ b/config/locales/i18n.yml
@@ -6,6 +6,7 @@ en: &en
language_fr-FR: Français
language_pt-PT: Português
language_de-DE: Deutsch
+ language_nl-NL: Nederlands
language_es: Español
language_it: Italiano
language_de: Deutsch
@@ -18,13 +19,43 @@ en: &en
language_nl: Nederlands
language_ar: العربية
language_ko: 한국어
+ language_ja: 日本語
+ add_from_google_drive: Add from Google Drive
+ or_add_from: Or add from
+ upload_a_new_document: Upload a New Document
hi_there: Hi there
+ pro: Pro
thanks: Thanks
+ private: Private
+ select: Select
+ enabled: Enabled
+ disabled: Disabled
+ party: Party
+ use_direct_file_attachment_links_in_the_documents: Use direct file attachment links in the documents
+ click_here_to_send_a_reset_password_email_html: ' to send a reset password email.'
+ edit_order: Edit Order
+ expirable_file_download_links: Expirable file download links
+ invite_form_fields: Invite form fields
+ default_parties: Default parties
+ authenticate_embedded_form_preview_with_token: Authenticate embedded form preview with token
+ stripe_integration: Stripe Integration
+ require_all_recipients: Require all recipients
+ stripe_account_has_been_connected: Stripe account has been connected.
+ re_connect_stripe: Re-connect Stripe
+ bcc_recipients: BCC recipients
+ resend_pending: Re-send pending
+ always_enforce_signing_order: Always enforce the signing order
+ create_templates_with_private_access_by_default: Create templates with private access by default
+ ensure_unique_recipients: Ensure unique recipients
edit_per_party: Edit per party
reply_to: Reply to
pending_by_me: Pending by me
partially_completed: Partially completed
- unarchive: Unarchive
+ require_phone_2fa_to_open: Require phone 2FA to open
+ the_sender_has_requested_a_two_factor_authentication_via_one_time_password_sent_to_your_html: The sender has requested two-factor authentication via a one-time password sent to your %{phone} phone number.
+ send_verification_code: Send verification code
+ code_has_been_resent: Code has been re-sent
+ invalid_code: Invalid code
signed: Signed
first_party: 'First Party'
remove_filter: Remove filter
@@ -35,16 +66,17 @@ en: &en
team_member_permissions: Team member permissions
entire_team: Entire team
admin_only: Admin only
- accessiable_by: Accessiable by
+ accessiable_by: Accessible by
team_access: Team access
document_download_filename_format: Document download filename format
- document_name: Document Name
docuseal_trusted_signature: DocuSeal Trusted Signature
hello_name: Hello %{name}
you_are_invited_to_product_name: You are invited to %{product_name}
you_have_been_invited_to_account_name_product_name_please_sign_up_using_the_link_below_: 'You have been invited to %{account_name} %{product_name}. Please sign up using the link below:'
sent_using_product_name_in_testing_mode_html: 'Sent using %{product_name} in testing mode'
sent_using_product_name_free_document_signing_html: 'Sent using %{product_name} free document signing.'
+ sent_with_docuseal_pro_html: 'Sent with DocuSeal Pro'
+ show_send_with_docuseal_pro_attribution_in_emails_html: Show "Sent with DocuSeal Pro" attribution in emails
sign_documents_with_trusted_certificate_provided_by_docu_seal_your_documents_and_data_are_never_shared_with_docu_seal_p_d_f_checksum_is_provided_to_generate_a_trusted_signature: Sign documents with trusted certificate provided by DocuSeal. Your documents and data are never shared with DocuSeal. PDF checksum is provided to generate a trusted signature.
you_have_been_invited_to_submit_the_name_form: 'You have been invited to submit the "%{name}" form.'
you_have_been_invited_to_sign_the_name: 'You have been invited to sign the "%{name}".'
@@ -53,7 +85,7 @@ en: &en
awaiting_completion_by_the_other_party: "Awaiting completion by the other party"
review_and_sign: Review and Sign
review_and_submit: Review and Submit
- please_contact_us_by_replying_to_this_email_if_you_didn_t_request_this: "Please contact us by replying to this email if you have any questions."
+ please_contact_us_by_replying_to_this_email_if_you_have_any_questions: "Please contact us by replying to this email if you have any questions."
submitter_invitation_sms_body_sign: '{account.name} has invited you to sign a document: {submitter.link}'
verification_code_sms_body: 'Verification code: {code}'
you_are_invited_to_submit_a_form: 'You are invited to submit a form'
@@ -97,6 +129,11 @@ en: &en
role: Role
reason: Reason
provide_your_email_to_start: Provide your email to start
+ provide_your_email: Provide your email
+ provide_your_name_to_start: Provide your name to start
+ provide_your_name: Provide your name
+ provide_your_phone_in_international_format_to_start: Provide your phone in international format to start
+ provide_your_phone_in_international_format: Provide your phone in international format
start: Start
enforce_recipients_order: Enforce recipients order
starting: Starting
@@ -164,7 +201,7 @@ en: &en
connect_salesforce: Connect Salesforce
danger_zone: Danger Zone
delete_my_account: Delete my account
- schedule_account_for_deletion_: Schedule account for deletion?
+ you_are_scheduling_your_account_for_deletion_after_deletion_your_data_will_be_permanently_removed_and_cannot_be_recovered_click_ok_if_you_would_like_to_continue: "You are scheduling your account for deletion. After deletion, your data will be permanently removed and cannot be recovered.\n\nClick OK if you would like to continue."
account_information_has_been_updated: Account information has been updated.
should_be_a_valid_url: should be a valid URL
your_account_removal_request_will_be_processed_within_2_months_please_contact_us_if_you_want_to_keep_your_account: Your account removal request will be processed within 2 months. Please contact us if you want to keep your account.
@@ -206,7 +243,7 @@ en: &en
upload_signed_pdf_file_to_validate_its_signature_: 'Upload signed PDF file to validate its signature:'
analyzing: Analyzing
verify_signed_pdf: Verify Signed PDF
- click_to_upload_or_drag_and_drop_html: 'Click to upload or drag and drop'
+ click_to_upload_or_drag_and_drop_html: 'Click to upload or drag and drop'
click_to_upload_or_drag_and_drop_files_html: 'Click to upload or drag and drop files'
signing_certificates: Signing Certificates
upload_cert: Upload Cert
@@ -253,6 +290,7 @@ en: &en
invalid_timeserver: Invalid Timeserver
email_templates: Email Templates
signature_request_email: Signature request email
+ signature_request_reminder_email: Signature request reminder email
signature_request_sms: Signature Request SMS
verification_code_sms: Verification Code SMS
completed_notification_email: Completed notification email
@@ -373,7 +411,6 @@ en: &en
send_signature_request_emails_without_limits_with_docuseal_pro: Send signature request emails without limits with DocuSeal Pro
count_emails_used: '%{count} emails used'
has_been_connected: has been connected
- but_not_activated: but not activated
sms_not_configured: SMS not Configure
configure_sms_settings_in_order_to_send_text_messages_: 'Configure SMS settings in order to send text messages:'
go_to_sms_settings: Go to SMS settings
@@ -433,9 +470,13 @@ en: &en
share_template_with_test_mode: Share template with Test mode
share_template_with_all_tenants: Share template with all Tenants
use_following_placeholders_text_: 'Use following placeholders text:'
- upgrade_plan_to_add_more_users: Upgrade plan to add more users
+ users_count_total_users_count_pro_users_limit_was_reached_to_invite_additional_users_please_purchase_more_pro_user_seats_via_the_manage_plan_button: '%{users_count}/%{total_users_count} Pro users limit was reached. To invite additional users, please purchase more Pro user seats via the "Manage plan" button.'
move_into_folder: Move Into Folder
new_folder_name: New Folder Name
+ new_subfolder_name: New Subfolder Name
+ change_parent_folder: Change Parent Folder
+ folder: Folder
+ create_a_new_folder: Create a New Folder
exit_preview: Exit Preview
general: General
recipients: Recipients
@@ -457,7 +498,9 @@ en: &en
upload_initials: Upload Initials
draw: Draw
upload_signature: Upload Signature
+ integration: Integration
admin: Admin
+ tenant_admin: Tenant Admin
editor: Editor
viewer: Viewer
member: Member
@@ -466,7 +509,6 @@ en: &en
edit_user: Edit User
new_user: New User
unarchive: Unarchive
- role: Role
last_session: Last session
unlock_more_user_roles_with_docuseal_pro: Unlock more user roles with DocuSeal Pro.
view_active: View Active
@@ -474,8 +516,6 @@ en: &en
team_accounts: Team Accounts
tenant_account: Tenant account
tenant_accounts: Tenant Accounts
- upgrade_plan: Upgrade Plan
- add_user: Add User
impersonate: Impersonate
loading: Loading
documents: Documents
@@ -535,8 +575,6 @@ en: &en
new_webhook: New Webhook
delete_webhook: Delete webhook
count_submissions_have_been_created: '%{count} submissions have been created.'
- gmail_has_been_connected: Gmail has been connected
- microsoft_account_has_been_connected: Microsoft Account has been connected
sms_length_cant_be_longer_than_120_bytes: SMS length can't be longer than 120 bytes
connected_successfully: Connected successfully.
user_nameid_not_found: 'User %{nameid} not found.'
@@ -561,6 +599,8 @@ en: &en
four_days: 4 days
eight_days: 8 days
fifteen_days: 15 days
+ twenty_one_days: 21 days
+ thirty_days: 30 days
free: Free
unlimited_documents_storage: Unlimited documents storage
users_management: Users management
@@ -588,6 +628,7 @@ en: &en
not_invited_yet: Not invited yet
not_completed_yet: Not completed yet
declined_on_time: 'Declined on %{time}'
+ expire_on_time: 'Expire on %{time}'
sign_in_person: Sign In-person
create_a_new_template_document_form_or_submit_the_existing_one_html: Create a new template document form or submit the existing one
send_email_copy_with_completed_documents_to_a_specified_bcc_address: Send email copy with completed documents to a specified BCC address.
@@ -642,7 +683,7 @@ en: &en
completed_at: Completed at
edit_recipient: Edit Recipient
update_recipient: Update Recipient
- use_international_format_1xxx_: 'Use internatioanl format: +1xxx...'
+ use_international_format_1xxx_: 'Use international format: +1xxx...'
submitter_cannot_be_updated: Submitter cannot be updated.
at_least_one_field_must_be_filled: At least one field must be filled.
archived_users: Archived Users
@@ -701,14 +742,118 @@ en: &en
submission_created_via_source_html: 'Submission created via %{source}'
pro_user_seats_used: Pro user seats used
manage_plan: Manage plan
+ this_submission_has_multiple_signers_which_prevents_the_use_of_a_sharing_link_html: This submission has multiple signers, which prevents the use of a sharing link as it's unclear which signer is responsible for specific fields. To resolve this, follow this guide to define the default signer details.
+ welcome_to_docuseal: Welcome to DocuSeal
+ start_a_quick_tour_to_learn_how_to_create_an_send_your_first_document: Start a quick tour to learn how to create an send your first document
+ start_tour: Start Tour
+ name_a_z: Name A-Z
+ recently_used: Recently used
+ newest_first: Newest first
+ none: None
+ default_expiration: Default expiration
+ specified_date: Specified date
+ one_day: 1 day
+ two_days: 2 days
+ three_days: 3 days
+ four_days: 4 days
+ five_days: 5 days
+ six_days: 6 days
+ seven_days: 7 days
+ eight_days: 8 days
+ nine_days: 9 days
+ ten_days: 10 days
+ two_weeks: 2 weeks
+ three_weeks: 3 weeks
+ four_weeks: 4 weeks
+ one_month: 1 month
+ two_months: 2 months
+ three_months: 3 months
+ eu_data_residency: EU data residency
+ please_enter_your_email_address_associated_with_the_completed_submission: Please enter your email address associated with the completed submission.
+ esignature_disclosure: eSignature Disclosure
+ share_link: Share link
+ enable_shared_link: Enable shared link
+ share_link_is_currently_disabled: Share link is currently disabled
+ select_data_residency: Select data residency
+ account_name_has_invited_you_to_fill_and_sign_documents_online_effortlessly_with_a_secure_fast_and_user_friendly_digital_document_signing_solution: '%{account_name} has invited you to fill and sign documents online effortlessly with a secure, fast, and user-friendly digital document signing solution.'
+ review_or_download_completed_documents_fill_and_sign_documents_online_effortlessly_with_a_secure_fast_and_user_friendly_digital_document_signing_solution: Review or download completed documents. Fill and sign documents online effortlessly with a secure, fast, and user-friendly digital document signing solution.
+ link_form_fields: Link form fields
+ at_least_one_field_must_be_displayed_in_the_form: At least one field must be displayed in the form.
+ this_template_has_multiple_parties_which_prevents_the_use_of_a_sharing_link: This template has multiple parties, which prevents the use of a shared link as it's unclear which party is responsible for specific fields. To resolve this, define the default party details.
+ events_log: Events Log
+ succeeded: Succeeded
+ failed: Failed
+ there_are_no_events: There are no events
+ resend: Resend
+ next_attempt_in_time_in_words: Next attempt in %{time_in_words}
+ request_email_otp_verification_with_shared_link: Request email OTP verification with shared link
+ sms_rate_limit_exceeded: SMS rate limit exceeded
+ invalid_phone_number: Invalid phone number
+ please_contact_the_requester_to_specify_your_phone_number_for_two_factor_authentication: Please contact the requester to specify your phone number for two-factor authentication.
+ we_sent_a_one_time_verification_code_to_your_email_address_please_enter_the_code_below_to_continue: We've sent a one-time verification code to your email address. Please enter the code below to continue.
+ re_send_code: Re-send Code
+ email_verification: Email verification
+ your_verification_code_to_access_the_name: 'Your verification code to access the "%{name}":'
+ please_reply_to_this_email_if_you_didnt_request_this: Please reply to this email if you didn't request this.
+ advanced_settings: Advanced settings
+ text: Text
+ code: Code
+ custom_html_emails: Custom HTML emails
+ connect_your_email_to_send_html_emails: Connect your email to send HTML emails
+ connect_your_email_or_outlook_account_or_add_smtp_settings_to_send_custom_html_emails: Connect your Gmail or Outlook account or add SMTP settings to send custom HTML emails.
+ connect_gmail_or_outlook: Connect Gmail or Outlook
+ connect_your_email_to_bulk_send: Connect your email to bulk send
+ connect_your_email_or_outlook_account_or_add_smtp_settings_to_bulk_send: Connect your Gmail or Outlook account or add SMTP settings to bulk send.
+ are_you_sure_you_want_to_add_recipients_without_sending_to_send_emails_it_requires_to_connect_gmail_or_outlook: Are you sure you want to add recipients without sending? To send emails it requires to connect Gmail or Outlook.
+ template_name_has_been_completed_by_submitters_html: '"{template.name}" has been completed by {submission.submitters}'
+ please_check_the_copy_of_your_template_name_in_the_email_attachments_html: 'Please check the copy of your "{template.name}" in the email attachments.'
+ you_have_been_invited_to_sign_the_template_name_html: 'You have been invited to sign the "{template.name}".'
+ reveal_api_key: Reveal API Key
+ enter_your_password_to_reveal_the_api_key: Enter your password to reveal the API key
+ wrong_password: Wrong password.
+ current_password: Current password
+ dont_remember_your_current_password_click_here_to_reset_it_html: 'Don''t remember your current password? to reset it.'
+ an_email_with_password_reset_instructions_has_been_sent: An email with password reset instructions has been sent.
+ api_key_access_code: API key access code
+ use_otp_code_to_access_the_api_key_html: Use %{code} code to access the API key.
+ please_reply_to_this_email_if_you_dont_recognize_this_request: Please reply to this email if you don't recognize this request.
+ your_user_account_has_been_archived_contact_your_administrator_to_restore_access_to_your_account: Your user account has been archived. Contact your administrator to restore access to your account.
+ your_email_could_not_be_reached_this_may_happen_if_there_was_a_typo_in_your_address_or_if_your_mailbox_is_not_available_please_contact_support_email_to_log_in: Your email could not be reached. This may happen if there was a typo in your address or if your mailbox is not available. Please contact support@docuseal.com to log in.
+ efficient_search_with_search_index: Efficient search with search index
+ reindex: Reindex
+ build_search_index: Build Search Index
+ require_two_factor_authentication_2fa_with_an_authenticator_app_e_g_google_authenticator_authy_all_users_signing_documents_must_pass_the_second_factor_verification_using_a_secure_code_in_addition_to_their_password: Require two-factor authentication (2FA) with an authenticator app (e.g., Google Authenticator, Authy). All users signing documents must pass the second factor verification using a secure code in addition to their password.
+ add_a_unique_signature_id_and_timestamp_to_each_signature_for_audit_and_traceability_purposes_along_with_the_timestamp_part_of_docuseals_21_cfr_part_11_compliance_settings: "Add a unique Signature ID and timestamp to each signature for audit and traceability purposes along with the timestamp. Part of DocuSeal's 21 CFR Part 11 compliance settings."
+ require_signer_to_provide_a_reason_for_signing_before_completing_their_signature_e_g_approvals_certifications_part_of_docuseals_21_cfr_part_11_compliance_settings: "Require signers to provide a reason for signing before completing their signature (e.g., approvals, certifications). Part of DocuSeal's 21 CFR Part 11 compliance settings."
+ allow_signers_to_create_signatures_by_typing_their_name_instead_of_drawing_or_uploading_one: Allow signers to create signatures by typing their name instead of drawing or uploading one.
+ allow_signers_to_resubmit_forms_after_completion_useful_when_corrections_or_multiple_submissions_are_needed: Allow signers to resubmit forms after completion, useful when corrections or multiple submissions are needed.
+ allow_recipients_to_decline_signing_a_document_the_decline_reason_notification_will_be_sent_to_the_signature_requester: Allow recipients to decline signing a document. The decline reason notification will be sent to the signature requester.
+ save_a_users_signature_and_automatically_pre_fill_it_in_future_signing_sessions: "Save a user's signature and automatically pre-fill it in future signing sessions."
+ make_document_download_links_expire_after_40_minutes_to_prevent_long_term_access_and_enhance_security: Make document download links expire after 40 minutes to prevent long-term access and enhance security.
+ require_authentication_with_user_login_or_api_key_to_access_the_document_download_links: Require authentication with user login or API key to access the document download links.
+ combine_signed_documents_and_the_audit_log_into_a_single_pdf_file_for_easier_recordkeeping_and_compliance: Combine signed documents and the Audit Log into a single PDF file for easier recordkeeping and compliance.
+ require_a_jwt_authorization_to_preview_embedded_forms_ensuring_only_authorized_users_can_view_them: Require a JWT authorization to preview embedded forms, ensuring only authorized users can view them.
+ make_all_newly_created_templates_private_to_their_creator_by_default: Make all newly created templates private to their creator by default.
+ make_the_recipients_signing_order_always_enforced_so_that_the_second_signer_can_start_signing_their_part_only_after_the_first_signer_has_completed_signing: Make the recipients signing order always enforced, so that the second signer can start signing their part only after the first signer has completed signing.
+ the_file_is_missing_make_sure_you_have_access_to_it_on_google_drive: The file is missing. Make sure you have access to it on Google Drive.
+ connect_google_drive: Connect Google Drive
+ google_drive_has_been_connected: Google Drive has been connected
+ unable_to_identify_reset_your_password_to_sign_in: Unable to identify. Reset your password to sign in.
+ desktop: Desktop
+ mobile: Mobile
+ tablet: Tablet
+ reset_default: Reset default
+ send_signature_request_email: Send signature request email
submission_sources:
api: API
bulk: Bulk Send
embed: Embedding
- invie: Invite
+ invite: Invite
link: Link
submission_event_names:
send_email_to_html: 'Email sent to %{submitter_name}'
+ bounce_email_html: 'Email bounced %{submitter_name}'
+ complaint_email_html: 'Spam complaint %{submitter_name}'
send_reminder_email_to_html: 'Reminder email sent to %{submitter_name}'
send_sms_to_html: 'SMS sent to %{submitter_name}'
send_2fa_sms_to_html: 'Verification SMS sent to %{submitter_name}'
@@ -716,6 +861,7 @@ en: &en
click_email_by_html: 'Email link clicked by %{submitter_name}'
click_sms_by_html: 'SMS link clicked by %{submitter_name}'
phone_verified_by_html: 'Phone verified by %{submitter_name}'
+ email_verified_by_html: 'Email verified by %{submitter_name}'
start_form_by_html: 'Submission started by %{submitter_name}'
view_form_by_html: 'Form viewed by %{submitter_name}'
invite_party_by_html: 'Invited %{invited_submitter_name} by %{submitter_name}'
@@ -739,12 +885,100 @@ en: &en
or: Or
download: download
a_sample_spreadsheet_to_fill_and_import: a sample spreadsheet to fill and import
+ app_tour:
+ start: Start
+ previous: Previous
+ next: Next
+ template_and_submissions: 'Templates and Submissions'
+ template_and_submissions_description: "You can select the view that best suits your workflow. Choose the 'Templates' view to create reusable document templates, or the 'Submissions' view to sign individual documents or review the status of each signature request."
+ upload_a_pdf_file: 'Upload a PDF file'
+ upload_a_pdf_file_description: 'Upload a PDF document to create a signing form template.'
+ select_a_signer_party: 'Select a signer party'
+ select_a_signer_party_description: 'This dropdown allows you to select a signing party role or add a new party to the document if it requires 2 or more signatures.'
+ available_parties: 'Available parties'
+ available_parties_description: 'This list contains all available parties with their role names. Once selected, you can add and configure fields for the signer party.'
+ available_field_types: 'Available field types'
+ available_field_types_description: 'This section contains all available field types that can be added to the document for data input or signature collection.'
+ text_input_field: 'Text input field'
+ text_input_field_description: 'This field allows users to enter text-based information, such as names or emails.'
+ signature_field: 'Signature field'
+ signature_field_description: 'This field is used to collect signatures from the signers.'
+ added_fields: 'Added fields'
+ added_fields_description: 'This list displays all fields added to the document. You can reorder, edit, or remove them.'
+ open_field_settings: 'Open field settings'
+ open_field_settings_description: 'On the right, next to the field name, there is a settings icon that opens the field settings.'
+ field_settings: 'Field settings'
+ field_settings_description: 'Each field can be customized through settings to meet your requirements, such as adjusting the font size, making it a required field, or adding a description.'
+ send_document: 'Send document for signing'
+ send_document_description: 'Before sending the document for signing, you can configure recipients, add their email addresses or phone numbers, and customize the email content.'
+ sign_yourself: 'Sign the document yourself'
+ sign_yourself_description: 'This button allows you to add your signature to the documents that require your signature.'
+ copy_and_share_link: 'Copy & share link'
+ copy_and_share_link_description: 'Copy this link to share the document. Anyone with the link can sign it after entering their email.'
+ sign_the_document: 'Sign the document'
+ sign_the_document_description: 'If you are one of the signers, this button allows you to sign the document.'
+ send_for_signing: 'Send for signing'
+ add_recipients: 'Add recipients'
+ add_recipients_description: 'Add new recipients for the document to be signed by entering their email addresses or phone numbers.'
+ settings: 'Settings'
+ settings_account_description: 'With comprehensive account settings, you can customize the eSigning experience and invite more users.'
+ support: 'Support'
+ support_description: 'You can use our self-service AI assistant or email us at support@docuseal.com if you have any questions.'
+ settings_template_description: 'Use this button to access your account settings page.'
doorkeeper:
scopes:
write: Update your data
read: Read your data
+ pagination:
+ submissions:
+ range_with_total: "%{from}-%{to} of %{count} submissions"
+ range_without_total: "%{from}-%{to} submissions"
+ templates:
+ range_with_total: "%{from}-%{to} of %{count} templates"
+ range_without_total: "%{from}-%{to} templates"
+ template_folders:
+ range_with_total: "%{from}-%{to} of %{count} folders"
+ range_without_total: "%{from}-%{to} folders"
+ users:
+ range_with_total: "%{from}-%{to} of %{count} users"
+ range_without_total: "%{from}-%{to} users"
+ items:
+ range_with_total: "%{from}-%{to} of %{count} items"
+ range_without_total: "%{from}-%{to} items"
+ events:
+ range_with_total: "%{from}-%{to} of %{count} events"
+ range_without_total: "%{from}-%{to} events"
es: &es
+ add_from_google_drive: Agregar desde Google Drive
+ or_add_from: O agregar desde
+ upload_a_new_document: Subir nuevo documento
+ use_direct_file_attachment_links_in_the_documents: Usar enlaces directos de archivos adjuntos en los documentos
+ enabled: Habilitado
+ disabled: Deshabilitado
+ expirable_file_download_links: Enlaces de descarga de archivos con vencimiento
+ create_templates_with_private_access_by_default: Crear plantillas con acceso privado por defecto
+ party: Parte
+ edit_order: Edita Pedido
+ select: Seleccionar
+ invite_form_fields: Invitar campos del formulario
+ pro: Pro
+ default_parties: Partes predeterminadas
+ authenticate_embedded_form_preview_with_token: Autenticar vista previa del formulario incrustado con token
+ require_all_recipients: Requerir a todos los destinatarios
+ stripe_integration: Integración con Stripe
+ stripe_account_has_been_connected: La cuenta de Stripe ha sido conectada.
+ re_connect_stripe: Volver a conectar Stripe
+ private: Privado
+ resend_pending: Reenviar pendiente
+ ensure_unique_recipients: Asegurar destinatarios únicos
+ require_phone_2fa_to_open: Requiere 2FA por teléfono para abrir
+ the_sender_has_requested_a_two_factor_authentication_via_one_time_password_sent_to_your_html: El remitente ha solicitado una autenticación de dos factores mediante una contraseña de un solo uso enviada a su número de teléfono %{phone}.
+ send_verification_code: Enviar código de verificación
+ code_has_been_resent: El código ha sido reenviado
+ invalid_code: Código inválido
+ always_enforce_signing_order: Siempre imponer el orden de firma
+ bcc_recipients: Destinatarios CCO
edit_per_party: Editar por parte
signed: Firmado
reply_to: Responder a
@@ -756,13 +990,11 @@ es: &es
select_user: Seleccionar usuario
team_member_permissions: Permisos de miembros del equipo
entire_team: Todo el equipo
- admin_only: Solo administrador
+ admin_only: Solo admin
accessiable_by: Accesible por
team_access: Acceso del equipo
remove_filter: Eliminar filtro
document_download_filename_format: Formato del nombre del archivo de descarga del documento
- document_name: Nombre del documento
- unarchive: Desarchivar
awaiting_completion_by_the_other_party: "Esperando la finalización por la otra parte"
enforce_recipients_order: 'Hacer cumplir el orden de los destinatarios'
first_party: 'Primera Parte'
@@ -772,6 +1004,8 @@ es: &es
you_have_been_invited_to_account_name_product_name_please_sign_up_using_the_link_below_: 'Has sido invitado a %{account_name} %{product_name}. Por favor, regístrate usando el enlace a continuación:'
sent_using_product_name_in_testing_mode_html: 'Enviado usando %{product_name} en Modo de Prueba'
sent_using_product_name_free_document_signing_html: 'Enviado usando la firma de documentos gratuita de %{product_name}.'
+ sent_with_docuseal_pro_html: 'Enviado con DocuSeal Pro'
+ show_send_with_docuseal_pro_attribution_in_emails_html: Mostrar el mensaje "Enviado con DocuSeal Pro" en los correos electrónicos
sign_documents_with_trusted_certificate_provided_by_docu_seal_your_documents_and_data_are_never_shared_with_docu_seal_p_d_f_checksum_is_provided_to_generate_a_trusted_signature: Firme documentos con un certificado de confianza proporcionado por DocuSeal. Sus documentos y datos nunca se comparten con DocuSeal. Se proporciona un checksum de PDF para generar una firma de confianza.
hi_there: Hola
thanks: Gracias
@@ -781,7 +1015,7 @@ es: &es
please_check_the_copy_of_your_name_in_the_email_attachments: 'Por favor, revisa la copia de tu "%{name}" en los archivos adjuntos del correo electrónico.'
review_and_sign: Revisar y Firmar
review_and_submit: Revisar y Enviar
- please_contact_us_by_replying_to_this_email_if_you_didn_t_request_this: "Por favor, contáctanos respondiendo a este correo si tienes alguna pregunta."
+ please_contact_us_by_replying_to_this_email_if_you_have_any_questions: "Por favor, contáctanos respondiendo a este correo si tienes alguna pregunta."
submitter_invitation_sms_body_sign: '{account.name} te ha invitado a firmar un documento: {submitter.link}'
verification_code_sms_body: 'Código de verificación: {code}'
you_are_invited_to_submit_a_form: 'Estás invitado/a a enviar un formulario'
@@ -810,7 +1044,7 @@ es: &es
submitter_documents_copy_email_body: |
Hola,
- Por favor, revisa la copia de tu "{template.name}" en los archivos adjuntos.
+ Por favor, revisa la copia de tu "{template.name}" en los archivos adjuntos del correo electrónico.
Alternativamente, puedes revisar y descargar tu copia usando el enlace a continuación:
[{template.name}]({documents.link})
@@ -825,6 +1059,11 @@ es: &es
role: Rol
reason: Razón
provide_your_email_to_start: Proporciona tu correo electrónico para comenzar
+ provide_your_email: Proporciona tu correo electrónico
+ provide_your_name_to_start: Proporciona tu nombre para comenzar
+ provide_your_name: Proporciona tu nombre
+ provide_your_phone_in_international_format_to_start: Proporciona tu teléfono en formato internacional para comenzar
+ provide_your_phone_in_international_format: Proporciona tu teléfono en formato internacional
start: Comenzar
starting: Comenzando
form_has_been_deleted_by_html: 'El formulario ha sido eliminado por %{name}.'
@@ -891,7 +1130,7 @@ es: &es
connect_salesforce: Conectar Salesforce
danger_zone: Zona de peligro
delete_my_account: Eliminar mi cuenta
- schedule_account_for_deletion_: ¿Programar la eliminación de la cuenta?
+ you_are_scheduling_your_account_for_deletion_after_deletion_your_data_will_be_permanently_removed_and_cannot_be_recovered_click_ok_if_you_would_like_to_continue: "Estás programando la eliminación de tu cuenta. Después de la eliminación, tus datos se eliminarán permanentemente y no podrán recuperarse.\n\nHaz clic en OK si deseas continuar."
account_information_has_been_updated: La información de la cuenta ha sido actualizada.
should_be_a_valid_url: debe ser una URL válida
your_account_removal_request_will_be_processed_within_2_months_please_contact_us_if_you_want_to_keep_your_account: Tu solicitud de eliminación de cuenta se procesará en un plazo de 2 meses. Por favor contáctanos si deseas mantener tu cuenta.
@@ -933,7 +1172,7 @@ es: &es
upload_signed_pdf_file_to_validate_its_signature_: 'Sube el archivo PDF firmado para validar su firma:'
analyzing: Analizando
verify_signed_pdf: Verificar PDF firmado
- click_to_upload_or_drag_and_drop_html: 'Haz clic para subir o arrastra y suelta'
+ click_to_upload_or_drag_and_drop_html: 'Haz clic para subir o arrastra y suelta'
click_to_upload_or_drag_and_drop_files_html: 'Haz clic para subir o arrastra y suelta archivos'
signing_certificates: Certificados de firma
upload_cert: Subir certificado
@@ -980,6 +1219,7 @@ es: &es
invalid_timeserver: Servidor de tiempo inválido
email_templates: Plantillas de correo electrónico
signature_request_email: Correo de solicitud de firma
+ signature_request_reminder_email: Correo de recordatorio de solicitud de firma
signature_request_sms: SMS de solicitud de firma
verification_code_sms: SMS de código de verificación
completed_notification_email: Correo de notificación de formulario completado
@@ -1100,7 +1340,6 @@ es: &es
send_signature_request_emails_without_limits_with_docuseal_pro: Envía solicitudes de firma sin límites con DocuSeal Pro
count_emails_used: '%{count} correos electrónicos utilizados'
has_been_connected: ha sido conectado
- but_not_activated: pero no activado
sms_not_configured: SMS no configurado
configure_sms_settings_in_order_to_send_text_messages_: 'Configura los ajustes de SMS para enviar mensajes de texto:'
go_to_sms_settings: Ir a la configuración de SMS
@@ -1160,9 +1399,13 @@ es: &es
share_template_with_test_mode: Compartir plantilla con el modo de prueba
share_template_with_all_tenants: Compartir plantilla con todos los inquilinos
use_following_placeholders_text_: 'Usa los siguientes marcadores de posición:'
- upgrade_plan_to_add_more_users: Actualiza el plan para agregar más usuarios
+ users_count_total_users_count_pro_users_limit_was_reached_to_invite_additional_users_please_purchase_more_pro_user_seats_via_the_manage_plan_button: 'Se alcanzó el límite de %{users_count}/%{total_users_count} usuarios Pro. Para invitar a más usuarios, compra más plazas Pro usando el botón "Gestionar plan".'
move_into_folder: Mover a la carpeta
new_folder_name: Nuevo nombre de la carpeta
+ new_subfolder_name: Nuevo nombre de subcarpeta
+ change_parent_folder: Cambiar carpeta principal
+ folder: Carpeta
+ create_a_new_folder: Crear una nueva carpeta
exit_preview: Salir de la vista previa
general: General
recipients: Destinatarios
@@ -1184,7 +1427,9 @@ es: &es
upload_initials: Subir iniciales
draw: Dibujar
upload_signature: Subir firma
+ integration: Integración
admin: Administrador
+ tenant_admin: Tenant Administrador
editor: Editor
viewer: Visor
member: Miembro
@@ -1193,7 +1438,6 @@ es: &es
edit_user: Editar usuario
new_user: Nuevo usuario
unarchive: Desarchivar
- role: Rol
last_session: Última sesión
unlock_more_user_roles_with_docuseal_pro: Desbloquea más roles de usuario con DocuSeal Pro.
view_active: Ver activos
@@ -1201,8 +1445,6 @@ es: &es
team_accounts: Cuentas de equipo
tenant_account: Cuenta de inquilino
tenant_accounts: Cuentas de inquilino
- upgrade_plan: Actualizar plan
- add_user: Agregar usuario
impersonate: Suplantar
loading: Cargando
documents: Documentos
@@ -1262,8 +1504,6 @@ es: &es
new_webhook: Nuevo Webhook
delete_webhook: Eliminar webhook
count_submissions_have_been_created: '%{count} envíos han sido creados.'
- gmail_has_been_connected: Gmail ha sido conectado.
- microsoft_account_has_been_connected: La cuenta de Microsoft ha sido conectada.
sms_length_cant_be_longer_than_120_bytes: La longitud del SMS no puede ser mayor a 120 bytes.
connected_successfully: Conectado con éxito.
user_nameid_not_found: 'Usuario %{nameid} no encontrado.'
@@ -1288,23 +1528,25 @@ es: &es
four_days: 4 días
eight_days: 8 días
fifteen_days: 15 días
+ twenty_one_days: 21 días
+ thirty_days: 30 días
free: Gratis
- unlimited_documents_storage: Almacenamiento ilimitado de documentos
+ unlimited_documents_storage: Almacenamiento ilimitado
users_management: Gestión de usuarios
ten_filed_types: 10 tipos de campos
multiple_signers: Múltiples firmantes
automatic_esignature: Firma electrónica automática
- ten_signature_request_emails_per_month: 10 correos electrónicos de solicitud de firma por mes
+ ten_signature_request_emails_per_month: 10 solicitudes de firma/mes
unlimited_sign_yourself: Firma ilimitada por ti mismo
- free_developer_testing_sandbox: Sandbox de prueba para desarrolladores gratis
+ free_developer_testing_sandbox: Sandbox gratuito para desarrolladores
continue_with_free_basic: Continuar con Free Basic
- unlimited_signature_request_emails: Correos electrónicos de solicitud de firma ilimitados
+ unlimited_signature_request_emails: Solicitudes de firma ilimitadas
your_company_logo: El logotipo de tu empresa
- connect_own_email_address: Conectar tu propia dirección de correo electrónico
- personalize_email_content: Personalizar el contenido del correo electrónico
+ connect_own_email_address: Conectar tu correo
+ personalize_email_content: Personalizar correo
automated_reminders: Recordatorios automáticos
bulk_send_from_spreadsheet: Envío masivo desde hoja de cálculo
- identify_verification_via_sms: Verificación de identidad a través de SMS
+ identify_verification_via_sms: Verificación por SMS
start_with_pro: Comenzar con Pro
user_month: usuario / mes
developer_sandbox: Sandbox para desarrolladores.
@@ -1315,6 +1557,7 @@ es: &es
not_invited_yet: Aún no invitado
not_completed_yet: Aún no completado
declined_on_time: 'Rechazado el %{time}'
+ expire_on_time: 'Expira el %{time}'
sign_in_person: Firma en persona
create_a_new_template_document_form_or_submit_the_existing_one_html: Crear una nueva plantilla de documento o enviar el existente
send_email_copy_with_completed_documents_to_a_specified_bcc_address: Enviar una copia del correo electrónico con los documentos completados a una dirección BCC especificada.
@@ -1355,7 +1598,6 @@ es: &es
select_field: Campo de Selección
multiple_field: Campo Múltiple
radio_field: Campo de Grupo Radio
- radio_field: Campo de Radio
cells_field: Campo de Celdas
stamp_field: Campo de Sello
payment_field: Campo de Pago
@@ -1428,6 +1670,108 @@ es: &es
submission_created_via_source_html: 'Envío creado a través de %{source}'
pro_user_seats_used: Plazas de usuario Pro en uso
manage_plan: Gestionar plan
+ this_submission_has_multiple_signers_which_prevents_the_use_of_a_sharing_link_html: 'Este envío tiene múltiples firmantes, lo que impide el uso de un enlace para compartir, ya que no está claro qué firmante es responsable de los campos específicos. Para resolver esto, sigue esta guía para definir los detalles predeterminados del firmante.'
+ welcome_to_docuseal: Bienvenido a DocuSeal
+ start_a_quick_tour_to_learn_how_to_create_an_send_your_first_document: Inicia una guía rápida para aprender a crear y enviar tu primer documento.
+ start_tour: Iniciar guía
+ name_a_z: Nombre A-Z
+ recently_used: Usado recientemente
+ newest_first: Más reciente primero
+ none: Ninguno
+ default_expiration: Vencimiento predeterminado
+ specified_date: Fecha especificada
+ one_day: 1 día
+ two_days: 2 días
+ three_days: 3 días
+ four_days: 4 días
+ five_days: 5 días
+ six_days: 6 días
+ seven_days: 7 días
+ eight_days: 8 días
+ nine_days: 9 días
+ ten_days: 10 días
+ two_weeks: 2 semanas
+ three_weeks: 3 semanas
+ four_weeks: 4 semanas
+ one_month: 1 mes
+ two_months: 2 meses
+ three_months: 3 meses
+ eu_data_residency: Datos alojados UE
+ please_enter_your_email_address_associated_with_the_completed_submission: Por favor, introduce tu dirección de correo electrónico asociada con el envío completado.
+ esignature_disclosure: Uso de firma electrónica
+ share_link: Enlace para compartir
+ enable_shared_link: Habilitar enlace compartido
+ share_link_is_currently_disabled: El enlace compartido está deshabilitado actualmente
+ select_data_residency: Seleccionar ubicación de datos
+ account_name_has_invited_you_to_fill_and_sign_documents_online_effortlessly_with_a_secure_fast_and_user_friendly_digital_document_signing_solution: '%{account_name} te ha invitado a completar y firmar documentos en línea fácilmente con una solución de firma digital segura, rápida y fácil de usar.'
+ review_or_download_completed_documents_fill_and_sign_documents_online_effortlessly_with_a_secure_fast_and_user_friendly_digital_document_signing_solution: Revisa o descarga los documentos completados. Completa y firma documentos en línea fácilmente con una solución de firma digital segura, rápida y fácil de usar.
+ link_form_fields: Vincular campos del formulario
+ at_least_one_field_must_be_displayed_in_the_form: Al menos un campo debe mostrarse en el formulario.
+ this_template_has_multiple_parties_which_prevents_the_use_of_a_sharing_link: Esta plantilla tiene varias partes, lo que impide el uso de un enlace compartido porque no está claro qué parte es responsable de campos específicos. Para resolverlo, define los detalles predeterminados de la parte.
+ events_log: Registro de eventos
+ succeeded: Exitoso
+ failed: Fallido
+ there_are_no_events: No hay eventos
+ resend: Reenviar
+ next_attempt_in_time_in_words: Próximo intento en %{time_in_words}
+ request_email_otp_verification_with_shared_link: Solicitar verificación OTP por correo electrónico con enlace compartido
+ sms_rate_limit_exceeded: Límite de SMS excedido
+ invalid_phone_number: Número de teléfono inválido
+ please_contact_the_requester_to_specify_your_phone_number_for_two_factor_authentication: Contacte al solicitante para especificar su número para la autenticación de dos factores.
+ we_sent_a_one_time_verification_code_to_your_email_address_please_enter_the_code_below_to_continue: Enviamos un código de verificación único a su correo electrónico. Ingréselo a continuación para continuar.
+ re_send_code: Reenviar código
+ email_verification: Verificación por correo electrónico
+ your_verification_code_to_access_the_name: 'Su código de verificación para acceder a "%{name}":'
+ please_reply_to_this_email_if_you_didnt_request_this: Por favor, responda este correo si no solicitó esto.
+ advanced_settings: Configuración avanzada
+ text: Texto
+ code: Código
+ custom_html_emails: Correos electrónicos HTML personalizados
+ connect_your_email_to_send_html_emails: Conecta tu correo electrónico para enviar correos HTML
+ connect_your_email_or_outlook_account_or_add_smtp_settings_to_send_custom_html_emails: Conecta tu cuenta de Gmail u Outlook o añade ajustes SMTP para enviar correos HTML personalizados.
+ connect_gmail_or_outlook: Conectar Gmail u Outlook
+ connect_your_email_to_bulk_send: Conecta tu correo electrónico para el envío masivo
+ connect_your_email_or_outlook_account_or_add_smtp_settings_to_bulk_send: Conecta tu cuenta de Gmail u Outlook o añade ajustes SMTP para el envío masivo.
+ are_you_sure_you_want_to_add_recipients_without_sending_to_send_emails_it_requires_to_connect_gmail_or_outlook: ¿Estás seguro de que quieres añadir destinatarios sin enviar? Para enviar correos electrónicos necesitas conectar Gmail u Outlook.
+ template_name_has_been_completed_by_submitters_html: '"{template.name}" ha sido completado por {submission.submitters}'
+ please_check_the_copy_of_your_template_name_in_the_email_attachments_html: 'Por favor, revisa la copia de tu "{template.name}" en los archivos adjuntos del correo electrónico.'
+ you_have_been_invited_to_sign_the_template_name_html: 'Has sido invitado a firmar el "{template.name}".'
+ reveal_api_key: Revelar clave API
+ enter_your_password_to_reveal_the_api_key: Introduce tu contraseña para revelar la clave API
+ wrong_password: Contraseña incorrecta.
+ current_password: Contraseña actual
+ dont_remember_your_current_password_click_here_to_reset_it_html: '¿No recuerdas tu contraseña actual? para restablecerla.'
+ an_email_with_password_reset_instructions_has_been_sent: Se enviará un correo electrónico con las instrucciones para restablecer tu contraseña en unos minutos.
+ api_key_access_code: Código de acceso de la clave API
+ use_otp_code_to_access_the_api_key_html: Usa el código %{code} para acceder a la clave API.
+ please_reply_to_this_email_if_you_dont_recognize_this_request: Responde a este correo si no reconoces esta solicitud.
+ your_user_account_has_been_archived_contact_your_administrator_to_restore_access_to_your_account: Tu cuenta de usuario ha sido archivada. Contacta a tu administrador para restaurar el acceso a tu cuenta.
+ your_email_could_not_be_reached_this_may_happen_if_there_was_a_typo_in_your_address_or_if_your_mailbox_is_not_available_please_contact_support_email_to_log_in: No se pudo acceder a tu correo electrónico. Esto puede ocurrir si hubo un error tipográfico en tu dirección o si tu buzón no está disponible. Por favor, contacta a support@docuseal.com para iniciar sesión.
+ efficient_search_with_search_index: Búsqueda eficiente con índice de búsqueda
+ reindex: Reindexar
+ build_search_index: Construir índice de búsqueda
+ require_two_factor_authentication_2fa_with_an_authenticator_app_e_g_google_authenticator_authy_all_users_signing_documents_must_pass_the_second_factor_verification_using_a_secure_code_in_addition_to_their_password: Requerir autenticación de dos factores (2FA) con una aplicación de autenticación (p. ej., Google Authenticator, Authy). Todos los usuarios que firman documentos deben pasar la verificación del segundo factor usando un código seguro además de su contraseña.
+ add_a_unique_signature_id_and_timestamp_to_each_signature_for_audit_and_traceability_purposes_along_with_the_timestamp_part_of_docuseals_21_cfr_part_11_compliance_settings: Agregar un ID de firma único y una marca de tiempo a cada firma para fines de auditoría y trazabilidad junto con la marca de tiempo. Parte de la configuración de cumplimiento 21 CFR Parte 11 de DocuSeal.
+ require_signer_to_provide_a_reason_for_signing_before_completing_their_signature_e_g_approvals_certifications_part_of_docuseals_21_cfr_part_11_compliance_settings: Requerir que los firmantes proporcionen un motivo para firmar antes de completar su firma (p. ej., aprobaciones, certificaciones). Parte de la configuración de cumplimiento 21 CFR Parte 11 de DocuSeal.
+ allow_signers_to_create_signatures_by_typing_their_name_instead_of_drawing_or_uploading_one: Permitir que los firmantes creen firmas escribiendo su nombre en lugar de dibujar o subir una.
+ allow_signers_to_resubmit_forms_after_completion_useful_when_corrections_or_multiple_submissions_are_needed: Permitir que los firmantes vuelvan a enviar formularios después de completarlos, útil cuando se necesitan correcciones o múltiples envíos.
+ allow_recipients_to_decline_signing_a_document_the_decline_reason_notification_will_be_sent_to_the_signature_requester: Permitir que los destinatarios rechacen firmar un documento. La notificación del motivo del rechazo se enviará al solicitante de la firma.
+ save_a_users_signature_and_automatically_pre_fill_it_in_future_signing_sessions: Guardar la firma de un usuario y rellenarla automáticamente en futuras sesiones de firma.
+ make_document_download_links_expire_after_40_minutes_to_prevent_long_term_access_and_enhance_security: Hacer que los enlaces de descarga de documentos caduquen después de 40 minutos para evitar el acceso a largo plazo y mejorar la seguridad.
+ require_authentication_with_user_login_or_api_key_to_access_the_document_download_links: Requerir autenticación con inicio de sesión de usuario o clave API para acceder a los enlaces de descarga de documentos.
+ combine_signed_documents_and_the_audit_log_into_a_single_pdf_file_for_easier_recordkeeping_and_compliance: Combinar documentos firmados y el registro de auditoría en un solo archivo PDF para una gestión y cumplimiento más fáciles.
+ require_a_jwt_authorization_to_preview_embedded_forms_ensuring_only_authorized_users_can_view_them: Requerir autorización JWT para previsualizar formularios incrustados, garantizando que solo los usuarios autorizados puedan verlos.
+ make_all_newly_created_templates_private_to_their_creator_by_default: Hacer que todas las plantillas creadas sean privadas para su creador por defecto.
+ make_the_recipients_signing_order_always_enforced_so_that_the_second_signer_can_start_signing_their_part_only_after_the_first_signer_has_completed_signing: Hacer que el orden de firma de los destinatarios se aplique siempre, de modo que el segundo firmante pueda comenzar a firmar solo después de que el primero haya completado la firma.
+ the_file_is_missing_make_sure_you_have_access_to_it_on_google_drive: El archivo falta. Asegúrate de tener acceso a él en Google Drive.
+ connect_google_drive: Conectar Google Drive
+ google_drive_has_been_connected: Google Drive se ha conectado
+ unable_to_identify_reset_your_password_to_sign_in: No se pudo identificar. Restablece tu contraseña para iniciar sesión.
+ desktop: Escritorio
+ mobile: Móvil
+ tablet: Tableta
+ reset_default: Restablecer por defecto
+ send_signature_request_email: Enviar correo de solicitud de firma
submission_sources:
api: API
bulk: Envío masivo
@@ -1436,6 +1780,8 @@ es: &es
link: Enlace
submission_event_names:
send_email_to_html: 'Correo electrónico enviado a %{submitter_name}'
+ bounce_email_html: 'Correo electrónico rebotado %{submitter_name}'
+ complaint_email_html: 'Queja de spam %{submitter_name}'
send_reminder_email_to_html: 'Correo de recordatorio enviado a %{submitter_name}'
send_sms_to_html: 'SMS enviado a %{submitter_name}'
send_2fa_sms_to_html: 'SMS de verificación enviado a %{submitter_name}'
@@ -1443,6 +1789,7 @@ es: &es
click_email_by_html: 'Enlace del correo electrónico clicado por %{submitter_name}'
click_sms_by_html: 'Enlace del SMS clicado por %{submitter_name}'
phone_verified_by_html: 'Teléfono verificado por %{submitter_name}'
+ email_verified_by_html: 'Correo electrónico verificado por %{submitter_name}'
start_form_by_html: 'Envío iniciado por %{submitter_name}'
view_form_by_html: 'Formulario visto por %{submitter_name}'
invite_party_by_html: 'Invitado %{invited_submitter_name} por %{submitter_name}'
@@ -1466,12 +1813,101 @@ es: &es
or: O
download: descarga
a_sample_spreadsheet_to_fill_and_import: una hoja de cálculo de ejemplo para completar e importar.
+ app_tour:
+ start: Comenzar
+ previous: Anterior
+ next: Siguiente
+ template_and_submissions: 'Plantillas y Envíos'
+ template_and_submissions_description: "Puedes seleccionar la vista que mejor se adapte a tu flujo de trabajo. Elige la vista 'Plantillas' para crear plantillas reutilizables de documentos, o la vista 'Envíos' para firmar documentos individuales o revisar el estado de cada solicitud de firma."
+ upload_a_pdf_file: 'Subir un archivo PDF'
+ upload_a_pdf_file_description: 'Sube un documento PDF para crear una plantilla de formulario de firma.'
+ select_a_signer_party: 'Seleccionar parte firmante'
+ select_a_signer_party_description: 'Este menú desplegable te permite seleccionar un rol de firmante o agregar una nueva parte al documento si requiere 2 o más firmas.'
+ available_parties: 'Partes disponibles'
+ available_parties_description: 'Esta lista contiene todas las partes disponibles con sus roles. Una vez seleccionada, puedes añadir y configurar campos para esa parte.'
+ available_field_types: 'Tipos de campo disponibles'
+ available_field_types_description: 'Esta sección contiene todos los tipos de campo que se pueden añadir al documento para entrada de datos o recolección de firmas.'
+ text_input_field: 'Campo de texto'
+ text_input_field_description: 'Este campo permite a los usuarios introducir información de texto, como nombres o correos electrónicos.'
+ signature_field: 'Campo de firma'
+ signature_field_description: 'Este campo se utiliza para recopilar las firmas de los firmantes.'
+ added_fields: 'Campos añadidos'
+ added_fields_description: 'Esta lista muestra todos los campos añadidos al documento. Puedes reordenarlos, editarlos o eliminarlos.'
+ open_field_settings: 'Abrir configuración del campo'
+ open_field_settings_description: 'A la derecha del nombre del campo, hay un icono de ajustes que abre la configuración del campo.'
+ field_settings: 'Configuración del campo'
+ field_settings_description: 'Cada campo puede personalizarse según tus necesidades, como ajustar el tamaño de fuente, hacerlo obligatorio o añadir una descripción.'
+ send_document: 'Enviar documento para firmar'
+ send_document_description: 'Antes de enviar el documento para firmar, puedes configurar destinatarios, añadir correos electrónicos o teléfonos, y personalizar el contenido del correo.'
+ sign_yourself: 'Firma el documento tú mismo'
+ sign_yourself_description: 'Este botón te permite añadir tu firma a documentos que requieren tu firma.'
+ copy_and_share_link: 'Copiar y compartir enlace'
+ copy_and_share_link_description: 'Copia este enlace para compartir el documento. Cualquiera con el enlace puede firmarlo tras ingresar su correo electrónico.'
+ sign_the_document: 'Firmar el documento'
+ sign_the_document_description: 'Si eres uno de los firmantes, este botón te permite firmar el documento.'
+ send_for_signing: 'Enviar para firma'
+ add_recipients: 'Agregar destinatarios'
+ add_recipients_description: 'Agrega nuevos destinatarios para que firmen el documento ingresando sus correos electrónicos o números de teléfono.'
+ settings: 'Configuración'
+ settings_account_description: 'Con una configuración completa de la cuenta, puedes personalizar la experiencia de firma y añadir más usuarios.'
+ support: 'Soporte'
+ support_description: 'Puedes usar nuestro asistente de IA o escribirnos a support@docuseal.com si tienes preguntas.'
+ settings_template_description: 'Usa este botón para acceder a la configuración de tu cuenta.'
doorkeeper:
scopes:
write: Actualizar tus datos
read: Leer tus datos
+ pagination:
+ submissions:
+ range_with_total: "%{from}-%{to} de %{count} envíos"
+ range_without_total: "%{from}-%{to} envíos"
+ templates:
+ range_with_total: "%{from}-%{to} de %{count} plantillas"
+ range_without_total: "%{from}-%{to} plantillas"
+ template_folders:
+ range_with_total: "%{from}-%{to} de %{count} carpetas"
+ range_without_total: "%{from}-%{to} carpetas"
+ users:
+ range_with_total: "%{from}-%{to} de %{count} usuarios"
+ range_without_total: "%{from}-%{to} usuarios"
+ items:
+ range_with_total: "%{from}-%{to} de %{count} elementos"
+ range_without_total: "%{from}-%{to} elementos"
+ events:
+ range_with_total: "%{from}-%{to} de %{count} eventos"
+ range_without_total: "%{from}-%{to} eventos"
it: &it
+ add_from_google_drive: Aggiungi da Google Drive
+ or_add_from: Oppure aggiungi da
+ upload_a_new_document: Carica nuovo documento
+ use_direct_file_attachment_links_in_the_documents: Usa i link diretti per gli allegati nei documenti
+ click_here_to_send_a_reset_password_email_html: ' per inviare una email per reimpostare la password.'
+ enabled: Abilitato
+ disabled: Disabilitato
+ expirable_file_download_links: Link di download di file con scadenza
+ create_templates_with_private_access_by_default: Crea modelli con accesso privato per impostazione predefinita
+ party: Parte
+ edit_order: Modifica Ordine
+ select: Seleziona
+ invite_form_fields: Invita campi modulo
+ pro: Pro
+ default_parties: Parti predefiniti
+ authenticate_embedded_form_preview_with_token: "Autentica l'anteprima del modulo incorporato con il token"
+ require_all_recipients: Richiedi tutti i destinatari
+ stripe_integration: Integrazione Stripe
+ stripe_account_has_been_connected: L'account Stripe è stato collegato.
+ re_connect_stripe: Ricollega Stripe
+ private: Privato
+ resend_pending: Reinvia in sospeso
+ ensure_unique_recipients: Assicurarsi destinatari unici
+ require_phone_2fa_to_open: Richiedi l'autenticazione a due fattori tramite telefono per aprire
+ the_sender_has_requested_a_two_factor_authentication_via_one_time_password_sent_to_your_html: Il mittente ha richiesto un'autenticazione a due fattori tramite una password monouso inviata al tuo numero di telefono %{phone}.
+ send_verification_code: Invia codice di verifica
+ code_has_been_resent: Il codice è stato inviato di nuovo
+ invalid_code: Codice non valido
+ always_enforce_signing_order: Applicare sempre l'ordine di firma
+ bcc_recipients: Destinatari BCC
edit_per_party: Modifica per partito
signed: Firmato
reply_to: Rispondi a
@@ -1482,13 +1918,11 @@ it: &it
select_user: Seleziona utente
team_member_permissions: Permessi membri del team
entire_team: Intero team
- admin_only: Solo amministratore
+ admin_only: Solo admin
accessiable_by: Accessibile da
team_access: Accesso al team
remove_filter: Rimuovi filtro
document_download_filename_format: Formato del nome file scaricato
- document_name: Nome del Documento
- unarchive: Ripristina
awaiting_completion_by_the_other_party: "In attesa di completamento da parte dell'altra parte"
enforce_recipients_order: "Applicare l'ordine dei destinatari"
first_party: 'Prima parte'
@@ -1498,6 +1932,8 @@ it: &it
you_have_been_invited_to_account_name_product_name_please_sign_up_using_the_link_below_: 'Sei stato invitato a %{account_name} %{product_name}. Registrati utilizzando il link qui sotto:'
sent_using_product_name_in_testing_mode_html: 'Inviato utilizzando %{product_name} in Modalità di Test'
sent_using_product_name_free_document_signing_html: 'Inviato utilizzando la firma di documenti gratuita di %{product_name}.'
+ sent_with_docuseal_pro_html: 'Inviato con DocuSeal Pro'
+ show_send_with_docuseal_pro_attribution_in_emails_html: Mostra la dicitura "Inviato con DocuSeal Pro" nelle email
sign_documents_with_trusted_certificate_provided_by_docu_seal_your_documents_and_data_are_never_shared_with_docu_seal_p_d_f_checksum_is_provided_to_generate_a_trusted_signature: "Firma documenti con un certificato di fiducia fornito da DocuSeal. I tuoi documenti e i tuoi dati non vengono mai condivisi con DocuSeal. Il checksum PDF è fornito per generare una firma di fiducia."
hi_there: Ciao
thanks: Grazie
@@ -1507,7 +1943,7 @@ it: &it
please_check_the_copy_of_your_name_in_the_email_attachments: "Per favore, controlla la copia del tuo \"%{name}\" negli allegati dell'email."
review_and_sign: Rivedi e Firma
review_and_submit: Rivedi e Invia
- please_contact_us_by_replying_to_this_email_if_you_didn_t_request_this: "Per favore, contattaci rispondendo a questa email se hai domande."
+ please_contact_us_by_replying_to_this_email_if_you_have_any_questions: "Per favore, contattaci rispondendo a questa email se hai domande."
submitter_invitation_sms_body_sign: '{account.name} ti ha invitato a firmare un documento: {submitter.link}'
verification_code_sms_body: 'Codice di verifica: {code}'
you_are_invited_to_submit_a_form: 'Sei stato invitato a inviare un modulo'
@@ -1551,6 +1987,11 @@ it: &it
role: Ruolo
reason: Ragione
provide_your_email_to_start: Fornisci la tua email per iniziare
+ provide_your_email: Fornisci la tua email
+ provide_your_name_to_start: Fornisci il tuo nome per iniziare
+ provide_your_name: Fornisci il tuo nome
+ provide_your_phone_in_international_format_to_start: Fornisci il tuo telefono in formato internazionale per iniziare
+ provide_your_phone_in_international_format: Fornisci il tuo telefono in formato internazionale
start: Inizia
starting: Iniziando
form_has_been_deleted_by_html: 'Il modulo è stato eliminato da %{name}.'
@@ -1617,7 +2058,7 @@ it: &it
connect_salesforce: Connetti Salesforce
danger_zone: Zona di pericolo
delete_my_account: Elimina il mio account
- schedule_account_for_deletion_: "Programmare l'eliminazione dell'account?"
+ you_are_scheduling_your_account_for_deletion_after_deletion_your_data_will_be_permanently_removed_and_cannot_be_recovered_click_ok_if_you_would_like_to_continue: "Stai programmando l'eliminazione del tuo account. Dopo l'eliminazione, i tuoi dati saranno rimossi in modo permanente e non potranno essere recuperati.\n\nFai clic su OK se desideri continuare."
account_information_has_been_updated: "Le informazioni dell'account sono state aggiornate."
should_be_a_valid_url: deve essere un URL valido
your_account_removal_request_will_be_processed_within_2_months_please_contact_us_if_you_want_to_keep_your_account: "La tua richiesta di rimozione dell'account sarà elaborata entro 2 mesi. Contattaci se desideri mantenere il tuo account."
@@ -1659,7 +2100,7 @@ it: &it
upload_signed_pdf_file_to_validate_its_signature_: 'Carica il file PDF firmato per validarne la firma:'
analyzing: Analisi in corso
verify_signed_pdf: Verifica PDF firmato
- click_to_upload_or_drag_and_drop_html: 'Clicca per caricare o trascina e rilascia'
+ click_to_upload_or_drag_and_drop_html: 'Clicca per caricare o trascina e rilascia'
click_to_upload_or_drag_and_drop_files_html: 'Clicca per caricare o trascina e rilascia i file'
signing_certificates: Certificati di firma
upload_cert: Carica certificato
@@ -1706,6 +2147,7 @@ it: &it
invalid_timeserver: Server di timestamp non valido
email_templates: Modelli email
signature_request_email: Email di richiesta di firma
+ signature_request_reminder_email: Email di promemoria di richiesta di firma
signature_request_sms: SMS di richiesta di firma
verification_code_sms: SMS con codice di verifica
completed_notification_email: Email di notifica di completamento
@@ -1806,7 +2248,7 @@ it: &it
add_new: Aggiungi nuovo
add_recipients: Aggiungi destinatari
add_new_recipients: Aggiungi nuovi destinatari
- add_recipients_html: Aggiungi
+ add_recipients_html: Destinatari
type_emails_here: Digita qui le email
or_embed_on_your_website: Oppure integra nel tuo sito web
phone: Telefono
@@ -1826,7 +2268,6 @@ it: &it
send_signature_request_emails_without_limits_with_docuseal_pro: Invia email di richiesta di firma senza limiti con DocuSeal Pro
count_emails_used: '%{count} email utilizzate'
has_been_connected: è stato connesso
- but_not_activated: ma non attivato
sms_not_configured: SMS non configurato
configure_sms_settings_in_order_to_send_text_messages_: 'Configura le impostazioni SMS per inviare messaggi di testo:'
go_to_sms_settings: Vai alle impostazioni SMS
@@ -1886,9 +2327,13 @@ it: &it
share_template_with_test_mode: Condividi modello con la modalità di test
share_template_with_all_tenants: Condividi il modello con tutti i tenant
use_following_placeholders_text_: 'Usa i seguenti segnaposto:'
- upgrade_plan_to_add_more_users: Aggiorna il piano per aggiungere più utenti
+ users_count_total_users_count_pro_users_limit_was_reached_to_invite_additional_users_please_purchase_more_pro_user_seats_via_the_manage_plan_button: 'È stato raggiunto il limite di %{users_count}/%{total_users_count} utenti Pro. Per invitare altri utenti, acquista più posti Pro tramite il pulsante "Gestisci piano".'
move_into_folder: Sposta nella cartella
new_folder_name: Nuovo nome della cartella
+ new_subfolder_name: Nuovo nome della sottocartella
+ change_parent_folder: Cambia cartella principale
+ folder: Cartella
+ create_a_new_folder: Crea una nuova cartella
exit_preview: "Esci dall'anteprima"
general: Generale
recipients: Destinatari
@@ -1910,6 +2355,7 @@ it: &it
upload_initials: Carica iniziali
draw: Disegna
upload_signature: Carica firma
+ integration: Integrazione
admin: Amministratore
editor: Editor
viewer: Visualizzatore
@@ -1919,7 +2365,6 @@ it: &it
edit_user: Modifica utente
new_user: Nuovo utente
unarchive: Disarchivia
- role: Ruolo
last_session: Ultima sessione
unlock_more_user_roles_with_docuseal_pro: Sblocca più ruoli utente con DocuSeal Pro.
view_active: Visualizza attivi
@@ -1927,8 +2372,6 @@ it: &it
team_accounts: Account di squadra
tenant_account: Account tenant
tenant_accounts: Account tenant
- upgrade_plan: Aggiorna piano
- add_user: Aggiungi utente
impersonate: Impersona
loading: Caricamento in corso
documents: Documenti
@@ -1988,8 +2431,6 @@ it: &it
new_webhook: Nuovo Webhook
delete_webhook: Elimina webhook
count_submissions_have_been_created: '%{count} invii sono stati creati.'
- gmail_has_been_connected: Gmail è stato connesso.
- microsoft_account_has_been_connected: "L'account Microsoft è stato connesso."
sms_length_cant_be_longer_than_120_bytes: "La lunghezza dell'SMS non può superare i 120 byte."
connected_successfully: Collegamento avvenuto con successo.
user_nameid_not_found: 'Utente %{nameid} non trovato.'
@@ -2014,6 +2455,8 @@ it: &it
four_days: 4 giorni
eight_days: 8 giorni
fifteen_days: 15 giorni
+ twenty_one_days: 21 giorni
+ thirty_days: 30 giorni
free: Gratuito
unlimited_documents_storage: Archiviazione illimitata di documenti
users_management: Gestione utenti
@@ -2022,7 +2465,7 @@ it: &it
automatic_esignature: Firma elettronica automatica
ten_signature_request_emails_per_month: 10 email di richiesta di firma al mese
unlimited_sign_yourself: Firma illimitata da te stesso
- free_developer_testing_sandbox: Sandbox di test per sviluppatori gratuito
+ free_developer_testing_sandbox: Sandbox di test gratuita
continue_with_free_basic: Continua con il piano Free Basic
unlimited_signature_request_emails: Email di richiesta di firma illimitate
your_company_logo: Il logo della tua azienda
@@ -2041,6 +2484,7 @@ it: &it
not_invited_yet: Non ancora invitato
not_completed_yet: Non ancora completato
declined_on_time: 'Rifiutato il %{time}'
+ expire_on_time: 'Scade il %{time}'
sign_in_person: Firma di persona
create_a_new_template_document_form_or_submit_the_existing_one_html: Crea un nuovo modello di documento o invia quello esistente
send_email_copy_with_completed_documents_to_a_specified_bcc_address: Invia una copia dell'email con i documenti completati a un indirizzo BCC specificato.
@@ -2154,6 +2598,109 @@ it: &it
submission_created_via_source_html: 'Invio creato tramite %{source}'
pro_user_seats_used: Posti utente Pro in uso
manage_plan: Gestisci piano
+ this_submission_has_multiple_signers_which_prevents_the_use_of_a_sharing_link_html: "Questa sottomissione ha più firmatari, il che impedisce l'uso di un link di condivisione poiché non è chiaro quale firmatario sia responsabile di specifici campi. Per risolvere questo problema, segui questa guida per definire i dettagli predefiniti del firmatario."
+ welcome_to_docuseal: Benvenuto in DocuSeal
+ start_a_quick_tour_to_learn_how_to_create_an_send_your_first_document: Inizia un tour rapido per imparare a creare e inviare il tuo primo documento.
+ start_tour: Inizia il tour
+ name_a_z: Nome A-Z
+ recently_used: Recentemente usato
+ newest_first: Più recenti prima
+ none: Nessuno
+ default_expiration: Scadenza predefinita
+ specified_date: Data specificata
+ one_day: 1 giorno
+ two_days: 2 giorni
+ three_days: 3 giorni
+ four_days: 4 giorni
+ five_days: 5 giorni
+ six_days: 6 giorni
+ seven_days: 7 giorni
+ eight_days: 8 giorni
+ nine_days: 9 giorni
+ ten_days: 10 giorni
+ two_weeks: 2 settimane
+ three_weeks: 3 settimane
+ four_weeks: 4 settimane
+ one_month: 1 mese
+ two_months: 2 mesi
+ three_months: 3 mesi
+ eu_data_residency: "Dati nell'UE"
+ please_enter_your_email_address_associated_with_the_completed_submission: "Inserisci il tuo indirizzo email associato all'invio completato."
+ esignature_disclosure: Uso della firma elettronica
+ share_link: Link di condivisione
+ enable_shared_link: Abilita link condiviso
+ share_link_is_currently_disabled: Il link condiviso è attualmente disabilitato
+ select_data_residency: Seleziona la residenza dei dati
+ account_name_has_invited_you_to_fill_and_sign_documents_online_effortlessly_with_a_secure_fast_and_user_friendly_digital_document_signing_solution: '%{account_name} ti ha invitato a compilare e firmare documenti online con facilità utilizzando una soluzione di firma digitale sicura, veloce e facile da usare.'
+ review_or_download_completed_documents_fill_and_sign_documents_online_effortlessly_with_a_secure_fast_and_user_friendly_digital_document_signing_solution: Rivedi o scarica i documenti completati. Compila e firma documenti online facilmente con una soluzione di firma digitale sicura, veloce e facile da usare.
+ link_form_fields: Collega i campi del modulo
+ at_least_one_field_must_be_displayed_in_the_form: Almeno un campo deve essere visualizzato nel modulo.
+ this_template_has_multiple_parties_which_prevents_the_use_of_a_sharing_link: Questo modello ha più parti, il che impedisce l’uso di un link di condivisione perché non è chiaro quale parte sia responsabile di campi specifici. Per risolvere, definisci i dettagli predefiniti della parte.
+ events_log: Registro eventi
+ succeeded: Riuscito
+ failed: Fallito
+ there_are_no_events: Nessun evento
+ resend: Invia di nuovo
+ next_attempt_in_time_in_words: Prossimo tentativo tra %{time_in_words}
+ this_template_has_multiple_parties_which_prevents_the_use_of_a_sharing_link: "Questo modello ha più parti, il che impedisce l'uso di un link di condivisione perché non è chiaro quale parte sia responsabile di campi specifici. Per risolvere, definisci i dettagli predefiniti della parte."
+ request_email_otp_verification_with_shared_link: "Richiedi la verifica OTP tramite email con link condiviso"
+ sms_rate_limit_exceeded: Limite SMS superato
+ invalid_phone_number: Numero di telefono non valido
+ please_contact_the_requester_to_specify_your_phone_number_for_two_factor_authentication: Contatta il richiedente per specificare il tuo numero per l'autenticazione a due fattori.
+ we_sent_a_one_time_verification_code_to_your_email_address_please_enter_the_code_below_to_continue: Abbiamo inviato un codice di verifica una tantum alla tua email. Inseriscilo qui sotto per continuare.
+ re_send_code: Invia di nuovo il codice
+ email_verification: Verifica email
+ your_verification_code_to_access_the_name: 'Il tuo codice per accedere a "%{name}":'
+ please_reply_to_this_email_if_you_didnt_request_this: Rispondi a questa email se non hai richiesto questo.
+ advanced_settings: Impostazioni avanzate
+ text: Testo
+ code: Codice
+ custom_html_emails: Email HTML personalizzate
+ connect_your_email_to_send_html_emails: Collega la tua email per inviare email HTML
+ connect_your_email_or_outlook_account_or_add_smtp_settings_to_send_custom_html_emails: Collega il tuo account Gmail o Outlook oppure aggiungi impostazioni SMTP per inviare email HTML personalizzate.
+ connect_gmail_or_outlook: Collega Gmail o Outlook
+ connect_your_email_to_bulk_send: Collega la tua email per invio multiplo
+ connect_your_email_or_outlook_account_or_add_smtp_settings_to_bulk_send: Collega il tuo account Gmail o Outlook oppure aggiungi impostazioni SMTP per invio multiplo.
+ are_you_sure_you_want_to_add_recipients_without_sending_to_send_emails_it_requires_to_connect_gmail_or_outlook: Sei sicuro di voler aggiungere destinatari senza inviare? Per inviare email devi collegare Gmail o Outlook.
+ template_name_has_been_completed_by_submitters_html: '"{template.name}" è stato completato da {submission.submitters}'
+ please_check_the_copy_of_your_template_name_in_the_email_attachments_html: 'Per favore, controlla la copia del tuo "{template.name}" negli allegati dell''email.'
+ you_have_been_invited_to_sign_the_template_name_html: 'Sei stato invitato a firmare il "{template.name}".'
+ reveal_api_key: Mostra chiave API
+ enter_your_password_to_reveal_the_api_key: Inserisci la tua password per mostrare la chiave API
+ wrong_password: Password errata.
+ current_password: Password attuale
+ dont_remember_your_current_password_click_here_to_reset_it_html: 'Non ricordi la tua password attuale? per reimpostarla.'
+ an_email_with_password_reset_instructions_has_been_sent: Un'email con le istruzioni per reimpostare la password ti è stata inviata e arriverà entro pochi minuti.
+ api_key_access_code: Codice di accesso della chiave API
+ use_otp_code_to_access_the_api_key_html: Usa il codice %{code} per accedere alla chiave API.
+ please_reply_to_this_email_if_you_dont_recognize_this_request: Rispondi a questa email se non riconosci questa richiesta.
+ your_user_account_has_been_archived_contact_your_administrator_to_restore_access_to_your_account: Il tuo account utente è stato archiviato. Contatta il tuo amministratore per ripristinare l'accesso al tuo account.
+ your_email_could_not_be_reached_this_may_happen_if_there_was_a_typo_in_your_address_or_if_your_mailbox_is_not_available_please_contact_support_email_to_log_in: Non è stato possibile raggiungere la tua email. Questo può accadere se c'è stato un errore di digitazione nell'indirizzo o se la tua casella di posta non è disponibile. Contatta support@docuseal.com per accedere.
+ efficient_search_with_search_index: Ricerca efficiente con indice di ricerca
+ reindex: Reindicizza
+ build_search_index: Crea indice di ricerca
+ require_two_factor_authentication_2fa_with_an_authenticator_app_e_g_google_authenticator_authy_all_users_signing_documents_must_pass_the_second_factor_verification_using_a_secure_code_in_addition_to_their_password: "Richiedere l'autenticazione a due fattori (2FA) con un'app di autenticazione (es. Google Authenticator, Authy). Tutti gli utenti che firmano documenti devono superare la verifica del secondo fattore utilizzando un codice sicuro oltre alla password."
+ add_a_unique_signature_id_and_timestamp_to_each_signature_for_audit_and_traceability_purposes_along_with_the_timestamp_part_of_docuseals_21_cfr_part_11_compliance_settings: Aggiungere un ID firma univoco e una marca temporale a ogni firma per scopi di audit e tracciabilità insieme alla marca temporale. Parte delle impostazioni di conformità 21 CFR Parte 11 di DocuSeal.
+ require_signer_to_provide_a_reason_for_signing_before_completing_their_signature_e_g_approvals_certifications_part_of_docuseals_21_cfr_part_11_compliance_settings: Richiedere ai firmatari di fornire una motivazione prima di completare la firma (es. approvazioni, certificazioni). Parte delle impostazioni di conformità 21 CFR Parte 11 di DocuSeal.
+ allow_signers_to_create_signatures_by_typing_their_name_instead_of_drawing_or_uploading_one: Consentire ai firmatari di creare firme digitando il proprio nome invece di disegnarle o caricarle.
+ allow_signers_to_resubmit_forms_after_completion_useful_when_corrections_or_multiple_submissions_are_needed: Consentire ai firmatari di reinviare i moduli dopo il completamento, utile quando sono necessarie correzioni o più invii.
+ allow_recipients_to_decline_signing_a_document_the_decline_reason_notification_will_be_sent_to_the_signature_requester: Consentire ai destinatari di rifiutare di firmare un documento. La notifica del motivo del rifiuto verrà inviata al richiedente della firma.
+ save_a_users_signature_and_automatically_pre_fill_it_in_future_signing_sessions: Salvare la firma di un utente e compilarla automaticamente nelle future sessioni di firma.
+ make_document_download_links_expire_after_40_minutes_to_prevent_long_term_access_and_enhance_security: "Fare in modo che i link di download dei documenti scadano dopo 40 minuti per prevenire l'accesso a lungo termine e migliorare la sicurezza."
+ require_authentication_with_user_login_or_api_key_to_access_the_document_download_links: "Richiedere l'autenticazione con login utente o chiave API per accedere ai link di download dei documenti."
+ combine_signed_documents_and_the_audit_log_into_a_single_pdf_file_for_easier_recordkeeping_and_compliance: Combinare documenti firmati e registro di audit in un unico file PDF per una gestione e conformità più semplici.
+ require_a_jwt_authorization_to_preview_embedded_forms_ensuring_only_authorized_users_can_view_them: "Richiedere un'autorizzazione JWT per visualizzare in anteprima i moduli incorporati, garantendo che solo gli utenti autorizzati possano vederli."
+ make_all_newly_created_templates_private_to_their_creator_by_default: Rendere tutte le nuove template private per il creatore per impostazione predefinita.
+ make_the_recipients_signing_order_always_enforced_so_that_the_second_signer_can_start_signing_their_part_only_after_the_first_signer_has_completed_signing: "Rendere sempre obbligatorio l'ordine di firma dei destinatari, in modo che il secondo firmatario possa iniziare solo dopo che il primo ha completato la firma."
+ the_file_is_missing_make_sure_you_have_access_to_it_on_google_drive: Il file è mancante. Assicurati di avere accesso a esso su Google Drive.
+ connect_google_drive: Connetti Google Drive
+ google_drive_has_been_connected: Google Drive è stato connesso
+ unable_to_identify_reset_your_password_to_sign_in: Impossibile identificare. Reimposta la password per accedere.
+ desktop: Desktop
+ mobile: Mobile
+ tablet: Tablet
+ reset_default: Reimposta predefinito
+ send_signature_request_email: Invia email di richiesta firma
submission_sources:
api: API
bulk: Invio massivo
@@ -2161,7 +2708,9 @@ it: &it
invite: Invito
link: Link
submission_event_names:
- send_email_to_html: 'E-mail inviato a %{submitter_name}'
+ send_email_to_html: 'Email inviata a %{submitter_name}'
+ bounce_email_html: 'Email respinta %{submitter_name}'
+ complaint_email_html: 'Segnalazione spam %{submitter_name}'
send_reminder_email_to_html: 'E-mail di promemoria inviato a %{submitter_name}'
send_sms_to_html: 'SMS inviato a %{submitter_name}'
send_2fa_sms_to_html: 'SMS di verifica inviato a %{submitter_name}'
@@ -2169,6 +2718,7 @@ it: &it
click_email_by_html: "Link dell'e-mail cliccato da %{submitter_name}"
click_sms_by_html: "Link dell'SMS cliccato da %{submitter_name}"
phone_verified_by_html: 'Telefono verificato da %{submitter_name}'
+ email_verified_by_html: 'Email verificata da %{submitter_name}'
start_form_by_html: 'Invio iniziato da %{submitter_name}'
view_form_by_html: 'Modulo visualizzato da %{submitter_name}'
invite_party_by_html: 'Invitato %{invited_submitter_name} da %{submitter_name}'
@@ -2192,65 +2742,154 @@ it: &it
or: Oppure
download: scarica
a_sample_spreadsheet_to_fill_and_import: un foglio di calcolo di esempio da compilare e importare.
+ app_tour:
+ start: Inizia
+ previous: Precedente
+ next: Successivo
+ template_and_submissions: 'Modelli e Invii'
+ template_and_submissions_description: "Puoi selezionare la visualizzazione più adatta al tuo flusso di lavoro. Scegli la visualizzazione 'Modelli' per creare modelli di documenti riutilizzabili o 'Invii' per firmare documenti singoli o controllare lo stato di ciascuna richiesta di firma."
+ upload_a_pdf_file: 'Carica un file PDF'
+ upload_a_pdf_file_description: 'Carica un documento PDF per creare un modello di modulo di firma.'
+ select_a_signer_party: 'Seleziona una parte firmataria'
+ select_a_signer_party_description: 'Questo menu a discesa consente di selezionare un ruolo di firmatario o aggiungere una nuova parte al documento se richiede 2 o più firme.'
+ available_parties: 'Parti disponibili'
+ available_parties_description: 'Questo elenco contiene tutte le parti disponibili con i relativi ruoli. Una volta selezionata, puoi aggiungere e configurare i campi per la parte firmataria.'
+ available_field_types: 'Tipi di campo disponibili'
+ available_field_types_description: "Questa sezione contiene tutti i tipi di campo disponibili che possono essere aggiunti al documento per l'inserimento di dati o la raccolta delle firme."
+ text_input_field: 'Campo di testo'
+ text_input_field_description: 'Questo campo consente agli utenti di inserire informazioni testuali, come nomi o email.'
+ signature_field: 'Campo firma'
+ signature_field_description: 'Questo campo viene utilizzato per raccogliere le firme dei firmatari.'
+ added_fields: 'Campi aggiunti'
+ added_fields_description: 'Questo elenco mostra tutti i campi aggiunti al documento. Puoi riordinarli, modificarli o rimuoverli.'
+ open_field_settings: 'Apri le impostazioni del campo'
+ open_field_settings_description: "A destra del nome del campo c'è un'icona delle impostazioni che apre il menu di configurazione."
+ field_settings: 'Impostazioni del campo'
+ field_settings_description: 'Ogni campo può essere personalizzato tramite le impostazioni per soddisfare le tue esigenze, come modificare la dimensione del testo, renderlo obbligatorio o aggiungere una descrizione.'
+ send_document: 'Invia documento per la firma'
+ send_document_description: "Prima di inviare il documento per la firma, puoi configurare i destinatari, aggiungere email o numeri di telefono e personalizzare il contenuto dell'email."
+ sign_yourself: 'Firma il documento personalmente'
+ sign_yourself_description: 'Questo pulsante ti consente di aggiungere la tua firma ai documenti che richiedono la tua firma.'
+ copy_and_share_link: 'Copia e condividi il link'
+ copy_and_share_link_description: 'Copia questo link per condividere il documento. Chiunque abbia il link potrà firmarlo dopo aver inserito la propria email.'
+ sign_the_document: 'Firma il documento'
+ sign_the_document_description: 'Se sei uno dei firmatari, questo pulsante ti consente di firmare il documento.'
+ send_for_signing: 'Invia per la firma'
+ add_recipients: 'Aggiungi destinatari'
+ add_recipients_description: 'Aggiungi nuovi destinatari inserendo i loro indirizzi email o numeri di telefono per far firmare il documento.'
+ settings: 'Impostazioni'
+ settings_account_description: "Con impostazioni complete dell'account, puoi personalizzare l'esperienza di firma elettronica e invitare altri utenti."
+ support: 'Supporto'
+ support_description: 'Puoi usare il nostro assistente AI oppure scriverci a support@docuseal.com se hai domande.'
+ settings_template_description: "Usa questo pulsante per accedere alla pagina delle impostazioni dell'account."
doorkeeper:
scopes:
write: Aggiorna i tuoi dati
read: Leggi i tuoi dati
+ pagination:
+ submissions:
+ range_with_total: "%{from}-%{to} di %{count} invii"
+ range_without_total: "%{from}-%{to} invii"
+ templates:
+ range_with_total: "%{from}-%{to} di %{count} modelli"
+ range_without_total: "%{from}-%{to} modelli"
+ template_folders:
+ range_with_total: "%{from}-%{to} di %{count} cartelle"
+ range_without_total: "%{from}-%{to} cartelle"
+ users:
+ range_with_total: "%{from}-%{to} di %{count} utenti"
+ range_without_total: "%{from}-%{to} utenti"
+ items:
+ range_with_total: "%{from}-%{to} di %{count} elementi"
+ range_without_total: "%{from}-%{to} elementi"
+ events:
+ range_with_total: "%{from}-%{to} di %{count} eventi"
+ range_without_total: "%{from}-%{to} eventi"
fr: &fr
- edit_per_party: Éditer par partie
+ add_from_google_drive: Ajouter depuis Google Drive
+ or_add_from: Ou ajouter depuis
+ upload_a_new_document: Téléverser un nouveau document
+ use_direct_file_attachment_links_in_the_documents: Utiliser des liens directs de pièces jointes dans les documents
+ click_here_to_send_a_reset_password_email_html: pour envoyer un e-mail de réinitialisation du mot de passe.
+ enabled: Activé
+ disabled: Désactivé
+ expirable_file_download_links: Liens de téléchargement à durée limitée
+ create_templates_with_private_access_by_default: Créer des modèles privés par défaut
+ party: Partie
+ edit_order: Modifier l’ordre
+ select: Sélectionner
+ invite_form_fields: Champs du formulaire d’invitation
+ pro: Pro
+ default_parties: Parties par défaut
+ authenticate_embedded_form_preview_with_token: Authentifier l’aperçu du formulaire intégré avec un jeton
+ require_all_recipients: Exiger tous les destinataires
+ stripe_integration: Intégration Stripe
+ stripe_account_has_been_connected: Le compte Stripe a été connecté.
+ re_connect_stripe: Reconnecter Stripe
+ private: Privé
+ resend_pending: Renvoyer en attente
+ ensure_unique_recipients: Garantir des destinataires uniques
+ require_phone_2fa_to_open: Exiger la 2FA par téléphone pour ouvrir
+ the_sender_has_requested_a_two_factor_authentication_via_one_time_password_sent_to_your_html: L’expéditeur a demandé une authentification à deux facteurs via un mot de passe à usage unique envoyé à votre numéro %{phone}.
+ send_verification_code: Envoyer le code de vérification
+ code_has_been_resent: Le code a été renvoyé
+ invalid_code: Code invalide
+ always_enforce_signing_order: Toujours imposer l’ordre de signature
+ bcc_recipients: Destinataires Cci
+ edit_per_party: Modifier par partie
signed: Signé
reply_to: Répondre à
- partially_completed: Partiellement complété
- pending_by_me: En attente par moi
+ partially_completed: Partiellement terminé
+ pending_by_me: En attente de ma part
add: Ajouter
- adding: Ajout
+ adding: Ajout en cours
owner: Propriétaire
select_user: Sélectionner un utilisateur
- team_member_permissions: Permissions des membres de l'équipe
- entire_team: Équipe entière
- admin_only: Administrateur uniquement
+ team_member_permissions: Autorisations des membres de l’équipe
+ entire_team: Toute l’équipe
+ admin_only: Admin seul
accessiable_by: Accessible par
- team_access: Accès à l'équipe
+ team_access: Accès équipe
remove_filter: Supprimer le filtre
- document_download_filename_format: Format du nom de fichier du téléchargement de document
- document_name: Nom du document
- unarchive: Désarchiver
- awaiting_completion_by_the_other_party: "En attente de la complétion par l'autre partie"
- enforce_recipients_order: "Respecter l'ordre des destinataires"
- first_party: 'Première partie'
+ document_download_filename_format: Format du nom de fichier pour le téléchargement de document
+ awaiting_completion_by_the_other_party: En attente de finalisation par l’autre partie
+ enforce_recipients_order: Imposer l’ordre des destinataires
+ first_party: Première partie
docuseal_trusted_signature: Signature de confiance DocuSeal
hello_name: Bonjour %{name}
you_are_invited_to_product_name: Vous êtes invité à %{product_name}
- you_have_been_invited_to_account_name_product_name_please_sign_up_using_the_link_below_: 'Vous avez été invité à %{account_name} %{product_name}. Veuillez vous inscrire en utilisant le lien ci-dessous:'
- sent_using_product_name_in_testing_mode_html: 'Envoyé en utilisant %{product_name} en Mode Test'
- sent_using_product_name_free_document_signing_html: 'Envoyé en utilisant la signature de documents gratuite de %{product_name}.'
- sign_documents_with_trusted_certificate_provided_by_docu_seal_your_documents_and_data_are_never_shared_with_docu_seal_p_d_f_checksum_is_provided_to_generate_a_trusted_signature: Signez des documents avec un certificat de confiance fourni par DocuSeal. Vos documents et données ne sont jamais partagés avec DocuSeal. Un checksum PDF est fourni pour générer une signature de confiance.
+ you_have_been_invited_to_account_name_product_name_please_sign_up_using_the_link_below_: 'Vous avez été invité à %{account_name} %{product_name}. Veuillez vous inscrire en utilisant le lien ci-dessous :'
+ sent_using_product_name_in_testing_mode_html: Envoyé avec %{product_name} en mode test
+ sent_using_product_name_free_document_signing_html: Envoyé avec %{product_name} signature de documents gratuite.
+ sent_with_docuseal_pro_html: Envoyé avec DocuSeal Pro
+ show_send_with_docuseal_pro_attribution_in_emails_html: Afficher l’attribution "Envoyé avec DocuSeal Pro" dans les e‑mails
+ sign_documents_with_trusted_certificate_provided_by_docu_seal_your_documents_and_data_are_never_shared_with_docu_seal_p_d_f_checksum_is_provided_to_generate_a_trusted_signature: Signez des documents avec un certificat de confiance fourni par DocuSeal. Vos documents et données ne sont jamais partagés avec DocuSeal. Une empreinte (checksum) PDF est fournie pour générer une signature de confiance.
hi_there: Bonjour
thanks: Merci
- you_have_been_invited_to_submit_the_name_form: 'Vous avez été invité à remplir le formulaire "%{name}".'
- you_have_been_invited_to_sign_the_name: 'Vous avez été invité à signer "%{name}".'
- alternatively_you_can_review_and_download_your_copy_using_the_link_below: 'Vous pouvez également consulter et télécharger votre copie en utilisant le lien ci-dessous:'
- please_check_the_copy_of_your_name_in_the_email_attachments: "Veuillez vérifier la copie de votre \"%{name}\" dans les pièces jointes de l'email."
- review_and_sign: Consulter et signer
- review_and_submit: Consulter et soumettre
- please_contact_us_by_replying_to_this_email_if_you_didn_t_request_this: 'Veuillez nous contacter en répondant à cet e-mail si vous avez des questions.'
- submitter_invitation_sms_body_sign: '{account.name} vous a invité à signer un document: {submitter.link}'
- verification_code_sms_body: 'Code de vérification: {code}'
+ you_have_been_invited_to_submit_the_name_form: Vous avez été invité à soumettre le formulaire "%{name}".
+ you_have_been_invited_to_sign_the_name: Vous avez été invité à signer "%{name}".
+ alternatively_you_can_review_and_download_your_copy_using_the_link_below: 'Vous pouvez également consulter et télécharger votre exemplaire à l’aide du lien ci‑dessous :'
+ please_check_the_copy_of_your_name_in_the_email_attachments: Veuillez vérifier la copie de votre "%{name}" dans les pièces jointes de l’e‑mail.
+ review_and_sign: Examiner et signer
+ review_and_submit: Examiner et soumettre
+ please_contact_us_by_replying_to_this_email_if_you_have_any_questions: Veuillez nous contacter en répondant à cet e‑mail si vous avez des questions.
+ submitter_invitation_sms_body_sign: "{account.name} vous a invité à signer un document : {submitter.link}"
+ verification_code_sms_body: 'Code de vérification : {code}'
you_are_invited_to_submit_a_form: Vous êtes invité à soumettre un formulaire
you_are_invited_to_sign_a_document: Vous êtes invité à signer un document
you_are_invited_to_sign_documents: Vous êtes invité à signer des documents
- your_document_copy: Votre copie du document
+ your_document_copy: Votre copie de document
name_has_been_completed_by_submitters: '"%{name}" a été complété par %{submitters}.'
- template_name_has_been_completed_by_submitters: '{template.name} a été complété par {submission.submitters}'
+ template_name_has_been_completed_by_submitters: "{template.name} a été complété par {submission.submitters}"
submitter_invitation_email_sign_body: |
Bonjour,
- Vous avez été invité à signer le "{template.name}".
+ Vous avez été invité à signer "{template.name}".
- [Consulter et signer]({submitter.link})
+ [Examiner et signer]({submitter.link})
- Veuillez nous contacter si vous avez des questions.
+ Veuillez nous contacter en répondant à cet e‑mail si vous avez des questions.
Merci,
{account.name}
@@ -2263,185 +2902,190 @@ fr: &fr
submitter_documents_copy_email_body: |
Bonjour,
- Veuillez vérifier la copie de votre "{template.name}" dans les pièces jointes.
- Vous pouvez également consulter et télécharger votre copie en utilisant le lien ci-dessous:
+ Veuillez vérifier la copie de votre "{template.name}" dans les pièces jointes de l’e‑mail.
+ Vous pouvez également consulter et télécharger votre exemplaire à l’aide du lien ci‑dessous :
[{template.name}]({documents.link})
Merci,
{account.name}
- view: Vue
- email: Email
- form_expired_at_html: 'Le formulaire a expiré le %{time}'
- verification_code_code: 'Code de vérification: %{code}'
- digitally_signed_by: Signé numériquement par
+ view: Voir
+ email: E‑mail
+ form_expired_at_html: Formulaire expiré le %{time}
+ verification_code_code: 'Code de vérification : %{code}'
+ digitally_signed_by: Signé électroniquement par
role: Rôle
- reason: Raison
- provide_your_email_to_start: Entrez votre adresse email pour commencer
- start: Démarrer
+ reason: Motif
+ provide_your_email_to_start: Fournissez votre e‑mail pour commencer
+ provide_your_email: Indiquez votre e‑mail
+ provide_your_name_to_start: Fournissez votre nom pour commencer
+ provide_your_name: Indiquez votre nom
+ provide_your_phone_in_international_format_to_start: Fournissez votre téléphone au format international pour commencer
+ provide_your_phone_in_international_format: Indiquez votre téléphone au format international
+ start: Commencer
starting: Démarrage
- form_has_been_deleted_by_html: 'Le formulaire a été supprimé par %{name}.'
- invited_by_html: 'Invité par %{name}'
- you_have_been_invited_to_submit_a_form: Vous avez été invité à remplir un formulaire
- signed_on_time: 'Signé le %{time}'
- completed_on_time: 'Terminé le %{time}'
- document_has_been_signed_already: 'Le document a déjà été signé'
- form_has_been_submitted_already: Le formulaire a déjà été complété
- send_copy_to_email: Envoyer une copie par e-mail
+ form_has_been_deleted_by_html: Le formulaire a été supprimé par %{name}.
+ invited_by_html: Invité par %{name}
+ you_have_been_invited_to_submit_a_form: Vous avez été invité à soumettre un formulaire
+ signed_on_time: Signé le %{time}
+ completed_on_time: Terminé le %{time}
+ document_has_been_signed_already: Le document a déjà été signé
+ form_has_been_submitted_already: Le formulaire a déjà été soumis
+ send_copy_to_email: Envoyer une copie par e‑mail
sending: Envoi en cours
- resubmit: Compléter à nouveau
+ resubmit: Soumettre à nouveau
or: ou
download_documents: Télécharger les documents
downloading: Téléchargement
download: Télécharger
decline: Refuser
declined: Refusé
- decline_reason: Raison du refus
- provide_a_reason: Fournir une raison
- notify_the_sender_with_the_reason_you_declined: Informer l'expéditeur de la raison pour laquelle vous avez refusé
- form_has_been_declined_on_html: "Le formulaire a été refusé le %{time}"
- name_declined_by_submitter: '"%{name}" a été refusé par %{submitter}'
- name_declined_by_submitter_with_the_following_reason: '"%{name}" a été refusé par %{submitter} avec la raison suivante:'
- completed_successfully: Complété avec succès
+ decline_reason: Motif du refus
+ provide_a_reason: Fournissez un motif
+ notify_the_sender_with_the_reason_you_declined: Notifier l’expéditeur avec le motif du refus
+ form_has_been_declined_on_html: Le formulaire a été refusé le %{time}
+ name_declined_by_submitter: '"%{name}" refusé par %{submitter}'
+ name_declined_by_submitter_with_the_following_reason: '"%{name}" a été refusé par %{submitter} pour le motif suivant :'
+ completed_successfully: Terminé avec succès
password: Mot de passe
sign_in: Se connecter
signing_in: Connexion en cours
sign_in_with_microsoft: Se connecter avec Microsoft
sign_in_with_google: Se connecter avec Google
- forgot_your_password_: Mot de passe oublié?
+ forgot_your_password_: Mot de passe oublié ?
create_free_account: Créer un compte gratuit
- already_have_an_account: Vous avez déjà un compte?
+ already_have_an_account: Vous avez déjà un compte ?
first_name: Prénom
- last_name: Nom de famille
- sign_up: S'inscrire
+ last_name: Nom
+ sign_up: S’inscrire
signing_up: Inscription en cours
profile_details: Détails du profil
- sign_up_with_google: S'inscrire avec Google
- sign_up_with_microsoft: S'inscrire avec Microsoft
- by_creating_an_account_you_agree_to_our_html: |
- En créant un compte, vous acceptez notre Politique de Confidentialité et nos Conditions d'Utilisation.
- enter_email_to_continue: Entrez votre e-mail pour continuer
+ sign_up_with_google: S’inscrire avec Google
+ sign_up_with_microsoft: S’inscrire avec Microsoft
+ by_creating_an_account_you_agree_to_our_html: En créant un compte, vous acceptez notre Politique de confidentialité et nos Conditions d’utilisation.
+ enter_email_to_continue: Entrez votre e‑mail pour continuer
account: Compte
preferences: Préférences
- company_name: "Nom de l'entreprise"
+ company_name: Nom de l’entreprise
time_zone: Fuseau horaire
language: Langue
- app_url: "URL de l'application"
+ app_url: URL de l’application
update: Mettre à jour
- updating: Mise à jour en cours
- force_2fa_with_authenticator_app: "Forcer l'authentification à deux facteurs avec l'application Authenticator"
- add_signature_id_to_the_documents: "Ajouter l'ID de signature aux documents"
- require_signing_reason: Demander une raison pour la signature
- allow_typed_text_signatures: Autoriser les signatures en texte tapé
- allow_to_resubmit_completed_forms: Autoriser la resoumission des formulaires complétés
- allow_to_decline_documents: Autoriser le refus des documents
- remember_and_pre_fill_signatures: Se souvenir et préremplir les signatures
- require_authentication_for_file_download_links: Exiger une authentification pour les liens de téléchargement des fichiers
- combine_completed_documents_and_audit_log: "Combiner les documents complétés et le journal d'audit"
- salesforce_integration: Intégration avec Salesforce
+ updating: Mise à jour
+ force_2fa_with_authenticator_app: Imposer la 2FA avec une application d’authentification
+ add_signature_id_to_the_documents: Ajouter l’ID de signature aux documents
+ require_signing_reason: Exiger un motif de signature
+ allow_typed_text_signatures: Autoriser les signatures tapées
+ allow_to_resubmit_completed_forms: Autoriser la nouvelle soumission des formulaires complétés
+ allow_to_decline_documents: Autoriser le refus de documents
+ remember_and_pre_fill_signatures: Mémoriser et pré-remplir les signatures
+ require_authentication_for_file_download_links: Exiger une authentification pour les liens de téléchargement
+ combine_completed_documents_and_audit_log: Combiner les documents complétés et le journal d’audit
+ salesforce_integration: Intégration Salesforce
salesforce_has_been_connected: Salesforce a été connecté.
- connect_salesforce_account_to_integrate_with_docuseal: "Connectez votre compte Salesforce pour l'intégrer avec DocuSeal"
+ connect_salesforce_account_to_integrate_with_docuseal: Connectez un compte Salesforce pour l’intégrer à DocuSeal
re_connect_salesforce: Reconnecter Salesforce
connect_salesforce: Connecter Salesforce
- danger_zone: Zone dangereuse
+ danger_zone: Zone de danger
delete_my_account: Supprimer mon compte
- schedule_account_for_deletion_: Programmer la suppression du compte?
+ you_are_scheduling_your_account_for_deletion_after_deletion_your_data_will_be_permanently_removed_and_cannot_be_recovered_click_ok_if_you_would_like_to_continue: "Vous planifiez la suppression de votre compte. Après suppression, vos données seront définitivement supprimées et ne pourront pas être récupérées.\n\nCliquez sur OK pour continuer."
account_information_has_been_updated: Les informations du compte ont été mises à jour.
should_be_a_valid_url: doit être une URL valide
- your_account_removal_request_will_be_processed_within_2_months_please_contact_us_if_you_want_to_keep_your_account: Votre demande de suppression du compte sera traitée dans un délai de 2 mois. Veuillez nous contacter si vous souhaitez conserver votre compte.
+ your_account_removal_request_will_be_processed_within_2_months_please_contact_us_if_you_want_to_keep_your_account: Votre demande de suppression de compte sera traitée sous 2 mois. Veuillez nous contacter si vous souhaitez conserver votre compte.
test_mode: Mode test
copy: Copier
copied: Copié
rotate: Pivoter
- remove_existing_api_token_and_generated_a_new_one_are_you_sure_: Supprimer le jeton API existant et en générer un nouveau. Êtes-vous sûr?
- request_signature_multiple_submitters_with_default_values: Demander une signature, plusieurs expéditeurs avec des valeurs par défaut
- request_signature_single_submitter: Demander une signature, un seul expéditeur
+ remove_existing_api_token_and_generated_a_new_one_are_you_sure_: Supprimer le jeton API existant et en générer un nouveau. Êtes-vous sûr ?
+ request_signature_multiple_submitters_with_default_values: Demander une signature, plusieurs soumissionnaires avec valeurs par défaut
+ request_signature_single_submitter: Demander une signature, un seul soumissionnaire
template_details: Détails du modèle
- open_full_api_reference: "Ouvrir la référence complète de l'API"
+ open_full_api_reference: Ouvrir la documentation API complète
api_token_has_been_updated: Le jeton API a été mis à jour.
- change_your_password: Changez votre mot de passe
+ change_your_password: Changer votre mot de passe
new_password: Nouveau mot de passe
- minimum_password_length_characters_minimum: '%{minimum_password_length} caractères minimum'
- confirm_new_password: Confirmez le nouveau mot de passe
+ minimum_password_length_characters_minimum: "%{minimum_password_length} caractères minimum"
+ confirm_new_password: Confirmer le nouveau mot de passe
change_my_password: Changer mon mot de passe
- changing_password: Changement de mot de passe en cours
+ changing_password: Changement du mot de passe
reset_password: Réinitialiser le mot de passe
- resetting_password: Réinitialisation du mot de passe en cours
- sign_in_with_name_account: 'Se connecter avec le compte %{name}'
- two_factor_code_from_authenticator_app: "Code à deux facteurs de l'application Authenticator"
- sign_up_in_docuseal_console_to_upgrade_on_premises_app_is_completely_standalone_console_is_used_only_to_manage_your_license: "Inscrivez-vous sur la console DocuSeal pour effectuer la mise à niveau. L'application locale est totalement autonome, la console est uniquement utilisée pour gérer votre licence."
- send_from_email: "Envoyer depuis l'email"
- optional: optionnel
+ resetting_password: Réinitialisation du mot de passe
+ sign_in_with_name_account: Se connecter avec le compte %{name}
+ two_factor_code_from_authenticator_app: Code 2FA de l’application d’authentification
+ sign_up_in_docuseal_console_to_upgrade_on_premises_app_is_completely_standalone_console_is_used_only_to_manage_your_license: Inscrivez-vous sur la Console DocuSeal pour mettre à niveau. L’application on‑premises est entièrement autonome ; la Console sert uniquement à gérer votre licence.
+ send_from_email: Envoyer depuis l’e‑mail
+ optional: facultatif
save: Enregistrer
- saving: Enregistrement en cours
+ saving: Enregistrement
changes_have_been_saved: Les modifications ont été enregistrées.
unlock_with_docuseal_pro: Débloquer avec DocuSeal Pro
- use_your_own_certificates_to_sign_and_verify_pdf_files: Utilisez vos propres certificats pour signer et vérifier les fichiers PDF.
- upload_certificate: Télécharger un certificat
+ use_your_own_certificates_to_sign_and_verify_pdf_files: Utilisez vos propres certificats pour signer et vérifier des fichiers PDF.
+ upload_certificate: Téléverser un certificat
name: Nom
file: Fichier
- use_a_valid_der_p12_or_pfx_file: Utilisez un fichier valide .der, .p12 ou .pfx.
+ use_a_valid_der_p12_or_pfx_file: Utilisez un fichier .der, .p12 ou .pfx valide.
submit: Soumettre
submitting: Soumission en cours
pdf_signature: Signature PDF
- upload_signed_pdf_file_to_validate_its_signature_: 'Téléchargez le fichier PDF signé pour valider sa signature:'
+ upload_signed_pdf_file_to_validate_its_signature_: 'Téléchargez un fichier PDF signé pour valider sa signature :'
analyzing: Analyse en cours
- verify_signed_pdf: Vérifier le PDF signé
- click_to_upload_or_drag_and_drop_html: 'Cliquez pour télécharger ou glissez-déposez'
- click_to_upload_or_drag_and_drop_files_html: 'Cliquez pour télécharger ou glissez-déposez des fichiers'
+ verify_signed_pdf: Vérifier un PDF signé
+ click_to_upload_or_drag_and_drop_html: Cliquez pour téléverser ou glissez‑déposez
+ click_to_upload_or_drag_and_drop_files_html: Cliquez pour téléverser ou glissez‑déposez des fichiers
signing_certificates: Certificats de signature
- upload_cert: Télécharger un certificat
- valid_to: "Valide jusqu'à"
+ upload_cert: Téléverser un certificat
+ valid_to: Valide jusqu’au
status: Statut
make_default: Définir par défaut
remove: Supprimer
- removing: Suppression en cours
+ removing: Suppression
delete: Supprimer
default: Par défaut
- are_you_sure_: Êtes-vous sûr?
- timestamp_server: Serveur de marque temporelle
- timeserver_url: URL du serveur de marque temporelle
- url_of_the_trusted_rfc_3161_timeserver_to_be_used_to_generate_timestamp_signatures: URL du serveur de marque temporelle RFC 3161 de confiance à utiliser pour générer des signatures de marque temporelle.
+ are_you_sure_: Êtes-vous sûr ?
+ timestamp_server: Serveur d’horodatage
+ timeserver_url: URL du serveur d’horodatage
+ url_of_the_trusted_rfc_3161_timeserver_to_be_used_to_generate_timestamp_signatures: URL du serveur d’horodatage RFC 3161 de confiance à utiliser pour générer des signatures horodatées.
apply_multiple_pdf_digital_signatures_in_the_document_per_each_signer: Appliquer plusieurs signatures numériques PDF dans le document pour chaque signataire
remove_pdf_form_fillable_fields_from_the_signed_pdf_flatten_form: Supprimer les champs de formulaire PDF remplissables du PDF signé (aplatir le formulaire)
certificate_has_been_successfully_added: Le certificat a été ajouté avec succès.
default_certificate_has_been_selected: Le certificat par défaut a été sélectionné.
certificate_has_been_removed: Le certificat a été supprimé.
already_exists: existe déjà.
- welcome_to_product_name: 'Bienvenue sur %{product_name}'
+ welcome_to_product_name: Bienvenue sur %{product_name}
set_password: Définir le mot de passe
- confirm_password: Confirmer le mot de passe
+ confirm_password: Confirmer le nouveau mot de passe
save_password_and_sign_in: Enregistrer le mot de passe et se connecter
- use_an_authenticator_mobile_app_like_google_authenticator_or_1password_to_scan_the_qr_code_below: "Utilisez une application d'authentification mobile comme Google Authenticator ou 1Password pour scanner le code QR ci-dessous."
- remove_2fa: "Supprimer l'authentification à deux facteurs"
- setup_2fa: "Configurer l'authentification à deux facteurs"
- 2fa_has_been_configured: "L'authentification à deux facteurs a été configurée."
- code_is_invalid: Le code n'est pas valide
- 2fa_has_been_removed: "L'authentification à deux facteurs a été supprimée."
- 2fa_has_been_set_up_already: "L'authentification à deux facteurs a déjà été configurée."
- developer_newsletters: Newsletters des développeurs
+ use_an_authenticator_mobile_app_like_google_authenticator_or_1password_to_scan_the_qr_code_below: Utilisez une application d’authentification mobile (Google Authenticator, 1Password, etc.) pour scanner le QR code ci‑dessous.
+ remove_2fa: Supprimer la 2FA
+ setup_2fa: Configurer la 2FA
+ 2fa_has_been_configured: La 2FA a été configurée.
+ code_is_invalid: Le code est invalide
+ 2fa_has_been_removed: La 2FA a été supprimée.
+ 2fa_has_been_set_up_already: La 2FA est déjà configurée.
+ developer_newsletters: Newsletters développeur
skip: Ignorer
- email_notifications: Notifications par e-mail
- receive_notification_emails_on_completed_submission: Recevoir des notifications par e-mail sur les soumissions complétées
- completed_documents_notification_bcc_address: Adresse BCC pour les notifications de documents complétés
- sign_request_email_reminders: Rappels par e-mail pour les demandes de signature
- send_automatic_email_reminders_to_your_recipients: Envoyer des rappels automatiques par e-mail à vos destinataires.
+ email_notifications: Notifications par e‑mail
+ receive_notification_emails_on_completed_submission: Recevoir des e‑mails de notification lors de la finalisation d’une soumission
+ completed_documents_notification_bcc_address: Adresse Cci pour la notification des documents complétés
+ sign_request_email_reminders: Rappels par e‑mail de demande de signature
+ send_automatic_email_reminders_to_your_recipients: Envoyer automatiquement des e‑mails de rappel à vos destinataires.
first_reminder_in: Premier rappel dans
second_reminder_in: Deuxième rappel dans
third_reminder_in: Troisième rappel dans
learn_more: En savoir plus
- unable_to_save: "Impossible d'enregistrer."
- invalid_timeserver: Serveur de marque temporelle non valide
- email_templates: "Modèles d'e-mail"
- signature_request_email: E-mail de demande de signature
+ unable_to_save: Impossible d’enregistrer.
+ invalid_timeserver: Serveur d’horodatage invalide
+ email_templates: Modèles d’e‑mail
+ signature_request_email: E‑mail de demande de signature
+ signature_request_reminder_email: E‑mail de rappel de demande de signature
signature_request_sms: SMS de demande de signature
- verification_code_sms: SMS avec code de vérification
- completed_notification_email: E-mail de notification de soumission complétée
- company_logo: "Logo de l'entreprise"
+ verification_code_sms: SMS de code de vérification
+ completed_notification_email: E‑mail de notification de finalisation
+ company_logo: Logo de l’entreprise
submission_form: Formulaire de soumission
completed_form_message: Message de formulaire complété
- completed_form_redirect_button: Bouton de redirection après formulaire complété
- documents_copy_email: E-mail de copie des documents
+ completed_form_redirect_button: Bouton de redirection après finalisation
+ documents_copy_email: E‑mail avec copie des documents
form_custom_css: CSS personnalisé du formulaire
subject: Objet
body: Corps
@@ -2449,67 +3093,67 @@ fr: &fr
title: Titre
button_title: Titre du bouton
button_url: URL du bouton
- upload_logo: Télécharger le logo
- show_confetti_on_successful_completion: Afficher des confettis après un succès
- attach_audit_log_pdf: "Joindre le PDF du journal d'audit"
- attach_documents: Joindre des documents
+ upload_logo: Téléverser le logo
+ show_confetti_on_successful_completion: Afficher des confettis en cas de réussite
+ attach_audit_log_pdf: Joindre le PDF du journal d’audit
+ attach_documents: Joindre les documents
settings_have_been_saved: Les paramètres ont été enregistrés.
display_your_company_name_and_logo_when_signing_documents: Afficher le nom et le logo de votre entreprise lors de la signature des documents.
profile: Profil
signature: Signature
update_signature: Mettre à jour la signature
- unable_to_save_signature: "Impossible d'enregistrer la signature."
+ unable_to_save_signature: Impossible d’enregistrer la signature.
signature_has_been_saved: La signature a été enregistrée.
signature_has_been_removed: La signature a été supprimée.
initials: Initiales
update_initials: Mettre à jour les initiales
- unable_to_save_initials: "Impossible d'enregistrer les initiales."
+ unable_to_save_initials: Impossible d’enregistrer les initiales.
initials_has_been_saved: Les initiales ont été enregistrées.
initials_has_been_removed: Les initiales ont été supprimées.
change_password: Changer le mot de passe
two_factor_authentication: Authentification à deux facteurs
- 2fa_is_not_configured: "L'authentification à deux facteurs n'est pas configurée"
- set_up_2fa: "Configurer l'authentification à deux facteurs"
- contact_information_has_been_update: Les informations de contact ont été mises à jour.
- password_has_been_changed: Le mot de passe a été changé.
- email_integration: Intégration e-mail
- send_via_connected_email: Envoyer via un e-mail connecté
+ 2fa_is_not_configured: La 2FA n’est pas configurée
+ set_up_2fa: Configurer la 2FA
+ contact_information_has_been_update: Les coordonnées ont été mises à jour.
+ password_has_been_changed: Le mot de passe a été modifié.
+ email_integration: Intégration e‑mail
+ send_via_connected_email: Envoyer via l’e‑mail connecté
activate_with_docuseal_pro: Activer avec DocuSeal Pro
- send_signature_request_to_your_recipients_directly_from_your_email: Envoyer une demande de signature directement depuis votre e-mail
+ send_signature_request_to_your_recipients_directly_from_your_email: Envoyez des demandes de signature directement depuis votre e‑mail
connect_gmail: Connecter Gmail
re_connect_gmail: Reconnecter Gmail
connect_microsoft: Connecter Microsoft
re_connect_microsoft: Reconnecter Microsoft
gmail_has_been_connected: Gmail a été connecté.
microsoft_account_has_been_connected: Le compte Microsoft a été connecté.
- but_not_activated: mais pas activé
- email_has_been_sent: "L'e-mail a été envoyé."
- email_has_been_sent_already: "L'e-mail a déjà été envoyé."
+ but_not_activated: mais non activé
+ email_has_been_sent: L’e‑mail a été envoyé.
+ email_has_been_sent_already: L’e‑mail a déjà été envoyé.
initial_setup: Configuration initiale
demo_environment: Environnement de démonstration
close: Fermer
- upgrade: Mettre à jour
+ upgrade: Mettre à niveau
settings: Paramètres
console: Console
verify_pdf: Vérifier le PDF
- sign_out: Déconnexion
- page_number: 'Page %{number}'
+ sign_out: Se déconnecter
+ page_number: Page %{number}
powered_by: Propulsé par
- count_documents_signed_with_html: '%{count} documents signés avec'
+ count_documents_signed_with_html: "%{count} documents signés avec"
storage: Stockage
notifications: Notifications
- e_signature: Signature électronique
+ e_signature: E-Signature
personalization: Personnalisation
users: Utilisateurs
- plans: Plans
+ plans: Formules
new: Nouveau
- embedding: Intégration
- background_jobs: Tâches en arrière-plan
- need_help_ask_a_question_: "Besoin d'aide? Posez une question:"
+ embedding: Embedding
+ background_jobs: Tâches en arrière‑plan
+ need_help_ask_a_question_: 'Besoin d’aide ? Posez une question :'
exit: Quitter
- leave: Partir
- impersonated_as: Usurpé comme
- ask_ai: "Demander à l'IA"
+ leave: Quitter
+ impersonated_as: Usurpation en tant que
+ ask_ai: Demander à l’IA
ai_assistant: Assistant IA
discord_community: Communauté Discord
integrations: Intégrations
@@ -2517,172 +3161,174 @@ fr: &fr
tenants: Locataires
send_signature_requests_via_sms: Envoyer des demandes de signature par SMS
twilio_settings: Paramètres Twilio
- webhook_settings: Paramètres du Webhook
- sending_sms: Envoi de SMS en cours
+ webhook_settings: Paramètres Webhook
+ sending_sms: Envoi de SMS
from: De
account_sid: SID du compte
- send_sms_via_webhook: Envoyer des SMS via Webhook
- webhook_integration_allows_to_send_sms_using_any_provider: "L'intégration du Webhook permet d'envoyer des SMS via n'importe quel fournisseur"
+ send_sms_via_webhook: Envoyer des SMS via webhook
+ webhook_integration_allows_to_send_sms_using_any_provider: L’intégration Webhook permet d’envoyer des SMS avec n’importe quel fournisseur
test: Tester
- single_sign_on_with_saml_2_0: Connexion unique avec SAML 2.0
- force_sso_disable_login_with_email_and_password: Forcer la SSO (désactiver la connexion avec e-mail et mot de passe)
+ single_sign_on_with_saml_2_0: Authentification unique (SSO) avec SAML 2.0
+ force_sso_disable_login_with_email_and_password: Forcer le SSO (désactiver la connexion par e‑mail et mot de passe)
for_aws_s3_compatible_apis_like_minio: Pour les API compatibles AWS S3 comme Minio.
store_all_files_on_disk: Stocker tous les fichiers sur disque
- no_configs_are_needed_but_make_sure_your_disk_is_persistent: "Aucune configuration n'est nécessaire, mais assurez-vous que votre disque est persistant"
- not_suitable_for_heroku_and_other_paas: "Pas adapté pour Heroku et d'autres PaaS"
+ no_configs_are_needed_but_make_sure_your_disk_is_persistent: Aucune configuration n’est nécessaire, mais assurez‑vous que votre disque est persistant
+ not_suitable_for_heroku_and_other_paas: Non adapté à Heroku et autres PaaS
bulk_send_from_excel_xlsx_or_csv: Envoi en masse depuis Excel XLSX ou CSV
- add_new: Ajouter nouveau
+ add_new: Ajouter
add_recipients: Ajouter des destinataires
add_new_recipients: Ajouter de nouveaux destinataires
- add_recipients_html: Ajouter
- type_emails_here: Saisissez les e-mails ici
- or_embed_on_your_website: Ou intégrez-le sur votre site web
+ add_recipients_html: Destinataires
+ type_emails_here: Saisissez les e‑mails ici
+ or_embed_on_your_website: Ou intégrez sur votre site web
phone: Téléphone
- send_emails: Envoyer des e-mails
+ send_emails: Envoyer les e‑mails
edit_message: Modifier le message
smtp_not_configured: SMTP non configuré
- configure_smtp_settings_in_order_to_send_emails_: 'Configurez les paramètres SMTP pour envoyer des e-mails:'
- go_to_smtp_settings: Aller aux paramètres SMTP
- save_as_default_template_message: Enregistrer comme modèle de message par défaut
+ configure_smtp_settings_in_order_to_send_emails_: 'Configurez les paramètres SMTP pour envoyer des e‑mails :'
+ go_to_smtp_settings: Accéder aux paramètres SMTP
+ save_as_default_template_message: Enregistrer comme message de modèle par défaut
re_send_sms: Renvoyer le SMS
- send_sms: Envoyer SMS
- preserve_order: "Préserver l'ordre"
- when_checked_notifications_will_be_sent_to_the_second_party_once_the_form_is_completed_by_the_previous_party_uncheck_this_option_to_send_notifications_to_all_parties_simultaneously_right_away: "Lorsqu'elle est cochée, les notifications seront envoyées à la deuxième partie une fois que la partie précédente aura complété le formulaire. Décochez cette option pour envoyer des notifications à toutes les parties simultanément immédiatement."
- upgrade_to_send_unlimited_signature_requests: Mettez à jour pour envoyer des demandes de signature illimitées
+ send_sms: Envoyer le SMS
+ preserve_order: Préserver l’ordre
+ when_checked_notifications_will_be_sent_to_the_second_party_once_the_form_is_completed_by_the_previous_party_uncheck_this_option_to_send_notifications_to_all_parties_simultaneously_right_away: Coché, les notifications seront envoyées à la seconde partie une fois le formulaire complété par la partie précédente. Décochez pour envoyer les notifications à toutes les parties simultanément.
+ upgrade_to_send_unlimited_signature_requests: Passez à la version Pro pour envoyer un nombre illimité de demandes de signature
add_without_sending: Ajouter sans envoyer
- upgade_now: Mettre à jour maintenant
- send_signature_request_emails_without_limits_with_docuseal_pro: Envoyez des e-mails de demande de signature sans limites avec DocuSeal Pro
- count_emails_used: '%{count} e-mails utilisés'
+ upgade_now: Mettre à niveau maintenant
+ send_signature_request_emails_without_limits_with_docuseal_pro: Envoyez des e‑mails de demande de signature sans limites avec DocuSeal Pro
+ count_emails_used: "%{count} e‑mails utilisés"
has_been_connected: a été connecté
- but_not_activated: mais pas activé
sms_not_configured: SMS non configuré
- configure_sms_settings_in_order_to_send_text_messages_: 'Configurez les paramètres SMS pour envoyer des messages texte'
- go_to_sms_settings: Aller aux paramètres SMS
- back_to_active: Revenir à actif
+ configure_sms_settings_in_order_to_send_text_messages_: 'Configurez les paramètres SMS pour envoyer des messages texte :'
+ go_to_sms_settings: Accéder aux paramètres SMS
+ back_to_active: Retour aux actifs
submissions: Soumissions
templates: Modèles
- document_templates_html: Documents Modèles
+ document_templates_html: Modèles de documents
archived: Archivé
search: Rechercher
- submissions_not_found: Soumissions non trouvées
+ submissions_not_found: Soumissions introuvables
create: Créer
view_archived: Voir les archivés
all: Tout
pending: En attente
completed: Terminé
- primarily_opened_with_microsoft_excel_other_options_include_google_sheets_libreoffice_calc_and_openoffice_calc: Principalement ouvert avec Microsoft Excel. Les autres options incluent Google Sheets, LibreOffice Calc et OpenOffice Calc.
+ primarily_opened_with_microsoft_excel_other_options_include_google_sheets_libreoffice_calc_and_openoffice_calc: 'Principalement ouvert avec Microsoft Excel. Autres options : Google Sheets, LibreOffice Calc et OpenOffice Calc.'
can_be_opened_with_microsoft_excel_google_sheets_or_any_text_editor_like_notepad: Peut être ouvert avec Microsoft Excel, Google Sheets ou tout éditeur de texte comme Notepad.
draw_signature: Dessiner la signature
clear: Effacer
- signature_uploaded: Signature téléchargée
+ signature_uploaded: Signature téléversée
photo_uploaded: Photo téléchargée
- submission_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: 'La suppression de la soumission est irréversible et supprimera définitivement tous les documents signés associés. Êtes-vous sûr?'
- return_back_to_your_desktop_device_to_complete_the_form_or_continue_on_mobile_html: 'Retournez à votre appareil de bureau pour compléter le formulaire ou continuez sur mobile'
- template_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: La suppression du modèle est irréversible et supprimera définitivement tous les documents signés associés. Êtes-vous sûr?
+ submission_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: La suppression de la soumission est irréversible et supprimera définitivement tous les documents signés associés. Êtes‑vous sûr ?
+ return_back_to_your_desktop_device_to_complete_the_form_or_continue_on_mobile_html: Revenez sur votre ordinateur de bureau pour terminer le formulaire ou continuez sur mobile
+ template_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: La suppression du modèle est irréversible et supprimera définitivement tous les documents signés associés. Êtes‑vous sûr ?
rename_folder: Renommer le dossier
folder_name: Nom du dossier
rename: Renommer
home: Accueil
- templates_not_found: Modèles non trouvés
- upload_new_document: Télécharger un nouveau document
- uploading: Téléchargement en cours
+ templates_not_found: Modèles introuvables
+ upload_new_document: Téléverser un nouveau document
+ uploading: Téléversement
expired: Expiré
sign_now: Signer
archive: Archiver
- archiving: Archivage en cours
+ archiving: Archivage
restore: Restaurer
- restoring: Restauration en cours
+ restoring: Restauration
clone: Cloner
edit: Modifier
move: Déplacer
- moving: Déplacement en cours
+ moving: Déplacement
preview: Aperçu
- upload: Télécharger
+ upload: Téléverser
clone_template: Cloner le modèle
new_document_template: Nouveau modèle de document
document_name: Nom du document
change_folder: Changer de dossier
shared: partagé
export: Exporter
- there_are_no_submissions: "Il n'y a pas de soumissions"
- send_an_invitation_to_fill_and_complete_the_form: Envoyer une invitation pour remplir et compléter le formulaire
+ there_are_no_submissions: Il n’y a aucune soumission
+ send_an_invitation_to_fill_and_complete_the_form: Envoyer une invitation pour remplir et terminer le formulaire
send_to_recipients: Envoyer aux destinataires
- sign_it_yourself: Signez-le vous-même
- api_and_embedding: API et intégration
+ sign_it_yourself: Signer vous‑même
+ api_and_embedding: API et Embedding
template_id: ID du modèle
- embedding_url: "URL d'intégration"
+ embedding_url: URL d’embedding
share_template_with_test_mode: Partager le modèle avec le mode test
share_template_with_all_tenants: Partager le modèle avec tous les locataires
- use_following_placeholders_text_: 'Utilisez les espaces réservés suivants:'
- upgrade_plan_to_add_more_users: "Mettez à jour le plan pour ajouter plus d'utilisateurs"
+ use_following_placeholders_text_: 'Utilisez les espaces réservés suivants :'
+ users_count_total_users_count_pro_users_limit_was_reached_to_invite_additional_users_please_purchase_more_pro_user_seats_via_the_manage_plan_button: "%{users_count}/%{total_users_count} limite d’utilisateurs Pro atteinte.\nPour inviter d’autres utilisateurs, achetez des places supplémentaires via le bouton « Gérer la formule »."
move_into_folder: Déplacer dans le dossier
- new_folder_name: Nouveau nom du dossier
- exit_preview: "Quitter l'aperçu"
+ new_folder_name: Nouveau nom de dossier
+ new_subfolder_name: Nouveau nom de sous‑dossier
+ change_parent_folder: Changer le dossier parent
+ folder: Dossier
+ create_a_new_folder: Créer un nouveau dossier
+ exit_preview: Quitter l’aperçu
general: Général
recipients: Destinataires
form_preferences: Préférences du formulaire
- redirect_on_completion_url: URL de redirection après achèvement
+ redirect_on_completion_url: URL de redirection après finalisation
completion_message: Message de finalisation
- email_subject: "Objet de l'e-mail"
- email_body: "Corps de l'e-mail"
- attach_audit_log_pdf_to_the_email: "Joindre le PDF du journal d'audit à l'e-mail"
- send_emails_automatically_on_completion: "Envoyer des e-mails automatiquement à l'achèvement"
- attach_documents_to_the_email: "Joindre des documents à l'e-mail"
+ email_subject: Objet de l’e‑mail
+ email_body: Corps de l’e‑mail
+ attach_audit_log_pdf_to_the_email: Joindre le PDF du journal d’audit à l’e‑mail
+ send_emails_automatically_on_completion: Envoyer automatiquement des e‑mails à la finalisation
+ attach_documents_to_the_email: Joindre les documents à l’e‑mail
not_specified: Non spécifié
submission_requester: Demandeur de soumission
- specified_email: E-mail spécifié
- invite_by_name: 'Invité par %{name}'
- same_as_name: 'Identique à %{name}'
- default_email: E-mail par défaut
+ specified_email: E‑mail spécifié
+ invite_by_name: Inviter par %{name}
+ same_as_name: Identique à %{name}
+ default_email: E‑mail par défaut
processing: Traitement en cours
- upload_initials: Télécharger les initiales
+ upload_initials: Téléverser les initiales
draw: Dessiner
- upload_signature: Télécharger la signature
+ upload_signature: Téléverser la signature
+ integration: Intégration
admin: Administrateur
+ tenant_admin: Administrateur locataire
editor: Éditeur
viewer: Lecteur
member: Membre
agent: Agent
- superadmin: Superadministrateur
- edit_user: "Modifier l'utilisateur"
+ superadmin: Superadmin
+ edit_user: Modifier l’utilisateur
new_user: Nouvel utilisateur
unarchive: Désarchiver
- role: Rôle
last_session: Dernière session
- unlock_more_user_roles_with_docuseal_pro: Déverrouillez plus de rôles d'utilisateurs avec DocuSeal Pro.
- view_active: Voir les actifs
- team_account: "Compte d'équipe"
- team_accounts: "Comptes d'équipe"
+ unlock_more_user_roles_with_docuseal_pro: Débloquez davantage de rôles utilisateurs avec DocuSeal Pro.
+ view_active: Voir actifs
+ team_account: Compte d’équipe
+ team_accounts: Comptes d’équipe
tenant_account: Compte locataire
tenant_accounts: Comptes locataires
- upgrade_plan: Mettre à jour le plan
- add_user: Ajouter un utilisateur
- impersonate: Usurper
- loading: Chargement en cours
+ impersonate: Usurper l’identité
+ loading: Chargement
documents: Documents
accounts: Comptes
edit_account: Modifier le compte
new_team: Nouvelle équipe
new_tenant: Nouveau locataire
- remove_team: "Supprimer l'équipe"
+ remove_team: Supprimer l’équipe
remove_tenant: Supprimer le locataire
replace: Remplacer
- allow_tenant_admins_to_invite_new_users: Permettre aux administrateurs de locataires d'inviter de nouveaux utilisateurs
+ allow_tenant_admins_to_invite_new_users: Autoriser les administrateurs locataires à inviter de nouveaux utilisateurs
manage_multiple_teams: Gérer plusieurs équipes
api_key: Clé API
logo: Logo
back: Retour
add_secret: Ajouter un secret
- edit_secret: Modifier le Secret
+ edit_secret: Modifier le secret
submission_example_payload: Exemple de payload de soumission
- there_are_no_signatures: "Il n'y a pas de signatures"
+ there_are_no_signatures: Il n’y a pas de signatures
signed_with_trusted_certificate: Signé avec un certificat de confiance
signed_with_external_certificate: Signé avec un certificat externe
- setup_2fa_to_continue: "Configurez l'authentification à deux facteurs pour continuer."
+ setup_2fa_to_continue: Configurez la 2FA pour continuer.
create_a_new_account: Créer un nouveau compte.
you_are_already_signed_in: Vous êtes déjà connecté.
please_sign_in: Veuillez vous connecter.
- not_found: Non trouvé
+ not_found: Introuvable
new_recipients_have_been_added: De nouveaux destinataires ont été ajoutés.
submission_has_been_removed: La soumission a été supprimée.
submission_has_been_archived: La soumission a été archivée.
@@ -2700,38 +3346,36 @@ fr: &fr
unable_to_move_template_into_folder: Impossible de déplacer le modèle dans le dossier.
template_has_been_unarchived: Le modèle a été désarchivé.
submission_has_been_unarchived: La soumission a été désarchivée.
- unable_to_update_file: Impossible de télécharger le fichier.
- user_has_been_updated: "L'utilisateur a été mis à jour."
- unable_to_remove_user: Impossible de supprimer l'utilisateur.
- user_has_been_invited: L'utilisateur a été invité.
- unable_to_update_user: "Impossible de mettre à jour l'utilisateur."
- user_has_been_removed: "L'utilisateur a été supprimé."
- invalid_pdf: PDF non valide
- webhook_secret_has_been_saved: Le secret du Webhook a été enregistré.
- webhook_url_has_been_saved: "L'URL du Webhook a été enregistrée."
- webhook_request_has_been_sent: La demande du Webhook a été envoyée.
- webhook_url_has_been_updated: "L'URL du Webhook a été mise à jour."
- webhook_url_has_been_deleted: "L'URL du Webhook a été supprimée."
- unable_to_resend_webhook_request: Impossible de renvoyer la requête du webhook.
- new_webhook: Nouveau Webhook
+ unable_to_update_file: Impossible de téléverser le fichier.
+ user_has_been_updated: L’utilisateur a été mis à jour.
+ unable_to_remove_user: Impossible de supprimer l’utilisateur.
+ user_has_been_invited: L’utilisateur a été invité.
+ unable_to_update_user: Impossible de mettre à jour l’utilisateur.
+ user_has_been_removed: L’utilisateur a été supprimé.
+ invalid_pdf: PDF invalide
+ webhook_secret_has_been_saved: Le secret du webhook a été enregistré.
+ webhook_url_has_been_saved: L’URL du webhook a été enregistrée.
+ webhook_request_has_been_sent: La requête webhook a été envoyée.
+ webhook_url_has_been_updated: L’URL du webhook a été mise à jour.
+ webhook_url_has_been_deleted: L’URL du webhook a été supprimée.
+ unable_to_resend_webhook_request: Impossible de renvoyer la requête webhook.
+ new_webhook: Nouveau webhook
delete_webhook: Supprimer le webhook
- count_submissions_have_been_created: '%{count} soumissions ont été créées.'
- gmail_has_been_connected: Gmail a été connecté.
- microsoft_account_has_been_connected: Le compte Microsoft a été connecté.
- sms_length_cant_be_longer_than_120_bytes: La longueur du SMS ne peut pas dépasser 120 octets.
+ count_submissions_have_been_created: "%{count} soumissions ont été créées."
+ sms_length_cant_be_longer_than_120_bytes: La longueur du SMS ne peut pas dépasser 120 octets
connected_successfully: Connecté avec succès.
- user_nameid_not_found: 'Utilisateur %{nameid} introuvable.'
- sso_settings_have_been_updated: Les paramètres de SSO ont été mis à jour.
+ user_nameid_not_found: Utilisateur %{nameid} introuvable.
+ sso_settings_have_been_updated: Les paramètres SSO ont été mis à jour.
sms_has_been_sent: Le SMS a été envoyé.
account_has_been_created: Le compte a été créé.
account_has_been_updated: Le compte a été mis à jour.
account_has_been_removed: Le compte a été supprimé.
- logo_has_been_uploaded: Le logo a été téléchargé.
- invalid_file_type: Type de fichier non valide
- upload_file: Télécharger le fichier
- upgrade_your_plan_to_invite_more_users_contact_email: "Mettez à jour votre plan pour inviter plus d'utilisateurs (contactez %{email})."
- contact_your_admin_email_to_invite_more_users: "Contactez votre administrateur %{email} pour inviter plus d'utilisateurs."
- contact_your_administrator_to_add_new_users: Contactez votre administrateur pour ajouter de nouveaux utilisateurs.
+ logo_has_been_uploaded: Le logo a été téléversé.
+ invalid_file_type: Type de fichier invalide
+ upload_file: Téléverser un fichier
+ upgrade_your_plan_to_invite_more_users_contact_email: Mettez à niveau votre formule pour inviter davantage d’utilisateurs (contact %{email}).
+ contact_your_admin_email_to_invite_more_users: Contactez votre administrateur %{email} pour inviter plus d’utilisateurs.
+ contact_your_administrator_to_add_new_users: Contactez votre administrateur pour ajouter un nouvel utilisateur
one_hour: 1 heure
two_hours: 2 heures
four_hours: 4 heures
@@ -2742,190 +3386,383 @@ fr: &fr
four_days: 4 jours
eight_days: 8 jours
fifteen_days: 15 jours
+ twenty_one_days: 21 jours
+ thirty_days: 30 jours
free: Gratuit
- unlimited_documents_storage: Stockage illimité de documents
+ unlimited_documents_storage: Stockage de documents illimité
users_management: Gestion des utilisateurs
ten_filed_types: 10 types de champs
- multiple_signers: Signataires multiples
+ multiple_signers: Plusieurs signataires
automatic_esignature: Signature électronique automatique
- ten_signature_request_emails_per_month: 10 e-mails de demande de signature par mois
- unlimited_sign_yourself: Signature illimitée par vous-même
- free_developer_testing_sandbox: Bac à sable de test pour développeurs gratuit
- continue_with_free_basic: Continuer avec Free Basic
- unlimited_signature_request_emails: E-mails de demande de signature illimités
+ ten_signature_request_emails_per_month: 10 e‑mails de demande de signature/mois
+ unlimited_sign_yourself: Signature personnelle illimitée
+ free_developer_testing_sandbox: Bac à sable de test développeur gratuit
+ continue_with_free_basic: Continuer avec l’offre Free Basic
+ unlimited_signature_request_emails: Demandes de signature illimitées
your_company_logo: Le logo de votre entreprise
- connect_own_email_address: Connectez votre propre adresse e-mail
- personalize_email_content: "Personnalisez le contenu de l'e-mail"
- automated_reminders: Rappels automatiques
- bulk_send_from_spreadsheet: Envoi en masse depuis une feuille de calcul
- identify_verification_via_sms: "Vérification de l'identité via SMS"
+ connect_own_email_address: Connecter votre propre adresse e‑mail
+ personalize_email_content: Personnaliser le contenu des e‑mails
+ automated_reminders: Rappels automatisés
+ bulk_send_from_spreadsheet: Envoi en masse depuis tableur
+ identify_verification_via_sms: Vérification d’identité par SMS
start_with_pro: Commencer avec Pro
user_month: utilisateur / mois
- developer_sandbox: Bac à sable pour développeurs
- upgrade_to_start_using_in_production_html: 'Mettre à jour pour commencer à utiliser en production.'
+ developer_sandbox: Bac à sable développeur.
+ upgrade_to_start_using_in_production_html: Mettez à niveau pour commencer à utiliser en production.
download_combined_pdf: Télécharger le PDF combiné
- audit_log: "Journal d'audit"
+ audit_log: Journal d’audit
signers: Signataires
not_invited_yet: Pas encore invité
not_completed_yet: Pas encore terminé
- declined_on_time: 'Refusé le %{time}'
- sign_in_person: Signature en personne
- create_a_new_template_document_form_or_submit_the_existing_one_html: "Créer un nouveau modèle de document ou soumettre l'existant"
- send_email_copy_with_completed_documents_to_a_specified_bcc_address: Envoyer une copie de l'e-mail avec les documents complétés à une adresse BCC spécifiée.
- re_send_email: Renvoyer l'email
- send_email: Envoyer l'email
+ declined_on_time: Refusé le %{time}
+ expire_on_time: Expire le %{time}
+ sign_in_person: Signer en personne
+ create_a_new_template_document_form_or_submit_the_existing_one_html: Créez un nouveau modèle de document ou soumettez l’existant
+ send_email_copy_with_completed_documents_to_a_specified_bcc_address: Envoyer une copie e‑mail avec les documents complétés à une adresse Cci spécifiée.
+ re_send_email: Renvoyer l’e‑mail
+ send_email: Envoyer l’e‑mail
copy_share_link: Copier le lien de partage
- copied_to_clipboard: Copié dans le presse-papiers
+ copied_to_clipboard: Copié dans le presse‑papiers
link: Lien
- via_email: par e-mail
- via_phone: par téléphone
- detailed: Détailé
- upload_list: Télécharger la liste
- creating: Création
+ via_email: Par e‑mail
+ via_phone: Par téléphone
+ detailed: Détaillé
+ upload_list: Téléverser une liste
+ creating: Création en cours
open_source_documents_software: logiciel de documents open source
copy_link: Copier le lien
opened: Ouvert
sent: Envoyé
awaiting: En attente
document_id: ID du document
- envelope_id: ID de l'enveloppe
- event_log: Journal d'événements
+ envelope_id: ID de l’enveloppe
+ event_log: Journal des événements
verify: Vérifier
- testing_log_not_for_production_use: Journal de test - Ne pas utiliser en production
- original_sha256: SHA256 original
+ testing_log_not_for_production_use: Journal de test - Non destiné à la production
+ original_sha256: SHA256 d’origine
result_sha256: SHA256 du résultat
generated_at: Généré le
- email_verification: Vérification de l'e-mail
- phone_verification: Vérification du téléphone
+ email_verification: Vérification par e‑mail
+ phone_verification: Vérification par téléphone
session_id: ID de session
option: Option
- text_field: Champ de Texte
- signature_field: Champ de Signature
- initials_field: "Champ d'Initiales"
- date_field: Champ de Date
- number_field: Champ de Numéro
- image_field: "Champ d'Image"
- file_field: Champ de Fichier
- select_field: Champ de Choix
- checkbox_field: Champ de Coche
- multiple_field: Champ de Choix Multiple
- radio_field: Champ de Groupe Radio
- cells_field: Champ de Cellules
- stamp_field: Champ de Tampon
- payment_field: Champ de Paiement
- phone_field: Champ de Téléphone
- verification_field: "Vérification d'Identité"
- identity_verification: "Vérification d'identité"
- paid_price: 'Payé %{price}'
+ text_field: Champ texte
+ signature_field: Champ signature
+ initials_field: Champ initiales
+ date_field: Champ date
+ number_field: Champ nombre
+ image_field: Champ image
+ file_field: Champ fichier
+ select_field: Champ sélection
+ checkbox_field: Case à cocher
+ multiple_field: Champ sélection multiple
+ radio_field: Groupe de boutons radio
+ cells_field: Champ cellules
+ stamp_field: Champ tampon
+ payment_field: Champ paiement
+ phone_field: Champ téléphone
+ verification_field: Champ de vérification
+ identity_verification: Vérification d’identité
+ paid_price: Payé %{price}
verified: Vérifié
unverified: Non vérifié
document: Document
completed_at: Terminé le
edit_recipient: Modifier le destinataire
update_recipient: Mettre à jour le destinataire
- use_international_format_1xxx_: 'Utilisez un format international : +1xxx...'
+ use_international_format_1xxx_: 'Utilisez le format international : +1xxx...'
submitter_cannot_be_updated: Le soumissionnaire ne peut pas être mis à jour.
at_least_one_field_must_be_filled: Au moins un champ doit être rempli.
- archived_users: Utilisateurs Archivés
- embedding_users: Utilisateurs Intégrés
- view_embedding_users: Voir les Utilisateurs Intégrés
+ archived_users: Utilisateurs archivés
+ embedding_users: Utilisateurs d’embedding
+ view_embedding_users: Voir les utilisateurs d’embedding
key: Clé
value: Valeur
- webhook_secret: Secret du Webhook
+ webhook_secret: Secret du webhook
author: Auteur
to: À
created_at: Créé le
apply: Appliquer
applying: Application en cours
- today: "Aujourd'hui"
+ today: Aujourd’hui
yesterday: Hier
- this_week: Cette Semaine
- last_week: La Semaine Dernière
- this_month: Ce Mois-ci
- last_month: Le Mois Dernier
- this_year: Cette Année
- policy_links: Liens des Politiques
- markdown_content_e_g: Contenu Markdown, par ex.
- privacy_policy: Politique de Confidentialité
- the_code_has_been_sent_to_your_email: Le code a été envoyé à votre e-mail.
- enter_the_verification_code_from_your_email: Entrez le code de vérification de votre e-mail.
+ this_week: Cette semaine
+ last_week: La semaine dernière
+ this_month: Ce mois‑ci
+ last_month: Le mois dernier
+ this_year: Cette année
+ policy_links: Liens de politique
+ markdown_content_e_g: Contenu Markdown, p. ex.
+ privacy_policy: Politique de confidentialité
+ the_code_has_been_sent_to_your_email: Le code a été envoyé à votre e‑mail.
+ enter_the_verification_code_from_your_email: Saisissez le code de vérification reçu par e‑mail.
too_many_attempts: Trop de tentatives.
- verification_code: Code de Vérification
- resend_code: Renvoyer le Code
- verify_new_sign_in: Vérifier la nouvelle connexion
- use_otp_code_to_sign_in_or_click_the_link_below_html: 'Utilisez le code %{code} pour vous connecter ou cliquez sur le lien ci-dessous :'
- complete_sign_in: Terminer la Connexion
- please_reply_to_this_email_if_you_dont_recognize_this_sign_in_attempt: Veuillez répondre à cet e-mail si vous ne reconnaissez pas cette tentative de connexion.
+ verification_code: Code de vérification
+ resend_code: Renvoyer le code
+ verify_new_sign_in: Vérifier une nouvelle connexion
+ use_otp_code_to_sign_in_or_click_the_link_below_html: 'Utilisez le code %{code} pour vous connecter ou cliquez sur le lien ci‑dessous :'
+ complete_sign_in: Terminer la connexion
+ please_reply_to_this_email_if_you_dont_recognize_this_sign_in_attempt: Veuillez répondre à cet e‑mail si vous ne reconnaissez pas cette tentative de connexion.
docuseal_support: Support DocuSeal
- use_the_edit_form_to_move_it_to_another_team: Utilisez le formulaire de modification pour le déplacer vers une autre équipe.
- too_many_sms_attempts_try_again_in_a_few_seconds: Trop de tentatives de SMS. Réessayez dans quelques secondes.
- number_phone_number_is_invalid: "Le numéro de téléphone +%{number} est invalide"
- make_com_integration: Intégration avec Make.com
- zapier_integration: Intégration avec Zapier
- seamlessly_automate_your_document_signing_process_with_make_com: Automatisez facilement votre processus de signature de documents avec Make.com.
+ use_the_edit_form_to_move_it_to_another_team: Utilisez le formulaire d’édition pour le déplacer vers une autre équipe.
+ too_many_sms_attempts_try_again_in_a_few_seconds: Trop de tentatives SMS. Réessayez dans quelques secondes.
+ number_phone_number_is_invalid: Le numéro de téléphone +%{number} est invalide
+ make_com_integration: Intégration Make.com
+ zapier_integration: Intégration Zapier
+ seamlessly_automate_your_document_signing_process_with_make_com: Automatisez en toute fluidité votre processus de signature de documents avec Make.com.
find_suitable_zapier_templates_to_automate_your_workflow: Trouvez des modèles Zapier adaptés pour automatiser votre flux de travail.
get_started: Commencer
- click_here_to_learn_more_about_user_roles_and_permissions_html: 'Cliquez ici pour en savoir plus sur les rôles et les autorisations des utilisateurs.'
- count_10_signature_request_emails_sent_this_month_upgrade_to_pro_to_send_unlimited_signature_request_email: '%{count} / 10 e-mails de demande de signature envoyés ce mois-ci. Passez à Pro pour envoyer des demandes de signature illimitées.'
- test_mode_emails_limit_will_be_reset_within_24_hours: La limite d'e-mails en mode test sera réinitialisée dans les 24 heures.
- on_a_scale_of_1_to_10_how_satisfied_are_you_with_the_docuseal_product_: 'Sur une échelle de 1 à 10, à quel point êtes-vous satisfait du produit DocuSeal?'
- tell_us_more_about_your_experience: Parlez-nous davantage de votre expérience
+ click_here_to_learn_more_about_user_roles_and_permissions_html: Cliquez ici pour en savoir plus sur les rôles et permissions des utilisateurs.
+ count_10_signature_request_emails_sent_this_month_upgrade_to_pro_to_send_unlimited_signature_request_email: "%{count} / 10 e‑mails de demande de signature envoyés ce mois‑ci. Passez à Pro pour envoyer des e‑mails de demande de signature illimités."
+ test_mode_emails_limit_will_be_reset_within_24_hours: La limite d’e‑mails en mode test sera réinitialisée sous 24 heures.
+ on_a_scale_of_1_to_10_how_satisfied_are_you_with_the_docuseal_product_: Sur une échelle de 1 à 10, quel est votre niveau de satisfaction du produit DocuSeal ?
+ tell_us_more_about_your_experience: Dites‑nous en plus sur votre expérience
extremely_dissatisfied: Extrêmement insatisfait
extremely_satisfied: Extrêmement satisfait
- your_pro_plan_payment_is_overdue: Le paiement de votre plan Pro est en retard.
- click_here_to_update_your_payment_details_and_clear_the_invoice_to_ensure_uninterrupted_service_html: 'Cliquez ici pour mettre à jour vos informations de paiement et régler la facture afin de garantir un service ininterrompu.'
- overdue_payment: Paiement En Retard
- your_pro_plan_has_been_suspended_due_to_unpaid_invoices_you_can_update_your_payment_details_to_settle_the_invoice_and_continue_using_docuseal_or_cancel_your_subscription: Votre plan Pro a été suspendu en raison de factures impayées. Vous pouvez mettre à jour vos informations de paiement pour régler la facture et continuer à utiliser DocuSeal ou annuler votre abonnement.
- manage_subscription: Gérer l'Abonnement
- submission_created_by_email_html: 'Soumission créée par %{email}'
- submission_created_by_email_via_source_html: 'Soumission créée par %{email} via %{source}'
- submission_created_via_source_html: 'Soumission créée via %{source}'
- pro_user_seats_used: Places utilisateur Pro en cours d'utilisation
- manage_plan: Gérer le plan
+ your_pro_plan_payment_is_overdue: Le paiement de votre offre Pro est en retard.
+ click_here_to_update_your_payment_details_and_clear_the_invoice_to_ensure_uninterrupted_service_html: Cliquez ici pour mettre à jour vos informations de paiement et régler la facture afin de garantir la continuité du service.
+ overdue_payment: Paiement en retard
+ your_pro_plan_has_been_suspended_due_to_unpaid_invoices_you_can_update_your_payment_details_to_settle_the_invoice_and_continue_using_docuseal_or_cancel_your_subscription: "Votre offre Pro a été suspendue en raison de factures impayées.\nVous pouvez mettre à jour vos informations de paiement pour régler la facture et continuer à utiliser DocuSeal, ou annuler votre abonnement."
+ manage_subscription: Gérer l’abonnement
+ submission_created_by_email_html: "Soumission créée par %{email}"
+ submission_created_by_email_via_source_html: "Soumission créée par %{email} via %{source}"
+ submission_created_via_source_html: "Soumission créée via %{source}"
+ pro_user_seats_used: Places d’utilisateurs Pro utilisées
+ manage_plan: Gérer la formule
+ this_submission_has_multiple_signers_which_prevents_the_use_of_a_sharing_link_html: Cette soumission comporte plusieurs signataires, ce qui empêche l’utilisation d’un lien de partage car il n’est pas clair quel signataire est responsable de quels champs. Pour résoudre cela, suivez ce guide pour définir les détails du signataire par défaut.
+ welcome_to_docuseal: Bienvenue sur DocuSeal
+ start_a_quick_tour_to_learn_how_to_create_an_send_your_first_document: Lancez une visite rapide pour apprendre à créer et envoyer votre premier document
+ start_tour: Démarrer la visite
+ name_a_z: Nom A‑Z
+ recently_used: Récemment utilisés
+ newest_first: Plus récents en premier
+ none: Aucun
+ default_expiration: Expiration par défaut
+ specified_date: Date spécifiée
+ one_day: 1 jour
+ three_days: 3 jours
+ five_days: 5 jours
+ six_days: 6 jours
+ seven_days: 7 jours
+ nine_days: 9 jours
+ ten_days: 10 jours
+ two_weeks: 2 semaines
+ three_weeks: 3 semaines
+ four_weeks: 4 semaines
+ one_month: 1 mois
+ two_months: 2 mois
+ three_months: 3 mois
+ eu_data_residency: Résidence des données UE
+ please_enter_your_email_address_associated_with_the_completed_submission: Veuillez saisir l’adresse e‑mail associée à la soumission complétée.
+ esignature_disclosure: Divulgation de signature électronique
+ share_link: Lien de partage
+ enable_shared_link: Activer le lien partagé
+ share_link_is_currently_disabled: Le lien de partage est actuellement désactivé
+ select_data_residency: Sélectionner la résidence des données
+ account_name_has_invited_you_to_fill_and_sign_documents_online_effortlessly_with_a_secure_fast_and_user_friendly_digital_document_signing_solution: "%{account_name} vous a invité à remplir et signer des documents en ligne facilement, grâce à une solution de signature numérique sécurisée, rapide et conviviale."
+ review_or_download_completed_documents_fill_and_sign_documents_online_effortlessly_with_a_secure_fast_and_user_friendly_digital_document_signing_solution: Consultez ou téléchargez les documents complétés. Remplissez et signez des documents en ligne facilement, grâce à une solution de signature numérique sécurisée, rapide et conviviale.
+ link_form_fields: Lier les champs du formulaire
+ at_least_one_field_must_be_displayed_in_the_form: Au moins un champ doit être affiché dans le formulaire.
+ this_template_has_multiple_parties_which_prevents_the_use_of_a_sharing_link: Ce modèle comporte plusieurs parties, ce qui empêche l’utilisation d’un lien de partage car il n’est pas clair quelle partie est responsable de quels champs. Définissez les détails de la partie par défaut.
+ events_log: Journal des événements
+ succeeded: Réussi
+ failed: Échec
+ there_are_no_events: Il n’y a aucun événement
+ resend: Renvoyer
+ next_attempt_in_time_in_words: Prochaine tentative dans %{time_in_words}
+ request_email_otp_verification_with_shared_link: Demander la vérification OTP par e‑mail avec le lien partagé
+ sms_rate_limit_exceeded: Limite de débit SMS dépassée
+ invalid_phone_number: Numéro de téléphone invalide
+ please_contact_the_requester_to_specify_your_phone_number_for_two_factor_authentication: Veuillez contacter le demandeur pour préciser votre numéro de téléphone pour l’authentification à deux facteurs.
+ we_sent_a_one_time_verification_code_to_your_email_address_please_enter_the_code_below_to_continue: Nous avons envoyé un code de vérification à usage unique à votre adresse e‑mail. Veuillez saisir le code ci‑dessous pour continuer.
+ re_send_code: Renvoyer le code
+ your_verification_code_to_access_the_name: 'Votre code de vérification pour accéder à "%{name}" :'
+ please_reply_to_this_email_if_you_didnt_request_this: Veuillez répondre à cet e‑mail si vous n’avez pas fait cette demande.
+ advanced_settings: Paramètres avancés
+ text: Texte
+ code: Code
+ custom_html_emails: E‑mails HTML personnalisés
+ connect_your_email_to_send_html_emails: Connectez votre e‑mail pour envoyer des e‑mails HTML
+ connect_your_email_or_outlook_account_or_add_smtp_settings_to_send_custom_html_emails: Connectez votre compte Gmail ou Outlook ou ajoutez des paramètres SMTP pour envoyer des e‑mails HTML personnalisés.
+ connect_gmail_or_outlook: Connecter Gmail ou Outlook
+ connect_your_email_to_bulk_send: Connectez votre e‑mail pour l’envoi en masse
+ connect_your_email_or_outlook_account_or_add_smtp_settings_to_bulk_send: Connectez votre compte Gmail ou Outlook ou ajoutez des paramètres SMTP pour l’envoi en masse.
+ are_you_sure_you_want_to_add_recipients_without_sending_to_send_emails_it_requires_to_connect_gmail_or_outlook: Êtes‑vous sûr de vouloir ajouter des destinataires sans envoyer ? Pour envoyer des e‑mails, il faut connecter Gmail ou Outlook.
+ template_name_has_been_completed_by_submitters_html: '"{template.name}" a été complété par {submission.submitters}'
+ please_check_the_copy_of_your_template_name_in_the_email_attachments_html: Veuillez vérifier la copie de votre "{template.name}" dans les pièces jointes de l’e‑mail.
+ you_have_been_invited_to_sign_the_template_name_html: Vous avez été invité à signer "{template.name}".
+ reveal_api_key: Révéler la clé API
+ enter_your_password_to_reveal_the_api_key: Entrez votre mot de passe pour révéler la clé API
+ wrong_password: Mauvais mot de passe.
+ current_password: Mot de passe actuel
+ dont_remember_your_current_password_click_here_to_reset_it_html: Vous ne vous souvenez plus de votre mot de passe actuel ? pour le réinitialiser.
+ an_email_with_password_reset_instructions_has_been_sent: Un e‑mail contenant les instructions de réinitialisation du mot de passe a été envoyé.
+ api_key_access_code: Code d’accès à la clé API
+ use_otp_code_to_access_the_api_key_html: Utilisez le code %{code} pour accéder à la clé API.
+ please_reply_to_this_email_if_you_dont_recognize_this_request: Veuillez répondre à cet e‑mail si vous ne reconnaissez pas cette demande.
+ your_user_account_has_been_archived_contact_your_administrator_to_restore_access_to_your_account: Votre compte utilisateur a été archivé. Contactez votre administrateur pour rétablir l’accès à votre compte.
+ your_email_could_not_be_reached_this_may_happen_if_there_was_a_typo_in_your_address_or_if_your_mailbox_is_not_available_please_contact_support_email_to_log_in: Votre e‑mail n’a pas pu être joint. Cela peut se produire en cas de faute de frappe dans votre adresse ou si votre boîte aux lettres n’est pas disponible. Veuillez contacter support@docuseal.com pour vous connecter.
+ efficient_search_with_search_index: Recherche efficace avec index de recherche
+ reindex: Réindexer
+ build_search_index: Construire l’index de recherche
+ require_two_factor_authentication_2fa_with_an_authenticator_app_e_g_google_authenticator_authy_all_users_signing_documents_must_pass_the_second_factor_verification_using_a_secure_code_in_addition_to_their_password: Exiger l’authentification à deux facteurs (2FA) avec une application d’authentification (p. ex., Google Authenticator, Authy). Tous les utilisateurs qui signent des documents doivent passer la vérification du second facteur à l’aide d’un code sécurisé en plus de leur mot de passe.
+ add_a_unique_signature_id_and_timestamp_to_each_signature_for_audit_and_traceability_purposes_along_with_the_timestamp_part_of_docuseals_21_cfr_part_11_compliance_settings: Ajouter un identifiant de signature unique et un horodatage à chaque signature à des fins d’audit et de traçabilité, avec l’horodatage. Fait partie des paramètres de conformité 21 CFR Part 11 de DocuSeal.
+ require_signer_to_provide_a_reason_for_signing_before_completing_their_signature_e_g_approvals_certifications_part_of_docuseals_21_cfr_part_11_compliance_settings: Exiger que les signataires fournissent un motif de signature avant de finaliser leur signature (p. ex., approbations, certifications). Fait partie des paramètres de conformité 21 CFR Part 11 de DocuSeal.
+ allow_signers_to_create_signatures_by_typing_their_name_instead_of_drawing_or_uploading_one: Autoriser les signataires à créer des signatures en tapant leur nom au lieu de dessiner ou téléverser une signature.
+ allow_signers_to_resubmit_forms_after_completion_useful_when_corrections_or_multiple_submissions_are_needed: Autoriser les signataires à soumettre à nouveau les formulaires après finalisation, utile pour des corrections ou soumissions multiples.
+ allow_recipients_to_decline_signing_a_document_the_decline_reason_notification_will_be_sent_to_the_signature_requester: Autoriser les destinataires à refuser de signer un document. Le motif du refus sera notifié au demandeur de signature.
+ save_a_users_signature_and_automatically_pre_fill_it_in_future_signing_sessions: Mémoriser la signature d’un utilisateur et la pré‑remplir automatiquement lors de futures sessions de signature.
+ make_document_download_links_expire_after_40_minutes_to_prevent_long_term_access_and_enhance_security: Faire expirer les liens de téléchargement des documents après 40 minutes pour éviter un accès à long terme et renforcer la sécurité.
+ require_authentication_with_user_login_or_api_key_to_access_the_document_download_links: Exiger une authentification par connexion utilisateur ou clé API pour accéder aux liens de téléchargement des documents.
+ combine_signed_documents_and_the_audit_log_into_a_single_pdf_file_for_easier_recordkeeping_and_compliance: Combiner les documents signés et le journal d’audit en un seul fichier PDF pour faciliter l’archivage et la conformité.
+ require_a_jwt_authorization_to_preview_embedded_forms_ensuring_only_authorized_users_can_view_them: Exiger une autorisation JWT pour prévisualiser les formulaires intégrés, afin que seuls les utilisateurs autorisés puissent les voir.
+ make_all_newly_created_templates_private_to_their_creator_by_default: Rendre tous les nouveaux modèles privés pour leur créateur par défaut.
+ make_the_recipients_signing_order_always_enforced_so_that_the_second_signer_can_start_signing_their_part_only_after_the_first_signer_has_completed_signing: Toujours imposer l’ordre de signature des destinataires, afin que le second signataire ne puisse commencer qu’après la signature du premier.
+ the_file_is_missing_make_sure_you_have_access_to_it_on_google_drive: Le fichier est manquant. Assurez‑vous d’y avoir accès sur Google Drive.
+ connect_google_drive: Connecter Google Drive
+ google_drive_has_been_connected: Google Drive a été connecté
+ unable_to_identify_reset_your_password_to_sign_in: Impossible d’identifier. Réinitialisez votre mot de passe pour vous connecter.
+ desktop: Bureau
+ mobile: Mobile
+ tablet: Tablette
+ reset_default: Réinitialiser par défaut
+ send_signature_request_email: Envoyer un e-mail de demande de signature
submission_sources:
api: API
bulk: Envoi en masse
- embed: Intégration
+ embed: Embedding
invite: Invitation
link: Lien
submission_event_names:
- send_email_to_html: 'E-mail envoyé à %{submitter_name}'
- send_reminder_email_to_html: 'E-mail de rappel envoyé à %{submitter_name}'
- send_sms_to_html: 'SMS envoyé à %{submitter_name}'
- send_2fa_sms_to_html: 'SMS de vérification envoyé à %{submitter_name}'
- open_email_by_html: 'E-mail ouvert par %{submitter_name}'
- click_email_by_html: "Lien de l'e-mail cliqué par %{submitter_name}"
- click_sms_by_html: 'Lien du SMS cliqué par %{submitter_name}'
- phone_verified_by_html: 'Téléphone vérifié par %{submitter_name}'
- start_form_by_html: 'Soumission commencée par %{submitter_name}'
- view_form_by_html: 'Formulaire consulté par %{submitter_name}'
- invite_party_by_html: 'Invité %{invited_submitter_name} par %{submitter_name}'
- complete_form_by_html: 'Soumission terminée par %{submitter_name}'
- start_verification_by_html: "Vérification d'identité commencée par %{submitter_name}"
- complete_verification_by_html: "Vérification d'identité terminée par %{submitter_name} avec %{provider}"
- api_complete_form_by_html: "Soumission terminée via l'API par %{submitter_name}"
+ send_email_to_html: "E‑mail envoyé à %{submitter_name}"
+ bounce_email_html: "E‑mail rejeté %{submitter_name}"
+ complaint_email_html: "Plainte spam %{submitter_name}"
+ send_reminder_email_to_html: "E‑mail de rappel envoyé à %{submitter_name}"
+ send_sms_to_html: "SMS envoyé à %{submitter_name}"
+ send_2fa_sms_to_html: "SMS de vérification envoyé à %{submitter_name}"
+ open_email_by_html: "E‑mail ouvert par %{submitter_name}"
+ click_email_by_html: "Lien e‑mail cliqué par %{submitter_name}"
+ click_sms_by_html: "Lien SMS cliqué par %{submitter_name}"
+ phone_verified_by_html: "Téléphone vérifié par %{submitter_name}"
+ email_verified_by_html: "E‑mail vérifié par %{submitter_name}"
+ start_form_by_html: "Soumission démarrée par %{submitter_name}"
+ view_form_by_html: "Formulaire consulté par %{submitter_name}"
+ invite_party_by_html: "Invité %{invited_submitter_name} par %{submitter_name}"
+ complete_form_by_html: "Soumission terminée par %{submitter_name}"
+ start_verification_by_html: "Vérification d’identité démarrée par %{submitter_name}"
+ complete_verification_by_html: "Vérification d’identité terminée par %{submitter_name} avec %{provider}"
+ api_complete_form_by_html: "Soumission terminée via API par %{submitter_name}"
import_list:
- select_worksheet: Sélectionner la feuille de calcul
+ select_worksheet: Sélectionner une feuille
open: Ouvrir
remove: Supprimer
- recipient_field: Champ du destinataire
- spreadsheet_column: Colonne de la feuille de calcul
- select_field: Sélectionner le champ
- select_column: Sélectionner la colonne
+ recipient_field: Champ destinataire
+ spreadsheet_column: Colonne du tableur
+ select_field: Sélectionner un champ
+ select_column: Sélectionner une colonne
new_field_mapping: Nouveau mappage de champ
total_entries: Entrées totales
- upload_csv_or_xlsx_spreadsheet: Télécharger une feuille de calcul CSV ou XLSX
- click_to_upload: Cliquez pour télécharger
- or_drag_and_drop_files: ou faites glisser et déposez les fichiers.
- or: Un
- download: téléchargez
- a_sample_spreadsheet_to_fill_and_import: un modèle de feuille de calcul à remplir et importer.
+ upload_csv_or_xlsx_spreadsheet: Téléverser un tableur CSV ou XLSX
+ click_to_upload: Cliquer pour téléverser
+ or_drag_and_drop_files: ou glisser‑déposer des fichiers.
+ or: Ou
+ download: télécharger
+ a_sample_spreadsheet_to_fill_and_import: un exemple de tableur à remplir et importer
+ app_tour:
+ start: Démarrer
+ previous: Précédent
+ next: Suivant
+ template_and_submissions: Modèles et Soumissions
+ template_and_submissions_description: Choisissez la vue qui convient à votre flux de travail. La vue « Modèles » permet de créer des modèles réutilisables, la vue « Soumissions » de signer des documents individuels ou de suivre chaque demande de signature.
+ upload_a_pdf_file: Téléverser un fichier PDF
+ upload_a_pdf_file_description: Téléversez un document PDF pour créer un modèle de signature.
+ select_a_signer_party: Sélectionner une partie signataire
+ select_a_signer_party_description: Ce menu permet de choisir un rôle signataire ou d’ajouter une nouvelle partie si le document requiert 2 signatures ou plus.
+ available_parties: Parties disponibles
+ available_parties_description: Cette liste contient toutes les parties disponibles avec leurs rôles. Une fois sélectionnée, vous pourrez ajouter et configurer les champs pour cette partie.
+ available_field_types: Types de champs disponibles
+ available_field_types_description: Cette section contient tous les types de champs qui peuvent être ajoutés au document pour la saisie de données ou la collecte de signatures.
+ text_input_field: Champ de saisie texte
+ text_input_field_description: Permet d’entrer des informations textuelles, comme des noms ou des e‑mails.
+ signature_field: Champ de signature
+ signature_field_description: Utilisé pour collecter les signatures des signataires.
+ added_fields: Champs ajoutés
+ added_fields_description: Liste des champs ajoutés au document. Vous pouvez les réorganiser, les modifier ou les supprimer.
+ open_field_settings: Ouvrir les paramètres du champ
+ open_field_settings_description: Un icône de paramètres à droite du nom du champ permet d’ouvrir ses paramètres.
+ field_settings: Paramètres du champ
+ field_settings_description: Chaque champ peut être personnalisé (taille de police, caractère obligatoire, description, etc.).
+ send_document: Envoyer le document pour signature
+ send_document_description: Avant l’envoi, vous pouvez configurer les destinataires, saisir leurs e‑mails ou numéros de téléphone et personnaliser le contenu de l’e‑mail.
+ sign_yourself: Signer le document soi‑même
+ sign_yourself_description: Ce bouton permet d’ajouter votre signature aux documents qui la requièrent.
+ copy_and_share_link: Copier et partager le lien
+ copy_and_share_link_description: Copiez ce lien pour partager le document. Toute personne ayant le lien peut le signer après avoir saisi son e‑mail.
+ sign_the_document: Signer le document
+ sign_the_document_description: Si vous êtes l’un des signataires, ce bouton vous permet de signer le document.
+ send_for_signing: Envoyer pour signature
+ add_recipients: Ajouter des destinataires
+ add_recipients_description: Ajoutez de nouveaux destinataires en entrant leurs adresses e‑mail ou numéros de téléphone.
+ settings: Paramètres
+ settings_account_description: Des paramètres de compte complets pour personnaliser l’expérience de signature et inviter d’autres utilisateurs.
+ support: Support
+ support_description: Utilisez notre assistant IA en libre‑service ou contactez‑nous à support@docuseal.com pour toute question.
+ settings_template_description: Utilisez ce bouton pour accéder à la page des paramètres de votre compte.
doorkeeper:
scopes:
write: Mettre à jour vos données
read: Lire vos données
+ pagination:
+ submissions:
+ range_with_total: "%{from}-%{to} sur %{count} soumissions"
+ range_without_total: "%{from}-%{to} soumissions"
+ templates:
+ range_with_total: "%{from}-%{to} sur %{count} modèles"
+ range_without_total: "%{from}-%{to} modèles"
+ template_folders:
+ range_with_total: "%{from}-%{to} sur %{count} dossiers"
+ range_without_total: "%{from}-%{to} dossiers"
+ users:
+ range_with_total: "%{from}-%{to} sur %{count} utilisateurs"
+ range_without_total: "%{from}-%{to} utilisateurs"
+ items:
+ range_with_total: "%{from}-%{to} sur %{count} éléments"
+ range_without_total: "%{from}-%{to} éléments"
+ events:
+ range_with_total: "%{from}-%{to} sur %{count} événements"
+ range_without_total: "%{from}-%{to} événements"
pt: &pt
+ add_from_google_drive: Adicionar do Google Drive
+ or_add_from: Ou adicionar de
+ upload_a_new_document: Enviar novo documento
+ use_direct_file_attachment_links_in_the_documents: Usar links diretos de anexos de arquivos nos documentos
+ click_here_to_send_a_reset_password_email_html: ' para enviar um e-mail de redefinição de senha.'
+ enabled: Ativado
+ disabled: Desativado
+ expirable_file_download_links: Links de download de arquivos com expiração
+ create_templates_with_private_access_by_default: Criar modelos com acesso privado por padrão
+ party: Parte
+ edit_order: Edita Pedido
+ select: Selecionar
+ invite_form_fields: Convidar campos do formulário
+ pro: Pro
+ default_parties: Partes padrão
+ authenticate_embedded_form_preview_with_token: Autenticar visualização incorporada do formulário com token
+ require_all_recipients: Exigir todos os destinatários
+ stripe_integration: Integração com Stripe
+ stripe_account_has_been_connected: Conta Stripe foi conectada.
+ re_connect_stripe: Reconectar Stripe
+ private: Privado
+ resend_pending: Re-enviar pendente
+ ensure_unique_recipients: Garantir destinatários únicos
+ require_phone_2fa_to_open: Necessário autenticação de dois fatores via telefone para abrir
+ the_sender_has_requested_a_two_factor_authentication_via_one_time_password_sent_to_your_html: O remetente solicitou uma autenticação de dois fatores via senha de uso único enviada para seu número %{phone}.
+ send_verification_code: Enviar código de verificação
+ code_has_been_resent: Código foi reenviado
+ invalid_code: Código inválido
+ always_enforce_signing_order: Sempre impor a ordem de assinatura
+ bcc_recipients: Destinatários BCC
edit_per_party: Edita por festa
signed: Assinado
reply_to: Responder a
@@ -2937,13 +3774,11 @@ pt: &pt
select_user: Selecionar usuário
team_member_permissions: Permissões de membro da equipe
entire_team: Toda a equipe
- admin_only: Somente administrador
+ admin_only: Somente admin
accessiable_by: Acessível por
team_access: Acesso à equipe
remove_filter: Remover filtro
document_download_filename_format: Formato do nome do arquivo de download do documento
- document_name: Nome do documento
- unarchive: Desarquivar
awaiting_completion_by_the_other_party: "Aguardando a conclusão pela outra parte"
enforce_recipients_order: 'Forçar a ordem dos recipientes'
first_party: 'Primeira Parte'
@@ -2953,6 +3788,8 @@ pt: &pt
you_have_been_invited_to_account_name_product_name_please_sign_up_using_the_link_below_: 'Você foi convidado para %{account_name} %{product_name}. Inscreva-se usando o link abaixo:'
sent_using_product_name_in_testing_mode_html: 'Enviado usando %{product_name} no Modo de Teste'
sent_using_product_name_free_document_signing_html: 'Enviado usando a assinatura gratuita de documentos de %{product_name}.'
+ sent_with_docuseal_pro_html: 'Enviado com DocuSeal Pro'
+ show_send_with_docuseal_pro_attribution_in_emails_html: Mostrar "Enviado com DocuSeal Pro" nos e-mails
sign_documents_with_trusted_certificate_provided_by_docu_seal_your_documents_and_data_are_never_shared_with_docu_seal_p_d_f_checksum_is_provided_to_generate_a_trusted_signature: Assine documentos com certificado confiável fornecido pela DocuSeal. Seus documentos e dados nunca são compartilhados com a DocuSeal. O checksum do PDF é fornecido para gerar uma assinatura confiável.
hi_there: Olá
thanks: Obrigado
@@ -2962,7 +3799,7 @@ pt: &pt
please_check_the_copy_of_your_name_in_the_email_attachments: 'Por favor, verifique a cópia de "%{name}" nos anexos do e-mail.'
review_and_sign: Revisar e assinar
review_and_submit: Revisar e submeter
- please_contact_us_by_replying_to_this_email_if_you_didn_t_request_this: 'Por favor, entre em contato conosco respondendo a este e-mail se você tiver alguma dúvida.'
+ please_contact_us_by_replying_to_this_email_if_you_have_any_questions: 'Por favor, entre em contato conosco respondendo a este e-mail se você tiver alguma dúvida.'
submitter_invitation_sms_body_sign: '{account.name} convidou você para assinar um documento: {submitter.link}'
verification_code_sms_body: 'Código de verificação: {code}'
you_are_invited_to_submit_a_form: Você foi convidado a submeter um formulário
@@ -2974,11 +3811,11 @@ pt: &pt
submitter_invitation_email_sign_body: |
Olá,
- Você foi convidado a assinar o documento "{template.name}".
+ Você foi convidado a assinar "{template.name}".
[Revisar e assinar]({submitter.link})
- Por favor, entre em contato conosco se tiver alguma dúvida.
+ Por favor, entre em contato conosco respondendo a este e-mail se você tiver alguma dúvida.
Obrigado,
{account.name}
@@ -2991,8 +3828,8 @@ pt: &pt
submitter_documents_copy_email_body: |
Olá,
- Por favor, verifique a cópia de seu "{template.name}" nos anexos do e-mail.
- Alternativamente, você pode revisar e baixar sua cópia usando o link abaixo:
+ Por favor, verifique a cópia de "{template.name}" nos anexos do e-mail.
+ Você pode revisar e baixar sua cópia usando o link abaixo:
[{template.name}]({documents.link})
@@ -3005,7 +3842,12 @@ pt: &pt
digitally_signed_by: Assinado digitalmente por
role: Função
reason: Motivo
- provide_your_email_to_start: Forneça o seu email para começar
+ provide_your_email_to_start: Informe seu e-mail para começar
+ provide_your_email: Informe seu e-mail
+ provide_your_name_to_start: Informe seu nome para começar
+ provide_your_name: Informe seu nome
+ provide_your_phone_in_international_format_to_start: Informe seu telefone no formato internacional para começar
+ provide_your_phone_in_international_format: Informe seu telefone no formato internacional
start: Iniciar
starting: Iniciando
form_has_been_deleted_by_html: 'O formulário foi eliminado por %{name}.'
@@ -3072,7 +3914,7 @@ pt: &pt
connect_salesforce: Conectar Salesforce
danger_zone: Zona de perigo
delete_my_account: Excluir minha conta
- schedule_account_for_deletion_: Agendar exclusão da conta?
+ you_are_scheduling_your_account_for_deletion_after_deletion_your_data_will_be_permanently_removed_and_cannot_be_recovered_click_ok_if_you_would_like_to_continue: "Você está agendando a exclusão da sua conta. Após a exclusão, seus dados serão permanentemente removidos e não poderão ser recuperados.\n\nClique em OK se desejar continuar."
account_information_has_been_updated: As informações da conta foram atualizadas.
should_be_a_valid_url: deve ser um URL válido
your_account_removal_request_will_be_processed_within_2_months_please_contact_us_if_you_want_to_keep_your_account: Seu pedido de remoção da conta será processado em até 2 meses. Entre em contato conosco se você quiser manter sua conta.
@@ -3114,7 +3956,7 @@ pt: &pt
upload_signed_pdf_file_to_validate_its_signature_: 'Envie o arquivo PDF assinado para validar a assinatura:'
analyzing: Analisando
verify_signed_pdf: Verificar PDF assinado
- click_to_upload_or_drag_and_drop_html: 'Clique para enviar ou arraste e solte'
+ click_to_upload_or_drag_and_drop_html: 'Clique para enviar ou arraste e solte'
click_to_upload_or_drag_and_drop_files_html: 'Clique para enviar ou arraste e solte os arquivos'
signing_certificates: Certificados de assinatura
upload_cert: Enviar certificado
@@ -3161,6 +4003,7 @@ pt: &pt
invalid_timeserver: Servidor de carimbo de tempo inválido
email_templates: Modelos de e-mail
signature_request_email: E-mail de solicitação de assinatura
+ signature_request_reminder_email: E-mail de lembrete de solicitação de assinatura
signature_request_sms: SMS de solicitação de assinatura
verification_code_sms: SMS com código de verificação
completed_notification_email: E-mail de notificação de submissão concluída
@@ -3221,7 +4064,7 @@ pt: &pt
verify_pdf: Verificar PDF
sign_out: Sair
page_number: 'Página %{number}'
- powered_by: Oferecido por
+ powered_by: Desenvolvido por
count_documents_signed_with_html: '%{count} documentos assinados com'
storage: Armazenamento
notifications: Notificações
@@ -3281,7 +4124,6 @@ pt: &pt
send_signature_request_emails_without_limits_with_docuseal_pro: Enviar e-mails de solicitação de assinatura sem limites com o DocuSeal Pro
count_emails_used: '%{count} e-mails usados'
has_been_connected: foi conectado
- but_not_activated: mas não ativado
sms_not_configured: SMS não configurado
configure_sms_settings_in_order_to_send_text_messages_: 'Configure as configurações de SMS para enviar mensagens de texto:'
go_to_sms_settings: Ir para configurações de SMS
@@ -3297,7 +4139,7 @@ pt: &pt
all: Todos
pending: Pendente
completed: Concluído
- primarily_opened_with_microsoft_excel_other_options_include_google_sheets_libreoffice_calc_and_openoffice_calc: Principalmente aberto com Microsoft Excel. Outras opções incluem Google Sheets, LibreOffice Calc e OpenOffice Calc.
+ primarily_opened_with_microsoft_excel_other_options_include_google_sheets_libreoffice_calc_and_openoffice_calc: "Principalmente aberto com Microsoft Excel; alternativas: Google Sheets, LibreOffice Calc e OpenOffice Calc."
can_be_opened_with_microsoft_excel_google_sheets_or_any_text_editor_like_notepad: Pode ser aberto com Microsoft Excel, Google Sheets ou qualquer editor de texto como o Notepad.
draw_signature: Desenhar assinatura
clear: Limpar
@@ -3341,9 +4183,13 @@ pt: &pt
share_template_with_test_mode: Compartilhar modelo com o modo de teste
share_template_with_all_tenants: Compartilhar modelo com todos os locatários
use_following_placeholders_text_: 'Use os seguintes textos de substituição:'
- upgrade_plan_to_add_more_users: Faça upgrade do plano para adicionar mais usuários
+ users_count_total_users_count_pro_users_limit_was_reached_to_invite_additional_users_please_purchase_more_pro_user_seats_via_the_manage_plan_button: 'O limite de %{users_count}/%{total_users_count} usuários Pro foi atingido. Para convidar mais usuários, adquira mais licenças Pro através do botão "Gerenciar plano".'
move_into_folder: Mover para pasta
new_folder_name: Novo nome da pasta
+ new_subfolder_name: Novo nome da subpasta
+ change_parent_folder: Alterar pasta pai
+ folder: Pasta
+ create_a_new_folder: Criar uma nova pasta
exit_preview: Sair da pré-visualização
general: Geral
recipients: Destinatários
@@ -3365,7 +4211,9 @@ pt: &pt
upload_initials: Enviar iniciais
draw: Desenhar
upload_signature: Enviar assinatura
+ integration: Integração
admin: Administrador
+ tenant_admin: Tenant Administrador
editor: Editor
viewer: Visualizador
member: Membro
@@ -3374,7 +4222,6 @@ pt: &pt
edit_user: Editar usuário
new_user: Novo usuário
unarchive: Desarquivar
- role: Função
last_session: Última sessão
unlock_more_user_roles_with_docuseal_pro: Desbloqueie mais funções de usuário com DocuSeal Pro.
view_active: Ver ativos
@@ -3382,8 +4229,6 @@ pt: &pt
team_accounts: Contas de equipe
tenant_account: Conta de locatário
tenant_accounts: Contas de locatário
- upgrade_plan: Fazer upgrade do plano
- add_user: Adicionar usuário
impersonate: Usurpar
loading: Carregando
documents: Documentos
@@ -3443,8 +4288,6 @@ pt: &pt
new_webhook: Novo Webhook
delete_webhook: Excluir webhook
count_submissions_have_been_created: '%{count} submissões foram criadas.'
- gmail_has_been_connected: O Gmail foi conectado
- microsoft_account_has_been_connected: A conta da Microsoft foi conectada
sms_length_cant_be_longer_than_120_bytes: O comprimento do SMS não pode ultrapassar 120 bytes
connected_successfully: Conectado com sucesso.
user_nameid_not_found: 'Usuário %{nameid} não encontrado.'
@@ -3469,17 +4312,19 @@ pt: &pt
four_days: 4 dias
eight_days: 8 dias
fifteen_days: 15 dias
+ twenty_one_days: 21 dias
+ thirty_days: 30 dias
free: Gratuito
- unlimited_documents_storage: Armazenamento ilimitado de documentos
+ unlimited_documents_storage: Armazenamento ilimitado
users_management: Gerenciamento de usuários
ten_filed_types: 10 tipos de campo
multiple_signers: Múltiplos signatários
automatic_esignature: Assinatura eletrônica automática
- ten_signature_request_emails_per_month: 10 e-mails de solicitação de assinatura por mês
+ ten_signature_request_emails_per_month: 10 e-mails/mês
unlimited_sign_yourself: Assinatura ilimitada por você mesmo
- free_developer_testing_sandbox: Sandbox de teste gratuito para desenvolvedores
+ free_developer_testing_sandbox: Sandbox gratuito para testes
continue_with_free_basic: Continuar com Free Basic
- unlimited_signature_request_emails: E-mails de solicitação de assinatura ilimitados
+ unlimited_signature_request_emails: E-mails ilimitados de solicitação
your_company_logo: Seu logotipo da empresa
connect_own_email_address: Conectar endereço de e-mail próprio
personalize_email_content: Personalizar conteúdo do e-mail
@@ -3496,6 +4341,7 @@ pt: &pt
not_invited_yet: Ainda não convidado
not_completed_yet: Ainda não concluído
declined_on_time: 'Recusado em %{time}'
+ expire_on_time: 'Expira em %{time}'
sign_in_person: Assinar pessoalmente
create_a_new_template_document_form_or_submit_the_existing_one_html: 'Criar um novo modelo de documento ou submeter o existente'
send_email_copy_with_completed_documents_to_a_specified_bcc_address: Envie uma cópia do e-mail com documentos concluídos para um endereço BCC especificado.
@@ -3609,6 +4455,108 @@ pt: &pt
submission_created_via_source_html: 'Envio criado via %{source}'
pro_user_seats_used: Lugares de usuário Pro em uso
manage_plan: Gerenciar plano
+ this_submission_has_multiple_signers_which_prevents_the_use_of_a_sharing_link_html: 'Este envio tem vários signatários, o que impede o uso de um link de compartilhamento, pois não está claro qual signatário é responsável por quais campos. Para resolver isso, siga este guia para definir os detalhes padrão do signatário.'
+ welcome_to_docuseal: Bem-vindo ao DocuSeal
+ start_a_quick_tour_to_learn_how_to_create_an_send_your_first_document: Comece um tour rápido para aprender a criar e enviar seu primeiro documento.
+ start_tour: Iniciar tour
+ name_a_z: Nome A-Z
+ recently_used: Recentemente usado
+ newest_first: Mais recente primeiro
+ none: Nenhum
+ default_expiration: Expiração padrão
+ specified_date: Data especificada
+ one_day: 1 dia
+ two_days: 2 dias
+ three_days: 3 dias
+ four_days: 4 dias
+ five_days: 5 dias
+ six_days: 6 dias
+ seven_days: 7 dias
+ eight_days: 8 dias
+ nine_days: 9 dias
+ ten_days: 10 dias
+ two_weeks: 2 semanas
+ three_weeks: 3 semanas
+ four_weeks: 4 semanas
+ one_month: 1 mês
+ two_months: 2 meses
+ three_months: 3 meses
+ eu_data_residency: Dados na UE
+ please_enter_your_email_address_associated_with_the_completed_submission: Por favor, insira seu e-mail associado ao envio concluído.
+ esignature_disclosure: Uso de assinatura eletrônica
+ share_link: Link de compartilhamento
+ enable_shared_link: Ativar link compartilhado
+ share_link_is_currently_disabled: O link compartilhado está desativado no momento
+ select_data_residency: Selecionar local dos dados
+ account_name_has_invited_you_to_fill_and_sign_documents_online_effortlessly_with_a_secure_fast_and_user_friendly_digital_document_signing_solution: '%{account_name} convidou você para preencher e assinar documentos online com facilidade usando uma solução de assinatura digital segura, rápida e fácil de usar.'
+ review_or_download_completed_documents_fill_and_sign_documents_online_effortlessly_with_a_secure_fast_and_user_friendly_digital_document_signing_solution: Reveja ou baixe os documentos concluídos. Preencha e assine documentos online com facilidade usando uma solução de assinatura digital segura, rápida e fácil de usar.
+ link_form_fields: Vincular campos do formulário
+ at_least_one_field_must_be_displayed_in_the_form: Pelo menos um campo deve ser exibido no formulário.
+ this_template_has_multiple_parties_which_prevents_the_use_of_a_sharing_link: Este modelo tem várias partes, o que impede o uso de um link de compartilhamento, pois não está claro qual parte é responsável por campos específicos. Para resolver isso, defina os detalhes padrão da parte.
+ events_log: Registro de eventos
+ succeeded: Sucesso
+ failed: Falhou
+ there_are_no_events: Nenhum evento
+ resend: Reenviar
+ next_attempt_in_time_in_words: Próxima tentativa em %{time_in_words}
+ request_email_otp_verification_with_shared_link: Solicitar verificação de OTP por e-mail com link compartilhado
+ sms_rate_limit_exceeded: Limite de SMS excedido
+ invalid_phone_number: Número de telefone inválido
+ please_contact_the_requester_to_specify_your_phone_number_for_two_factor_authentication: Entre em contato com o solicitante para especificar seu número para autenticação de dois fatores.
+ we_sent_a_one_time_verification_code_to_your_email_address_please_enter_the_code_below_to_continue: Enviamos um código de verificação único para seu e-mail. Insira-o abaixo para continuar.
+ re_send_code: Reenviar código
+ email_verification: Verificação de e-mail
+ your_verification_code_to_access_the_name: 'Seu código de verificação para acessar "%{name}":'
+ please_reply_to_this_email_if_you_didnt_request_this: Responda a este e-mail se você não solicitou isso.
+ advanced_settings: Configurações avançadas
+ text: Texto
+ code: Código
+ custom_html_emails: E-mails HTML personalizados
+ connect_your_email_to_send_html_emails: Conecte seu e-mail para enviar e-mails HTML
+ connect_your_email_or_outlook_account_or_add_smtp_settings_to_send_custom_html_emails: Conecte sua conta Gmail ou Outlook ou adicione configurações SMTP para enviar e-mails HTML personalizados.
+ connect_gmail_or_outlook: Conectar Gmail ou Outlook
+ connect_your_email_to_bulk_send: Conecte seu e-mail para envio em massa
+ connect_your_email_or_outlook_account_or_add_smtp_settings_to_bulk_send: Conecte sua conta Gmail ou Outlook ou adicione configurações SMTP para envio em massa.
+ are_you_sure_you_want_to_add_recipients_without_sending_to_send_emails_it_requires_to_connect_gmail_or_outlook: Tem certeza de que deseja adicionar destinatários sem enviar? Para enviar e-mails é necessário conectar Gmail ou Outlook.
+ template_name_has_been_completed_by_submitters_html: '"{template.name}" foi concluído por {submission.submitters}'
+ please_check_the_copy_of_your_template_name_in_the_email_attachments_html: 'Por favor, verifique a cópia do seu "{template.name}" nos anexos do e-mail.'
+ you_have_been_invited_to_sign_the_template_name_html: 'Você foi convidado a assinar o "{template.name}".'
+ reveal_api_key: Revelar chave API
+ enter_your_password_to_reveal_the_api_key: Insira sua senha para revelar a chave API
+ wrong_password: Senha incorreta.
+ current_password: Senha atual
+ dont_remember_your_current_password_click_here_to_reset_it_html: 'Não se lembra da sua senha atual? para redefini-la.'
+ an_email_with_password_reset_instructions_has_been_sent: Um e-mail com instruções para redefinir sua senha será enviado em alguns minutos.
+ api_key_access_code: Código de acesso da chave API
+ use_otp_code_to_access_the_api_key_html: Use o código %{code} para acessar a chave API.
+ please_reply_to_this_email_if_you_dont_recognize_this_request: Responda a este e-mail se você não reconhecer esta solicitação.
+ your_user_account_has_been_archived_contact_your_administrator_to_restore_access_to_your_account: Sua conta de usuário foi arquivada. Entre em contato com o administrador para restaurar o acesso à sua conta.
+ your_email_could_not_be_reached_this_may_happen_if_there_was_a_typo_in_your_address_or_if_your_mailbox_is_not_available_please_contact_support_email_to_log_in: Seu e-mail não pôde ser acessado. Isso pode acontecer se houve um erro de digitação no endereço ou se sua caixa de correio não estiver disponível. Entre em contato com support@docuseal.com para fazer login.
+ efficient_search_with_search_index: Pesquisa eficiente com índice de busca
+ reindex: Reindexar
+ build_search_index: Construir índice de busca
+ require_two_factor_authentication_2fa_with_an_authenticator_app_e_g_google_authenticator_authy_all_users_signing_documents_must_pass_the_second_factor_verification_using_a_secure_code_in_addition_to_their_password: "Exigir autenticação de dois fatores (2FA) com um aplicativo autenticador (ex.: Google Authenticator, Authy). Todos os usuários que assinam documentos devem passar pela verificação do segundo fator usando um código seguro além da senha."
+ add_a_unique_signature_id_and_timestamp_to_each_signature_for_audit_and_traceability_purposes_along_with_the_timestamp_part_of_docuseals_21_cfr_part_11_compliance_settings: Adicionar um ID de assinatura exclusivo e um carimbo de data/hora a cada assinatura para fins de auditoria e rastreabilidade junto com o carimbo de data/hora. Parte das configurações de conformidade 21 CFR Parte 11 do DocuSeal.
+ require_signer_to_provide_a_reason_for_signing_before_completing_their_signature_e_g_approvals_certifications_part_of_docuseals_21_cfr_part_11_compliance_settings: "Exigir que os signatários forneçam uma razão antes de completar a assinatura (ex.: aprovações, certificações). Parte das configurações de conformidade 21 CFR Parte 11 do DocuSeal."
+ allow_signers_to_create_signatures_by_typing_their_name_instead_of_drawing_or_uploading_one: Permitir que os signatários criem assinaturas digitando seu nome em vez de desenhá-las ou carregá-las.
+ allow_signers_to_resubmit_forms_after_completion_useful_when_corrections_or_multiple_submissions_are_needed: Permitir que os signatários reenviem formulários após o término, útil quando são necessárias correções ou múltiplos envios.
+ allow_recipients_to_decline_signing_a_document_the_decline_reason_notification_will_be_sent_to_the_signature_requester: Permitir que os destinatários recusem assinar um documento. A notificação do motivo da recusa será enviada ao solicitante da assinatura.
+ save_a_users_signature_and_automatically_pre_fill_it_in_future_signing_sessions: Salvar a assinatura de um usuário e preenchê-la automaticamente em futuras sessões de assinatura.
+ make_document_download_links_expire_after_40_minutes_to_prevent_long_term_access_and_enhance_security: Fazer os links de download de documentos expirarem após 40 minutos para evitar o acesso prolongado e aumentar a segurança.
+ require_authentication_with_user_login_or_api_key_to_access_the_document_download_links: Exigir autenticação com login do usuário ou chave API para acessar os links de download de documentos.
+ combine_signed_documents_and_the_audit_log_into_a_single_pdf_file_for_easier_recordkeeping_and_compliance: Combinar documentos assinados e o registro de auditoria em um único arquivo PDF para facilitar o arquivamento e a conformidade.
+ require_a_jwt_authorization_to_preview_embedded_forms_ensuring_only_authorized_users_can_view_them: Exigir autorização JWT para visualizar formulários incorporados, garantindo que apenas usuários autorizados possam vê-los.
+ make_all_newly_created_templates_private_to_their_creator_by_default: Tornar todos os modelos recém-criados privados para seu criador por padrão.
+ make_the_recipients_signing_order_always_enforced_so_that_the_second_signer_can_start_signing_their_part_only_after_the_first_signer_has_completed_signing: Tornar a ordem de assinatura dos destinatários sempre obrigatória, para que o segundo signatário só possa assinar após o primeiro concluir.
+ the_file_is_missing_make_sure_you_have_access_to_it_on_google_drive: O arquivo está faltando. Certifique-se de ter acesso a ele no Google Drive.
+ connect_google_drive: Conectar Google Drive
+ google_drive_has_been_connected: O Google Drive foi conectado
+ unable_to_identify_reset_your_password_to_sign_in: Não foi possível identificar. Redefina sua senha para fazer login.
+ desktop: Computador
+ mobile: Celular
+ tablet: Tablet
+ reset_default: Redefinir para padrão
+ send_signature_request_email: Enviar e-mail de solicitação de assinatura
submission_sources:
api: API
bulk: Envio em massa
@@ -3616,14 +4564,17 @@ pt: &pt
invite: Convite
link: Link
submission_event_names:
- send_email_to_html: 'E-mail enviado para %{submitter_name}'
- send_reminder_email_to_html: 'E-mail de lembrete enviado para %{submitter_name}'
+ send_email_to_html: 'Email enviado para %{submitter_name}'
+ bounce_email_html: 'Email não entregue %{submitter_name}'
+ complaint_email_html: 'Reclamação de spam %{submitter_name}'
+ send_reminder_email_to_html: 'Email de lembrete enviado para %{submitter_name}'
send_sms_to_html: 'SMS enviado para %{submitter_name}'
send_2fa_sms_to_html: 'SMS de verificação enviado para %{submitter_name}'
open_email_by_html: 'E-mail aberto por %{submitter_name}'
click_email_by_html: 'Link do e-mail clicado por %{submitter_name}'
click_sms_by_html: 'Link do SMS clicado por %{submitter_name}'
phone_verified_by_html: 'Telefone verificado por %{submitter_name}'
+ email_verified_by_html: 'Email verificado por %{submitter_name}'
start_form_by_html: 'Submissão iniciada por %{submitter_name}'
view_form_by_html: 'Formulário visualizado por %{submitter_name}'
invite_party_by_html: 'Convidado %{invited_submitter_name} por %{submitter_name}'
@@ -3647,65 +4598,153 @@ pt: &pt
or: Ou
download: baixe
a_sample_spreadsheet_to_fill_and_import: uma planilha de exemplo para preencher e importar.
+ app_tour:
+ start: Iniciar
+ previous: Anterior
+ next: Próximo
+ template_and_submissions: 'Modelos e Submissões'
+ template_and_submissions_description: "Você pode selecionar a visualização que melhor se adapta ao seu fluxo de trabalho. Escolha a visualização 'Modelos' para criar modelos reutilizáveis de documentos ou 'Submissões' para assinar documentos individuais ou verificar o status de cada solicitação de assinatura."
+ upload_a_pdf_file: 'Enviar um arquivo PDF'
+ upload_a_pdf_file_description: 'Envie um documento PDF para criar um modelo de formulário de assinatura.'
+ select_a_signer_party: 'Selecionar parte assinante'
+ select_a_signer_party_description: 'Este menu suspenso permite selecionar um papel de assinante ou adicionar uma nova parte ao documento, se forem necessárias 2 ou mais assinaturas.'
+ available_parties: 'Partes disponíveis'
+ available_parties_description: 'Esta lista contém todas as partes disponíveis com seus respectivos papéis. Após selecionar, você poderá adicionar e configurar os campos para essa parte.'
+ available_field_types: 'Tipos de campo disponíveis'
+ available_field_types_description: 'Esta seção contém todos os tipos de campos que podem ser adicionados ao documento para entrada de dados ou coleta de assinaturas.'
+ text_input_field: 'Campo de texto'
+ text_input_field_description: 'Este campo permite que os usuários insiram informações baseadas em texto, como nomes ou e-mails.'
+ signature_field: 'Campo de assinatura'
+ signature_field_description: 'Este campo é usado para coletar assinaturas dos signatários.'
+ added_fields: 'Campos adicionados'
+ added_fields_description: 'Esta lista exibe todos os campos adicionados ao documento. Você pode reordená-los, editá-los ou removê-los.'
+ open_field_settings: 'Abrir configurações do campo'
+ open_field_settings_description: 'À direita do nome do campo há um ícone de configurações que abre as configurações do campo.'
+ field_settings: 'Configurações do campo'
+ field_settings_description: 'Cada campo pode ser personalizado de acordo com suas necessidades, como ajustar o tamanho da fonte, torná-lo obrigatório ou adicionar uma descrição.'
+ send_document: 'Enviar documento para assinatura'
+ send_document_description: 'Antes de enviar o documento para assinatura, você pode configurar os destinatários, adicionar e-mails ou números de telefone e personalizar o conteúdo do e-mail.'
+ sign_yourself: 'Assinar o documento você mesmo'
+ sign_yourself_description: 'Este botão permite que você adicione sua própria assinatura aos documentos que exigem sua assinatura.'
+ copy_and_share_link: 'Copiar e compartilhar link'
+ copy_and_share_link_description: 'Copie este link para compartilhar o documento. Qualquer pessoa com o link pode assiná-lo após inserir seu e-mail.'
+ sign_the_document: 'Assinar o documento'
+ sign_the_document_description: 'Se você for um dos signatários, este botão permite que você assine o documento.'
+ send_for_signing: 'Enviar para assinatura'
+ add_recipients: 'Adicionar destinatários'
+ add_recipients_description: 'Adicione novos destinatários inserindo seus endereços de e-mail ou números de telefone para assinar o documento.'
+ settings: 'Configurações'
+ settings_account_description: 'Com configurações completas de conta, você pode personalizar a experiência de assinatura eletrônica e convidar mais usuários.'
+ support: 'Suporte'
+ support_description: 'Você pode usar nosso assistente de IA ou nos escrever para support@docuseal.com se tiver dúvidas.'
+ settings_template_description: 'Use este botão para acessar a página de configurações da sua conta.'
doorkeeper:
scopes:
write: Atualizar seus dados
read: Ler seus dados
+ pagination:
+ submissions:
+ range_with_total: "%{from}-%{to} de %{count} submissões"
+ range_without_total: "%{from}-%{to} submissões"
+ templates:
+ range_with_total: "%{from}-%{to} de %{count} modelos"
+ range_without_total: "%{from}-%{to} modelos"
+ template_folders:
+ range_with_total: "%{from}-%{to} de %{count} pastas"
+ range_without_total: "%{from}-%{to} pastas"
+ users:
+ range_with_total: "%{from}-%{to} de %{count} usuários"
+ range_without_total: "%{from}-%{to} usuários"
+ items:
+ range_with_total: "%{from}-%{to} de %{count} itens"
+ range_without_total: "%{from}-%{to} itens"
+ events:
+ range_with_total: "%{from}-%{to} de %{count} eventos"
+ range_without_total: "%{from}-%{to} eventos"
de: &de
- edit_per_party: Bearbeiten pro Partei
+ add_from_google_drive: Aus Google Drive hinzufügen
+ or_add_from: Oder hinzufügen aus
+ upload_a_new_document: Neues Dokument hochladen
+ hi_there: Hallo
+ pro: Pro
+ thanks: Danke
+ private: Privat
+ select: Auswählen
+ enabled: Aktiviert
+ disabled: Deaktiviert
+ party: Partei
+ use_direct_file_attachment_links_in_the_documents: Direkte Dateianhang-Links in den Dokumenten verwenden
+ click_here_to_send_a_reset_password_email_html: ', um eine E-Mail zum Zurücksetzen des Passworts zu senden.'
+ edit_order: Bestellung bearbeiten
+ expirable_file_download_links: Ablaufbare Datei-Download-Links
+ invite_form_fields: Einladungsformular-Felder
+ default_parties: Standardparteien
+ authenticate_embedded_form_preview_with_token: Eingebettete Formularvorschau mit Token authentifizieren
+ stripe_integration: Stripe-Integration
+ require_all_recipients: Alle Empfänger verpflichten
+ stripe_account_has_been_connected: Stripe-Konto wurde verbunden.
+ re_connect_stripe: Stripe erneut verbinden
+ bcc_recipients: BCC-Empfänger
+ resend_pending: Ausstehende erneut versenden
+ always_enforce_signing_order: Reihenfolge der Unterschriften immer erzwingen
+ create_templates_with_private_access_by_default: Vorlagen standardmäßig mit privatem Zugriff erstellen
+ ensure_unique_recipients: Eindeutige Empfänger sicherstellen
+ edit_per_party: Pro Partei bearbeiten
+ reply_to: Antwortadresse
+ pending_by_me: Von mir ausstehend
+ partially_completed: Teilweise fertig
+ require_phone_2fa_to_open: Telefon-2FA zum Öffnen erforderlich
+ the_sender_has_requested_a_two_factor_authentication_via_one_time_password_sent_to_your_html: Der Absender hat eine Zwei-Faktor-Authentifizierung per Einmalpasswort angefordert, das an Ihre Telefonnummer %{phone} gesendet wurde.
+ send_verification_code: Verifizierungscode senden
+ code_has_been_resent: Code wurde erneut gesendet
+ invalid_code: Ungültiger Code
signed: Unterschrieben
- reply_to: Antworten auf
- partially_completed: Teilweise abgeschlossen
- pending_by_me: Ausstehend von mir
+ first_party: 'Erste Partei'
+ remove_filter: Filter entfernen
add: Hinzufügen
- adding: Hinzufügen
+ adding: Wird hinzugefügt
owner: Eigentümer
select_user: Benutzer auswählen
team_member_permissions: Berechtigungen für Teammitglieder
entire_team: Gesamtes Team
- admin_only: Nur Administratoren
+ admin_only: Nur Admins
accessiable_by: Zugänglich für
team_access: Teamzugang
- remove_filter: Filter entfernen
document_download_filename_format: Format des Dateinamens beim Herunterladen von Dokumenten
- document_name: Dokumentname
- unarchive: Wiederherstellen
- awaiting_completion_by_the_other_party: "Warten auf die Fertigstellung durch die andere Partei"
- enforce_recipients_order: 'Empfängerreihenfolge durchsetzen'
- first_party: 'Erste Partei'
docuseal_trusted_signature: DocuSeal-Vertrauenssignatur
hello_name: Hallo %{name}
- you_are_invited_to_product_name: Sie sind eingeladen zu %{product_name}
+ you_are_invited_to_product_name: Sie sind zu %{product_name} eingeladen
you_have_been_invited_to_account_name_product_name_please_sign_up_using_the_link_below_: 'Sie wurden zu %{account_name} %{product_name} eingeladen. Bitte registrieren Sie sich über den folgenden Link:'
sent_using_product_name_in_testing_mode_html: 'Gesendet über %{product_name} im Testmodus'
sent_using_product_name_free_document_signing_html: 'Gesendet mit der kostenlosen Dokumentensignierung von %{product_name}.'
- sign_documents_with_trusted_certificate_provided_by_docu_seal_your_documents_and_data_are_never_shared_with_docu_seal_p_d_f_checksum_is_provided_to_generate_a_trusted_signature: Unterzeichnen Sie Dokumente mit einem vertrauenswürdigen Zertifikat von DocuSeal. Ihre Dokumente und Daten werden niemals mit DocuSeal geteilt. Eine PDF-Prüfziffer wird bereitgestellt, um eine vertrauenswürdige Signatur zu generieren.
- hi_there: Hallo
- thanks: Danke
- you_have_been_invited_to_submit_the_name_form: 'Du wurdest eingeladen, das Formular "%{name}" einzureichen.'
- you_have_been_invited_to_sign_the_name: 'Du wurdest eingeladen, "%{name}" zu unterschreiben.'
- alternatively_you_can_review_and_download_your_copy_using_the_link_below: 'Du kannst alternativ deine Kopie mit dem untenstehenden Link überprüfen und herunterladen:'
- please_check_the_copy_of_your_name_in_the_email_attachments: 'Bitte überprüfe die Kopie von "%{name}" im E-Mail-Anhang.'
- review_and_sign: Überprüfen und unterschreiben
- review_and_submit: Überprüfen und einreichen
- please_contact_us_by_replying_to_this_email_if_you_didn_t_request_this: 'Bitte kontaktiere uns, indem du auf diese E-Mail antwortest, falls du Fragen hast.'
- submitter_invitation_sms_body_sign: '{account.name} hat dich eingeladen, ein Dokument zu unterschreiben: {submitter.link}'
+ sent_with_docuseal_pro_html: Gesendet mit DocuSeal Pro
+ show_send_with_docuseal_pro_attribution_in_emails_html: '"Gesendet mit DocuSeal Pro" in E-Mails anzeigen'
+ sign_documents_with_trusted_certificate_provided_by_docu_seal_your_documents_and_data_are_never_shared_with_docu_seal_p_d_f_checksum_is_provided_to_generate_a_trusted_signature: Unterzeichnen Sie Dokumente mit einem vertrauenswürdigen Zertifikat von DocuSeal. Ihre Dokumente und Daten werden niemals mit DocuSeal geteilt. Eine PDF-Prüfsumme wird bereitgestellt, um eine vertrauenswürdige Signatur zu generieren.
+ you_have_been_invited_to_submit_the_name_form: 'Sie wurden eingeladen, das Formular "%{name}" einzureichen.'
+ you_have_been_invited_to_sign_the_name: 'Sie wurden eingeladen, "%{name}" zu unterschreiben.'
+ alternatively_you_can_review_and_download_your_copy_using_the_link_below: 'Alternativ können Sie Ihre Kopie über den untenstehenden Link ansehen und herunterladen:'
+ please_check_the_copy_of_your_name_in_the_email_attachments: 'Bitte prüfen Sie die Kopie von "%{name}" im E-Mail-Anhang.'
+ awaiting_completion_by_the_other_party: "Warten auf die Fertigstellung durch die andere Partei"
+ review_and_sign: Prüfen und unterschreiben
+ review_and_submit: Prüfen und einreichen
+ please_contact_us_by_replying_to_this_email_if_you_have_any_questions: 'Bitte kontaktieren Sie uns, indem Sie auf diese E-Mail antworten, falls Sie Fragen haben.'
+ submitter_invitation_sms_body_sign: '{account.name} hat Sie eingeladen, ein Dokument zu unterschreiben: {submitter.link}'
verification_code_sms_body: 'Verifizierungscode: {code}'
- you_are_invited_to_submit_a_form: Du wurdest eingeladen, ein Formular einzureichen
- you_are_invited_to_sign_a_document: Du wurdest eingeladen, ein Dokument zu unterschreiben
- you_are_invited_to_sign_documents: Du wurdest eingeladen, Dokumente zu unterschreiben
- your_document_copy: Deine Kopie des Dokuments
+ you_are_invited_to_submit_a_form: Sie sind eingeladen, ein Formular einzureichen
+ you_are_invited_to_sign_a_document: Sie sind eingeladen, ein Dokument zu unterschreiben
+ you_are_invited_to_sign_documents: Sie sind eingeladen, Dokumente zu unterschreiben
+ your_document_copy: Ihre Dokumentkopie
name_has_been_completed_by_submitters: '"%{name}" wurde von %{submitters} abgeschlossen.'
template_name_has_been_completed_by_submitters: '{template.name} wurde von {submission.submitters} abgeschlossen'
submitter_invitation_email_sign_body: |
Hallo,
- Du wurdest eingeladen, das Dokument "{template.name}" zu unterschreiben.
+ Sie wurden eingeladen, "{template.name}" zu unterschreiben.
- [Überprüfen und unterschreiben]({submitter.link})
+ [Prüfen und unterschreiben]({submitter.link})
- Bitte kontaktiere uns, falls du Fragen hast.
+ Bitte kontaktieren Sie uns, indem Sie auf diese E-Mail antworten, falls Sie Fragen haben.
Danke,
{account.name}
@@ -3718,42 +4757,48 @@ de: &de
submitter_documents_copy_email_body: |
Hallo,
- Bitte überprüfe die Kopie deines "{template.name}" im E-Mail-Anhang.
- Alternativ kannst du deine Kopie mit dem untenstehenden Link überprüfen und herunterladen:
+ Bitte prüfen Sie die Kopie von "{template.name}" im E-Mail-Anhang.
+ Alternativ können Sie Ihre Kopie über den untenstehenden Link ansehen und herunterladen:
[{template.name}]({documents.link})
Danke,
{account.name}
- view: Ansicht
+ view: Anzeigen
email: E-Mail
- form_expired_at_html: 'Das Formular ist am %{time} abgelaufen'
+ form_expired_at_html: 'Formular abgelaufen am %{time}'
verification_code_code: 'Verifizierungscode: %{code}'
digitally_signed_by: Digital signiert von
role: Rolle
reason: Grund
- provide_your_email_to_start: Gib deine E-Mail-Adresse ein, um zu starten
+ provide_your_email_to_start: Geben Sie Ihre E-Mail-Adresse ein, um zu starten
+ provide_your_email: Geben Sie Ihre E-Mail-Adresse ein
+ provide_your_name_to_start: Geben Sie Ihren Namen ein, um zu starten
+ provide_your_name: Geben Sie Ihren Namen ein
+ provide_your_phone_in_international_format_to_start: Geben Sie Ihre Telefonnummer im internationalen Format ein, um zu starten
+ provide_your_phone_in_international_format: Geben Sie Ihre Telefonnummer im internationalen Format ein
start: Starten
- starting: Starten
- form_has_been_deleted_by_html: 'Das Formular wurde von %{name} gelöscht.'
+ enforce_recipients_order: Empfängerreihenfolge durchsetzen
+ starting: Wird gestartet
invited_by_html: 'Eingeladen von %{name}'
- you_have_been_invited_to_submit_a_form: Du wurdest eingeladen, ein Formular einzureichen
- signed_on_time: 'Unterzeichnet um %{time}'
+ you_have_been_invited_to_submit_a_form: Sie wurden eingeladen, ein Formular einzureichen
+ signed_on_time: 'Unterzeichnet am %{time}'
completed_on_time: 'Abgeschlossen am %{time}'
- document_has_been_signed_already: 'Das Dokument wurde bereits unterschrieben'
- form_has_been_submitted_already: Formular wurde bereits eingereicht
+ document_has_been_signed_already: Das Dokument wurde bereits unterschrieben
+ form_has_been_submitted_already: Das Formular wurde bereits eingereicht
send_copy_to_email: Kopie per E-Mail senden
- sending: Senden
+ sending: Wird gesendet
resubmit: Erneut einreichen
+ form_has_been_deleted_by_html: 'Das Formular wurde von %{name} gelöscht.'
or: oder
download_documents: Dokumente herunterladen
- downloading: Lädt herunter
- download: Laden
+ downloading: Wird heruntergeladen
+ download: Download
decline: Ablehnen
declined: Abgelehnt
decline_reason: Ablehnungsgrund
provide_a_reason: Geben Sie einen Grund an
- notify_the_sender_with_the_reason_you_declined: Benachrichtigen Sie den Absender über den Grund Ihrer Ablehnung
+ notify_the_sender_with_the_reason_you_declined: Den Absender über den Grund Ihrer Ablehnung benachrichtigen
form_has_been_declined_on_html: "Das Formular wurde am %{time} abgelehnt"
name_declined_by_submitter: '"%{name}" wurde von %{submitter} abgelehnt'
name_declined_by_submitter_with_the_following_reason: '"%{name}" wurde von %{submitter} mit folgendem Grund abgelehnt:'
@@ -3765,7 +4810,7 @@ de: &de
sign_in_with_google: Mit Google anmelden
forgot_your_password_: Passwort vergessen?
create_free_account: Kostenloses Konto erstellen
- already_have_an_account: Hast du schon ein Konto?
+ already_have_an_account: Haben Sie bereits ein Konto?
first_name: Vorname
last_name: Nachname
sign_up: Registrieren
@@ -3773,7 +4818,7 @@ de: &de
profile_details: Profildetails
sign_up_with_google: Mit Google registrieren
sign_up_with_microsoft: Mit Microsoft registrieren
- by_creating_an_account_you_agree_to_our_html: 'Durch die Erstellung eines Kontos stimmst du unseren Datenschutzrichtlinien und Nutzungsbedingungen zu.'
+ by_creating_an_account_you_agree_to_our_html: 'Durch die Erstellung eines Kontos stimmen Sie unseren Datenschutzrichtlinien und Nutzungsbedingungen zu.'
enter_email_to_continue: E-Mail eingeben, um fortzufahren
account: Konto
preferences: Einstellungen
@@ -3782,40 +4827,40 @@ de: &de
language: Sprache
app_url: App-URL
update: Aktualisieren
- updating: Aktualisieren
+ updating: Wird aktualisiert
force_2fa_with_authenticator_app: 2FA mit Authenticator-App erzwingen
add_signature_id_to_the_documents: Signatur-ID zu den Dokumenten hinzufügen
require_signing_reason: Grund für die Signatur erforderlich
- allow_typed_text_signatures: Unterschriften mit getipptem Text zulassen
+ allow_typed_text_signatures: Getippte Unterschriften zulassen
allow_to_resubmit_completed_forms: Erneutes Einreichen abgeschlossener Formulare zulassen
- allow_to_decline_documents: Erlauben, Dokumente abzulehnen
+ allow_to_decline_documents: Ablehnen von Dokumenten erlauben
remember_and_pre_fill_signatures: Signaturen merken und vorab ausfüllen
require_authentication_for_file_download_links: Authentifizierung für Dateidownload-Links erforderlich
combine_completed_documents_and_audit_log: Abgeschlossene Dokumente und Prüfprotokoll kombinieren
salesforce_integration: Salesforce-Integration
salesforce_has_been_connected: Salesforce wurde verbunden.
- connect_salesforce_account_to_integrate_with_docuseal: Verbinde dein Salesforce-Konto, um es mit DocuSeal zu integrieren
+ connect_salesforce_account_to_integrate_with_docuseal: Verbinden Sie Ihr Salesforce-Konto, um es mit DocuSeal zu integrieren
re_connect_salesforce: Salesforce erneut verbinden
connect_salesforce: Salesforce verbinden
danger_zone: Gefahrenzone
delete_my_account: Mein Konto löschen
- schedule_account_for_deletion_: Konto zur Löschung einplanen?
+ you_are_scheduling_your_account_for_deletion_after_deletion_your_data_will_be_permanently_removed_and_cannot_be_recovered_click_ok_if_you_would_like_to_continue: "Sie planen die Löschung Ihres Kontos. Nach der Löschung werden Ihre Daten dauerhaft entfernt und können nicht wiederhergestellt werden.\n\nKlicken Sie auf OK, wenn Sie fortfahren möchten."
account_information_has_been_updated: Die Kontoinformationen wurden aktualisiert.
should_be_a_valid_url: sollte eine gültige URL sein
- your_account_removal_request_will_be_processed_within_2_months_please_contact_us_if_you_want_to_keep_your_account: Deine Anfrage zur Kontolöschung wird innerhalb von 2 Monaten bearbeitet. Bitte kontaktiere uns, wenn du dein Konto behalten möchtest.
+ your_account_removal_request_will_be_processed_within_2_months_please_contact_us_if_you_want_to_keep_your_account: Ihre Anfrage zur Kontolöschung wird innerhalb von 2 Monaten bearbeitet. Bitte kontaktieren Sie uns, wenn Sie Ihr Konto behalten möchten.
test_mode: Testmodus
copy: Kopieren
copied: Kopiert
rotate: Drehen
- remove_existing_api_token_and_generated_a_new_one_are_you_sure_: Vorhandenen API-Token entfernen und einen neuen generieren. Bist du sicher?
- request_signature_multiple_submitters_with_default_values: Unterschrift anfordern, mehrere Einreicher mit Standardwerten
- request_signature_single_submitter: Unterschrift anfordern, ein Einreicher
+ remove_existing_api_token_and_generated_a_new_one_are_you_sure_: Vorhandenen API-Token entfernen und einen neuen generieren. Sind Sie sicher?
+ request_signature_multiple_submitters_with_default_values: Signatur anfordern, mehrere Einreicher mit Standardwerten
+ request_signature_single_submitter: Signatur anfordern, ein Einreicher
template_details: Vorlagendetails
- open_full_api_reference: Komplette API-Referenz öffnen
+ open_full_api_reference: Vollständige API-Referenz öffnen
api_token_has_been_updated: Der API-Token wurde aktualisiert.
- change_your_password: Ändere dein Passwort
+ change_your_password: Ändern Sie Ihr Passwort
new_password: Neues Passwort
- minimum_password_length_characters_minimum: '%{minimum_password_length} Zeichen mindestens'
+ minimum_password_length_characters_minimum: 'Mindestens %{minimum_password_length} Zeichen'
confirm_new_password: Neues Passwort bestätigen
change_my_password: Mein Passwort ändern
changing_password: Passwort wird geändert
@@ -3823,41 +4868,41 @@ de: &de
resetting_password: Passwort wird zurückgesetzt
sign_in_with_name_account: 'Mit %{name}-Konto anmelden'
two_factor_code_from_authenticator_app: Zwei-Faktor-Code aus der Authenticator-App
- sign_up_in_docuseal_console_to_upgrade_on_premises_app_is_completely_standalone_console_is_used_only_to_manage_your_license: Melde dich in der DocuSeal-Konsole an, um ein Upgrade durchzuführen. Die lokale App ist völlig eigenständig, die Konsole wird nur zur Verwaltung deiner Lizenz verwendet.
+ sign_up_in_docuseal_console_to_upgrade_on_premises_app_is_completely_standalone_console_is_used_only_to_manage_your_license: Melden Sie sich in der DocuSeal-Konsole an, um ein Upgrade durchzuführen. Die lokale App ist vollständig eigenständig; die Konsole wird nur zur Verwaltung Ihrer Lizenz verwendet.
send_from_email: Von E-Mail senden
optional: optional
save: Speichern
- saving: Speichern
+ saving: Wird gespeichert
changes_have_been_saved: Änderungen wurden gespeichert.
- unlock_with_docuseal_pro: Mit DocuSeal Pro entsperren
- use_your_own_certificates_to_sign_and_verify_pdf_files: Verwende deine eigenen Zertifikate, um PDF-Dateien zu signieren und zu verifizieren.
+ unlock_with_docuseal_pro: Mit DocuSeal Pro freischalten
+ use_your_own_certificates_to_sign_and_verify_pdf_files: Verwenden Sie Ihre eigenen Zertifikate, um PDF-Dateien zu signieren und zu verifizieren.
upload_certificate: Zertifikat hochladen
name: Name
file: Datei
- use_a_valid_der_p12_or_pfx_file: Verwende eine gültige .der-, .p12- oder .pfx-Datei.
+ use_a_valid_der_p12_or_pfx_file: Verwenden Sie eine gültige .der-, .p12- oder .pfx-Datei.
submit: Einreichen
- submitting: Einreichung
+ submitting: Wird eingereicht
pdf_signature: PDF-Signatur
upload_signed_pdf_file_to_validate_its_signature_: 'Signierte PDF-Datei hochladen, um ihre Signatur zu validieren:'
- analyzing: Analysieren
+ analyzing: Wird analysiert
verify_signed_pdf: Signiertes PDF verifizieren
- click_to_upload_or_drag_and_drop_html: 'Klicke, um hochzuladen oder ziehe und lasse fallen'
- click_to_upload_or_drag_and_drop_files_html: 'Klicke, um Dateien hochzuladen oder ziehe und lasse sie fallen'
+ click_to_upload_or_drag_and_drop_html: 'Klicken zum Hochladen oder per Drag & Drop ablegen'
+ click_to_upload_or_drag_and_drop_files_html: 'Klicken zum Hochladen oder Dateien per Drag & Drop ablegen'
signing_certificates: Signaturzertifikate
upload_cert: Zertifikat hochladen
valid_to: Gültig bis
status: Status
make_default: Als Standard festlegen
remove: Entfernen
- removing: Entfernen
+ removing: Wird entfernt
delete: Löschen
default: Standard
- are_you_sure_: Bist du sicher?
+ are_you_sure_: Sind Sie sicher?
timestamp_server: Zeitstempel-Server
timeserver_url: Zeitstempel-Server-URL
url_of_the_trusted_rfc_3161_timeserver_to_be_used_to_generate_timestamp_signatures: URL des vertrauenswürdigen RFC-3161-Zeitstempelservers zur Generierung von Zeitstempelsignaturen.
- apply_multiple_pdf_digital_signatures_in_the_document_per_each_signer: Mehrere PDF-Digitalsignaturen im Dokument für jeden Unterzeichner anwenden
- remove_pdf_form_fillable_fields_from_the_signed_pdf_flatten_form: PDF-Formularfelder aus dem signierten PDF entfernen (Formular abflachen)
+ apply_multiple_pdf_digital_signatures_in_the_document_per_each_signer: Mehrere PDF-Digitalsignaturen im Dokument pro Unterzeichner anwenden
+ remove_pdf_form_fillable_fields_from_the_signed_pdf_flatten_form: Ausfüllbare PDF-Formularfelder aus dem signierten PDF entfernen (Formular abflachen)
certificate_has_been_successfully_added: Das Zertifikat wurde erfolgreich hinzugefügt.
default_certificate_has_been_selected: Das Standardzertifikat wurde ausgewählt.
certificate_has_been_removed: Das Zertifikat wurde entfernt.
@@ -3866,7 +4911,7 @@ de: &de
set_password: Passwort festlegen
confirm_password: Passwort bestätigen
save_password_and_sign_in: Passwort speichern und anmelden
- use_an_authenticator_mobile_app_like_google_authenticator_or_1password_to_scan_the_qr_code_below: Verwende eine Authentifikator-App wie Google Authenticator oder 1Password, um den untenstehenden QR-Code zu scannen.
+ use_an_authenticator_mobile_app_like_google_authenticator_or_1password_to_scan_the_qr_code_below: Verwenden Sie eine Authentifikator-App wie Google Authenticator oder 1Password, um den untenstehenden QR-Code zu scannen.
remove_2fa: 2FA entfernen
setup_2fa: 2FA einrichten
2fa_has_been_configured: 2FA wurde eingerichtet.
@@ -3876,10 +4921,10 @@ de: &de
developer_newsletters: Entwickler-Newsletter
skip: Überspringen
email_notifications: E-Mail-Benachrichtigungen
- receive_notification_emails_on_completed_submission: E-Mail-Benachrichtigungen bei abgeschlossener Einreichung erhalten
- completed_documents_notification_bcc_address: BCC-Adresse für abgeschlossene Dokumentbenachrichtigungen
- sign_request_email_reminders: Erinnerungen an Unterschriftsanfragen per E-Mail
- send_automatic_email_reminders_to_your_recipients: Automatische E-Mail-Erinnerungen an deine Empfänger senden.
+ receive_notification_emails_on_completed_submission: Benachrichtigungs-E-Mails bei abgeschlossener Einreichung erhalten
+ completed_documents_notification_bcc_address: BCC-Adresse für Benachrichtigungen zu abgeschlossenen Dokumenten
+ sign_request_email_reminders: E-Mail-Erinnerungen für Signaturanfragen
+ send_automatic_email_reminders_to_your_recipients: Automatische E-Mail-Erinnerungen an Ihre Empfänger senden.
first_reminder_in: Erste Erinnerung in
second_reminder_in: Zweite Erinnerung in
third_reminder_in: Dritte Erinnerung in
@@ -3887,16 +4932,17 @@ de: &de
unable_to_save: Speichern nicht möglich.
invalid_timeserver: Ungültiger Zeitstempelserver
email_templates: E-Mail-Vorlagen
- signature_request_email: E-Mail für Unterschriftsanfrage
- signature_request_sms: SMS für Unterschriftsanfrage
+ signature_request_email: E-Mail für Signaturanfrage
+ signature_request_reminder_email: E-Mail-Erinnerung für Signaturanfrage
+ signature_request_sms: SMS für Signaturanfrage
verification_code_sms: SMS mit Verifizierungscode
- completed_notification_email: E-Mail für abgeschlossene Benachrichtigung
+ completed_notification_email: E-Mail-Benachrichtigung bei Abschluss
company_logo: Firmenlogo
submission_form: Einreichungsformular
completed_form_message: Nachricht zum abgeschlossenen Formular
completed_form_redirect_button: Weiterleitungsschaltfläche nach Formularabschluss
documents_copy_email: E-Mail mit Dokumentenkopie
- form_custom_css: Benutzerdefinierte CSS für Formular
+ form_custom_css: Benutzerdefiniertes CSS für Formular
subject: Betreff
body: Inhalt
text_message: Textnachricht
@@ -3908,7 +4954,7 @@ de: &de
attach_audit_log_pdf: Prüfprotokoll-PDF anhängen
attach_documents: Dokumente anhängen
settings_have_been_saved: Die Einstellungen wurden gespeichert.
- display_your_company_name_and_logo_when_signing_documents: Zeige den Namen und das Logo deines Unternehmens beim Signieren von Dokumenten an.
+ display_your_company_name_and_logo_when_signing_documents: Zeigen Sie den Namen und das Logo Ihres Unternehmens beim Signieren von Dokumenten an.
profile: Profil
signature: Unterschrift
update_signature: Unterschrift aktualisieren
@@ -3927,9 +4973,9 @@ de: &de
contact_information_has_been_update: Die Kontaktinformationen wurden aktualisiert.
password_has_been_changed: Das Passwort wurde geändert.
email_integration: E-Mail-Integration
- send_via_connected_email: Über verbundene E-Mail senden
+ send_via_connected_email: Über verbundenes E-Mail-Konto senden
activate_with_docuseal_pro: Mit DocuSeal Pro aktivieren
- send_signature_request_to_your_recipients_directly_from_your_email: Sende eine Unterschriftsanfrage direkt von deiner E-Mail aus
+ send_signature_request_to_your_recipients_directly_from_your_email: Senden Sie Signaturanfragen direkt aus Ihrem E-Mail-Konto
connect_gmail: Gmail verbinden
re_connect_gmail: Gmail erneut verbinden
connect_microsoft: Microsoft verbinden
@@ -3939,7 +4985,7 @@ de: &de
but_not_activated: aber nicht aktiviert
email_has_been_sent: Die E-Mail wurde gesendet.
email_has_been_sent_already: Die E-Mail wurde bereits gesendet.
- initial_setup: Erste Einrichtung
+ initial_setup: Ersteinrichtung
demo_environment: Demo-Umgebung
close: Schließen
upgrade: Upgrade
@@ -3968,8 +5014,8 @@ de: &de
discord_community: Discord-Community
integrations: Integrationen
teams: Teams
- tenants: Mieter
- send_signature_requests_via_sms: Unterschriftsanfragen per SMS senden
+ tenants: Mandanten
+ send_signature_requests_via_sms: Signaturanfragen per SMS senden
twilio_settings: Twilio-Einstellungen
webhook_settings: Webhook-Einstellungen
sending_sms: SMS wird gesendet
@@ -3982,40 +5028,39 @@ de: &de
force_sso_disable_login_with_email_and_password: SSO erzwingen (Login mit E-Mail und Passwort deaktivieren)
for_aws_s3_compatible_apis_like_minio: Für AWS S3-kompatible APIs wie Minio.
store_all_files_on_disk: Alle Dateien auf der Festplatte speichern
- no_configs_are_needed_but_make_sure_your_disk_is_persistent: Keine Konfigurationen erforderlich, aber stelle sicher, dass deine Festplatte beständig ist
+ no_configs_are_needed_but_make_sure_your_disk_is_persistent: Keine Konfigurationen erforderlich, aber stellen Sie sicher, dass Ihre Festplatte persistent ist
not_suitable_for_heroku_and_other_paas: Nicht geeignet für Heroku und andere PaaS
- bulk_send_from_excel_xlsx_or_csv: Massenversand aus Excel XLSX oder CSV
+ bulk_send_from_excel_xlsx_or_csv: Massenversand aus Excel (XLSX) oder CSV
add_new: Neu hinzufügen
add_recipients: Empfänger hinzufügen
add_new_recipients: Neue Empfänger hinzufügen
- add_recipients_html: Empfänger
+ add_recipients_html: Empfänger
type_emails_here: E-Mail-Adressen hier eingeben
- or_embed_on_your_website: Oder auf deiner Website einbetten
+ or_embed_on_your_website: Oder auf Ihrer Website einbetten
phone: Telefon
send_emails: E-Mails senden
edit_message: Nachricht bearbeiten
smtp_not_configured: SMTP nicht konfiguriert
- configure_smtp_settings_in_order_to_send_emails_: 'Konfiguriere die SMTP-Einstellungen, um E-Mails zu senden:'
- go_to_smtp_settings: Zu den SMTP-Einstellungen gehen
- save_as_default_template_message: Als Standardvorlage speichern
+ configure_smtp_settings_in_order_to_send_emails_: 'Konfigurieren Sie die SMTP-Einstellungen, um E-Mails zu senden:'
+ go_to_smtp_settings: Zu den SMTP-Einstellungen
+ save_as_default_template_message: Als Standardvorlagentext speichern
re_send_sms: SMS erneut senden
send_sms: SMS senden
preserve_order: Reihenfolge beibehalten
- when_checked_notifications_will_be_sent_to_the_second_party_once_the_form_is_completed_by_the_previous_party_uncheck_this_option_to_send_notifications_to_all_parties_simultaneously_right_away: Wenn aktiviert, werden Benachrichtigungen an die zweite Partei gesendet, sobald die vorherige Partei das Formular ausgefüllt hat. Deaktiviere diese Option, um Benachrichtigungen an alle Parteien gleichzeitig sofort zu senden.
- upgrade_to_send_unlimited_signature_requests: Upgrade durchführen, um unbegrenzte Unterschriftsanfragen zu senden
+ when_checked_notifications_will_be_sent_to_the_second_party_once_the_form_is_completed_by_the_previous_party_uncheck_this_option_to_send_notifications_to_all_parties_simultaneously_right_away: Wenn aktiviert, werden Benachrichtigungen an die zweite Partei gesendet, sobald die vorherige Partei das Formular ausgefüllt hat. Deaktivieren Sie diese Option, um Benachrichtigungen an alle Parteien gleichzeitig zu senden.
+ upgrade_to_send_unlimited_signature_requests: Upgrade durchführen, um unbegrenzte Signaturanfragen zu senden
add_without_sending: Hinzufügen ohne zu senden
upgade_now: Jetzt upgraden
- send_signature_request_emails_without_limits_with_docuseal_pro: Unterschriftsanfragen ohne Limits mit DocuSeal Pro senden
+ send_signature_request_emails_without_limits_with_docuseal_pro: Signaturanfragen per E-Mail ohne Limits mit DocuSeal Pro senden
count_emails_used: '%{count} E-Mails verwendet'
has_been_connected: wurde verbunden
- but_not_activated: aber nicht aktiviert
sms_not_configured: SMS nicht konfiguriert
- configure_sms_settings_in_order_to_send_text_messages_: 'Konfiguriere die SMS-Einstellungen, um Textnachrichten zu senden:'
- go_to_sms_settings: Zu den SMS-Einstellungen gehen
- back_to_active: Zurück zu aktiv
+ configure_sms_settings_in_order_to_send_text_messages_: 'Konfigurieren Sie die SMS-Einstellungen, um Textnachrichten zu senden:'
+ go_to_sms_settings: Zu den SMS-Einstellungen
+ back_to_active: Zurück zu Aktiv
submissions: Einreichungen
templates: Vorlagen
- document_templates_html: Dokument Vorlagen
+ document_templates_html: Dokument-Vorlagen
archived: Archiviert
search: Suchen
submissions_not_found: Einreichungen nicht gefunden
@@ -4030,26 +5075,26 @@ de: &de
clear: Löschen
signature_uploaded: Unterschrift hochgeladen
photo_uploaded: Foto hochgeladen
- submission_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: 'Das Löschen der Einreichung ist unwiderruflich und wird alle zugehörigen signierten Dokumente dauerhaft entfernen. Bist du sicher?'
- return_back_to_your_desktop_device_to_complete_the_form_or_continue_on_mobile_html: 'Gehe zurück zu deinem Desktop-Gerät, um das Formular abzuschließen, oder fahre auf dem Handy fort'
- template_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: Die Vorlagenlöschung ist unwiderruflich und wird alle zugehörigen signierten Dokumente dauerhaft entfernen. Bist du sicher?
+ submission_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: 'Das Löschen der Einreichung ist unwiderruflich und entfernt alle zugehörigen signierten Dokumente dauerhaft. Sind Sie sicher?'
+ return_back_to_your_desktop_device_to_complete_the_form_or_continue_on_mobile_html: 'Wechseln Sie zurück zu Ihrem Desktop-Gerät, um das Formular abzuschließen, oder fahren Sie auf dem Mobilgerät fort'
+ template_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: Die Löschung der Vorlage ist unwiderruflich und entfernt alle zugehörigen signierten Dokumente dauerhaft. Sind Sie sicher?
rename_folder: Ordner umbenennen
folder_name: Ordnername
rename: Umbenennen
home: Startseite
templates_not_found: Vorlagen nicht gefunden
upload_new_document: Neues Dokument hochladen
- uploading: Hochladen
+ uploading: Wird hochgeladen
expired: Abgelaufen
sign_now: Unterschreiben
archive: Archivieren
- archiving: Archivierung
+ archiving: Wird archiviert
restore: Wiederherstellen
- restoring: Wiederherstellung
+ restoring: Wird wiederhergestellt
clone: Klonen
edit: Bearbeiten
move: Verschieben
- moving: Verschieben
+ moving: Wird verschoben
preview: Vorschau
upload: Hochladen
clone_template: Vorlage klonen
@@ -4059,18 +5104,22 @@ de: &de
shared: Geteilt
export: Exportieren
there_are_no_submissions: Es gibt keine Einreichungen
- send_an_invitation_to_fill_and_complete_the_form: Eine Einladung zum Ausfüllen und Abschließen des Formulars senden
+ send_an_invitation_to_fill_and_complete_the_form: Einladung zum Ausfüllen und Abschließen des Formulars senden
send_to_recipients: An Empfänger senden
sign_it_yourself: Selbst unterschreiben
api_and_embedding: API und Einbettung
template_id: Vorlagen-ID
embedding_url: Einbettungs-URL
- share_template_with_test_mode: Vorlage mit dem Testmodus teilen
- share_template_with_all_tenants: Vorlage mit allen Mietern teilen
- use_following_placeholders_text_: 'Verwende die folgenden Platzhaltertexte:'
- upgrade_plan_to_add_more_users: Upgrade des Plans, um weitere Benutzer hinzuzufügen
+ share_template_with_test_mode: Vorlage im Testmodus teilen
+ share_template_with_all_tenants: Vorlage mit allen Mandanten teilen
+ use_following_placeholders_text_: 'Verwenden Sie die folgenden Platzhaltertexte:'
+ users_count_total_users_count_pro_users_limit_was_reached_to_invite_additional_users_please_purchase_more_pro_user_seats_via_the_manage_plan_button: '%{users_count}/%{total_users_count} Pro-Benutzerlimit erreicht. Um weitere Benutzer einzuladen, kaufen Sie bitte zusätzliche Pro-Benutzerplätze über die Schaltfläche „Plan verwalten“.'
move_into_folder: In Ordner verschieben
new_folder_name: Neuer Ordnername
+ new_subfolder_name: Neuer Unterordnername
+ change_parent_folder: Übergeordneten Ordner ändern
+ folder: Ordner
+ create_a_new_folder: Neuen Ordner erstellen
exit_preview: Vorschau beenden
general: Allgemein
recipients: Empfänger
@@ -4083,16 +5132,18 @@ de: &de
send_emails_automatically_on_completion: E-Mails nach Abschluss automatisch senden
attach_documents_to_the_email: Dokumente an die E-Mail anhängen
not_specified: Nicht angegeben
- submission_requester: Einreichungsanforderer
+ submission_requester: Anfragende Person
specified_email: Angegebene E-Mail
- invite_by_name: 'Eingeladen von %{name}'
+ invite_by_name: 'Einladung von %{name}'
same_as_name: 'Gleich wie %{name}'
default_email: Standard-E-Mail
processing: Verarbeitung
upload_initials: Initialen hochladen
draw: Zeichnen
upload_signature: Unterschrift hochladen
+ integration: Integration
admin: Administrator
+ tenant_admin: Mandantenadministrator
editor: Redakteur
viewer: Betrachter
member: Mitglied
@@ -4101,41 +5152,38 @@ de: &de
edit_user: Benutzer bearbeiten
new_user: Neuer Benutzer
unarchive: Entarchivieren
- role: Rolle
last_session: Letzte Sitzung
unlock_more_user_roles_with_docuseal_pro: Weitere Benutzerrollen mit DocuSeal Pro freischalten.
view_active: Aktive anzeigen
team_account: Teamkonto
team_accounts: Teamkonten
- tenant_account: Mieterkonto
- tenant_accounts: Mieterkonten
- upgrade_plan: Plan upgraden
- add_user: Benutzer hinzufügen
- impersonate: Nachahmen
+ tenant_account: Mandantenkonto
+ tenant_accounts: Mandantenkonten
+ impersonate: Als Benutzer auftreten
loading: Wird geladen
documents: Dokumente
accounts: Konten
edit_account: Konto bearbeiten
new_team: Neues Team
- new_tenant: Neuer Mieter
+ new_tenant: Neuer Mandant
remove_team: Team entfernen
- remove_tenant: Mieter entfernen
+ remove_tenant: Mandant entfernen
replace: Ersetzen
- allow_tenant_admins_to_invite_new_users: Mietadministratoren erlauben, neue Benutzer einzuladen
+ allow_tenant_admins_to_invite_new_users: Mandantenadministratoren erlauben, neue Benutzer einzuladen
manage_multiple_teams: Mehrere Teams verwalten
api_key: API-Schlüssel
logo: Logo
back: Zurück
- add_secret: Geheimnis hinzuf
- edit_secret: Geheimnis bearb
+ add_secret: Geheimnis hinzufügen
+ edit_secret: Geheimnis bearbeiten
submission_example_payload: Beispiel-Payload für Einreichung
there_are_no_signatures: Es gibt keine Unterschriften
signed_with_trusted_certificate: Signiert mit vertrauenswürdigem Zertifikat
signed_with_external_certificate: Signiert mit externem Zertifikat
- setup_2fa_to_continue: Richte 2FA ein, um fortzufahren.
+ setup_2fa_to_continue: Richten Sie 2FA ein, um fortzufahren.
create_a_new_account: Neues Konto erstellen.
- you_are_already_signed_in: Du bist bereits angemeldet.
- please_sign_in: Bitte melde dich an.
+ you_are_already_signed_in: Sie sind bereits angemeldet.
+ please_sign_in: Bitte melden Sie sich an.
not_found: Nicht gefunden
new_recipients_have_been_added: Neue Empfänger wurden hinzugefügt.
submission_has_been_removed: Die Einreichung wurde entfernt.
@@ -4153,25 +5201,23 @@ de: &de
document_template_has_been_moved: Die Dokumentvorlage wurde verschoben.
unable_to_move_template_into_folder: Vorlage konnte nicht in den Ordner verschoben werden.
template_has_been_unarchived: Die Vorlage wurde entarchiviert.
- submission_has_been_unarchived: Die Einreichung wurde wiederhergestellt.
+ submission_has_been_unarchived: Die Einreichung wurde entarchiviert.
unable_to_update_file: Datei konnte nicht hochgeladen werden.
- user_has_been_updated: Der Benutzer wurde aktualisiert.
- unable_to_remove_user: Benutzer konnte nicht entfernt werden.
user_has_been_invited: Der Benutzer wurde eingeladen.
unable_to_update_user: Der Benutzer konnte nicht aktualisiert werden.
+ user_has_been_updated: Der Benutzer wurde aktualisiert.
+ unable_to_remove_user: Der Benutzer konnte nicht entfernt werden.
user_has_been_removed: Der Benutzer wurde entfernt.
invalid_pdf: Ungültiges PDF
webhook_secret_has_been_saved: Das Webhook-Geheimnis wurde gespeichert.
webhook_url_has_been_saved: Die Webhook-URL wurde gespeichert.
webhook_request_has_been_sent: Die Webhook-Anfrage wurde gesendet.
- webhook_url_has_been_updated: Webhook-URL wurde aktualisiert.
- webhook_url_has_been_deleted: Webhook-URL wurde gelöscht.
+ webhook_url_has_been_updated: Die Webhook-URL wurde aktualisiert.
+ webhook_url_has_been_deleted: Die Webhook-URL wurde gelöscht.
unable_to_resend_webhook_request: Webhook-Anfrage konnte nicht erneut gesendet werden.
new_webhook: Neuer Webhook
delete_webhook: Webhook löschen
count_submissions_have_been_created: '%{count} Einreichungen wurden erstellt.'
- gmail_has_been_connected: Gmail wurde verbunden.
- microsoft_account_has_been_connected: Microsoft-Konto wurde verbunden.
sms_length_cant_be_longer_than_120_bytes: Die SMS-Länge darf 120 Bytes nicht überschreiten.
connected_successfully: Erfolgreich verbunden.
user_nameid_not_found: 'Benutzer %{nameid} nicht gefunden.'
@@ -4183,9 +5229,9 @@ de: &de
logo_has_been_uploaded: Das Logo wurde hochgeladen.
invalid_file_type: Ungültiger Dateityp
upload_file: Datei hochladen
- upgrade_your_plan_to_invite_more_users_contact_email: 'Führe ein Upgrade durch, um mehr Benutzer einzuladen (Kontakt %{email}).'
- contact_your_admin_email_to_invite_more_users: 'Kontaktiere deinen Administrator %{email}, um mehr Benutzer einzuladen.'
- contact_your_administrator_to_add_new_users: Kontaktiere deinen Administrator, um neue Benutzer hinzuzufügen.
+ upgrade_your_plan_to_invite_more_users_contact_email: 'Führen Sie ein Upgrade durch, um mehr Benutzer einzuladen (Kontakt %{email}).'
+ contact_your_admin_email_to_invite_more_users: 'Kontaktieren Sie Ihren Administrator %{email}, um mehr Benutzer einzuladen.'
+ contact_your_administrator_to_add_new_users: Kontaktieren Sie Ihren Administrator, um neue Benutzer hinzuzufügen.
one_hour: 1 Stunde
two_hours: 2 Stunden
four_hours: 4 Stunden
@@ -4196,39 +5242,42 @@ de: &de
four_days: 4 Tage
eight_days: 8 Tage
fifteen_days: 15 Tage
+ twenty_one_days: 21 Tage
+ thirty_days: 30 Tage
free: Kostenlos
unlimited_documents_storage: Unbegrenzter Dokumentenspeicher
users_management: Benutzerverwaltung
ten_filed_types: 10 Feldtypen
multiple_signers: Mehrere Unterzeichner
- automatic_esignature: Automatische E-Signatur
- ten_signature_request_emails_per_month: 10 E-Mails für Unterschriftsanforderungen pro Monat
- unlimited_sign_yourself: Unbegrenzte Selbstsignatur
- free_developer_testing_sandbox: Kostenloser Test-Sandbox für Entwickler
+ automatic_esignature: Automatische E‑Signatur
+ ten_signature_request_emails_per_month: 10 E-Mails für Signaturanfragen pro Monat
+ unlimited_sign_yourself: Unbegrenzt selbst unterschreiben
+ free_developer_testing_sandbox: Kostenlose Entwickler-Testumgebung
continue_with_free_basic: Mit Free Basic fortfahren
- unlimited_signature_request_emails: Unbegrenzte Unterschriftsanforderungen per E-Mail
- your_company_logo: Dein Firmenlogo
+ unlimited_signature_request_emails: Unbegrenzte Signaturanfrage-E-Mails
+ your_company_logo: Ihr Firmenlogo
connect_own_email_address: Eigene E-Mail-Adresse verbinden
personalize_email_content: E-Mail-Inhalt personalisieren
automated_reminders: Automatische Erinnerungen
- bulk_send_from_spreadsheet: Massenversand aus einer Tabellenkalkulation
+ bulk_send_from_spreadsheet: Massenversand aus Tabelle
identify_verification_via_sms: Identitätsüberprüfung per SMS
start_with_pro: Mit Pro starten
user_month: Benutzer / Monat
- developer_sandbox: Entwickler-Sandbox
- upgrade_to_start_using_in_production_html: 'Upgrade um mit der Produktion zu starten.'
+ developer_sandbox: Entwickler-Sandbox.
+ upgrade_to_start_using_in_production_html: 'Upgrade durchführen, um die Produktionsnutzung zu starten.'
download_combined_pdf: Kombiniertes PDF herunterladen
audit_log: Prüfprotokoll
signers: Unterzeichner
not_invited_yet: Noch nicht eingeladen
not_completed_yet: Noch nicht abgeschlossen
declined_on_time: 'Abgelehnt am %{time}'
- sign_in_person: Persönlich unterschreiben
- create_a_new_template_document_form_or_submit_the_existing_one_html: 'Neue Vorlage erstellen oder vorhandene einreichen'
+ expire_on_time: 'Läuft ab am %{time}'
+ sign_in_person: Vor Ort unterschreiben
+ create_a_new_template_document_form_or_submit_the_existing_one_html: Neue Vorlage erstellen oder bestehende einreichen
send_email_copy_with_completed_documents_to_a_specified_bcc_address: Senden Sie eine E-Mail-Kopie mit abgeschlossenen Dokumenten an eine angegebene BCC-Adresse.
re_send_email: E-Mail erneut senden
send_email: E-Mail senden
- copy_share_link: Link zum Teilen kopieren
+ copy_share_link: Freigabelink kopieren
copied_to_clipboard: In die Zwischenablage kopiert
link: Link
via_email: per E-Mail
@@ -4246,8 +5295,8 @@ de: &de
event_log: Ereignisprotokoll
verify: Überprüfen
testing_log_not_for_production_use: Testprotokoll - Nicht für den Produktionseinsatz
- original_sha256: Original SHA256
- result_sha256: Ergebnis SHA256
+ original_sha256: Original-SHA256
+ result_sha256: Ergebnis-SHA256
generated_at: Generiert am
email_verification: E-Mail-Verifizierung
phone_verification: Telefonverifizierung
@@ -4261,9 +5310,9 @@ de: &de
image_field: Bildfeld
file_field: Dateifeld
select_field: Auswahlfeld
- checkbox_field: Checkbox-Feld
- multiple_field: Mehrfach-Auswahlfeld
- radio_field: Radio-Gruppenfeld
+ checkbox_field: Checkboxveld
+ multiple_field: Meerkeuzeveld
+ radio_field: Radiogroepveld
cells_field: Zellenfeld
stamp_field: Stempelfeld
payment_field: Zahlungsfeld
@@ -4274,11 +5323,11 @@ de: &de
verified: Verifiziert
unverified: Nicht verifiziert
document: Dokument
- completed_at: Abgeschlossen am
+ completed_at: Abgeschlossen
edit_recipient: Empfänger bearbeiten
update_recipient: Empfänger aktualisieren
use_international_format_1xxx_: 'Verwenden Sie das internationale Format: +1xxx...'
- submitter_cannot_be_updated: Der Absender kann nicht aktualisiert werden.
+ submitter_cannot_be_updated: Der Einreicher kann nicht aktualisiert werden.
at_least_one_field_must_be_filled: Mindestens ein Feld muss ausgefüllt werden.
archived_users: Archivierte Benutzer
embedding_users: Einbettende Benutzer
@@ -4306,12 +5355,12 @@ de: &de
too_many_attempts: Zu viele Versuche.
verification_code: Verifizierungscode
resend_code: Code erneut senden
- verify_new_sign_in: Neue Anmeldung überprüfen
+ verify_new_sign_in: Neue Anmeldung verifizieren
use_otp_code_to_sign_in_or_click_the_link_below_html: 'Verwenden Sie den Code %{code}, um sich anzumelden, oder klicken Sie auf den untenstehenden Link:'
complete_sign_in: Anmeldung abschließen
please_reply_to_this_email_if_you_dont_recognize_this_sign_in_attempt: Bitte antworten Sie auf diese E-Mail, wenn Sie diesen Anmeldeversuch nicht erkennen.
docuseal_support: DocuSeal Support
- use_the_edit_form_to_move_it_to_another_team: Verwenden Sie das Bearbeitungsformular, um ihn in ein anderes Team zu verschieben.
+ use_the_edit_form_to_move_it_to_another_team: Verwenden Sie das Bearbeitungsformular, um es in ein anderes Team zu verschieben.
too_many_sms_attempts_try_again_in_a_few_seconds: Zu viele SMS-Versuche. Versuchen Sie es in ein paar Sekunden erneut.
number_phone_number_is_invalid: "Die Telefonnummer +%{number} ist ungültig"
make_com_integration: Make.com-Integration
@@ -4320,9 +5369,9 @@ de: &de
find_suitable_zapier_templates_to_automate_your_workflow: Finden Sie passende Zapier-Vorlagen, um Ihren Workflow zu automatisieren.
get_started: Loslegen
click_here_to_learn_more_about_user_roles_and_permissions_html: 'Klicken Sie hier, um mehr über Benutzerrollen und -berechtigungen zu erfahren.'
- count_10_signature_request_emails_sent_this_month_upgrade_to_pro_to_send_unlimited_signature_request_email: '%{count} / 10 Signaturanfrage-E-Mails wurden diesen Monat gesendet. Upgraden Sie zu Pro, um unbegrenzte Signaturanfragen zu senden.'
+ count_10_signature_request_emails_sent_this_month_upgrade_to_pro_to_send_unlimited_signature_request_email: '%{count} / 10 E-Mails für Signaturanfragen wurden diesen Monat gesendet. Upgraden Sie zu Pro, um unbegrenzte Signaturanfragen zu senden.'
test_mode_emails_limit_will_be_reset_within_24_hours: Das Limit für E-Mails im Testmodus wird innerhalb von 24 Stunden zurückgesetzt.
- on_a_scale_of_1_to_10_how_satisfied_are_you_with_the_docuseal_product_: 'Auf einer Skala von 1 bis 10, wie zufrieden sind Sie mit dem DocuSeal-Produkt?'
+ on_a_scale_of_1_to_10_how_satisfied_are_you_with_the_docuseal_product_: 'Auf einer Skala von 1 bis 10: Wie zufrieden sind Sie mit dem DocuSeal-Produkt?'
tell_us_more_about_your_experience: Erzählen Sie uns mehr über Ihre Erfahrung
extremely_dissatisfied: Extrem unzufrieden
extremely_satisfied: Extrem zufrieden
@@ -4330,12 +5379,114 @@ de: &de
click_here_to_update_your_payment_details_and_clear_the_invoice_to_ensure_uninterrupted_service_html: 'Klicken Sie hier, um Ihre Zahlungsdaten zu aktualisieren und die Rechnung zu begleichen, um einen unterbrechungsfreien Service sicherzustellen.'
overdue_payment: Überfällige Zahlung
your_pro_plan_has_been_suspended_due_to_unpaid_invoices_you_can_update_your_payment_details_to_settle_the_invoice_and_continue_using_docuseal_or_cancel_your_subscription: Ihr Pro-Plan wurde aufgrund unbezahlter Rechnungen ausgesetzt. Sie können Ihre Zahlungsdaten aktualisieren, um die Rechnung zu begleichen und DocuSeal weiterhin zu nutzen, oder Ihr Abonnement kündigen.
- manage_subscription: Abonnement Verwalten
- submission_created_by_email_html: 'Übermittlung erstellt von %{email}'
- submission_created_by_email_via_source_html: 'Übermittlung erstellt durch %{email} über %{source}'
- submission_created_via_source_html: 'Übermittlung erstellt über %{source}'
+ manage_subscription: Abonnement verwalten
+ submission_created_by_email_html: 'Einreichung erstellt von %{email}'
+ submission_created_by_email_via_source_html: 'Einreichung erstellt von %{email} über %{source}'
+ submission_created_via_source_html: 'Einreichung erstellt über %{source}'
pro_user_seats_used: Verwendete Pro-Benutzerplätze
manage_plan: Plan verwalten
+ this_submission_has_multiple_signers_which_prevents_the_use_of_a_sharing_link_html: 'Diese Einreichung hat mehrere Unterzeichner, was die Nutzung eines Freigabelinks verhindert, da unklar ist, welcher Unterzeichner für welche Felder verantwortlich ist. Um dies zu lösen, folgen Sie dieser Anleitung, um die Standarddetails des Unterzeichners festzulegen.'
+ welcome_to_docuseal: Willkommen bei DocuSeal
+ start_a_quick_tour_to_learn_how_to_create_an_send_your_first_document: Starten Sie eine kurze Tour, um zu lernen, wie Sie Ihr erstes Dokument erstellen und versenden.
+ start_tour: Starten
+ name_a_z: Name A-Z
+ recently_used: Kürzlich verwendet
+ newest_first: Neueste zuerst
+ none: Keine
+ default_expiration: Standardablauf
+ specified_date: Angegebenes Datum
+ one_day: 1 Tag
+ two_days: 2 Tage
+ three_days: 3 Tage
+ four_days: 4 Tage
+ five_days: 5 Tage
+ six_days: 6 Tage
+ seven_days: 7 Tage
+ eight_days: 8 Tage
+ nine_days: 9 Tage
+ ten_days: 10 Tage
+ two_weeks: 2 Wochen
+ three_weeks: 3 Wochen
+ four_weeks: 4 Wochen
+ one_month: 1 Monat
+ two_months: 2 Monate
+ three_months: 3 Monate
+ eu_data_residency: EU-Datenresidenz
+ please_enter_your_email_address_associated_with_the_completed_submission: Bitte geben Sie Ihre E-Mail-Adresse ein, die mit der abgeschlossenen Einreichung verknüpft ist.
+ esignature_disclosure: Hinweis zur E‑Signatur
+ share_link: Freigabelink
+ enable_shared_link: Freigabelink aktivieren
+ share_link_is_currently_disabled: Freigabelink ist derzeit deaktiviert
+ select_data_residency: Datenstandort auswählen
+ account_name_has_invited_you_to_fill_and_sign_documents_online_effortlessly_with_a_secure_fast_and_user_friendly_digital_document_signing_solution: '%{account_name} hat Sie eingeladen, Dokumente mühelos online mit einer sicheren, schnellen und benutzerfreundlichen digitalen Signaturlösung auszufüllen und zu unterschreiben.'
+ review_or_download_completed_documents_fill_and_sign_documents_online_effortlessly_with_a_secure_fast_and_user_friendly_digital_document_signing_solution: Überprüfen oder laden Sie abgeschlossene Dokumente herunter. Füllen und unterschreiben Sie Dokumente mühelos online mit einer sicheren, schnellen und benutzerfreundlichen digitalen Signaturlösung.
+ link_form_fields: Formularfelder verknüpfen
+ at_least_one_field_must_be_displayed_in_the_form: Mindestens ein Feld muss im Formular angezeigt werden.
+ this_template_has_multiple_parties_which_prevents_the_use_of_a_sharing_link: Diese Vorlage enthält mehrere Parteien, was die Verwendung eines Freigabelinks verhindert, da unklar ist, welche Partei für bestimmte Felder verantwortlich ist. Um dies zu beheben, definieren Sie die Standardparteidetails.
+ events_log: Ereignisprotokoll
+ succeeded: Erfolgreich
+ failed: Fehlgeschlagen
+ there_are_no_events: Es sind keine Ereignisse vorhanden
+ resend: Erneut senden
+ next_attempt_in_time_in_words: Nächster Versuch in %{time_in_words}
+ request_email_otp_verification_with_shared_link: E-Mail-OTP-Verifizierung mit Freigabelink anfordern
+ sms_rate_limit_exceeded: SMS-Limit überschritten
+ invalid_phone_number: Ungültige Telefonnummer
+ please_contact_the_requester_to_specify_your_phone_number_for_two_factor_authentication: Bitte kontaktieren Sie den Anforderer, um Ihre Telefonnummer für die Zwei-Faktor-Authentifizierung anzugeben.
+ we_sent_a_one_time_verification_code_to_your_email_address_please_enter_the_code_below_to_continue: Wir haben einen einmaligen Verifizierungscode an Ihre E-Mail-Adresse gesendet. Bitte geben Sie ihn unten ein, um fortzufahren.
+ re_send_code: Code erneut senden
+ email_verification: E-Mail-Verifizierung
+ your_verification_code_to_access_the_name: 'Ihr Verifizierungscode für den Zugriff auf "%{name}":'
+ please_reply_to_this_email_if_you_didnt_request_this: Bitte antworten Sie auf diese E-Mail, wenn Sie dies nicht angefordert haben.
+ advanced_settings: Erweiterte Einstellungen
+ text: Text
+ code: Code
+ custom_html_emails: Benutzerdefinierte HTML-E-Mails
+ connect_your_email_to_send_html_emails: Verbinden Sie Ihr E-Mail-Konto, um HTML-E-Mails zu senden
+ connect_your_email_or_outlook_account_or_add_smtp_settings_to_send_custom_html_emails: Verbinden Sie Ihr Gmail- oder Outlook-Konto oder fügen Sie SMTP-Einstellungen hinzu, um benutzerdefinierte HTML-E-Mails zu senden.
+ connect_gmail_or_outlook: Gmail oder Outlook verbinden
+ connect_your_email_to_bulk_send: E-Mail-Konto für Massenversand verbinden
+ connect_your_email_or_outlook_account_or_add_smtp_settings_to_bulk_send: Verbinden Sie Ihr Gmail- oder Outlook-Konto oder fügen Sie SMTP-Einstellungen für den Massenversand hinzu.
+ are_you_sure_you_want_to_add_recipients_without_sending_to_send_emails_it_requires_to_connect_gmail_or_outlook: Möchten Sie wirklich Empfänger hinzufügen, ohne zu senden? Zum Senden von E-Mails ist eine Verbindung zu Gmail oder Outlook erforderlich.
+ template_name_has_been_completed_by_submitters_html: '"{template.name}" wurde von {submission.submitters} abgeschlossen'
+ please_check_the_copy_of_your_template_name_in_the_email_attachments_html: 'Bitte prüfen Sie die Kopie Ihres "{template.name}" in den E-Mail-Anhängen.'
+ you_have_been_invited_to_sign_the_template_name_html: 'Sie wurden eingeladen, "{template.name}" zu unterschreiben.'
+ reveal_api_key: API-Schlüssel anzeigen
+ enter_your_password_to_reveal_the_api_key: Geben Sie Ihr Passwort ein, um den API-Schlüssel anzuzeigen
+ wrong_password: Falsches Passwort.
+ current_password: Aktuelles Passwort
+ dont_remember_your_current_password_click_here_to_reset_it_html: 'Sie erinnern sich nicht an Ihr aktuelles Passwort? , um es zurückzusetzen.'
+ an_email_with_password_reset_instructions_has_been_sent: Eine E-Mail mit Anweisungen zum Zurücksetzen Ihres Passworts wurde gesendet.
+ api_key_access_code: API-Schlüssel-Zugangscode
+ use_otp_code_to_access_the_api_key_html: Verwenden Sie den Code %{code}, um auf den API-Schlüssel zuzugreifen.
+ please_reply_to_this_email_if_you_dont_recognize_this_request: Bitte antworten Sie auf diese E-Mail, wenn Sie diese Anfrage nicht erkennen.
+ your_user_account_has_been_archived_contact_your_administrator_to_restore_access_to_your_account: Ihr Benutzerkonto wurde archiviert. Wenden Sie sich an Ihren Administrator, um den Zugriff wiederherzustellen.
+ your_email_could_not_be_reached_this_may_happen_if_there_was_a_typo_in_your_address_or_if_your_mailbox_is_not_available_please_contact_support_email_to_log_in: Ihre E-Mail konnte nicht erreicht werden. Dies kann passieren, wenn sich ein Tippfehler in Ihrer Adresse befindet oder Ihr Postfach nicht verfügbar ist. Bitte kontaktieren Sie support@docuseal.com, um sich anzumelden.
+ efficient_search_with_search_index: Effiziente Suche mit Suchindex
+ reindex: Neu indexieren
+ build_search_index: Suchindex erstellen
+ require_two_factor_authentication_2fa_with_an_authenticator_app_e_g_google_authenticator_authy_all_users_signing_documents_must_pass_the_second_factor_verification_using_a_secure_code_in_addition_to_their_password: Zwei-Faktor-Authentifizierung (2FA) mit einer Authentifizierungs-App (z. B. Google Authenticator, Authy) erforderlich. Alle Benutzer, die Dokumente unterzeichnen, müssen zusätzlich zu ihrem Passwort die zweite Faktorprüfung mit einem sicheren Code bestehen.
+ add_a_unique_signature_id_and_timestamp_to_each_signature_for_audit_and_traceability_purposes_along_with_the_timestamp_part_of_docuseals_21_cfr_part_11_compliance_settings: Fügen Sie jeder Signatur eine eindeutige Signatur-ID und einen Zeitstempel für Prüf- und Nachverfolgbarkeitszwecke hinzu. Teil der DocuSeal-Einstellungen zur 21 CFR Part 11-Compliance.
+ require_signer_to_provide_a_reason_for_signing_before_completing_their_signature_e_g_approvals_certifications_part_of_docuseals_21_cfr_part_11_compliance_settings: Unterzeichner müssen vor Abschluss ihrer Signatur einen Grund für die Unterzeichnung angeben (z. B. Genehmigungen, Zertifizierungen). Teil der DocuSeal-Einstellungen zur 21 CFR Part 11-Compliance.
+ allow_signers_to_create_signatures_by_typing_their_name_instead_of_drawing_or_uploading_one: Unterzeichner dürfen Signaturen erstellen, indem sie ihren Namen eingeben, statt eine Signatur zu zeichnen oder hochzuladen.
+ allow_signers_to_resubmit_forms_after_completion_useful_when_corrections_or_multiple_submissions_are_needed: Unterzeichner dürfen Formulare nach Abschluss erneut einreichen – nützlich für Korrekturen oder mehrere Einreichungen.
+ allow_recipients_to_decline_signing_a_document_the_decline_reason_notification_will_be_sent_to_the_signature_requester: Empfänger dürfen die Unterzeichnung eines Dokuments ablehnen. Die Benachrichtigung mit dem Ablehnungsgrund wird an den Anforderer der Signatur gesendet.
+ save_a_users_signature_and_automatically_pre_fill_it_in_future_signing_sessions: Die Signatur eines Benutzers speichern und sie in zukünftigen Signatursitzungen automatisch vorausfüllen.
+ make_document_download_links_expire_after_40_minutes_to_prevent_long_term_access_and_enhance_security: Download-Links für Dokumente nach 40 Minuten ablaufen lassen, um langfristigen Zugriff zu verhindern und die Sicherheit zu erhöhen.
+ require_authentication_with_user_login_or_api_key_to_access_the_document_download_links: Authentifizierung mit Benutzeranmeldung oder API-Schlüssel erforderlich, um auf die Download-Links für Dokumente zuzugreifen.
+ combine_signed_documents_and_the_audit_log_into_a_single_pdf_file_for_easier_recordkeeping_and_compliance: Unterzeichnete Dokumente und das Prüfprotokoll in einer einzigen PDF-Datei kombinieren – für einfachere Aufbewahrung und Compliance.
+ require_a_jwt_authorization_to_preview_embedded_forms_ensuring_only_authorized_users_can_view_them: JWT-Autorisierung für die Vorschau eingebetteter Formulare erforderlich, sodass nur autorisierte Benutzer sie ansehen können.
+ make_all_newly_created_templates_private_to_their_creator_by_default: Alle neu erstellten Vorlagen standardmäßig nur für ihren Ersteller sichtbar machen.
+ make_the_recipients_signing_order_always_enforced_so_that_the_second_signer_can_start_signing_their_part_only_after_the_first_signer_has_completed_signing: Die Unterzeichnungsreihenfolge der Empfänger immer erzwingen, sodass der zweite Unterzeichner erst nach Abschluss durch den ersten beginnen kann.
+ the_file_is_missing_make_sure_you_have_access_to_it_on_google_drive: Die Datei fehlt. Stellen Sie sicher, dass Sie Zugriff darauf in Google Drive haben.
+ connect_google_drive: Google Drive verbinden
+ google_drive_has_been_connected: Google Drive wurde verbunden
+ unable_to_identify_reset_your_password_to_sign_in: Identifizierung nicht möglich. Setzen Sie Ihr Passwort zurück, um sich anzumelden.
+ desktop: Desktop
+ mobile: Mobil
+ tablet: Tablet
+ reset_default: Standard zurücksetzen
+ send_signature_request_email: Signaturanfrage-E-Mail senden
submission_sources:
api: API
bulk: Massenversand
@@ -4344,6 +5495,8 @@ de: &de
link: Link
submission_event_names:
send_email_to_html: 'E-Mail gesendet an %{submitter_name}'
+ bounce_email_html: 'E-Mail unzustellbar %{submitter_name}'
+ complaint_email_html: 'Spam-Beschwerde %{submitter_name}'
send_reminder_email_to_html: 'Erinnerungs-E-Mail gesendet an %{submitter_name}'
send_sms_to_html: 'SMS gesendet an %{submitter_name}'
send_2fa_sms_to_html: 'Verifizierungs-SMS gesendet an %{submitter_name}'
@@ -4351,9 +5504,10 @@ de: &de
click_email_by_html: 'E-Mail-Link angeklickt von %{submitter_name}'
click_sms_by_html: 'SMS-Link angeklickt von %{submitter_name}'
phone_verified_by_html: 'Telefon verifiziert von %{submitter_name}'
+ email_verified_by_html: 'E-Mail verifiziert von %{submitter_name}'
start_form_by_html: 'Einreichung gestartet von %{submitter_name}'
view_form_by_html: 'Formular angesehen von %{submitter_name}'
- invite_party_by_html: 'Eingeladen %{invited_submitter_name} von %{submitter_name}'
+ invite_party_by_html: 'Eingeladen %{invited_submitter_name} durch %{submitter_name}'
complete_form_by_html: 'Einreichung abgeschlossen von %{submitter_name}'
start_verification_by_html: 'Identitätsüberprüfung gestartet von %{submitter_name}'
complete_verification_by_html: 'Identitätsüberprüfung abgeschlossen von %{submitter_name} mit %{provider}'
@@ -4367,19 +5521,83 @@ de: &de
select_field: Feld auswählen
select_column: Spalte auswählen
new_field_mapping: Neue Feldzuordnung
- total_entries: Gesamte Einträge
- upload_csv_or_xlsx_spreadsheet: Laden Sie eine CSV- oder XLSX-Tabelle hoch
+ total_entries: Gesamteinträge
+ upload_csv_or_xlsx_spreadsheet: CSV- oder XLSX-Tabelle hochladen
click_to_upload: Klicken Sie, um hochzuladen
- or_drag_and_drop_files: oder ziehen Sie die Dateien hierher.
+ or_drag_and_drop_files: oder Dateien hierher ziehen und ablegen.
or: Oder
- download: laden
- a_sample_spreadsheet_to_fill_and_import: Sie eine Beispieltabelle herunter, um sie auszufüllen und zu importieren.
+ download: Download
+ a_sample_spreadsheet_to_fill_and_import: Beispieltabelle zum Ausfüllen und Importieren herunterladen
+ app_tour:
+ start: Start
+ previous: Zurück
+ next: Weiter
+ template_and_submissions: 'Vorlagen und Einreichungen'
+ template_and_submissions_description: "Sie können die Ansicht wählen, die am besten zu Ihrem Arbeitsablauf passt. Wählen Sie die Ansicht 'Vorlagen', um wiederverwendbare Dokumentvorlagen zu erstellen, oder 'Einreichungen', um einzelne Dokumente zu unterschreiben oder den Status jeder Signaturanfrage zu überprüfen."
+ upload_a_pdf_file: 'PDF-Datei hochladen'
+ upload_a_pdf_file_description: 'Laden Sie ein PDF-Dokument hoch, um eine Vorlage für ein Signaturformular zu erstellen.'
+ select_a_signer_party: 'Unterzeichner-Partei auswählen'
+ select_a_signer_party_description: 'Dieses Dropdown-Menü ermöglicht es Ihnen, eine Signaturrolle auszuwählen oder eine neue Partei zum Dokument hinzuzufügen, wenn es zwei oder mehr Unterschriften erfordert.'
+ available_parties: 'Verfügbare Parteien'
+ available_parties_description: 'Diese Liste enthält alle verfügbaren Parteien mit ihren Rollennamen. Nach der Auswahl können Sie Felder für die Unterzeichner-Partei hinzufügen und konfigurieren.'
+ available_field_types: 'Verfügbare Feldtypen'
+ available_field_types_description: 'Dieser Bereich enthält alle verfügbaren Feldtypen, die dem Dokument für Dateneingabe oder Signaturerfassung hinzugefügt werden können.'
+ text_input_field: 'Textfeld'
+ text_input_field_description: 'Dieses Feld ermöglicht es Benutzern, textbasierte Informationen wie Namen oder E-Mails einzugeben.'
+ signature_field: 'Signaturfeld'
+ signature_field_description: 'Dieses Feld wird verwendet, um die Unterschriften der Unterzeichner zu erfassen.'
+ added_fields: 'Hinzugefügte Felder'
+ added_fields_description: 'Diese Liste zeigt alle dem Dokument hinzugefügten Felder. Sie können sie neu anordnen, bearbeiten oder entfernen.'
+ open_field_settings: 'Feldeinstellungen öffnen'
+ open_field_settings_description: 'Rechts neben dem Feldnamen befindet sich ein Einstellungssymbol, um die Feldeinstellungen zu öffnen.'
+ field_settings: 'Feldeinstellungen'
+ field_settings_description: 'Jedes Feld kann individuell angepasst werden, z. B. durch Schriftgröße, Pflichtfeld-Option oder Beschreibung.'
+ send_document: 'Dokument zum Unterschreiben senden'
+ send_document_description: 'Bevor Sie das Dokument zum Unterschreiben senden, können Sie Empfänger hinzufügen, ihre E-Mail-Adressen oder Telefonnummern eingeben und den E-Mail-Inhalt anpassen.'
+ sign_yourself: 'Dokument selbst unterschreiben'
+ sign_yourself_description: 'Mit dieser Schaltfläche können Sie Ihre eigene Unterschrift zu Dokumenten hinzufügen, die Ihre Signatur erfordern.'
+ copy_and_share_link: 'Link kopieren und teilen'
+ copy_and_share_link_description: 'Kopieren Sie diesen Link, um das Dokument zu teilen. Jeder mit dem Link kann es unterschreiben, nachdem er seine E-Mail-Adresse eingegeben hat.'
+ sign_the_document: 'Dokument unterschreiben'
+ sign_the_document_description: 'Wenn Sie einer der Unterzeichner sind, können Sie das Dokument mit dieser Schaltfläche unterschreiben.'
+ send_for_signing: 'Zum Unterschreiben senden'
+ add_recipients: 'Empfänger hinzufügen'
+ add_recipients_description: 'Fügen Sie neue Empfänger hinzu, indem Sie ihre E-Mail-Adressen oder Telefonnummern eingeben, damit sie das Dokument unterschreiben können.'
+ settings: 'Einstellungen'
+ settings_account_description: 'Mit umfangreichen Kontoeinstellungen können Sie das Signiererlebnis anpassen und weitere Benutzer einladen.'
+ support: 'Support'
+ support_description: 'Sie können unseren KI-Assistenten nutzen oder uns bei Fragen an support@docuseal.com schreiben.'
+ settings_template_description: 'Über diese Schaltfläche gelangen Sie zu den Kontoeinstellungen.'
doorkeeper:
scopes:
- write: Aktualisiere deine Daten
- read: Lese deine Daten
+ write: Aktualisieren Sie Ihre Daten
+ read: Lesen Sie Ihre Daten
+ pagination:
+ submissions:
+ range_with_total: "%{from}-%{to} von %{count} Einreichungen"
+ range_without_total: "%{from}-%{to} Einreichungen"
+ templates:
+ range_with_total: "%{from}-%{to} von %{count} Vorlagen"
+ range_without_total: "%{from}-%{to} Vorlagen"
+ template_folders:
+ range_with_total: "%{from}-%{to} von %{count} Ordnern"
+ range_without_total: "%{from}-%{to} Ordner"
+ users:
+ range_with_total: "%{from}-%{to} von %{count} Benutzern"
+ range_without_total: "%{from}-%{to} Benutzer"
+ items:
+ range_with_total: "%{from}-%{to} von %{count} Elementen"
+ range_without_total: "%{from}-%{to} Elemente"
+ events:
+ range_with_total: "%{from}-%{to} von %{count} Ereignissen"
+ range_without_total: "%{from}-%{to} Ereignisse"
pl:
+ require_phone_2fa_to_open: Wymagaj uwierzytelniania telefonicznego 2FA do otwarcia
+ the_sender_has_requested_a_two_factor_authentication_via_one_time_password_sent_to_your_html: Nadawca zażądał uwierzytelnienia dwuetapowego poprzez jednorazowe hasło wysłane na Twój %{phone} numer telefonu.
+ send_verification_code: Wyślij kod weryfikacyjny
+ code_has_been_resent: Kod został wysłany ponownie
+ invalid_code: Niepoprawny kod
awaiting_completion_by_the_other_party: "Oczekuje na dokończenie przez drugą stronę"
view: Widok
hi_there: Cześć,
@@ -4397,7 +5615,13 @@ pl:
digitally_signed_by: Podpis cyfrowy przez
form_expired_at_html: 'Formularz wygasł o %{time}'
role: Rola
- provide_your_email_to_start: Podaj swój adres email, aby rozpocząć
+ provide_your_email_to_start: Podaj swój e-mail, aby rozpocząć
+ provide_your_email: Podaj swój e-mail
+ provide_your_name_to_start: Podaj swoje imię, aby rozpocząć
+ provide_your_name: Podaj swoje imię
+ provide_your_phone_in_international_format_to_start: Podaj numer telefonu w formacie międzynarodowym, aby rozpocząć
+ provide_your_phone_in_international_format: Podaj numer telefonu w formacie międzynarodowym
+ use_international_format_1xxx_: 'Użyj formatu międzynarodowego: +1xxx...'
start: Rozpocznij
reason: Powód
starting: Rozpoczynanie
@@ -4437,8 +5661,34 @@ pl:
too_many_attempts: Zbyt wiele prób.
verification_code: Kod Weryfikacyjny
resend_code: Wyślij Kod Ponownie
+ powered_by: 'Napędzany prze'
+ count_documents_signed_with_html: '%{count} dokumentów podpisanych za pomocą'
+ open_source_documents_software: 'oprogramowanie do dokumentów open source'
+ eu_data_residency: Dane w UE
+ please_enter_your_email_address_associated_with_the_completed_submission: Wprowadź adres e-mail powiązany z ukończonym zgłoszeniem.
+ privacy_policy: Polityka Prywatności
+ esignature_disclosure: Użycie e-podpisu
+ select_data_residency: Wybierz lokalizację danych
+ company_name: Nazwa firmy
+ optional: opcjonalne
+ submit: Prześlij
+ sms_rate_limit_exceeded: Przekroczono limit wiadomości SMS
+ invalid_phone_number: Nieprawidłowy numer telefonu
+ please_contact_the_requester_to_specify_your_phone_number_for_two_factor_authentication: Skontaktuj się z nadawcą, aby podać numer telefonu do uwierzytelniania dwuskładnikowego.
+ we_sent_a_one_time_verification_code_to_your_email_address_please_enter_the_code_below_to_continue: Wysłaliśmy jednorazowy kod weryfikacyjny na Twój adres e-mail. Wprowadź go poniżej, aby kontynuować.
+ re_send_code: Wyślij ponownie kod
+ email_verification: Weryfikacja e-mail
+ your_verification_code_to_access_the_name: 'Twój kod weryfikacyjny do uzyskania dostępu do "%{name}":'
+ please_reply_to_this_email_if_you_didnt_request_this: Odpowiedz na ten e-mail, jeśli nie prosiłeś o to.
+ your_user_account_has_been_archived_contact_your_administrator_to_restore_access_to_your_account: Twoje konto użytkownika zostało zarchiwizowane. Skontaktuj się z administratorem, aby przywrócić dostęp do konta.
+ your_email_could_not_be_reached_this_may_happen_if_there_was_a_typo_in_your_address_or_if_your_mailbox_is_not_available_please_contact_support_email_to_log_in: Nie udało się uzyskać dostępu do Twojego adresu e-mail. Może to być spowodowane literówką w adresie lub niedostępnością skrzynki. Skontaktuj się z support@docuseal.com, aby się zalogować.
uk:
+ require_phone_2fa_to_open: Вимагати двофакторну автентифікацію через телефон для відкриття
+ the_sender_has_requested_a_two_factor_authentication_via_one_time_password_sent_to_your_html: Відправник запросив двофакторну автентифікацію за допомогою одноразового пароля, відправленого на ваш номер телефону %{phone}.
+ send_verification_code: Надіслати код підтвердження
+ code_has_been_resent: Код повторно надіслано
+ invalid_code: Невірний код
awaiting_completion_by_the_other_party: "Очікує завершення з боку іншої сторони"
view: Переглянути
hi_there: Привіт,
@@ -4455,7 +5705,13 @@ uk:
digitally_signed_by: Цифровий підпис від
verification_code_code: 'Код підтвердження: %{code}'
role: Роль
- provide_your_email_to_start: Введіть свій email, щоб почати
+ provide_your_email_to_start: Введіть свій емейл, щоб почати
+ provide_your_email: Введіть свій емейл
+ provide_your_name_to_start: Введіть своє ім’я, щоб почати
+ provide_your_name: Введіть своє ім’я
+ provide_your_phone_in_international_format_to_start: Введіть номер телефону у міжнародному форматі, щоб почати
+ provide_your_phone_in_international_format: Введіть номер телефону у міжнародному форматі
+ use_international_format_1xxx_: 'Використовуйте міжнародний формат: +1xxx...'
form_expired_at_html: 'Строк подачі завершився о %{time}'
start: Почати
reason: Причина
@@ -4496,8 +5752,34 @@ uk:
too_many_attempts: Забагато спроб.
verification_code: Код перевірки
resend_code: Відправити код знову
+ powered_by: 'Працює на базі'
+ count_documents_signed_with_html: '%{count} документів підписано за допомогою'
+ open_source_documents_software: 'відкрите програмне забезпечення для документів'
+ eu_data_residency: 'Зберігання даних в ЄС'
+ please_enter_your_email_address_associated_with_the_completed_submission: "Введіть адресу електронної пошти, пов'язану із завершеним поданням."
+ privacy_policy: Політика конфіденційності
+ esignature_disclosure: Використання e-підпису
+ select_data_residency: Виберіть місце зберігання даних
+ company_name: Назва компанії
+ optional: необов’язково
+ submit: Надіслати
+ sms_rate_limit_exceeded: Перевищено ліміт SMS
+ invalid_phone_number: Невірний номер телефону
+ please_contact_the_requester_to_specify_your_phone_number_for_two_factor_authentication: Зв’яжіться з відправником, щоб вказати номер телефону для двофакторної автентифікації.
+ we_sent_a_one_time_verification_code_to_your_email_address_please_enter_the_code_below_to_continue: Ми надіслали одноразовий код підтвердження на вашу електронну пошту. Введіть його нижче, щоб продовжити.
+ re_send_code: Надіслати код повторно
+ email_verification: Підтвердження електронної пошти
+ your_verification_code_to_access_the_name: 'Ваш код доступу до "%{name}":'
+ please_reply_to_this_email_if_you_didnt_request_this: Відповідайте на цей лист, якщо ви цього не запитували.
+ your_user_account_has_been_archived_contact_your_administrator_to_restore_access_to_your_account: Ваш обліковий запис було архівовано. Зверніться до адміністратора, щоб відновити доступ.
+ your_email_could_not_be_reached_this_may_happen_if_there_was_a_typo_in_your_address_or_if_your_mailbox_is_not_available_please_contact_support_email_to_log_in: Не вдалося отримати доступ до вашої електронної пошти. Це може статися, якщо була допущена помилка в адресі або ваша скринька недоступна. Зверніться до support@docuseal.com, щоб увійти.
cs:
+ require_phone_2fa_to_open: Vyžadovat otevření pomocí telefonního 2FA
+ the_sender_has_requested_a_two_factor_authentication_via_one_time_password_sent_to_your_html: Odesílatel požádal o dvoufaktorové ověření pomocí jednorázového hesla zaslaného na vaše telefonní číslo %{phone}.
+ send_verification_code: Odeslat ověřovací kód
+ code_has_been_resent: Kód byl znovu odeslán
+ invalid_code: Neplatný kód
awaiting_completion_by_the_other_party: "Čeká se na dokončení druhou stranou"
view: Zobrazit
hi_there: Ahoj,
@@ -4514,7 +5796,13 @@ cs:
digitally_signed_by: Digitálně podepsáno uživatelem
verification_code_code: 'Ověřovací kód: %{code}'
role: Role
- provide_your_email_to_start: Zadejte svůj email pro zahájení
+ provide_your_email_to_start: Zadejte svůj e-mail pro zahájení
+ provide_your_email: Zadejte svůj e-mail
+ provide_your_name_to_start: Zadejte své jméno pro zahájení
+ provide_your_name: Zadejte své jméno
+ provide_your_phone_in_international_format_to_start: Zadejte své telefonní číslo v mezinárodním formátu pro zahájení
+ provide_your_phone_in_international_format: Zadejte své telefonní číslo v mezinárodním formátu
+ use_international_format_1xxx_: 'Použijte mezinárodní formát: +1xxx...'
reason: Důvod
form_expired_at_html: 'Formulář vypršel %{time}'
start: Zahájit
@@ -4555,8 +5843,34 @@ cs:
too_many_attempts: Příliš mnoho pokusů.
verification_code: Ověřovací Kód
resend_code: Znovu Odeslat Kód
+ powered_by: 'Poháněno'
+ count_documents_signed_with_html: '%{count} dokumentů podepsáno pomocí'
+ open_source_documents_software: 'open source software pro dokumenty'
+ eu_data_residency: 'Uložení dat v EU'
+ please_enter_your_email_address_associated_with_the_completed_submission: Zadejte e-mailovou adresu spojenou s dokončeným odesláním.
+ privacy_policy: Zásady Ochrany Osobních Údajů
+ esignature_disclosure: Použití e-podpisu
+ select_data_residency: Vyberte umístění dat
+ company_name: Název společnosti
+ optional: volitelné
+ submit: Odeslat
+ sms_rate_limit_exceeded: Překročena hranice SMS
+ invalid_phone_number: Neplatné telefonní číslo
+ please_contact_the_requester_to_specify_your_phone_number_for_two_factor_authentication: Kontaktujte odesílatele kvůli zadání vašeho čísla pro dvoufázové ověření.
+ we_sent_a_one_time_verification_code_to_your_email_address_please_enter_the_code_below_to_continue: Poslali jsme jednorázový ověřovací kód na váš e-mail. Zadejte ho níže pro pokračování.
+ re_send_code: Znovu odeslat kód
+ email_verification: Ověření e-mailu
+ your_verification_code_to_access_the_name: 'Váš ověřovací kód pro přístup k "%{name}":'
+ please_reply_to_this_email_if_you_didnt_request_this: Odpovězte na tento e-mail, pokud jste o to nežádali.
+ your_user_account_has_been_archived_contact_your_administrator_to_restore_access_to_your_account: Váš uživatelský účet byl archivován. Kontaktujte svého administrátora pro obnovení přístupu.
+ your_email_could_not_be_reached_this_may_happen_if_there_was_a_typo_in_your_address_or_if_your_mailbox_is_not_available_please_contact_support_email_to_log_in: Nepodařilo se dosáhnout na váš e-mail. To se může stát, pokud je v adrese překlep nebo vaše schránka není dostupná. Kontaktujte support@docuseal.com pro přihlášení.
he:
+ require_phone_2fa_to_open: דרוש אימות דו-שלבי באמצעות טלפון לפתיחה
+ the_sender_has_requested_a_two_factor_authentication_via_one_time_password_sent_to_your_html: השולח ביקש אימות דו-שלבי באמצעות סיסמה חד פעמית שנשלחה למספר הטלפון שלך %{phone}.
+ send_verification_code: שלח קוד אימות
+ code_has_been_resent: הקוד נשלח מחדש
+ invalid_code: קוד שגוי
awaiting_completion_by_the_other_party: "המתנה להשלמה מצד הצד השני"
view: תצוגה
hi_there: שלום,
@@ -4574,7 +5888,13 @@ he:
role: תפקיד
reason: סיבה
verification_code_code: 'קוד אימות: %{code}'
- provide_your_email_to_start: ספק את כתובת הדוא"ל שלך כדי להתחיל
+ provide_your_email_to_start: הזן את האימייל שלך כדי להתחיל
+ provide_your_email: הזן את האימייל שלך
+ provide_your_name_to_start: הזן את שמך כדי להתחיל
+ provide_your_name: הזן את שמך
+ provide_your_phone_in_international_format_to_start: הזן את מספר הטלפון שלך בפורמט בינלאומי כדי להתחיל
+ provide_your_phone_in_international_format: הזן את מספר הטלפון שלך בפורמט בינלאומי
+ use_international_format_1xxx_: 'השתמש בפורמט בינלאומי: +1xxx...'
start: התחל
starting: מתחיל
form_expired_at_html: 'הטופס פג תוקף ב- %{time}'
@@ -4614,67 +5934,960 @@ he:
too_many_attempts: יותר מדי ניסיונות.
verification_code: קוד אימות
resend_code: שלח קוד מחדש
+ powered_by: 'מופעל על ידי'
+ count_documents_signed_with_html: '%{count} מסמכים נחתמו באמצעות'
+ open_source_documents_software: 'תוכנה בקוד פתוח למסמכים'
+ eu_data_residency: 'נתונים באיחוד האירופי '
+ please_enter_your_email_address_associated_with_the_completed_submission: 'אנא הזן את כתובת הדוא"ל המשויכת למשלוח שהושלם.'
+ privacy_policy: 'מדיניות פרטיות'
+ esignature_disclosure: 'גילוי חתימה אלקטרונית'
+ select_data_residency: בחר מיקום נתונים
+ company_name: שם החברה
+ optional: אופציונלי
+ submit: 'שלח'
+ sms_rate_limit_exceeded: 'חריגה ממגבלת SMS'
+ invalid_phone_number: 'מספר טלפון לא תקין'
+ please_contact_the_requester_to_specify_your_phone_number_for_two_factor_authentication: 'פנה לשולח כדי לציין את מספרך לאימות דו-שלבי.'
+ we_sent_a_one_time_verification_code_to_your_email_address_please_enter_the_code_below_to_continue: 'שלחנו קוד אימות חד-פעמי לדוא"ל שלך. הזן את הקוד למטה כדי להמשיך.'
+ re_send_code: 'שלח קוד מחדש'
+ email_verification: 'אימות דוא"ל'
+ your_verification_code_to_access_the_name: 'קוד האימות שלך לגישה ל-%{name}:'
+ please_reply_to_this_email_if_you_didnt_request_this: 'השב למייל זה אם לא ביקשת זאת.'
+ your_user_account_has_been_archived_contact_your_administrator_to_restore_access_to_your_account: החשבון שלך הועבר לארכיון. פנה למנהל המערכת כדי לשחזר את הגישה.
+ your_email_could_not_be_reached_this_may_happen_if_there_was_a_typo_in_your_address_or_if_your_mailbox_is_not_available_please_contact_support_email_to_log_in: לא ניתן היה לגשת לדוא"ל שלך. ייתכן שזה קרה עקב שגיאת כתיב בכתובת או אם תיבת הדואר אינה זמינה. אנא פנה ל־support@docuseal.com כדי להתחבר.
-nl:
- awaiting_completion_by_the_other_party: "In afwachting van voltooiing door de andere partij"
+nl: &nl
+ add_from_google_drive: Toevoegen vanuit Google Drive
+ or_add_from: Of toevoegen vanuit
+ upload_a_new_document: Nieuw document uploaden
+ hi_there: Hallo
+ pro: Pro
+ thanks: Bedankt
+ private: Privé
+ select: Selecteer
+ enabled: Ingeschakeld
+ disabled: Uitgeschakeld
+ party: Partij
+ use_direct_file_attachment_links_in_the_documents: Gebruik directe bijlage-links in de documenten
+ click_here_to_send_a_reset_password_email_html: om een e-mail voor wachtwoordherstel te verzenden.
+ edit_order: Volgorde bewerken
+ expirable_file_download_links: Verlopende downloadlinks voor bestanden
+ invite_form_fields: Velden van uitnodigingsformulier
+ default_parties: Standaard partijen
+ authenticate_embedded_form_preview_with_token: Preview van ingesloten formulier authenticeren met token
+ stripe_integration: Stripe-integratie
+ require_all_recipients: Alle ontvangers verplichten
+ stripe_account_has_been_connected: Stripe-account is verbonden.
+ re_connect_stripe: Stripe opnieuw verbinden
+ bcc_recipients: BCC-ontvangers
+ resend_pending: Opnieuw verzenden in behandeling
+ always_enforce_signing_order: Ondertekenvolgorde altijd afdwingen
+ create_templates_with_private_access_by_default: Sjablonen standaard met privétoegang maken
+ ensure_unique_recipients: Unieke ontvangers afdwingen
+ edit_per_party: Per partij bewerken
+ reply_to: Antwoord aan
+ pending_by_me: In afwachting van mij
+ partially_completed: Gedeeltelijk voltooid
+ require_phone_2fa_to_open: Telefoon-2FA vereist om te openen
+ the_sender_has_requested_a_two_factor_authentication_via_one_time_password_sent_to_your_html: De verzender heeft tweeledige verificatie aangevraagd via een eenmalig wachtwoord dat naar uw telefoonnummer %{phone} is verzonden.
+ send_verification_code: Verificatiecode verzenden
+ code_has_been_resent: Code is opnieuw verzonden.
+ invalid_code: Ongeldige code
+ signed: Ondertekend
+ first_party: Eerste partij
+ remove_filter: Filter verwijderen
+ add: Toevoegen
+ adding: Toevoegen
+ owner: Eigenaar
+ select_user: Gebruiker selecteren
+ team_member_permissions: Machtigingen teamleden
+ entire_team: Gehele team
+ admin_only: Alleen admin
+ accessiable_by: Toegankelijk voor
+ team_access: Teamtoegang
+ document_download_filename_format: Bestandsnaamformaat voor documentdownload
+ docuseal_trusted_signature: DocuSeal Vertrouwde handtekening
+ hello_name: Hallo %{name}
+ you_are_invited_to_product_name: U bent uitgenodigd voor %{product_name}
+ you_have_been_invited_to_account_name_product_name_please_sign_up_using_the_link_below_: 'U bent uitgenodigd voor %{account_name} %{product_name}. Meld u aan via de onderstaande link:'
+ sent_using_product_name_in_testing_mode_html: Verzonden met %{product_name} in testmodus
+ sent_using_product_name_free_document_signing_html: Verzonden met %{product_name} gratis documentondertekening.
+ sent_with_docuseal_pro_html: Verzonden met DocuSeal Pro
+ show_send_with_docuseal_pro_attribution_in_emails_html: Toon de vermelding 'Verzonden met DocuSeal Pro' in e-mails
+ ? sign_documents_with_trusted_certificate_provided_by_docu_seal_your_documents_and_data_are_never_shared_with_docu_seal_p_d_f_checksum_is_provided_to_generate_a_trusted_signature
+ : Onderteken documenten met een vertrouwd certificaat geleverd door DocuSeal. Uw documenten en gegevens worden nooit gedeeld met DocuSeal. PDF-checksum wordt verstrekt om een vertrouwde handtekening te genereren.
+ you_have_been_invited_to_submit_the_name_form: U bent uitgenodigd om het formulier "%{name}" in te dienen.
+ you_have_been_invited_to_sign_the_name: U bent uitgenodigd om "%{name}" te ondertekenen.
+ alternatively_you_can_review_and_download_your_copy_using_the_link_below: 'U kunt uw exemplaar ook bekijken en downloaden via de onderstaande link:'
+ please_check_the_copy_of_your_name_in_the_email_attachments: Controleer de kopie van uw "%{name}" in de e-mailbijlagen.
+ awaiting_completion_by_the_other_party: In afwachting van voltooiing door de andere partij
+ review_and_sign: Bekijken en ondertekenen
+ review_and_submit: Bekijken en indienen
+ please_contact_us_by_replying_to_this_email_if_you_have_any_questions: Neem contact met ons op door op deze e-mail te antwoorden als u vragen heeft.
+ submitter_invitation_sms_body_sign: "{account.name} heeft u uitgenodigd om een document te ondertekenen: {submitter.link}"
+ verification_code_sms_body: 'Verificatiecode: {code}'
+ you_are_invited_to_submit_a_form: U bent uitgenodigd om een formulier in te dienen
+ you_are_invited_to_sign_a_document: U bent uitgenodigd om een document te ondertekenen
+ you_are_invited_to_sign_documents: U bent uitgenodigd om documenten te ondertekenen
+ your_document_copy: Uw documentkopie
+ name_has_been_completed_by_submitters: '"%{name}" is voltooid door %{submitters}.'
+ template_name_has_been_completed_by_submitters: "{template.name} is voltooid door {submission.submitters}"
+ submitter_invitation_email_sign_body: |
+ Hallo,
+
+ U bent uitgenodigd om "{template.name}" te ondertekenen.
+
+ [Bekijken en ondertekenen]({submitter.link})
+
+ Neem contact met ons op door op deze e-mail te antwoorden als u vragen heeft.
+
+ Bedankt,
+ {account.name}
+ submitter_completed_email_body: |
+ Hallo,
+
+ "{template.name}" is voltooid door {submission.submitters}
+
+ {submission.link}
+ submitter_documents_copy_email_body: |
+ Hallo,
+
+ Controleer de kopie van uw "{template.name}" in de e-mailbijlagen.
+ U kunt uw exemplaar ook bekijken en downloaden via de onderstaande link:
+
+ [{template.name}]({documents.link})
+
+ Bedankt,
+ {account.name}
view: Bekijken
- hi_there: Hallo,
- download: Downloaden
- decline: Weigeren
- declined: Geweigerd
- decline_reason: Weigeringsreden
- provide_a_reason: Geef een reden op
- notify_the_sender_with_the_reason_you_declined: Informeer de afzender over de reden waarom je hebt geweigerd
- form_has_been_declined_on_html: 'Formulier is afgewezen op %{time}'
- name_declined_by_submitter: '"%{name}" is geweigerd door %{submitter}'
- name_declined_by_submitter_with_the_following_reason: '"%{name}" is geweigerd door %{submitter} met de volgende reden:'
email: E-mail
+ form_expired_at_html: Formulier verlopen op %{time}
+ verification_code_code: 'Verificatiecode: %{code}'
digitally_signed_by: Digitaal ondertekend door
role: Rol
- verification_code_code: 'Verificatiecode: %{code}'
- provide_your_email_to_start: Geef uw e-mailadres om te beginnen
- start: Start
reason: Reden
- form_expired_at_html: 'Formulier is verlopen op %{time}'
+ provide_your_email_to_start: Vul uw e-mailadres in om te beginnen
+ provide_your_email: Vul uw e-mailadres in
+ provide_your_name_to_start: Vul uw naam in om te beginnen
+ provide_your_name: Vul uw naam in
+ provide_your_phone_in_international_format_to_start: Vul uw telefoonnummer in internationaal formaat in om te beginnen
+ provide_your_phone_in_international_format: Vul uw telefoonnummer in internationaal formaat in
+ start: Start
+ enforce_recipients_order: Volgorde van ontvangers afdwingen
starting: Starten
- invited_by_html: 'Uitgenodigd door %{name}'
+ invited_by_html: Uitgenodigd door %{name}
you_have_been_invited_to_submit_a_form: U bent uitgenodigd om een formulier in te dienen
- signed_on_time: 'Ondertekend op %{time}'
- completed_on_time: 'Voltooid op %{time}'
- document_has_been_signed_already: 'Het document is al ondertekend'
+ signed_on_time: Ondertekend op %{time}
+ completed_on_time: Voltooid op %{time}
+ document_has_been_signed_already: Document is al ondertekend
form_has_been_submitted_already: Formulier is al ingediend
- send_copy_to_email: Stuur kopie naar E-mail
- sending: Voltooien
+ send_copy_to_email: Kopie naar e-mail verzenden
+ sending: Verzenden
resubmit: Opnieuw indienen
- form_has_been_deleted_by_html: 'Formulier is verwijderd door %{name}.'
+ form_has_been_deleted_by_html: Formulier is verwijderd door %{name}.
or: of
download_documents: Documenten downloaden
downloading: Downloaden
+ download: Downloaden
+ decline: Weigeren
+ declined: Geweigerd
+ decline_reason: Reden van weigering
+ provide_a_reason: Geef een reden op
+ notify_the_sender_with_the_reason_you_declined: Informeer de verzender over de reden van uw weigering
+ form_has_been_declined_on_html: Formulier is geweigerd op %{time}
+ name_declined_by_submitter: '"%{name}" geweigerd door %{submitter}'
+ name_declined_by_submitter_with_the_following_reason: '"%{name}" is geweigerd door %{submitter} met de volgende reden:'
completed_successfully: Succesvol voltooid
password: Wachtwoord
sign_in: Inloggen
- signing_in: Aan het inloggen
+ signing_in: Bezig met inloggen
sign_in_with_microsoft: Inloggen met Microsoft
sign_in_with_google: Inloggen met Google
forgot_your_password_: Wachtwoord vergeten?
create_free_account: Gratis account aanmaken
- already_have_an_account: Heb je al een account?
+ already_have_an_account: Al een account?
first_name: Voornaam
last_name: Achternaam
- sign_up: Aanmelden
- signing_up: Aanmelden bezig
+ sign_up: Registreren
+ signing_up: Bezig met registreren
profile_details: Profielgegevens
- sign_up_with_google: Aanmelden met Google
- sign_up_with_microsoft: Aanmelden met Microsoft
- by_creating_an_account_you_agree_to_our_html: 'Door een account aan te maken, ga je akkoord met ons Privacybeleid en onze Gebruiksvoorwaarden.'
- enter_email_to_continue: Voer e-mail in om door te gaan
+ sign_up_with_google: Registreren met Google
+ sign_up_with_microsoft: Registreren met Microsoft
+ by_creating_an_account_you_agree_to_our_html: Door een account aan te maken gaat u akkoord met ons Privacybeleid en onze Servicevoorwaarden.
+ enter_email_to_continue: Voer e-mailadres in om door te gaan
+ account: Account
+ preferences: Voorkeuren
+ company_name: Bedrijfsnaam
+ time_zone: Tijdzone
+ language: Taal
+ app_url: App-URL
+ update: Bijwerken
+ updating: Bijwerken
+ force_2fa_with_authenticator_app: 2FA afdwingen met authenticator-app
+ add_signature_id_to_the_documents: Handtekening-ID toevoegen aan de documenten
+ require_signing_reason: Reden voor ondertekening verplicht stellen
+ allow_typed_text_signatures: Handtekeningen met getypte tekst toestaan
+ allow_to_resubmit_completed_forms: Opnieuw indienen van voltooide formulieren toestaan
+ allow_to_decline_documents: Weigeren van documenten toestaan
+ remember_and_pre_fill_signatures: Handtekeningen onthouden en vooraf invullen
+ require_authentication_for_file_download_links: Authenticatie vereisen voor links naar bestandsdownloads
+ combine_completed_documents_and_audit_log: Voltooide documenten en auditlogboek combineren
+ salesforce_integration: Salesforce-integratie
+ salesforce_has_been_connected: Salesforce is verbonden.
+ connect_salesforce_account_to_integrate_with_docuseal: Verbind een Salesforce-account om te integreren met DocuSeal
+ re_connect_salesforce: Salesforce opnieuw verbinden
+ connect_salesforce: Salesforce verbinden
+ danger_zone: Gevaarzone
+ delete_my_account: Mijn account verwijderen
+ you_are_scheduling_your_account_for_deletion_after_deletion_your_data_will_be_permanently_removed_and_cannot_be_recovered_click_ok_if_you_would_like_to_continue: "U plant uw account voor verwijdering. Na verwijdering worden uw gegevens permanent verwijderd en kunnen ze niet worden hersteld.\n\nKlik op OK als u wilt doorgaan."
+ account_information_has_been_updated: Accountinformatie is bijgewerkt.
+ should_be_a_valid_url: moet een geldige URL zijn
+ your_account_removal_request_will_be_processed_within_2_months_please_contact_us_if_you_want_to_keep_your_account: Uw verzoek tot verwijdering van uw account wordt binnen 2 maanden verwerkt. Neem contact met ons op als u uw account wilt behouden.
+ test_mode: Testmodus
+ copy: Kopiëren
+ copied: Gekopieerd
+ rotate: Draaien
+ remove_existing_api_token_and_generated_a_new_one_are_you_sure_: Bestaand API-token verwijderen en een nieuw genereren. Weet u het zeker?
+ request_signature_multiple_submitters_with_default_values: Handtekening aanvragen, meerdere inzenders met standaardwaarden
+ request_signature_single_submitter: Handtekening aanvragen, één inzender
+ template_details: Sjabloondetails
+ open_full_api_reference: Volledige API-referentie openen
+ api_token_has_been_updated: API-token is bijgewerkt.
+ change_your_password: Wijzig uw wachtwoord
+ new_password: Nieuw wachtwoord
+ minimum_password_length_characters_minimum: Minimaal %{minimum_password_length} tekens
+ confirm_new_password: Nieuw wachtwoord bevestigen
+ change_my_password: Mijn wachtwoord wijzigen
+ changing_password: Wachtwoord wijzigen
+ reset_password: Wachtwoord resetten
+ resetting_password: Wachtwoord resetten
+ sign_in_with_name_account: Inloggen met %{name}-account
+ two_factor_code_from_authenticator_app: Twee-factorcode van authenticator-app
+ sign_up_in_docuseal_console_to_upgrade_on_premises_app_is_completely_standalone_console_is_used_only_to_manage_your_license: Meld u aan in de DocuSeal Console om te upgraden. De on-premises app is volledig zelfstandig; de Console wordt alleen gebruikt om uw licentie te beheren.
+ send_from_email: Verzenden vanaf e-mailadres
+ optional: optioneel
+ save: Opslaan
+ saving: Opslaan
+ changes_have_been_saved: Wijzigingen zijn opgeslagen.
+ unlock_with_docuseal_pro: Ontgrendel met DocuSeal Pro
+ use_your_own_certificates_to_sign_and_verify_pdf_files: Gebruik uw eigen certificaten om PDF-bestanden te ondertekenen en te verifiëren.
+ upload_certificate: Certificaat uploaden
+ name: Naam
+ file: Bestand
+ use_a_valid_der_p12_or_pfx_file: Gebruik een geldig .der-, .p12- of .pfx-bestand.
+ submit: Indienen
+ submitting: Indienen
+ pdf_signature: PDF-handtekening
+ upload_signed_pdf_file_to_validate_its_signature_: 'Upload een ondertekend PDF-bestand om de handtekening te valideren:'
+ analyzing: Analyseren
+ verify_signed_pdf: Ondertekende PDF verifiëren
+ click_to_upload_or_drag_and_drop_html: Klik om te uploaden of sleep bestanden hierheen
+ click_to_upload_or_drag_and_drop_files_html: Klik om te uploaden of sleep bestanden
+ signing_certificates: Ondertekeningscertificaten
+ upload_cert: Certificaat uploaden
+ valid_to: Geldig tot
+ status: Status
+ make_default: Als standaard instellen
+ remove: Verwijderen
+ removing: Verwijderen
+ delete: Verwijderen
+ default: Standaard
+ are_you_sure_: Weet u het zeker?
+ timestamp_server: Tijdstempelserver
+ timeserver_url: Timeserver-URL
+ url_of_the_trusted_rfc_3161_timeserver_to_be_used_to_generate_timestamp_signatures: URL van de vertrouwde RFC 3161-tijdserver die wordt gebruikt om tijdstempelhandtekeningen te genereren.
+ apply_multiple_pdf_digital_signatures_in_the_document_per_each_signer: Meerdere PDF-digitale handtekeningen in het document toepassen, per ondertekenaar
+ remove_pdf_form_fillable_fields_from_the_signed_pdf_flatten_form: Invulbare PDF-formuliervelden verwijderen uit de ondertekende PDF (formulier vlak maken)
+ certificate_has_been_successfully_added: Certificaat is succesvol toegevoegd.
+ default_certificate_has_been_selected: Standaardcertificaat is geselecteerd.
+ certificate_has_been_removed: Certificaat is verwijderd.
+ already_exists: bestaat al.
+ welcome_to_product_name: Welkom bij %{product_name}
+ set_password: Wachtwoord instellen
+ confirm_password: Wachtwoord bevestigen
+ save_password_and_sign_in: Wachtwoord opslaan en inloggen
+ use_an_authenticator_mobile_app_like_google_authenticator_or_1password_to_scan_the_qr_code_below: Gebruik een mobiele authenticator-app zoals Google Authenticator of 1Password om de onderstaande QR-code te scannen.
+ remove_2fa: 2FA verwijderen
+ setup_2fa: 2FA instellen
+ 2fa_has_been_configured: 2FA is geconfigureerd.
+ code_is_invalid: Code is ongeldig
+ 2fa_has_been_removed: 2FA is verwijderd.
+ 2fa_has_been_set_up_already: 2FA is al ingesteld.
+ developer_newsletters: Nieuwsbrieven voor ontwikkelaars
+ skip: Overslaan
+ email_notifications: E-mailmeldingen
+ receive_notification_emails_on_completed_submission: Ontvang e-mailmeldingen bij voltooide inzendingen
+ completed_documents_notification_bcc_address: BCC-adres voor melding voltooide documenten
+ sign_request_email_reminders: E-mailherinneringen voor ondertekenverzoeken
+ send_automatic_email_reminders_to_your_recipients: Stuur automatische e-mailherinneringen naar uw ontvangers.
+ first_reminder_in: Eerste herinnering over
+ second_reminder_in: Tweede herinnering over
+ third_reminder_in: Derde herinnering over
+ learn_more: Meer informatie
+ unable_to_save: Kan niet opslaan.
+ invalid_timeserver: Ongeldige tijdserver
+ email_templates: E-mailsjablonen
+ signature_request_email: E-mail voor handtekeningverzoek
+ signature_request_reminder_email: E-mailherinnering voor handtekeningverzoek
+ signature_request_sms: SMS voor handtekeningverzoek
+ verification_code_sms: Verificatiecode-SMS
+ completed_notification_email: E-mailmelding voltooid
+ company_logo: Bedrijfslogo
+ submission_form: Indieningsformulier
+ completed_form_message: Bericht voltooid formulier
+ completed_form_redirect_button: Knop voor doorverwijzing na voltooid formulier
+ documents_copy_email: E-mail met kopie van documenten
+ form_custom_css: Aangepaste CSS voor formulier
+ subject: Onderwerp
+ body: Inhoud
+ text_message: Tekstbericht
+ title: Titel
+ button_title: Knoptekst
+ button_url: Knop-URL
+ upload_logo: Logo uploaden
+ show_confetti_on_successful_completion: Confetti tonen na succesvolle voltooiing
+ attach_audit_log_pdf: Auditlogboek-PDF bijvoegen
+ attach_documents: Documenten bijvoegen
+ settings_have_been_saved: Instellingen zijn opgeslagen.
+ display_your_company_name_and_logo_when_signing_documents: Toon uw bedrijfsnaam en logo bij het ondertekenen van documenten.
+ profile: Profiel
+ signature: Handtekening
+ update_signature: Handtekening bijwerken
+ unable_to_save_signature: Kan handtekening niet opslaan.
+ signature_has_been_saved: Handtekening is opgeslagen.
+ signature_has_been_removed: Handtekening is verwijderd.
+ initials: Initialen
+ update_initials: Initialen bijwerken
+ unable_to_save_initials: Kan initialen niet opslaan.
+ initials_has_been_saved: Initialen zijn opgeslagen.
+ initials_has_been_removed: Initialen zijn verwijderd.
+ change_password: Wachtwoord wijzigen
+ two_factor_authentication: Tweeledige verificatie
+ 2fa_is_not_configured: 2FA is niet geconfigureerd
+ set_up_2fa: 2FA instellen
+ contact_information_has_been_update: Contactgegevens zijn bijgewerkt.
+ password_has_been_changed: Wachtwoord is gewijzigd.
+ email_integration: E-mailintegratie
+ send_via_connected_email: Verzenden via gekoppeld e-mailaccount
+ activate_with_docuseal_pro: Activeren met DocuSeal Pro
+ send_signature_request_to_your_recipients_directly_from_your_email: Stuur een ondertekenverzoek rechtstreeks vanuit uw eigen e-mail naar uw ontvangers
+ connect_gmail: Gmail verbinden
+ re_connect_gmail: Gmail opnieuw verbinden
+ connect_microsoft: Microsoft verbinden
+ re_connect_microsoft: Microsoft opnieuw verbinden
+ gmail_has_been_connected: Gmail is verbonden.
+ microsoft_account_has_been_connected: Microsoft-account is verbonden.
+ but_not_activated: maar niet geactiveerd
+ email_has_been_sent: E-mail is verzonden.
+ email_has_been_sent_already: E-mail is al verzonden.
+ initial_setup: Initiële configuratie
+ demo_environment: Demo-omgeving
+ close: Sluiten
+ upgrade: Upgraden
+ settings: Instellingen
+ console: Console
+ verify_pdf: PDF verifiëren
+ sign_out: Afmelden
+ page_number: Pagina %{number}
+ powered_by: Aangedreven door
+ count_documents_signed_with_html: "%{count} documenten ondertekend met"
+ storage: Opslag
+ notifications: Meldingen
+ e_signature: E-handtekening
+ personalization: Personalisatie
+ users: Gebruikers
+ plans: Abonnementen
+ new: Nieuw
+ embedding: Insluiten
+ background_jobs: Achtergrondtaken
+ need_help_ask_a_question_: 'Hulp nodig? Stel een vraag:'
+ exit: Afsluiten
+ leave: Verlaten
+ impersonated_as: Geïmpersonificeerd als
+ ask_ai: AI vragen
+ ai_assistant: AI-assistent
+ discord_community: Discord-community
+ integrations: Integraties
+ teams: Teams
+ tenants: Tenants
+ send_signature_requests_via_sms: Ondertekenverzoeken via SMS verzenden
+ twilio_settings: Twilio-instellingen
+ webhook_settings: Webhook-instellingen
+ sending_sms: SMS verzenden
+ from: Van
+ account_sid: Account SID
+ send_sms_via_webhook: SMS verzenden via webhook
+ webhook_integration_allows_to_send_sms_using_any_provider: Webhook-integratie maakt het mogelijk SMS te verzenden met elke provider
+ test: Test
+ single_sign_on_with_saml_2_0: Single Sign-On met SAML 2.0
+ force_sso_disable_login_with_email_and_password: SSO afdwingen (inloggen met e-mail en wachtwoord uitschakelen)
+ for_aws_s3_compatible_apis_like_minio: Voor AWS S3-compatibele API's zoals MinIO.
+ store_all_files_on_disk: Alle bestanden op schijf opslaan
+ no_configs_are_needed_but_make_sure_your_disk_is_persistent: Geen configuraties nodig, maar zorg ervoor dat uw schijf persistent is
+ not_suitable_for_heroku_and_other_paas: Niet geschikt voor Heroku en andere PaaS
+ bulk_send_from_excel_xlsx_or_csv: Bulkverzenden vanuit Excel XLSX of CSV
+ add_new: Nieuw toevoegen
+ add_recipients: Ontvangers toevoegen
+ add_new_recipients: Nieuwe ontvangers toevoegen
+ add_recipients_html: Toevoegen ontvangers
+ type_emails_here: Typ hier e-mailadressen
+ or_embed_on_your_website: Of insluiten op uw website
+ phone: Telefoon
+ send_emails: E-mails verzenden
+ edit_message: Bericht bewerken
+ smtp_not_configured: SMTP niet geconfigureerd
+ configure_smtp_settings_in_order_to_send_emails_: 'Configureer de SMTP-instellingen om e-mails te kunnen verzenden:'
+ go_to_smtp_settings: Ga naar SMTP-instellingen
+ save_as_default_template_message: Opslaan als standaard sjabloonbericht
+ re_send_sms: SMS opnieuw verzenden
+ send_sms: SMS verzenden
+ preserve_order: Volgorde behouden
+ when_checked_notifications_will_be_sent_to_the_second_party_once_the_form_is_completed_by_the_previous_party_uncheck_this_option_to_send_notifications_to_all_parties_simultaneously_right_away: Indien aangevinkt worden meldingen naar de tweede partij verzonden zodra de voorgaande partij het formulier heeft voltooid. Schakel deze optie uit om meldingen direct tegelijk naar alle partijen te sturen.
+ upgrade_to_send_unlimited_signature_requests: Upgrade om onbeperkte ondertekenverzoeken te verzenden
+ add_without_sending: Toevoegen zonder te verzenden
+ upgade_now: Nu upgraden
+ send_signature_request_emails_without_limits_with_docuseal_pro: Verzend onbeperkt e-mails voor ondertekenverzoeken met DocuSeal Pro
+ count_emails_used: "%{count} e-mails gebruikt"
+ has_been_connected: is verbonden
+ sms_not_configured: SMS niet geconfigureerd
+ configure_sms_settings_in_order_to_send_text_messages_: 'Configureer de SMS-instellingen om tekstberichten te kunnen verzenden:'
+ go_to_sms_settings: Ga naar SMS-instellingen
+ back_to_active: Terug naar Actief
+ submissions: Inzendingen
+ templates: Sjablonen
+ document_templates_html: Documentsjablonen
+ archived: Gearchiveerd
+ search: Zoeken
+ submissions_not_found: Geen inzendingen gevonden
+ create: Aanmaken
+ view_archived: Archief bekijken
+ all: Alle
+ pending: In behandeling
+ completed: Voltooid
+ primarily_opened_with_microsoft_excel_other_options_include_google_sheets_libreoffice_calc_and_openoffice_calc: Wordt voornamelijk geopend met Microsoft Excel. Andere opties zijn Google Sheets, LibreOffice Calc en OpenOffice Calc.
+ can_be_opened_with_microsoft_excel_google_sheets_or_any_text_editor_like_notepad: Kan worden geopend met Microsoft Excel, Google Sheets of een teksteditor zoals Kladblok.
+ draw_signature: Handtekening tekenen
+ clear: Wissen
+ signature_uploaded: Handtekening geüpload
+ submission_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: Het verwijderen van de inzending is onomkeerbaar en verwijdert permanent alle bijbehorende ondertekende documenten. Weet u het zeker?
+ return_back_to_your_desktop_device_to_complete_the_form_or_continue_on_mobile_html: Ga terug naar uw desktopapparaat om het formulier te voltooien of ga verder op mobiel
+ template_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: Het verwijderen van het sjabloon is onomkeerbaar en verwijdert permanent alle bijbehorende ondertekende documenten. Weet u het zeker?
+ rename_folder: Map hernoemen
+ folder_name: Mapnaam
+ rename: Hernoemen
+ home: Start
+ templates_not_found: Geen sjablonen gevonden
+ upload_new_document: Nieuw document uploaden
+ uploading: Uploaden
+ expired: Verlopen
+ sign_now: Onderteken
+ archive: Archiveren
+ archiving: Archiveren
+ restore: Herstellen
+ restoring: Herstellen
+ clone: Klonen
+ edit: Bewerken
+ move: Verplaatsen
+ moving: Verplaatsen
+ preview: Voorbeeld
+ upload: Uploaden
+ clone_template: Sjabloon klonen
+ new_document_template: Nieuwe documentsjabloon
+ document_name: Documentnaam
+ change_folder: Map wijzigen
+ shared: gedeeld
+ export: Exporteren
+ there_are_no_submissions: Er zijn geen inzendingen
+ send_an_invitation_to_fill_and_complete_the_form: Stuur een uitnodiging om het formulier in te vullen en te voltooien
+ send_to_recipients: Verzenden naar ontvangers
+ sign_it_yourself: Zelf ondertekenen
+ api_and_embedding: API en insluiten
+ template_id: Sjabloon-ID
+ embedding_url: Insluitings-URL
+ share_template_with_test_mode: Sjabloon delen met testmodus
+ share_template_with_all_tenants: Sjabloon delen met alle tenants
+ use_following_placeholders_text_: 'Gebruik de volgende placeholder-teksten:'
+ users_count_total_users_count_pro_users_limit_was_reached_to_invite_additional_users_please_purchase_more_pro_user_seats_via_the_manage_plan_button: "%{users_count}/%{total_users_count} Pro-gebruikerslimiet is bereikt. Koop meer Pro-gebruikersplaatsen via de knop ''Abonnement beheren'' om extra gebruikers uit te nodigen."
+ move_into_folder: Verplaatsen naar map
+ new_folder_name: Nieuwe mapnaam
+ new_subfolder_name: Nieuwe submapnaam
+ change_parent_folder: Bovenliggende map wijzigen
+ folder: Map
+ create_a_new_folder: Nieuwe map maken
+ exit_preview: Voorbeeld sluiten
+ general: Algemeen
+ recipients: Ontvangers
+ form_preferences: Formuliervoorkeuren
+ redirect_on_completion_url: URL voor doorverwijzing na voltooiing
+ completion_message: Voltooiingsbericht
+ email_subject: E-mailonderwerp
+ email_body: E-mailtekst
+ attach_audit_log_pdf_to_the_email: Auditlogboek-PDF aan de e-mail toevoegen
+ send_emails_automatically_on_completion: E-mails automatisch verzenden na voltooiing
+ attach_documents_to_the_email: Documenten aan de e-mail toevoegen
+ not_specified: Niet gespecificeerd
+ submission_requester: Aanvrager van inzending
+ specified_email: Opgegeven e-mail
+ invite_by_name: Uitnodigen door %{name}
+ same_as_name: Zelfde als %{name}
+ default_email: Standaard e-mail
+ processing: Verwerken
+ upload_initials: Initialen uploaden
+ draw: Tekenen
+ upload_signature: Handtekening uploaden
+ integration: Integratie
+ admin: Beheerder
+ tenant_admin: Tenantbeheerder
+ editor: Bewerker
+ viewer: Lezer
+ member: Lid
+ agent: Agent
+ superadmin: Superbeheerder
+ edit_user: Gebruiker bewerken
+ new_user: Nieuwe gebruiker
+ unarchive: Dearchiveren
+ last_session: Laatste sessie
+ unlock_more_user_roles_with_docuseal_pro: Ontgrendel meer gebruikersrollen met DocuSeal Pro.
+ view_active: Actieve items bekijken
+ team_account: Teamaccount
+ team_accounts: Teamaccounts
+ tenant_account: Tenantaccount
+ tenant_accounts: Tenantaccounts
+ impersonate: Impersoneren
+ loading: Laden
+ documents: Documenten
+ accounts: Accounts
+ edit_account: Account bewerken
+ new_team: Nieuw team
+ new_tenant: Nieuwe tenant
+ remove_team: Team verwijderen
+ remove_tenant: Tenant verwijderen
+ replace: Vervangen
+ allow_tenant_admins_to_invite_new_users: Sta tenantbeheerders toe nieuwe gebruikers uit te nodigen
+ manage_multiple_teams: Meerdere teams beheren
+ api_key: API-sleutel
+ logo: Logo
+ back: Terug
+ add_secret: Geheim toevoegen
+ edit_secret: Geheim bewerken
+ submission_example_payload: Voorbeeldpayload inzending
+ there_are_no_signatures: Er zijn geen handtekeningen
+ signed_with_trusted_certificate: Ondertekend met vertrouwd certificaat
+ signed_with_external_certificate: Ondertekend met extern certificaat
+ setup_2fa_to_continue: Stel 2FA in om door te gaan.
+ create_a_new_account: Maak een nieuw account aan.
+ you_are_already_signed_in: U bent al aangemeld.
+ please_sign_in: Log in alstublieft.
+ not_found: Niet gevonden
+ new_recipients_have_been_added: Nieuwe ontvangers zijn toegevoegd.
+ submission_has_been_removed: Inzending is verwijderd.
+ submission_has_been_archived: Inzending is gearchiveerd.
+ form_has_been_completed_already: Formulier is al voltooid.
+ form_has_been_archived: Formulier is gearchiveerd.
+ form_has_been_expired: Formulier is verlopen.
+ form_has_been_declined: Formulier is geweigerd.
+ file_is_missing: Bestand ontbreekt
+ folder_name_has_been_updated: Mapnaam is bijgewerkt.
+ unable_to_rename_folder: Kan map niet hernoemen.
+ template_has_been_removed: Sjabloon is verwijderd.
+ template_has_been_archived: Sjabloon is gearchiveerd.
+ template_has_been_cloned: Sjabloon is gekloond.
+ document_template_has_been_moved: Documentsjabloon is verplaatst.
+ unable_to_move_template_into_folder: Kan sjabloon niet naar map verplaatsen.
+ template_has_been_unarchived: Sjabloon is gedearchiveerd.
+ submission_has_been_unarchived: Inzending is gedearchiveerd.
+ unable_to_update_file: Kan bestand niet uploaden.
+ user_has_been_invited: Gebruiker is uitgenodigd.
+ unable_to_update_user: Kan gebruiker niet bijwerken.
+ user_has_been_updated: Gebruiker is bijgewerkt.
+ unable_to_remove_user: Kan gebruiker niet verwijderen.
+ user_has_been_removed: Gebruiker is verwijderd.
+ invalid_pdf: Ongeldige PDF
+ webhook_secret_has_been_saved: Webhook-geheim is opgeslagen.
+ webhook_url_has_been_saved: Webhook-URL is opgeslagen.
+ webhook_request_has_been_sent: Webhook-verzoek is verzonden.
+ webhook_url_has_been_updated: Webhook-URL is bijgewerkt.
+ webhook_url_has_been_deleted: Webhook-URL is verwijderd.
+ unable_to_resend_webhook_request: Kan webhook-verzoek niet opnieuw verzenden.
+ new_webhook: Nieuwe webhook
+ delete_webhook: Webhook verwijderen
+ count_submissions_have_been_created: "%{count} inzendingen zijn aangemaakt."
+ sms_length_cant_be_longer_than_120_bytes: SMS-lengte mag niet langer zijn dan 120 bytes
+ connected_successfully: Succesvol verbonden.
+ user_nameid_not_found: Gebruiker %{nameid} niet gevonden.
+ sso_settings_have_been_updated: SSO-instellingen zijn bijgewerkt.
+ sms_has_been_sent: SMS is verzonden.
+ account_has_been_created: Account is aangemaakt.
+ account_has_been_updated: Account is bijgewerkt.
+ account_has_been_removed: Account is verwijderd.
+ logo_has_been_uploaded: Logo is geüpload.
+ invalid_file_type: Ongeldig bestandstype
+ upload_file: Bestand uploaden
+ upgrade_your_plan_to_invite_more_users_contact_email: Upgrade uw abonnement om meer gebruikers uit te nodigen (contact %{email}).
+ contact_your_admin_email_to_invite_more_users: Neem contact op met uw beheerder %{email} om meer gebruikers uit te nodigen.
+ contact_your_administrator_to_add_new_users: Neem contact op met uw beheerder om een nieuwe gebruiker toe te voegen
+ one_hour: 1 uur
+ two_hours: 2 uur
+ four_hours: 4 uur
+ eight_hours: 8 uur
+ twelve_hours: 12 uur
+ twenty_four_hours: 24 uur
+ two_days: 2 dagen
+ four_days: 4 dagen
+ eight_days: 8 dagen
+ fifteen_days: 15 dagen
+ twenty_one_days: 21 dagen
+ thirty_days: 30 dagen
+ free: Gratis
+ unlimited_documents_storage: Onbeperkte documentopslag
+ users_management: Gebruikersbeheer
+ ten_filed_types: 10 veldtypen
+ multiple_signers: Meerdere ondertekenaars
+ automatic_esignature: Automatische e-handtekening
+ ten_signature_request_emails_per_month: 10 e-mails met verzoeken/maand
+ unlimited_sign_yourself: Onbeperkt zelf ondertekenen
+ free_developer_testing_sandbox: Gratis test-sandbox voor devs
+ continue_with_free_basic: Doorgaan met Free Basic
+ unlimited_signature_request_emails: Onbeperkte ondertekenverzoeken
+ your_company_logo: Uw bedrijfslogo
+ connect_own_email_address: Eigen e-mailadres koppelen
+ personalize_email_content: E-mailinhoud personaliseren
+ automated_reminders: Geautomatiseerde herinneringen
+ bulk_send_from_spreadsheet: Bulkverzenden vanuit spreadsheet
+ identify_verification_via_sms: Identiteitsverificatie via SMS
+ start_with_pro: Starten met Pro
+ user_month: gebruiker / maand
+ developer_sandbox: Ontwikkelaars-sandbox.
+ upgrade_to_start_using_in_production_html: Upgrade om in productie te gaan gebruiken.
+ download_combined_pdf: Gecombineerde PDF downloaden
+ audit_log: Auditlogboek
+ signers: Ondertekenaars
+ not_invited_yet: Nog niet uitgenodigd
+ not_completed_yet: Nog niet voltooid
+ declined_on_time: Geweigerd op %{time}
+ expire_on_time: Verloopt op %{time}
+ sign_in_person: In persoon ondertekenen
+ create_a_new_template_document_form_or_submit_the_existing_one_html: Maak een nieuw sjabloon voor een documentformulier of dien het bestaande in
+ send_email_copy_with_completed_documents_to_a_specified_bcc_address: Stuur een e-mailkopie met voltooide documenten naar een opgegeven BCC-adres.
+ re_send_email: E-mail opnieuw verzenden
+ send_email: E-mail verzenden
+ copy_share_link: Deellink kopiëren
+ copied_to_clipboard: Gekopieerd naar klembord
+ link: Link
+ via_email: via e-mail
+ via_phone: via telefoon
+ detailed: Gedetailleerd
+ upload_list: Lijst uploaden
+ creating: Aanmaken
+ open_source_documents_software: open-sourcesoftware voor documenten
+ copy_link: Link kopiëren
+ opened: Geopend
+ sent: Verzonden
+ awaiting: Wachten
+ document_id: Document-ID
+ envelope_id: Envelop-ID
+ event_log: Gebeurtenissenlogboek
+ verify: Verifiëren
+ testing_log_not_for_production_use: Testlogboek - Niet voor productiegebruik
+ original_sha256: Oorspronkelijke SHA256
+ result_sha256: Resultaat SHA256
+ generated_at: Gegenereerd op
+ email_verification: E-mailverificatie
+ phone_verification: Telefoonverificatie
+ session_id: Sessie-ID
+ option: Optie
+ text_field: Tekstveld
+ signature_field: Handtekeningveld
+ initials_field: Initialenveld
+ date_field: Datumveld
+ number_field: Getalveld
+ image_field: Afbeeldingsveld
+ file_field: Bestandsveld
+ select_field: Selectieveld
+ checkbox_field: Aankruisvakje
+ multiple_field: Meerkeuzeveld
+ radio_field: Radiogroepveld
+ cells_field: Cellenveld
+ stamp_field: Stempelveld
+ payment_field: Betalingsveld
+ phone_field: Telefoonveld
+ verification_field: Identiteitsverificatie
+ identity_verification: Identiteitsverificatie
+ paid_price: Betaald %{price}
+ verified: Geverifieerd
+ unverified: Niet geverifieerd
+ document: Document
+ completed_at: Voltooid op
+ edit_recipient: Ontvanger bewerken
+ update_recipient: Ontvanger bijwerken
+ use_international_format_1xxx_: 'Gebruik internationaal formaat: +1xxx...'
+ submitter_cannot_be_updated: Inzender kan niet worden bijgewerkt.
+ at_least_one_field_must_be_filled: Er moet minstens één veld worden ingevuld.
+ archived_users: Gearchiveerde gebruikers
+ embedding_users: Gebruikers voor insluiten
+ view_embedding_users: Insluitgebruikers bekijken
+ key: Sleutel
+ value: Waarde
+ webhook_secret: Webhook-geheim
+ author: Auteur
+ to: Aan
+ created_at: Aangemaakt
+ apply: Toepassen
+ applying: Toepassen
+ today: Vandaag
+ yesterday: Gisteren
+ this_week: Deze week
+ last_week: Afgelopen week
+ this_month: Deze maand
+ last_month: Afgelopen maand
+ this_year: Dit jaar
+ policy_links: Beleidskoppelingen
+ markdown_content_e_g: Markdown-inhoud, bijv.
+ privacy_policy: Privacybeleid
the_code_has_been_sent_to_your_email: De code is naar uw e-mail verzonden.
enter_the_verification_code_from_your_email: Voer de verificatiecode uit uw e-mail in.
too_many_attempts: Te veel pogingen.
verification_code: Verificatiecode
- resend_code: Code Opnieuw Verzenden
+ resend_code: Code opnieuw verzenden
+ verify_new_sign_in: Nieuwe aanmelding verifiëren
+ use_otp_code_to_sign_in_or_click_the_link_below_html: 'Gebruik de code %{code} om in te loggen of klik op de onderstaande link:'
+ complete_sign_in: Inloggen voltooien
+ please_reply_to_this_email_if_you_dont_recognize_this_sign_in_attempt: Reageer op deze e-mail als u deze aanmeldpoging niet herkent.
+ docuseal_support: DocuSeal Support
+ use_the_edit_form_to_move_it_to_another_team: Gebruik het bewerkingsformulier om het naar een ander team te verplaatsen.
+ too_many_sms_attempts_try_again_in_a_few_seconds: Te veel SMS-pogingen. Probeer het over enkele seconden opnieuw.
+ number_phone_number_is_invalid: Telefoonnummer +%{number} is ongeldig
+ make_com_integration: Make.com-integratie
+ zapier_integration: Zapier-integratie
+ seamlessly_automate_your_document_signing_process_with_make_com: Automatiseer uw documentondertekeningsproces naadloos met Make.com.
+ find_suitable_zapier_templates_to_automate_your_workflow: Vind geschikte Zapier-sjablonen om uw workflow te automatiseren.
+ get_started: Aan de slag
+ click_here_to_learn_more_about_user_roles_and_permissions_html: Klik hier voor meer informatie over gebruikersrollen en machtigingen.
+ count_10_signature_request_emails_sent_this_month_upgrade_to_pro_to_send_unlimited_signature_request_email: "%{count} / 10 e-mails voor ondertekenverzoeken deze maand verzonden. Upgrade naar Pro om onbeperkt e-mails voor ondertekenverzoeken te verzenden."
+ test_mode_emails_limit_will_be_reset_within_24_hours: Limiet voor testmodus-e-mails wordt binnen 24 uur opnieuw ingesteld.
+ on_a_scale_of_1_to_10_how_satisfied_are_you_with_the_docuseal_product_: Op een schaal van 1 tot 10, hoe tevreden bent u over het DocuSeal-product?
+ tell_us_more_about_your_experience: Vertel ons meer over uw ervaring
+ extremely_dissatisfied: Zeer ontevreden
+ extremely_satisfied: Zeer tevreden
+ your_pro_plan_payment_is_overdue: Uw betaling voor het Pro-abonnement is achterstallig.
+ click_here_to_update_your_payment_details_and_clear_the_invoice_to_ensure_uninterrupted_service_html: Klik hier om uw betaalgegevens bij te werken en de factuur te voldoen om ononderbroken service te garanderen.
+ overdue_payment: Achterstallige betaling
+ your_pro_plan_has_been_suspended_due_to_unpaid_invoices_you_can_update_your_payment_details_to_settle_the_invoice_and_continue_using_docuseal_or_cancel_your_subscription: Uw Pro-abonnement is opgeschort vanwege onbetaalde facturen. U kunt uw betaalgegevens bijwerken om de factuur te voldoen en DocuSeal te blijven gebruiken of uw abonnement opzeggen.
+ manage_subscription: Abonnement beheren
+ submission_created_by_email_html: "Inzending aangemaakt door %{email}"
+ submission_created_by_email_via_source_html: "Inzending aangemaakt door %{email} via %{source}"
+ submission_created_via_source_html: "Inzending aangemaakt via %{source}"
+ pro_user_seats_used: Gebruikersplaatsen Pro gebruikt
+ manage_plan: Abonnement beheren
+ this_submission_has_multiple_signers_which_prevents_the_use_of_a_sharing_link_html: Deze inzending heeft meerdere ondertekenaars, waardoor het gebruik van een deellink niet mogelijk is omdat onduidelijk is welke ondertekenaar verantwoordelijk is voor specifieke velden. Volg deze handleiding om de standaardgegevens van de ondertekenaar te definiëren.
+ welcome_to_docuseal: Welkom bij DocuSeal
+ start_a_quick_tour_to_learn_how_to_create_an_send_your_first_document: Start een korte rondleiding om te leren hoe u uw eerste document maakt en verzendt
+ start_tour: Rondleiding starten
+ name_a_z: Naam A-Z
+ recently_used: Onlangs gebruikt
+ newest_first: Nieuwste eerst
+ none: Geen
+ default_expiration: Standaardvervaldatum
+ specified_date: Opgegeven datum
+ one_day: 1 dag
+ three_days: 3 dagen
+ five_days: 5 dagen
+ six_days: 6 dagen
+ seven_days: 7 dagen
+ nine_days: 9 dagen
+ ten_days: 10 dagen
+ two_weeks: 2 weken
+ three_weeks: 3 weken
+ four_weeks: 4 weken
+ one_month: 1 maand
+ two_months: 2 maanden
+ three_months: 3 maanden
+ eu_data_residency: EU-gegevensresidentie
+ please_enter_your_email_address_associated_with_the_completed_submission: Voer het e-mailadres in dat aan de voltooide inzending is gekoppeld.
+ esignature_disclosure: Verklaring e-handtekening
+ share_link: Deellink
+ enable_shared_link: Deellink inschakelen
+ share_link_is_currently_disabled: Deellink is momenteel uitgeschakeld
+ select_data_residency: Gegevensresidentie selecteren
+ account_name_has_invited_you_to_fill_and_sign_documents_online_effortlessly_with_a_secure_fast_and_user_friendly_digital_document_signing_solution: "%{account_name} heeft u uitgenodigd om documenten online moeiteloos in te vullen en te ondertekenen met een veilige, snelle en gebruiksvriendelijke digitale ondertekenoplossing."
+ review_or_download_completed_documents_fill_and_sign_documents_online_effortlessly_with_a_secure_fast_and_user_friendly_digital_document_signing_solution: Bekijk of download voltooide documenten. Vul en onderteken documenten online moeiteloos met een veilige, snelle en gebruiksvriendelijke digitale ondertekenoplossing.
+ link_form_fields: Formuliervelden koppelen
+ at_least_one_field_must_be_displayed_in_the_form: Er moet minstens één veld in het formulier worden weergegeven
+ this_template_has_multiple_parties_which_prevents_the_use_of_a_sharing_link: Dit sjabloon heeft meerdere partijen, waardoor het gebruik van een gedeelde link niet mogelijk is omdat onduidelijk is welke partij verantwoordelijk is voor specifieke velden. Definieer de standaardpartijdetails om dit op te lossen.
+ events_log: Logboek gebeurtenissen
+ succeeded: Geslaagd
+ failed: Mislukt
+ there_are_no_events: Er zijn geen gebeurtenissen
+ resend: Opnieuw
+ next_attempt_in_time_in_words: Volgende poging over %{time_in_words}
+ request_email_otp_verification_with_shared_link: E-mail-OTP-verificatie vereisen bij deellink
+ sms_rate_limit_exceeded: SMS-snelheidslimiet overschreden
+ invalid_phone_number: Ongeldig telefoonnummer
+ please_contact_the_requester_to_specify_your_phone_number_for_two_factor_authentication: Neem contact op met de aanvrager om uw telefoonnummer op te geven voor tweeledige verificatie.
+ we_sent_a_one_time_verification_code_to_your_email_address_please_enter_the_code_below_to_continue: We hebben een eenmalige verificatiecode naar uw e-mailadres gestuurd. Voer de code hieronder in om door te gaan.
+ re_send_code: Code opnieuw verzenden
+ your_verification_code_to_access_the_name: 'Uw verificatiecode om toegang te krijgen tot "%{name}":'
+ please_reply_to_this_email_if_you_didnt_request_this: Reageer op deze e-mail als u dit niet hebt aangevraagd.
+ advanced_settings: Geavanceerde instellingen
+ text: Tekst
+ code: Code
+ custom_html_emails: Aangepaste HTML-e-mails
+ connect_your_email_to_send_html_emails: Koppel uw e-mail om HTML-e-mails te verzenden
+ connect_your_email_or_outlook_account_or_add_smtp_settings_to_send_custom_html_emails: Koppel uw Gmail- of Outlook-account of voeg SMTP-instellingen toe om aangepaste HTML-e-mails te verzenden.
+ connect_gmail_or_outlook: Gmail of Outlook verbinden
+ connect_your_email_to_bulk_send: Koppel uw e-mail om bulk te verzenden
+ connect_your_email_or_outlook_account_or_add_smtp_settings_to_bulk_send: Koppel uw Gmail- of Outlook-account of voeg SMTP-instellingen toe om bulk te verzenden.
+ are_you_sure_you_want_to_add_recipients_without_sending_to_send_emails_it_requires_to_connect_gmail_or_outlook: Weet u zeker dat u ontvangers wilt toevoegen zonder te verzenden? Om e-mails te verzenden moet u Gmail of Outlook koppelen.
+ template_name_has_been_completed_by_submitters_html: '"{template.name}" is voltooid door {submission.submitters}'
+ please_check_the_copy_of_your_template_name_in_the_email_attachments_html: Controleer de kopie van uw "{template.name}" in de e-mailbijlagen.
+ you_have_been_invited_to_sign_the_template_name_html: U bent uitgenodigd om "{template.name}" te ondertekenen.
+ reveal_api_key: API-sleutel tonen
+ enter_your_password_to_reveal_the_api_key: Voer uw wachtwoord in om de API-sleutel te tonen
+ wrong_password: Onjuist wachtwoord.
+ current_password: Huidig wachtwoord
+ dont_remember_your_current_password_click_here_to_reset_it_html: Huidig wachtwoord vergeten? om het te resetten.
+ an_email_with_password_reset_instructions_has_been_sent: Er is een e-mail met instructies voor het resetten van het wachtwoord verzonden.
+ api_key_access_code: Toegangscode API-sleutel
+ use_otp_code_to_access_the_api_key_html: Gebruik de code %{code} om toegang te krijgen tot de API-sleutel.
+ please_reply_to_this_email_if_you_dont_recognize_this_request: Reageer op deze e-mail als u dit verzoek niet herkent.
+ your_user_account_has_been_archived_contact_your_administrator_to_restore_access_to_your_account: Uw gebruikersaccount is gearchiveerd. Neem contact op met uw beheerder om de toegang tot uw account te herstellen.
+ your_email_could_not_be_reached_this_may_happen_if_there_was_a_typo_in_your_address_or_if_your_mailbox_is_not_available_please_contact_support_email_to_log_in: Uw e-mailadres kon niet worden bereikt. Dit kan gebeuren als er een typefout in uw adres zit of als uw mailbox niet beschikbaar is. Neem contact op met support@docuseal.com om in te loggen.
+ efficient_search_with_search_index: Efficiënt zoeken met zoekindex
+ reindex: Opnieuw indexeren
+ build_search_index: Zoekindex opbouwen
+ require_two_factor_authentication_2fa_with_an_authenticator_app_e_g_google_authenticator_authy_all_users_signing_documents_must_pass_the_second_factor_verification_using_a_secure_code_in_addition_to_their_password: Tweeledige verificatie (2FA) met een authenticator-app (bijv. Google Authenticator, Authy) vereisen. Alle gebruikers die documenten ondertekenen moeten naast hun wachtwoord de tweede factor verifiëren met een beveiligde code.
+ add_a_unique_signature_id_and_timestamp_to_each_signature_for_audit_and_traceability_purposes_along_with_the_timestamp_part_of_docuseals_21_cfr_part_11_compliance_settings: Voeg voor audit- en traceerbaarheidsdoeleinden een unieke handtekening-ID en tijdstempel toe aan elke handtekening. Onderdeel van de 21 CFR Part 11-nalevingsinstellingen van DocuSeal.
+ require_signer_to_provide_a_reason_for_signing_before_completing_their_signature_e_g_approvals_certifications_part_of_docuseals_21_cfr_part_11_compliance_settings: Vereist dat de ondertekenaar vóór het voltooien van zijn handtekening een reden opgeeft (bijv. goedkeuringen, certificeringen). Onderdeel van de 21 CFR Part 11-nalevingsinstellingen van DocuSeal.
+ allow_signers_to_create_signatures_by_typing_their_name_instead_of_drawing_or_uploading_one: Sta ondertekenaars toe handtekeningen te maken door hun naam te typen in plaats van te tekenen of te uploaden.
+ allow_signers_to_resubmit_forms_after_completion_useful_when_corrections_or_multiple_submissions_are_needed: Sta ondertekenaars toe formulieren na voltooiing opnieuw in te dienen; nuttig wanneer correcties of meerdere inzendingen nodig zijn.
+ allow_recipients_to_decline_signing_a_document_the_decline_reason_notification_will_be_sent_to_the_signature_requester: Sta ontvangers toe het ondertekenen van een document te weigeren. De melding met de reden van weigering wordt naar de aanvrager van de handtekening gestuurd.
+ save_a_users_signature_and_automatically_pre_fill_it_in_future_signing_sessions: Sla de handtekening van een gebruiker op en vul deze automatisch vooraf in bij toekomstige ondertekeningssessies.
+ make_document_download_links_expire_after_40_minutes_to_prevent_long_term_access_and_enhance_security: Laat links voor het downloaden van documenten na 40 minuten verlopen om langdurige toegang te voorkomen en de beveiliging te verbeteren.
+ require_authentication_with_user_login_or_api_key_to_access_the_document_download_links: Authenticatie met gebruikerslogin of API-sleutel vereisen om toegang te krijgen tot de documentdownloadlinks.
+ combine_signed_documents_and_the_audit_log_into_a_single_pdf_file_for_easier_recordkeeping_and_compliance: Combineer ondertekende documenten en het auditlogboek in één PDF-bestand voor eenvoudiger archivering en compliance.
+ require_a_jwt_authorization_to_preview_embedded_forms_ensuring_only_authorized_users_can_view_them: JWT-autorisatie vereisen om ingesloten formulieren te bekijken, zodat alleen geautoriseerde gebruikers ze kunnen zien.
+ make_all_newly_created_templates_private_to_their_creator_by_default: Maak alle nieuw aangemaakte sjablonen standaard privé voor hun maker.
+ make_the_recipients_signing_order_always_enforced_so_that_the_second_signer_can_start_signing_their_part_only_after_the_first_signer_has_completed_signing: Zorg dat de volgorde van ondertekenen altijd wordt afgedwongen, zodat de tweede ondertekenaar pas kan beginnen nadat de eerste ondertekenaar heeft voltooid.
+ the_file_is_missing_make_sure_you_have_access_to_it_on_google_drive: Het bestand ontbreekt. Zorg ervoor dat je er toegang toe hebt op Google Drive.
+ connect_google_drive: Verbind Google Drive
+ google_drive_has_been_connected: Google Drive is verbonden
+ unable_to_identify_reset_your_password_to_sign_in: Kan niet worden geïdentificeerd. Stel je wachtwoord opnieuw in om in te loggen.
+ desktop: Desktop
+ mobile: Mobiel
+ tablet: Tablet
+ reset_default: Standaard herstellen
+ send_signature_request_email: E-mail met handtekeningaanvraag verzenden
+ submission_sources:
+ api: API
+ bulk: Bulkverzending
+ embed: Insluiten
+ invite: Uitnodiging
+ link: Link
+ submission_event_names:
+ send_email_to_html: "E-mail verzonden naar %{submitter_name}"
+ bounce_email_html: "E-mail gebounced %{submitter_name}"
+ complaint_email_html: "Spamklacht %{submitter_name}"
+ send_reminder_email_to_html: "Herinneringsmail verzonden naar %{submitter_name}"
+ send_sms_to_html: "SMS verzonden naar %{submitter_name}"
+ send_2fa_sms_to_html: "Verificatie-SMS verzonden naar %{submitter_name}"
+ open_email_by_html: "E-mail geopend door %{submitter_name}"
+ click_email_by_html: "E-maillink aangeklikt door %{submitter_name}"
+ click_sms_by_html: "SMS-link aangeklikt door %{submitter_name}"
+ phone_verified_by_html: "Telefoon geverifieerd door %{submitter_name}"
+ email_verified_by_html: "E-mail geverifieerd door %{submitter_name}"
+ start_form_by_html: "Inzending gestart door %{submitter_name}"
+ view_form_by_html: "Formulier bekeken door %{submitter_name}"
+ invite_party_by_html: "Uitgenodigd %{invited_submitter_name} door %{submitter_name}"
+ complete_form_by_html: "Inzending voltooid door %{submitter_name}"
+ start_verification_by_html: "Identiteitsverificatie gestart door %{submitter_name}"
+ complete_verification_by_html: "Identiteitsverificatie voltooid door %{submitter_name} met %{provider}"
+ api_complete_form_by_html: "Inzending via API voltooid door %{submitter_name}"
+ import_list:
+ select_worksheet: Werkblad selecteren
+ open: Openen
+ remove: Verwijderen
+ recipient_field: Ontvangerveld
+ spreadsheet_column: Spreadsheetkolom
+ select_field: Veld selecteren
+ select_column: Kolom selecteren
+ new_field_mapping: Nieuwe veldkoppeling
+ total_entries: Totaal aantal items
+ upload_csv_or_xlsx_spreadsheet: CSV- of XLSX-spreadsheet uploaden
+ click_to_upload: Klik om te uploaden
+ or_drag_and_drop_files: of sleep bestanden hierheen.
+ or: Of
+ download: downloaden
+ a_sample_spreadsheet_to_fill_and_import: een voorbeeldspreadsheet om in te vullen en te importeren
+ app_tour:
+ start: Starten
+ previous: Vorige
+ next: Volgende
+ template_and_submissions: Sjablonen en inzendingen
+ template_and_submissions_description: U kunt de weergave kiezen die het beste past bij uw workflow. Kies de weergave 'Sjablonen' om herbruikbare documentsjablonen te maken, of de weergave 'Inzendingen' om afzonderlijke documenten te ondertekenen of de status van elk ondertekenverzoek te bekijken.
+ upload_a_pdf_file: Upload een PDF-bestand
+ upload_a_pdf_file_description: Upload een PDF-document om een sjabloon voor een ondertekeningsformulier te maken.
+ select_a_signer_party: Selecteer een ondertekenende partij
+ select_a_signer_party_description: Met deze vervolgkeuzelijst kunt u een rol voor een ondertekenende partij selecteren of een nieuwe partij aan het document toevoegen als 2 of meer handtekeningen vereist zijn.
+ available_parties: Beschikbare partijen
+ available_parties_description: Deze lijst bevat alle beschikbare partijen met hun rolnamen. Na selectie kunt u velden toevoegen en configureren voor de ondertekenende partij.
+ available_field_types: Beschikbare veldtypen
+ available_field_types_description: Deze sectie bevat alle beschikbare veldtypen die aan het document kunnen worden toegevoegd voor gegevensinvoer of het verzamelen van handtekeningen.
+ text_input_field: Tekstinvoerveld
+ text_input_field_description: Met dit veld kunnen gebruikers tekstgebaseerde informatie invoeren, zoals namen of e-mails.
+ signature_field: Handtekeningveld
+ signature_field_description: Dit veld wordt gebruikt om handtekeningen van ondertekenaars te verzamelen.
+ added_fields: Toegevoegde velden
+ added_fields_description: Deze lijst toont alle velden die aan het document zijn toegevoegd. U kunt ze opnieuw ordenen, bewerken of verwijderen.
+ open_field_settings: Veldinstellingen openen
+ open_field_settings_description: Rechts naast de veldnaam staat een instellingenpictogram waarmee u de veldinstellingen kunt openen.
+ field_settings: Veldinstellingen
+ field_settings_description: Elk veld kan via instellingen worden aangepast aan uw behoeften, zoals het aanpassen van de lettergrootte, het verplicht maken van het veld of het toevoegen van een beschrijving.
+ send_document: Document verzenden ter ondertekening
+ send_document_description: Voordat u het document ter ondertekening verzendt, kunt u ontvangers configureren, hun e-mailadressen of telefoonnummers toevoegen en de e-mailinhoud aanpassen.
+ sign_yourself: Het document zelf ondertekenen
+ sign_yourself_description: Met deze knop kunt u uw handtekening toevoegen aan documenten die uw handtekening vereisen.
+ copy_and_share_link: Link kopiëren en delen
+ copy_and_share_link_description: Kopieer deze link om het document te delen. Iedereen met de link kan het ondertekenen nadat ze hun e-mailadres hebben ingevoerd.
+ sign_the_document: Het document ondertekenen
+ sign_the_document_description: Als u een van de ondertekenaars bent, kunt u met deze knop het document ondertekenen.
+ send_for_signing: Verzenden voor ondertekening
+ add_recipients: Ontvangers toevoegen
+ add_recipients_description: Voeg nieuwe ontvangers toe om het document te ondertekenen door hun e-mailadressen of telefoonnummers in te voeren.
+ settings: Instellingen
+ settings_account_description: Met uitgebreide accountinstellingen kunt u de eSigning-ervaring aanpassen en meer gebruikers uitnodigen.
+ support: Ondersteuning
+ support_description: U kunt onze selfservice AI-assistent gebruiken of ons e-mailen op support@docuseal.com als u vragen heeft.
+ settings_template_description: Gebruik deze knop om naar uw accountinstellingenpagina te gaan.
+ doorkeeper:
+ scopes:
+ write: Uw gegevens bijwerken
+ read: Uw gegevens lezen
+ pagination:
+ submissions:
+ range_with_total: "%{from}-%{to} van %{count} inzendingen"
+ range_without_total: "%{from}-%{to} inzendingen"
+ templates:
+ range_with_total: "%{from}-%{to} van %{count} sjablonen"
+ range_without_total: "%{from}-%{to} sjablonen"
+ template_folders:
+ range_with_total: "%{from}-%{to} van %{count} mappen"
+ range_without_total: "%{from}-%{to} mappen"
+ users:
+ range_with_total: "%{from}-%{to} van %{count} gebruikers"
+ range_without_total: "%{from}-%{to} gebruikers"
+ items:
+ range_with_total: "%{from}-%{to} van %{count} items"
+ range_without_total: "%{from}-%{to} items"
+ events:
+ range_with_total: "%{from}-%{to} van %{count} gebeurtenissen"
+ range_without_total: "%{from}-%{to} gebeurtenissen"
ar:
+ require_phone_2fa_to_open: "تطلب فتح عبر تحقق الهاتف ذو العاملين"
+ the_sender_has_requested_a_two_factor_authentication_via_one_time_password_sent_to_your_html: "المرسل طلب تحقق ذو عاملين عبر كلمة مرور لمرة واحدة مرسل إلى رقم هاتفك %{phone}."
+ send_verification_code: "إرسال رمز التحقق"
+ code_has_been_resent: "تم إعادة إرسال الرمز"
+ invalid_code: "رمز غير صالح"
awaiting_completion_by_the_other_party: "في انتظار إكتمال الطرف الآخر"
view: عرض
hi_there: مرحبا,
@@ -4690,7 +6903,13 @@ ar:
email: البريد الإلكتروني
digitally_signed_by: تم التوقيع الرقمي بواسطة
role: الدور
- provide_your_email_to_start: قدم بريدك الإلكتروني للبدء
+ provide_your_email_to_start: أدخل بريدك الإلكتروني للبدء
+ provide_your_email: أدخل بريدك الإلكتروني
+ provide_your_name_to_start: أدخل اسمك للبدء
+ provide_your_name: أدخل اسمك
+ provide_your_phone_in_international_format_to_start: أدخل رقم هاتفك بصيغة دولية للبدء
+ provide_your_phone_in_international_format: أدخل رقم هاتفك بصيغة دولية
+ use_international_format_1xxx_: 'استخدم التنسيق الدولي: +1xxx...'
start: بدء
starting: بداية
verification_code_code: 'رمز التحقق: %{code}'
@@ -4732,8 +6951,34 @@ ar:
too_many_attempts: عدد المحاولات كبير جدًا.
verification_code: رمز التحقق
resend_code: إعادة إرسال الرمز
+ powered_by: 'مشغل بواسطة'
+ count_documents_signed_with_html: '%{count} مستندات تم توقيعها باستخدام'
+ open_source_documents_software: 'برنامج مستندات مفتوح المصدر'
+ eu_data_residency: 'بيانات في الاتحاد الأوروبي'
+ please_enter_your_email_address_associated_with_the_completed_submission: 'يرجى إدخال عنوان البريد الإلكتروني المرتبط بالإرسال المكتمل.'
+ privacy_policy: 'سياسة الخصوصية'
+ esignature_disclosure: 'إفصاح التوقيع الإلكتروني'
+ select_data_residency: اختر موقع تخزين البيانات
+ company_name: اسم الشركة
+ optional: اختياري
+ submit: 'إرسال'
+ sms_rate_limit_exceeded: 'تم تجاوز حد رسائل SMS'
+ invalid_phone_number: 'رقم الهاتف غير صالح'
+ please_contact_the_requester_to_specify_your_phone_number_for_two_factor_authentication: 'يرجى الاتصال بالمرسل لتحديد رقم هاتفك للمصادقة الثنائية.'
+ we_sent_a_one_time_verification_code_to_your_email_address_please_enter_the_code_below_to_continue: 'أرسلنا رمز تحقق لمرة واحدة إلى بريدك الإلكتروني. الرجاء إدخاله أدناه للمتابعة.'
+ re_send_code: 'إعادة إرسال الرمز'
+ email_verification: 'التحقق من البريد الإلكتروني'
+ your_verification_code_to_access_the_name: 'رمز التحقق الخاص بك للوصول إلى "%{name}":'
+ please_reply_to_this_email_if_you_didnt_request_this: 'يرجى الرد على هذا البريد إذا لم تطلب ذلك.'
+ your_user_account_has_been_archived_contact_your_administrator_to_restore_access_to_your_account: تم أرشفة حسابك. يرجى التواصل مع المسؤول لاستعادة الوصول إلى حسابك.
+ your_email_could_not_be_reached_this_may_happen_if_there_was_a_typo_in_your_address_or_if_your_mailbox_is_not_available_please_contact_support_email_to_log_in: تعذّر الوصول إلى بريدك الإلكتروني. قد يحدث هذا في حال وجود خطأ في العنوان أو إذا كانت صندوق البريد غير متاح. يرجى التواصل مع support@docuseal.com لتسجيل الدخول.
ko:
+ require_phone_2fa_to_open: 휴대폰 2FA를 열 때 요구함
+ the_sender_has_requested_a_two_factor_authentication_via_one_time_password_sent_to_your_html: 발신자가 %{phone} 전화번호로 보내진 일회용 비밀번호를 통해 이중 인증을 요청했습니다.
+ send_verification_code: 인증 코드 보내기
+ code_has_been_resent: 코드가 재전송되었습니다.
+ invalid_code: 잘못된 코드
awaiting_completion_by_the_other_party: "다른 당사자의 완료를 기다리고 있습니다"
view: 보기
hi_there: 안녕하세요,
@@ -4749,7 +6994,13 @@ ko:
email: 이메일
digitally_signed_by: 디지털로 서명됨
role: 역할
- provide_your_email_to_start: 시작하려면 이메일을 제공하세요
+ provide_your_email_to_start: 시작하려면 이메일을 입력하세요
+ provide_your_email: 이메일을 입력하세요
+ provide_your_name_to_start: 시작하려면 이름을 입력하세요
+ provide_your_name: 이름을 입력하세요
+ provide_your_phone_in_international_format_to_start: 시작하려면 국제 형식의 전화번호를 입력하세요
+ provide_your_phone_in_international_format: 국제 형식의 전화번호를 입력하세요
+ use_international_format_1xxx_: '국제 형식을 사용하세요: +1xxx...'
start: 시작
reason: 이유
starting: 시작 중
@@ -4791,6 +7042,118 @@ ko:
too_many_attempts: 시도 횟수가 너무 많습니다.
verification_code: 인증 코드
resend_code: 코드 재전송
+ powered_by: '제공:'
+ count_documents_signed_with_html: '%{count}개의 문서가 다음을 통해 서명됨'
+ open_source_documents_software: '오픈소스 문서 소프트웨어'
+ eu_data_residency: 'EU 데이터 보관'
+ please_enter_your_email_address_associated_with_the_completed_submission: '완료된 제출과 연결된 이메일 주소를 입력하세요.'
+ privacy_policy: 개인정보 처리방침
+ esignature_disclosure: 전자서명 공개
+ select_data_residency: 데이터 저장 위치 선택
+ company_name: 회사 이름
+ optional: 선택 사항
+ submit: 제출
+ sms_rate_limit_exceeded: SMS 제한 초과
+ invalid_phone_number: 잘못된 전화번호입니다
+ please_contact_the_requester_to_specify_your_phone_number_for_two_factor_authentication: 이중 인증을 위해 전화번호를 지정하려면 요청자에게 문의하세요.
+ we_sent_a_one_time_verification_code_to_your_email_address_please_enter_the_code_below_to_continue: 일회용 인증 코드를 이메일로 보냈습니다. 계속하려면 아래에 입력하세요.
+ re_send_code: 코드 재전송
+ email_verification: 이메일 인증
+ your_verification_code_to_access_the_name: '"%{name}"에 액세스하기 위한 인증 코드:'
+ please_reply_to_this_email_if_you_didnt_request_this: 요청하지 않았다면 이 이메일에 회신하세요.
+ your_user_account_has_been_archived_contact_your_administrator_to_restore_access_to_your_account: 사용자 계정이 보관되었습니다. 계정 접근을 복원하려면 관리자에게 문의하세요.
+ your_email_could_not_be_reached_this_may_happen_if_there_was_a_typo_in_your_address_or_if_your_mailbox_is_not_available_please_contact_support_email_to_log_in: 이메일에 접근할 수 없습니다. 주소에 오타가 있거나 메일박스가 사용 불가능한 경우 발생할 수 있습니다. 로그인하려면 support@docuseal.com에 문의하세요.
+
+ja:
+ require_phone_2fa_to_open: 電話による2段階認証が必要です
+ the_sender_has_requested_a_two_factor_authentication_via_one_time_password_sent_to_your_html: 送信者は、%{phone} に送信されたワンタイムパスワードによる2段階認証を要求しました。
+ send_verification_code: 認証コードを送信
+ code_has_been_resent: コードが再送信されました
+ invalid_code: 無効なコードです
+ awaiting_completion_by_the_other_party: 他の当事者による完了を待機中
+ view: 表示
+ hi_there: こんにちは
+ download: ダウンロード
+ decline: 辞退
+ declined: 辞退済み
+ decline_reason: 辞退の理由
+ provide_a_reason: 理由を入力してください
+ notify_the_sender_with_the_reason_you_declined: 辞退理由を送信者に通知してください
+ form_has_been_declined_on_html: '%{time} にフォームが辞退されました'
+ name_declined_by_submitter: '"%{name}" は %{submitter} により辞退されました'
+ name_declined_by_submitter_with_the_following_reason: '"%{name}" は %{submitter} により次の理由で辞退されました:'
+ email: メール
+ digitally_signed_by: 電子署名者
+ role: 役割
+ provide_your_email_to_start: 開始するにはメールアドレスを入力してください
+ provide_your_email: メールアドレスを入力してください
+ provide_your_name_to_start: 開始するには名前を入力してください
+ provide_your_name: 名前を入力してください
+ provide_your_phone_in_international_format_to_start: 開始するには国際形式の電話番号を入力してください
+ provide_your_phone_in_international_format: 国際形式の電話番号を入力してください
+ use_international_format_1xxx_: '国際形式を使用してください:+1xxx...'
+ start: 開始
+ reason: 理由
+ starting: 開始中
+ form_expired_at_html: '%{time} にフォームの有効期限が切れました'
+ invited_by_html: '%{name} により招待されました'
+ you_have_been_invited_to_submit_a_form: フォームの提出に招待されました
+ verification_code_code: '認証コード: %{code}'
+ signed_on_time: '%{time} に署名済み'
+ completed_on_time: '%{time} に完了'
+ document_has_been_signed_already: ドキュメントはすでに署名されています
+ form_has_been_submitted_already: フォームはすでに送信されています
+ send_copy_to_email: メールにコピーを送信
+ sending: 送信中
+ resubmit: 再送信
+ form_has_been_deleted_by_html: '%{name} によりフォームが削除されました。'
+ or: または
+ download_documents: ドキュメントをダウンロード
+ downloading: ダウンロード中
+ completed_successfully: 正常に完了しました
+ password: パスワード
+ sign_in: サインイン
+ signing_in: サインイン中
+ sign_in_with_microsoft: Microsoftでサインイン
+ sign_in_with_google: Googleでサインイン
+ forgot_your_password_: パスワードをお忘れですか?
+ create_free_account: 無料アカウントを作成
+ already_have_an_account: すでにアカウントをお持ちですか?
+ first_name: 名
+ last_name: 姓
+ sign_up: 登録
+ signing_up: 登録中
+ profile_details: プロフィールの詳細
+ sign_up_with_google: Googleで登録
+ sign_up_with_microsoft: Microsoftで登録
+ by_creating_an_account_you_agree_to_our_html: 'プライバシーポリシーおよび利用規約に同意の上、アカウントを作成します。'
+ enter_email_to_continue: 続行するにはメールを入力してください
+ the_code_has_been_sent_to_your_email: コードがあなたのメールに送信されました
+ enter_the_verification_code_from_your_email: メールに記載された認証コードを入力してください
+ too_many_attempts: 試行回数が多すぎます
+ verification_code: 認証コード
+ resend_code: コードを再送信
+ powered_by: '提供元:'
+ count_documents_signed_with_html: '%{count} 件のドキュメントが以下で署名されました'
+ open_source_documents_software: 'オープンソースのドキュメントソフトウェア'
+ eu_data_residency: 'EU データ居住'
+ please_enter_your_email_address_associated_with_the_completed_submission: '完了した提出に関連付けられたメールアドレスを入力してください。'
+ privacy_policy: プライバシーポリシー
+ esignature_disclosure: 電子署名に関する開示
+ select_data_residency: データ保存場所を選択
+ company_name: 会社名
+ optional: 任意
+ submit: 送信
+ sms_rate_limit_exceeded: SMSの送信制限を超えました
+ invalid_phone_number: 無効な電話番号です
+ please_contact_the_requester_to_specify_your_phone_number_for_two_factor_authentication: 二要素認証のため、リクエスターに電話番号を指定してください。
+ we_sent_a_one_time_verification_code_to_your_email_address_please_enter_the_code_below_to_continue: ワンタイム認証コードをメールアドレスに送信しました。続行するには、以下にコードを入力してください。
+ re_send_code: コードを再送信
+ email_verification: メール認証
+ your_verification_code_to_access_the_name: '"%{name}"へのアクセスコード:'
+ please_reply_to_this_email_if_you_didnt_request_this: このリクエストを行っていない場合は、このメールに返信してください。
+ your_user_account_has_been_archived_contact_your_administrator_to_restore_access_to_your_account: あなたのユーザーアカウントはアーカイブされました。アクセスを復元するには管理者に連絡してください。
+ your_email_could_not_be_reached_this_may_happen_if_there_was_a_typo_in_your_address_or_if_your_mailbox_is_not_available_please_contact_support_email_to_log_in: メールにアクセスできませんでした。アドレスの入力ミスやメールボックスが利用できない場合に発生することがあります。ログインするには support@docuseal.com に連絡してください。
en-US:
<<: *en
@@ -4818,3 +7181,6 @@ de-DE:
it-IT:
<<: *it
+
+nl-NL:
+ <<: *nl
diff --git a/config/routes.rb b/config/routes.rb
index 57e02300..13c33fb5 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -57,7 +57,7 @@ Rails.application.routes.draw do
resources :verify_pdf_signature, only: %i[create]
resource :mfa_setup, only: %i[show new edit create destroy], controller: 'mfa_setup'
- resources :account_configs, only: %i[create]
+ resources :account_configs, only: %i[create destroy]
resources :user_configs, only: %i[create]
resources :encrypted_user_configs, only: %i[destroy]
resources :timestamp_server, only: %i[create]
@@ -65,7 +65,9 @@ Rails.application.routes.draw do
resources :setup, only: %i[index create]
resource :newsletter, only: %i[show update]
resources :enquiries, only: %i[create]
- resources :users, only: %i[new create edit update destroy]
+ resources :users, only: %i[new create edit update destroy] do
+ resource :send_reset_password, only: %i[update], controller: 'users_send_reset_password'
+ end
resource :user_signature, only: %i[edit update destroy]
resource :user_initials, only: %i[edit update destroy]
resources :submissions_archived, only: %i[index], path: 'submissions/archived'
@@ -96,7 +98,9 @@ Rails.application.routes.draw do
resources :submissions_filters, only: %i[show], param: 'name'
resources :templates, only: %i[new create edit update show destroy] do
resource :debug, only: %i[show], controller: 'templates_debug' if Rails.env.development?
- resources :documents, only: %i[create], controller: 'template_documents'
+ resources :documents, only: %i[index create], controller: 'template_documents'
+ resources :clone_and_replace, only: %i[create], controller: 'templates_clone_and_replace'
+ resources :detect_fields, only: %i[create], controller: 'templates_detect_fields' unless Docuseal.multitenant?
resources :restore, only: %i[create], controller: 'templates_restore'
resources :archived, only: %i[index], controller: 'templates_archived_submissions'
resources :submissions, only: %i[new create]
@@ -104,8 +108,10 @@ Rails.application.routes.draw do
resource :preview, only: %i[show], controller: 'templates_preview'
resource :form, only: %i[show], controller: 'templates_form_preview'
resource :code_modal, only: %i[show], controller: 'templates_code_modal'
- resource :preferences, only: %i[show create], controller: 'templates_preferences'
+ resource :preferences, only: %i[show create destroy], controller: 'templates_preferences'
+ resource :share_link, only: %i[show create], controller: 'templates_share_link'
resources :recipients, only: %i[create], controller: 'templates_recipients'
+ resources :prefillable_fields, only: %i[create], controller: 'templates_prefillable_fields'
resources :submissions_export, only: %i[index new]
end
resources :preview_document_page, only: %i[show], path: '/preview/:signed_uuid'
@@ -130,6 +136,9 @@ Rails.application.routes.draw do
get :completed
end
+ resource :resubmit_form, controller: 'start_form', only: :update
+ resources :start_form_email_2fa_send, only: :create
+
resources :submit_form, only: %i[], path: '' do
get :success, on: :collection
end
@@ -161,8 +170,13 @@ Rails.application.routes.draw do
scope '/settings', as: :settings do
unless Docuseal.multitenant?
resources :storage, only: %i[index create], controller: 'storage_settings'
+ resources :search_entries_reindex, only: %i[create]
resources :sms, only: %i[index], controller: 'sms_settings'
end
+ if Docuseal.demo? || !Docuseal.multitenant?
+ resources :api, only: %i[index create], controller: 'api_settings'
+ resource :reveal_access_token, only: %i[show create], controller: 'reveal_access_token'
+ end
resources :email, only: %i[index create], controller: 'email_smtp_settings'
resources :sso, only: %i[index], controller: 'sso_settings'
resources :notifications, only: %i[index create], controller: 'notifications_settings'
@@ -173,9 +187,13 @@ Rails.application.routes.draw do
resources :integration_users, only: %i[index], path: 'users/:status', controller: 'users',
defaults: { status: :integration }
resource :personalization, only: %i[show create], controller: 'personalization_settings'
- resources :api, only: %i[index create], controller: 'api_settings'
resources :webhooks, only: %i[index show new create update destroy], controller: 'webhook_settings' do
post :resend
+
+ resources :events, only: %i[show], controller: 'webhook_events' do
+ post :resend, on: :member
+ post :refresh, on: :member
+ end
end
resource :account, only: %i[show update destroy]
resources :profile, only: %i[index] do
diff --git a/config/storage.yml b/config/storage.yml
index e6fca35e..389cffd1 100644
--- a/config/storage.yml
+++ b/config/storage.yml
@@ -1,7 +1,7 @@
disk:
service: Disk
root: <%= ENV['WORKDIR'] || '.' %>/attachments
- public: true
+ public: <%= ENV['ACTIVE_STORAGE_PUBLIC'] == 'true' %>
aws_s3:
service: S3
diff --git a/db/migrate/20240816072859_populate_submitter_account_id.rb b/db/migrate/20240816072859_populate_submitter_account_id.rb
index 29960068..d3ccf572 100644
--- a/db/migrate/20240816072859_populate_submitter_account_id.rb
+++ b/db/migrate/20240816072859_populate_submitter_account_id.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class PopulateSubmitterAccountId < ActiveRecord::Migration[7.1]
- disable_ddl_transaction
+ disable_ddl_transaction!
class MigrationSubmitter < ApplicationRecord
self.table_name = 'submitters'
diff --git a/db/migrate/20241022125135_populate_completed_submitters_and_documents.rb b/db/migrate/20241022125135_populate_completed_submitters_and_documents.rb
index c2c3dd57..6e373656 100644
--- a/db/migrate/20241022125135_populate_completed_submitters_and_documents.rb
+++ b/db/migrate/20241022125135_populate_completed_submitters_and_documents.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class PopulateCompletedSubmittersAndDocuments < ActiveRecord::Migration[7.2]
- disable_ddl_transaction
+ disable_ddl_transaction!
class MigrationSubmitter < ApplicationRecord
self.table_name = 'submitters'
diff --git a/db/migrate/20241029192232_populate_webhook_urls.rb b/db/migrate/20241029192232_populate_webhook_urls.rb
index cb8b5546..ae11d8ad 100644
--- a/db/migrate/20241029192232_populate_webhook_urls.rb
+++ b/db/migrate/20241029192232_populate_webhook_urls.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class PopulateWebhookUrls < ActiveRecord::Migration[7.2]
- disable_ddl_transaction
+ disable_ddl_transaction!
class MigrationWebhookUrl < ActiveRecord::Base
self.table_name = 'webhook_urls'
diff --git a/db/migrate/20250518070555_account_accesses.rb b/db/migrate/20250518070555_account_accesses.rb
new file mode 100644
index 00000000..a5cc2770
--- /dev/null
+++ b/db/migrate/20250518070555_account_accesses.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+class AccountAccesses < ActiveRecord::Migration[8.0]
+ def change
+ create_table :account_accesses do |t|
+ t.references :account, null: false, foreign_key: true, index: false
+ t.references :user, null: false, foreign_key: false, index: false
+
+ t.index %i[account_id user_id], unique: true
+
+ t.timestamps
+ end
+ end
+end
diff --git a/db/migrate/20250523121121_add_shared_link_to_templates.rb b/db/migrate/20250523121121_add_shared_link_to_templates.rb
new file mode 100644
index 00000000..039872c2
--- /dev/null
+++ b/db/migrate/20250523121121_add_shared_link_to_templates.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class AddSharedLinkToTemplates < ActiveRecord::Migration[8.0]
+ disable_ddl_transaction!
+
+ class MigrationTemplate < ActiveRecord::Base
+ self.table_name = 'templates'
+ end
+
+ def up
+ add_column :templates, :shared_link, :boolean, if_not_exists: true
+
+ MigrationTemplate.where(shared_link: nil).in_batches.update_all(shared_link: true)
+
+ change_column_default :templates, :shared_link, from: nil, to: false
+ change_column_null :templates, :shared_link, false
+ end
+
+ def down
+ remove_column :templates, :shared_link
+ end
+end
diff --git a/db/migrate/20250527102542_add_name_to_submissions.rb b/db/migrate/20250527102542_add_name_to_submissions.rb
new file mode 100644
index 00000000..66166de3
--- /dev/null
+++ b/db/migrate/20250527102542_add_name_to_submissions.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddNameToSubmissions < ActiveRecord::Migration[8.0]
+ def change
+ add_column :submissions, :name, :text
+ end
+end
diff --git a/db/migrate/20250527102550_remove_not_null_template_id.rb b/db/migrate/20250527102550_remove_not_null_template_id.rb
new file mode 100644
index 00000000..1ad542bb
--- /dev/null
+++ b/db/migrate/20250527102550_remove_not_null_template_id.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class RemoveNotNullTemplateId < ActiveRecord::Migration[8.0]
+ def change
+ change_column_null :submissions, :template_id, true
+ end
+end
diff --git a/db/migrate/20250530080846_add_email_events_date_index.rb b/db/migrate/20250530080846_add_email_events_date_index.rb
new file mode 100644
index 00000000..7d46bec1
--- /dev/null
+++ b/db/migrate/20250530080846_add_email_events_date_index.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+class AddEmailEventsDateIndex < ActiveRecord::Migration[8.0]
+ def change
+ add_index :email_events, %i[account_id event_datetime]
+ remove_index :email_events, :account_id
+ end
+end
diff --git a/db/migrate/20250531085328_remove_completed_submitter_template_not_null.rb b/db/migrate/20250531085328_remove_completed_submitter_template_not_null.rb
new file mode 100644
index 00000000..dc52a162
--- /dev/null
+++ b/db/migrate/20250531085328_remove_completed_submitter_template_not_null.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class RemoveCompletedSubmitterTemplateNotNull < ActiveRecord::Migration[8.0]
+ def change
+ change_column_null :completed_submitters, :template_id, true
+ end
+end
diff --git a/db/migrate/20250603105556_create_search_enties.rb b/db/migrate/20250603105556_create_search_enties.rb
new file mode 100644
index 00000000..bee12609
--- /dev/null
+++ b/db/migrate/20250603105556_create_search_enties.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+class CreateSearchEnties < ActiveRecord::Migration[8.0]
+ disable_ddl_transaction!
+
+ def up
+ return unless adapter_name == 'PostgreSQL'
+
+ create_table :search_entries do |t|
+ t.references :record, null: false, polymorphic: true, index: false
+ t.bigint :account_id, null: false
+ t.tsvector :tsvector, null: false
+
+ t.timestamps
+ end
+
+ begin
+ enable_extension 'btree_gin'
+ rescue StandardError
+ nil
+ end
+
+ btree_gin_enabled = extension_enabled?('btree_gin')
+
+ add_index :search_entries, btree_gin_enabled ? %i[account_id tsvector] : :tsvector,
+ using: :gin, where: "record_type = 'Submitter'",
+ name: 'index_search_entries_on_account_id_tsvector_submitter'
+ add_index :search_entries, btree_gin_enabled ? %i[account_id tsvector] : :tsvector,
+ using: :gin, where: "record_type = 'Submission'",
+ name: 'index_search_entries_on_account_id_tsvector_submission'
+ add_index :search_entries, btree_gin_enabled ? %i[account_id tsvector] : :tsvector,
+ using: :gin, where: "record_type = 'Template'",
+ name: 'index_search_entries_on_account_id_tsvector_template'
+
+ add_index :search_entries, %i[record_id record_type], unique: true
+ end
+
+ def down
+ return unless adapter_name == 'PostgreSQL'
+
+ drop_table :search_entries
+
+ begin
+ disable_extension 'btree_gin'
+ rescue StandardError
+ nil
+ end
+ end
+end
diff --git a/db/migrate/20250608163157_add_ngram_to_search_index.rb b/db/migrate/20250608163157_add_ngram_to_search_index.rb
new file mode 100644
index 00000000..8d609ca4
--- /dev/null
+++ b/db/migrate/20250608163157_add_ngram_to_search_index.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class AddNgramToSearchIndex < ActiveRecord::Migration[8.0]
+ def change
+ return unless adapter_name == 'PostgreSQL'
+
+ btree_gin_enabled = extension_enabled?('btree_gin')
+
+ add_column :search_entries, :ngram, :tsvector
+
+ add_index :search_entries, btree_gin_enabled ? %i[account_id tsvector] : :tsvector,
+ using: :gin, where: "record_type = 'Submitter'",
+ name: 'index_search_entries_on_account_id_ngram_submitter'
+ add_index :search_entries, btree_gin_enabled ? %i[account_id tsvector] : :tsvector,
+ using: :gin, where: "record_type = 'Submission'",
+ name: 'index_search_entries_on_account_id_ngram_submission'
+ add_index :search_entries, btree_gin_enabled ? %i[account_id tsvector] : :tsvector,
+ using: :gin, where: "record_type = 'Template'",
+ name: 'index_search_entries_on_account_id_ngram_template'
+ end
+end
diff --git a/db/migrate/20250613160132_add_timezone_to_submitters.rb b/db/migrate/20250613160132_add_timezone_to_submitters.rb
new file mode 100644
index 00000000..3b13b82d
--- /dev/null
+++ b/db/migrate/20250613160132_add_timezone_to_submitters.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddTimezoneToSubmitters < ActiveRecord::Migration[8.0]
+ def change
+ add_column :submitters, :timezone, :string
+ end
+end
diff --git a/db/migrate/20250615091654_add_submitters_completed_at_index.rb b/db/migrate/20250615091654_add_submitters_completed_at_index.rb
new file mode 100644
index 00000000..1ff3431f
--- /dev/null
+++ b/db/migrate/20250615091654_add_submitters_completed_at_index.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddSubmittersCompletedAtIndex < ActiveRecord::Migration[8.0]
+ def change
+ add_index :submitters, %i[completed_at account_id]
+ end
+end
diff --git a/db/migrate/20250617072547_add_email_events_event_type_index.rb b/db/migrate/20250617072547_add_email_events_event_type_index.rb
new file mode 100644
index 00000000..6a543efb
--- /dev/null
+++ b/db/migrate/20250617072547_add_email_events_event_type_index.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+class AddEmailEventsEventTypeIndex < ActiveRecord::Migration[8.0]
+ def change
+ add_index :email_events, :email, where: "event_type IN ('bounce', 'soft_bounce', 'complaint', 'soft_complaint')",
+ name: 'index_email_events_on_email_event_types'
+ end
+end
diff --git a/db/migrate/20250617074820_add_templates_folder_index.rb b/db/migrate/20250617074820_add_templates_folder_index.rb
new file mode 100644
index 00000000..dd8e2daa
--- /dev/null
+++ b/db/migrate/20250617074820_add_templates_folder_index.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddTemplatesFolderIndex < ActiveRecord::Migration[8.0]
+ def change
+ add_index :templates, %i[account_id folder_id id], where: 'archived_at IS NULL'
+ end
+end
diff --git a/db/migrate/20250617075609_add_submissions_template_index.rb b/db/migrate/20250617075609_add_submissions_template_index.rb
new file mode 100644
index 00000000..9bfdd5dc
--- /dev/null
+++ b/db/migrate/20250617075609_add_submissions_template_index.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+class AddSubmissionsTemplateIndex < ActiveRecord::Migration[8.0]
+ def change
+ add_index :submissions, %i[account_id template_id id], where: 'archived_at IS NULL'
+ add_index :submissions, %i[account_id template_id id],
+ where: 'archived_at IS NOT NULL',
+ name: 'index_submissions_on_account_id_and_template_id_and_id_archived'
+ end
+end
diff --git a/db/migrate/20250618085322_add_archived_templates_index.rb b/db/migrate/20250618085322_add_archived_templates_index.rb
new file mode 100644
index 00000000..b55f52a5
--- /dev/null
+++ b/db/migrate/20250618085322_add_archived_templates_index.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+class AddArchivedTemplatesIndex < ActiveRecord::Migration[8.0]
+ def change
+ add_index :templates, %i[account_id id], where: 'archived_at IS NOT NULL',
+ name: 'index_templates_on_account_id_and_id_archived'
+ end
+end
diff --git a/db/migrate/20250627130628_create_webhook_events_and_attempts.rb b/db/migrate/20250627130628_create_webhook_events_and_attempts.rb
new file mode 100644
index 00000000..1b879d6c
--- /dev/null
+++ b/db/migrate/20250627130628_create_webhook_events_and_attempts.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class CreateWebhookEventsAndAttempts < ActiveRecord::Migration[8.0]
+ def change
+ create_table :webhook_events do |t|
+ t.string :uuid, null: false
+ t.bigint :webhook_url_id, null: false
+ t.bigint :account_id, null: false
+ t.bigint :record_id, null: false
+ t.string :record_type, null: false
+ t.string :event_type, null: false
+ t.string :status, null: false
+
+ t.index %i[uuid webhook_url_id], unique: true
+ t.index %i[webhook_url_id id]
+ t.index %i[webhook_url_id id], where: "status = 'error'", name: 'index_webhook_events_error'
+
+ t.timestamps
+ end
+
+ create_table :webhook_attempts do |t|
+ t.bigint :webhook_event_id, null: false, index: true
+ t.text :response_body
+ t.integer :response_status_code, null: false
+ t.integer :attempt, null: false
+
+ t.timestamps
+ end
+ end
+end
diff --git a/db/migrate/20250718121133_add_parent_folder_id_to_template_folders.rb b/db/migrate/20250718121133_add_parent_folder_id_to_template_folders.rb
new file mode 100644
index 00000000..b0df85bd
--- /dev/null
+++ b/db/migrate/20250718121133_add_parent_folder_id_to_template_folders.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddParentFolderIdToTemplateFolders < ActiveRecord::Migration[8.0]
+ def change
+ add_reference :template_folders, :parent_folder, foreign_key: { to_table: :template_folders }, index: true
+ end
+end
diff --git a/db/migrate/20250831125322_populate_expire_link_configs.rb b/db/migrate/20250831125322_populate_expire_link_configs.rb
new file mode 100644
index 00000000..352f2f77
--- /dev/null
+++ b/db/migrate/20250831125322_populate_expire_link_configs.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class PopulateExpireLinkConfigs < ActiveRecord::Migration[8.0]
+ disable_ddl_transaction!
+
+ class MigrationAccount < ActiveRecord::Base
+ self.table_name = 'accounts'
+ end
+
+ class MigrationAccountConfig < ActiveRecord::Base
+ self.table_name = 'account_configs'
+
+ serialize :value, coder: JSON
+ end
+
+ def up
+ MigrationAccount.find_each do |account|
+ config = MigrationAccountConfig.find_or_initialize_by(key: 'download_links_expire', account_id: account.id)
+
+ next if config.persisted?
+
+ config.value = false
+ config.save!
+ end
+ end
+
+ def down
+ nil
+ end
+end
diff --git a/db/migrate/20250901110606_add_verification_method_to_completed_submitters.rb b/db/migrate/20250901110606_add_verification_method_to_completed_submitters.rb
new file mode 100644
index 00000000..31d48047
--- /dev/null
+++ b/db/migrate/20250901110606_add_verification_method_to_completed_submitters.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddVerificationMethodToCompletedSubmitters < ActiveRecord::Migration[8.0]
+ def change
+ add_column :completed_submitters, :verification_method, :string
+ end
+end
diff --git a/db/migrate/20250912090605_add_template_variables.rb b/db/migrate/20250912090605_add_template_variables.rb
new file mode 100644
index 00000000..346762cd
--- /dev/null
+++ b/db/migrate/20250912090605_add_template_variables.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddTemplateVariables < ActiveRecord::Migration[8.0]
+ def change
+ add_column :templates, :variables_schema, :text
+ add_column :submissions, :variables_schema, :text
+ add_column :submissions, :variables, :text
+ end
+end
diff --git a/db/migrate/20250915060548_create_lock_events.rb b/db/migrate/20250915060548_create_lock_events.rb
new file mode 100644
index 00000000..4fb101ed
--- /dev/null
+++ b/db/migrate/20250915060548_create_lock_events.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+class CreateLockEvents < ActiveRecord::Migration[8.0]
+ def change
+ create_table :lock_events do |t|
+ t.string :key, index: true, null: false
+ t.string :event_name, null: false
+
+ t.index %i[event_name key], unique: true, where: "event_name IN ('start', 'complete')"
+
+ t.timestamps
+ end
+ end
+end
diff --git a/db/migrate/20250922053744_update_email_event_type_index.rb b/db/migrate/20250922053744_update_email_event_type_index.rb
new file mode 100644
index 00000000..7c33c65f
--- /dev/null
+++ b/db/migrate/20250922053744_update_email_event_type_index.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+class UpdateEmailEventTypeIndex < ActiveRecord::Migration[8.0]
+ def change
+ remove_index :email_events, :email, where: "event_type IN ('bounce', 'soft_bounce', 'complaint', 'soft_complaint')",
+ name: 'index_email_events_on_email_event_types'
+
+ add_index :email_events, :email,
+ where: "event_type IN ('bounce', 'soft_bounce', 'permanent_bounce', 'complaint', 'soft_complaint')",
+ name: 'index_email_events_on_email_event_types'
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 34aaa8bf..c14f705b 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,8 +10,9 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema[8.0].define(version: 2025_02_25_111255) do
+ActiveRecord::Schema[8.0].define(version: 2025_09_22_053744) do
# These are extensions that must be enabled in order to support this database
+ enable_extension "btree_gin"
enable_extension "plpgsql"
create_table "access_tokens", force: :cascade do |t|
@@ -24,6 +25,14 @@ ActiveRecord::Schema[8.0].define(version: 2025_02_25_111255) do
t.index ["user_id"], name: "index_access_tokens_on_user_id"
end
+ create_table "account_accesses", force: :cascade do |t|
+ t.bigint "account_id", null: false
+ t.bigint "user_id", null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.index ["account_id", "user_id"], name: "index_account_accesses_on_account_id_and_user_id", unique: true
+ end
+
create_table "account_configs", force: :cascade do |t|
t.bigint "account_id", null: false
t.string "key", null: false
@@ -102,12 +111,13 @@ ActiveRecord::Schema[8.0].define(version: 2025_02_25_111255) do
t.bigint "submitter_id", null: false
t.bigint "submission_id", null: false
t.bigint "account_id", null: false
- t.bigint "template_id", null: false
+ t.bigint "template_id"
t.string "source", null: false
t.integer "sms_count", null: false
t.datetime "completed_at", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
+ t.string "verification_method"
t.index ["account_id"], name: "index_completed_submitters_on_account_id"
t.index ["submitter_id"], name: "index_completed_submitters_on_submitter_id", unique: true
end
@@ -166,8 +176,9 @@ ActiveRecord::Schema[8.0].define(version: 2025_02_25_111255) do
t.text "data", null: false
t.datetime "event_datetime", null: false
t.datetime "created_at", null: false
- t.index ["account_id"], name: "index_email_events_on_account_id"
+ t.index ["account_id", "event_datetime"], name: "index_email_events_on_account_id_and_event_datetime"
t.index ["email"], name: "index_email_events_on_email"
+ t.index ["email"], name: "index_email_events_on_email_event_types", where: "((event_type)::text = ANY ((ARRAY['bounce'::character varying, 'soft_bounce'::character varying, 'permanent_bounce'::character varying, 'complaint'::character varying, 'soft_complaint'::character varying])::text[]))"
t.index ["emailable_type", "emailable_id"], name: "index_email_events_on_emailable"
t.index ["message_id"], name: "index_email_events_on_message_id"
end
@@ -206,6 +217,15 @@ ActiveRecord::Schema[8.0].define(version: 2025_02_25_111255) do
t.index ["user_id"], name: "index_encrypted_user_configs_on_user_id"
end
+ create_table "lock_events", force: :cascade do |t|
+ t.string "key", null: false
+ t.string "event_name", null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.index ["event_name", "key"], name: "index_lock_events_on_event_name_and_key", unique: true, where: "((event_name)::text = ANY ((ARRAY['start'::character varying, 'complete'::character varying])::text[]))"
+ t.index ["key"], name: "index_lock_events_on_key"
+ end
+
create_table "oauth_access_grants", force: :cascade do |t|
t.bigint "resource_owner_id", null: false
t.bigint "application_id", null: false
@@ -248,6 +268,23 @@ ActiveRecord::Schema[8.0].define(version: 2025_02_25_111255) do
t.index ["uid"], name: "index_oauth_applications_on_uid", unique: true
end
+ create_table "search_entries", force: :cascade do |t|
+ t.string "record_type", null: false
+ t.bigint "record_id", null: false
+ t.bigint "account_id", null: false
+ t.tsvector "tsvector", null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.tsvector "ngram"
+ t.index ["account_id", "ngram"], name: "index_search_entries_on_account_id_ngram_submission", where: "((record_type)::text = 'Submission'::text)", using: :gin
+ t.index ["account_id", "ngram"], name: "index_search_entries_on_account_id_ngram_submitter", where: "((record_type)::text = 'Submitter'::text)", using: :gin
+ t.index ["account_id", "ngram"], name: "index_search_entries_on_account_id_ngram_template", where: "((record_type)::text = 'Template'::text)", using: :gin
+ t.index ["account_id", "tsvector"], name: "index_search_entries_on_account_id_tsvector_submission", where: "((record_type)::text = 'Submission'::text)", using: :gin
+ t.index ["account_id", "tsvector"], name: "index_search_entries_on_account_id_tsvector_submitter", where: "((record_type)::text = 'Submitter'::text)", using: :gin
+ t.index ["account_id", "tsvector"], name: "index_search_entries_on_account_id_tsvector_template", where: "((record_type)::text = 'Template'::text)", using: :gin
+ t.index ["record_id", "record_type"], name: "index_search_entries_on_record_id_and_record_type", unique: true
+ end
+
create_table "submission_events", force: :cascade do |t|
t.bigint "submission_id", null: false
t.bigint "submitter_id"
@@ -262,7 +299,7 @@ ActiveRecord::Schema[8.0].define(version: 2025_02_25_111255) do
end
create_table "submissions", force: :cascade do |t|
- t.bigint "template_id", null: false
+ t.bigint "template_id"
t.bigint "created_by_user_id"
t.datetime "archived_at"
t.datetime "created_at", null: false
@@ -270,13 +307,18 @@ ActiveRecord::Schema[8.0].define(version: 2025_02_25_111255) do
t.text "template_fields"
t.text "template_schema"
t.text "template_submitters"
- t.text "source", null: false
+ t.string "source", null: false
t.string "submitters_order", null: false
t.string "slug", null: false
t.text "preferences", null: false
t.bigint "account_id", null: false
t.datetime "expire_at"
+ t.text "name"
+ t.text "variables_schema"
+ t.text "variables"
t.index ["account_id", "id"], name: "index_submissions_on_account_id_and_id"
+ t.index ["account_id", "template_id", "id"], name: "index_submissions_on_account_id_and_template_id_and_id", where: "(archived_at IS NULL)"
+ t.index ["account_id", "template_id", "id"], name: "index_submissions_on_account_id_and_template_id_and_id_archived", where: "(archived_at IS NOT NULL)"
t.index ["created_by_user_id"], name: "index_submissions_on_created_by_user_id"
t.index ["slug"], name: "index_submissions_on_slug", unique: true
t.index ["template_id"], name: "index_submissions_on_template_id"
@@ -302,7 +344,9 @@ ActiveRecord::Schema[8.0].define(version: 2025_02_25_111255) do
t.text "metadata", null: false
t.bigint "account_id", null: false
t.datetime "declined_at"
+ t.string "timezone"
t.index ["account_id", "id"], name: "index_submitters_on_account_id_and_id"
+ t.index ["completed_at", "account_id"], name: "index_submitters_on_completed_at_and_account_id"
t.index ["email"], name: "index_submitters_on_email"
t.index ["external_id"], name: "index_submitters_on_external_id"
t.index ["slug"], name: "index_submitters_on_slug", unique: true
@@ -324,8 +368,10 @@ ActiveRecord::Schema[8.0].define(version: 2025_02_25_111255) do
t.datetime "archived_at"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
+ t.bigint "parent_folder_id"
t.index ["account_id"], name: "index_template_folders_on_account_id"
t.index ["author_id"], name: "index_template_folders_on_author_id"
+ t.index ["parent_folder_id"], name: "index_template_folders_on_parent_folder_id"
end
create_table "template_sharings", force: :cascade do |t|
@@ -353,6 +399,10 @@ ActiveRecord::Schema[8.0].define(version: 2025_02_25_111255) do
t.bigint "folder_id", null: false
t.string "external_id"
t.text "preferences", null: false
+ t.boolean "shared_link", default: false, null: false
+ t.text "variables_schema"
+ t.index ["account_id", "folder_id", "id"], name: "index_templates_on_account_id_and_folder_id_and_id", where: "(archived_at IS NULL)"
+ t.index ["account_id", "id"], name: "index_templates_on_account_id_and_id_archived", where: "(archived_at IS NOT NULL)"
t.index ["account_id"], name: "index_templates_on_account_id"
t.index ["author_id"], name: "index_templates_on_author_id"
t.index ["external_id"], name: "index_templates_on_external_id"
@@ -391,7 +441,7 @@ ActiveRecord::Schema[8.0].define(version: 2025_02_25_111255) do
t.datetime "archived_at"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
- t.text "uuid", null: false
+ t.string "uuid", null: false
t.string "otp_secret"
t.integer "consumed_timestep"
t.boolean "otp_required_for_login", default: false, null: false
@@ -402,6 +452,31 @@ ActiveRecord::Schema[8.0].define(version: 2025_02_25_111255) do
t.index ["uuid"], name: "index_users_on_uuid", unique: true
end
+ create_table "webhook_attempts", force: :cascade do |t|
+ t.bigint "webhook_event_id", null: false
+ t.text "response_body"
+ t.integer "response_status_code", null: false
+ t.integer "attempt", null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.index ["webhook_event_id"], name: "index_webhook_attempts_on_webhook_event_id"
+ end
+
+ create_table "webhook_events", force: :cascade do |t|
+ t.string "uuid", null: false
+ t.bigint "webhook_url_id", null: false
+ t.bigint "account_id", null: false
+ t.bigint "record_id", null: false
+ t.string "record_type", null: false
+ t.string "event_type", null: false
+ t.string "status", null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.index ["uuid", "webhook_url_id"], name: "index_webhook_events_on_uuid_and_webhook_url_id", unique: true
+ t.index ["webhook_url_id", "id"], name: "index_webhook_events_error", where: "((status)::text = 'error'::text)"
+ t.index ["webhook_url_id", "id"], name: "index_webhook_events_on_webhook_url_id_and_id"
+ end
+
create_table "webhook_urls", force: :cascade do |t|
t.bigint "account_id", null: false
t.text "url", null: false
@@ -415,6 +490,7 @@ ActiveRecord::Schema[8.0].define(version: 2025_02_25_111255) do
end
add_foreign_key "access_tokens", "users"
+ add_foreign_key "account_accesses", "accounts"
add_foreign_key "account_configs", "accounts"
add_foreign_key "account_linked_accounts", "accounts"
add_foreign_key "account_linked_accounts", "accounts", column: "linked_account_id"
@@ -437,6 +513,7 @@ ActiveRecord::Schema[8.0].define(version: 2025_02_25_111255) do
add_foreign_key "submitters", "submissions"
add_foreign_key "template_accesses", "templates"
add_foreign_key "template_folders", "accounts"
+ add_foreign_key "template_folders", "template_folders", column: "parent_folder_id"
add_foreign_key "template_folders", "users", column: "author_id"
add_foreign_key "template_sharings", "templates"
add_foreign_key "templates", "accounts"
diff --git a/docs/api/csharp.md b/docs/api/csharp.md
new file mode 100644
index 00000000..2d4d56a7
--- /dev/null
+++ b/docs/api/csharp.md
@@ -0,0 +1,4107 @@
+### List all templates
+
+The API endpoint provides the ability to retrieve a list of available document templates.
+
+```csharp
+var client = new RestClient("https://api.docuseal.com/templates");
+var request = new RestRequest("", Method.Get);
+request.AddHeader("X-Auth-Token", "API_KEY");
+var response = client.Execute(request);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "List all templates",
+ "operationId": "getTemplates",
+ "parameters": [
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates based on the name partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates by unique slug.",
+ "example": "opaKWh8WWTAcVG"
+ },
+ {
+ "name": "external_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The unique applications-specific identifier provided for the template via API or Embedded template form builder. It allows you to receive only templates with your specified external id."
+ },
+ {
+ "name": "folder",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates by folder name."
+ },
+ {
+ "name": "archived",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ },
+ "description": "Get only archived templates instead of active ones."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of templates to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the template to start the list from. It allows you to receive only templates with id greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of templates."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the template to end the list with. It allows you to receive only templates with id less than the specified value."
+ }
+ ]
+}
+```
+
+### Get a template
+
+The API endpoint provides the functionality to retrieve information about a document template.
+
+```csharp
+var client = new RestClient("https://api.docuseal.com/templates/1000001");
+var request = new RestRequest("", Method.Get);
+request.AddHeader("X-Auth-Token", "API_KEY");
+var response = client.Execute(request);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Get a template",
+ "operationId": "getTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ]
+}
+```
+
+### Archive a template
+
+The API endpoint allows you to archive a document template.
+
+```csharp
+var client = new RestClient("https://api.docuseal.com/templates/1000001");
+var request = new RestRequest("", Method.Delete);
+request.AddHeader("X-Auth-Token", "API_KEY");
+var response = client.Execute(request);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Archive a template",
+ "operationId": "archiveTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ]
+}
+```
+
+### Update a template
+
+The API endpoint provides the functionality to move a document template to a different folder and update the name of the template.
+
+```csharp
+var client = new RestClient("https://api.docuseal.com/templates/1000001");
+var request = new RestRequest("", Method.Put);
+request.AddHeader("X-Auth-Token", "API_KEY");
+request.AddHeader("content-type", "application/json");
+request.AddParameter("application/json", "{\"name\":\"New Document Name\",\"folder_name\":\"New Folder\"}", ParameterType.RequestBody);
+var response = client.Execute(request);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Update a template",
+ "operationId": "updateTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the template",
+ "example": "New Document Name"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be moved.",
+ "example": "New Folder"
+ },
+ "roles": {
+ "type": "array",
+ "description": "An array of submitter role names to update the template with.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Agent",
+ "Customer"
+ ]
+ },
+ "archived": {
+ "type": "boolean",
+ "description": "Set `false` to unarchive template."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### List all submissions
+
+The API endpoint provides the ability to retrieve a list of available submissions.
+
+```csharp
+var client = new RestClient("https://api.docuseal.com/submissions");
+var request = new RestRequest("", Method.Get);
+request.AddHeader("X-Auth-Token", "API_KEY");
+var response = client.Execute(request);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "List all submissions",
+ "operationId": "getSubmissions",
+ "parameters": [
+ {
+ "name": "template_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The template ID allows you to receive only the submissions created from that specific template."
+ },
+ {
+ "name": "status",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "enum": [
+ "pending",
+ "completed",
+ "declined",
+ "expired"
+ ]
+ },
+ "description": "Filter submissions by status."
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions based on submitters name, email or phone partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions by unique slug.",
+ "example": "NtLDQM7eJX2ZMd"
+ },
+ {
+ "name": "template_folder",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions by template folder name."
+ },
+ {
+ "name": "archived",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ },
+ "description": "Returns only archived submissions when `true` and only active submissions when `false`."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of submissions to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission to start the list from. It allows you to receive only submissions with an ID greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of submissions."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission that marks the end of the list. It allows you to receive only submissions with an ID less than the specified value."
+ }
+ ]
+}
+```
+
+### Create a submission
+
+This API endpoint allows you to create signature requests (submissions) for a document template and send them to the specified submitters (signers). Related Guides Send documents for signature via API Pre-fill PDF document form fields with API
+
+```csharp
+var client = new RestClient("https://api.docuseal.com/submissions");
+var request = new RestRequest("", Method.Post);
+request.AddHeader("X-Auth-Token", "API_KEY");
+request.AddHeader("content-type", "application/json");
+request.AddParameter("application/json", "{\"template_id\":1000001,\"send_email\":true,\"submitters\":[{\"role\":\"First Party\",\"email\":\"john.doe@example.com\"}]}", ParameterType.RequestBody);
+var response = client.Execute(request);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission",
+ "operationId": "createSubmission",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_id",
+ "submitters"
+ ],
+ "properties": {
+ "template_id": {
+ "type": "integer",
+ "description": "The unique identifier of the template. Document template forms can be created via the Web UI, PDF and DOCX API, or HTML API.",
+ "example": 1000001
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject for the submitter."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body for the submitter. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for template document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document template field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Get a submission
+
+The API endpoint provides the functionality to retrieve information about a submission.
+
+```csharp
+var client = new RestClient("https://api.docuseal.com/submissions/1001");
+var request = new RestRequest("", Method.Get);
+request.AddHeader("X-Auth-Token", "API_KEY");
+var response = client.Execute(request);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Get a submission",
+ "operationId": "getSubmission",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Archive a submission
+
+The API endpoint allows you to archive a submission.
+
+```csharp
+var client = new RestClient("https://api.docuseal.com/submissions/1001");
+var request = new RestRequest("", Method.Delete);
+request.AddHeader("X-Auth-Token", "API_KEY");
+var response = client.Execute(request);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Archive a submission",
+ "operationId": "archiveSubmission",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Get submission documents
+
+This endpoint returns a list of partially filled documents for a submission. If the submission has been completed, the final signed documents are returned.
+
+```csharp
+var client = new RestClient("https://api.docuseal.com/submissions/1001/documents");
+var request = new RestRequest("", Method.Get);
+request.AddHeader("X-Auth-Token", "API_KEY");
+var response = client.Execute(request);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Get submission documents",
+ "operationId": "getSubmissionDocuments",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Create submissions from emails
+
+This API endpoint allows you to create submissions for a document template and send them to the specified email addresses. This is a simplified version of the POST /submissions API to be used with Zapier or other automation tools.
+
+```csharp
+var client = new RestClient("https://api.docuseal.com/submissions/emails");
+var request = new RestRequest("", Method.Post);
+request.AddHeader("X-Auth-Token", "API_KEY");
+request.AddHeader("content-type", "application/json");
+request.AddParameter("application/json", "{\"template_id\":1000001,\"emails\":\"hi@docuseal.com, example@docuseal.com\"}", ParameterType.RequestBody);
+var response = client.Execute(request);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create submissions from emails",
+ "operationId": "createSubmissionsFromEmails",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_id",
+ "emails"
+ ],
+ "properties": {
+ "template_id": {
+ "type": "integer",
+ "description": "The unique identifier of the template.",
+ "example": 1000001
+ },
+ "emails": {
+ "type": "string",
+ "description": "A comma-separated list of email addresses to send the submission to.",
+ "example": "{{emails}}"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Get a submitter
+
+The API endpoint provides functionality to retrieve information about a submitter, along with the submitter documents and field values.
+
+```csharp
+var client = new RestClient("https://api.docuseal.com/submitters/500001");
+var request = new RestRequest("", Method.Get);
+request.AddHeader("X-Auth-Token", "API_KEY");
+var response = client.Execute(request);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "Get a submitter",
+ "operationId": "getSubmitter",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter.",
+ "example": 500001
+ }
+ ]
+}
+```
+
+### Update a submitter
+
+The API endpoint allows you to update submitter details, pre-fill or update field values and re-send emails. Related Guides Automatically sign documents via API
+
+```csharp
+var client = new RestClient("https://api.docuseal.com/submitters/500001");
+var request = new RestRequest("", Method.Put);
+request.AddHeader("X-Auth-Token", "API_KEY");
+request.AddHeader("content-type", "application/json");
+request.AddParameter("application/json", "{\"email\":\"john.doe@example.com\",\"fields\":[{\"name\":\"First Name\",\"default_value\":\"Acme\"}]}", ParameterType.RequestBody);
+var response = client.Execute(request);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "Update a submitter",
+ "operationId": "updateSubmitter",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter.",
+ "example": 500001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `true` to re-send signature request emails."
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to re-send signature request via phone number SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for template document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document template field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### List all submitters
+
+The API endpoint provides the ability to retrieve a list of submitters.
+
+```csharp
+var client = new RestClient("https://api.docuseal.com/submitters");
+var request = new RestRequest("", Method.Get);
+request.AddHeader("X-Auth-Token", "API_KEY");
+var response = client.Execute(request);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "List all submitters",
+ "operationId": "getSubmitters",
+ "parameters": [
+ {
+ "name": "submission_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The submission ID allows you to receive only the submitters related to that specific submission."
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submitters on name, email or phone partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submitters by unique slug.",
+ "example": "zAyL9fH36Havvm"
+ },
+ {
+ "name": "completed_after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "example": "2024-03-05 9:32:20",
+ "description": "The date and time string value to filter submitters that completed the submission after the specified date and time."
+ },
+ {
+ "name": "completed_before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "example": "2024-03-06 19:32:20",
+ "description": "The date and time string value to filter submitters that completed the submission before the specified date and time."
+ },
+ {
+ "name": "external_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The unique applications-specific identifier provided for a submitter when initializing a signature request. It allows you to receive only submitters with a specified external id."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of submitters to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter to start the list from. It allows you to receive only submitters with id greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of submitters."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter to end the list with. It allows you to receive only submitters with id less than the specified value."
+ }
+ ]
+}
+```
+
+### Update template documents
+
+The API endpoint allows you to add, remove or replace documents in the template with provided PDF/DOCX file or HTML content.
+
+```csharp
+var client = new RestClient("https://api.docuseal.com/templates/1000001/documents");
+var request = new RestRequest("", Method.Put);
+request.AddHeader("X-Auth-Token", "API_KEY");
+request.AddHeader("content-type", "application/json");
+request.AddParameter("application/json", "{\"documents\":[{\"file\":\"string\"}]}", ParameterType.RequestBody);
+var response = client.Execute(request);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Update template documents",
+ "operationId": "addDocumentToTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the documents template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "documents": {
+ "type": "array",
+ "description": "The list of documents to add or replace in the template.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Template"
+ },
+ "file": {
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF or DOCX file or downloadable file URL. Leave it empty if you create a new document using HTML param."
+ },
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags. Leave it empty if you add a document via PDF or DOCX base64 encoded file param or URL."
+ },
+ "position": {
+ "type": "integer",
+ "description": "Position of the document. By default will be added as the last document in the template.",
+ "example": 0
+ },
+ "replace": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to replace existing document with a new file at `position`. Existing document fields will be transferred to the new document if it doesn't contain any fields."
+ },
+ "remove": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to remove existing document at given `position` or with given `name`."
+ }
+ }
+ }
+ },
+ "merge": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to merge all existing and new documents into a single PDF document in the template."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Clone a template
+
+The API endpoint allows you to clone existing template into a new template.
+
+```csharp
+var client = new RestClient("https://api.docuseal.com/templates/1000001/clone");
+var request = new RestRequest("", Method.Post);
+request.AddHeader("X-Auth-Token", "API_KEY");
+request.AddHeader("content-type", "application/json");
+request.AddParameter("application/json", "{\"name\":\"Cloned Template\"}", ParameterType.RequestBody);
+var response = client.Execute(request);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Clone a template",
+ "operationId": "cloneTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the documents template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Template name. Existing name with (Clone) suffix will be used if not specified.",
+ "example": "Cloned Template"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be cloned."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from HTML
+
+The API endpoint provides the functionality to seamlessly generate a PDF document template by utilizing the provided HTML content while incorporating pre-defined fields. Related Guides Create PDF document fillable form with HTML
+
+```csharp
+var client = new RestClient("https://api.docuseal.com/templates/html");
+var request = new RestRequest("", Method.Post);
+request.AddHeader("X-Auth-Token", "API_KEY");
+request.AddHeader("content-type", "application/json");
+request.AddParameter("application/json", "{\"html\":\"Lorem Ipsum is simply dummy text of the\\n\\n\\nand typesetting industry \\n\",\"name\":\"Test Template\"}", ParameterType.RequestBody);
+var response = client.Execute(request);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from HTML",
+ "operationId": "createTemplateFromHtml",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "html_header": {
+ "type": "string",
+ "description": "HTML template of the header to be displayed on every page."
+ },
+ "html_footer": {
+ "type": "string",
+ "description": "HTML template of the footer to be displayed on every page."
+ },
+ "name": {
+ "type": "string",
+ "description": "Template name. Random uuid will be assigned when not specified.",
+ "example": "Test Template"
+ },
+ "size": {
+ "type": "string",
+ "default": "Letter",
+ "description": "Page size. Letter 8.5 x 11 will be assigned when not specified.",
+ "enum": [
+ "Letter",
+ "Legal",
+ "Tabloid",
+ "Ledger",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6"
+ ],
+ "example": "A4"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new HTML.",
+ "example": "714d974e-83d8-11ee-b962-0242ac120002"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "description": "The list of documents built from HTML. Can be used to create a template with multiple documents. Leave `documents` param empty when using a top-level `html` param for a template with a single document.",
+ "items": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Document"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from Word DOCX
+
+The API endpoint provides the functionality to create a fillable document template for existing Microsoft Word document. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.docx for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```csharp
+var client = new RestClient("https://api.docuseal.com/templates/docx");
+var request = new RestRequest("", Method.Post);
+request.AddHeader("X-Auth-Token", "API_KEY");
+request.AddHeader("content-type", "application/json");
+request.AddParameter("application/json", "{\"name\":\"Test DOCX\",\"documents\":[{\"name\":\"string\",\"file\":\"base64\"}]}", ParameterType.RequestBody);
+var response = client.Execute(request);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from Word DOCX",
+ "operationId": "createTemplateFromDocx",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test DOCX"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new document.",
+ "example": "unique-key"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "type": "string",
+ "example": "base64",
+ "format": "base64",
+ "description": "Base64-encoded content of the DOCX file or downloadable file URL"
+ },
+ "fields": {
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1."
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from existing PDF
+
+The API endpoint provides the functionality to create a fillable document template for existing PDF file. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```csharp
+var client = new RestClient("https://api.docuseal.com/templates/pdf");
+var request = new RestRequest("", Method.Post);
+request.AddHeader("X-Auth-Token", "API_KEY");
+request.AddHeader("content-type", "application/json");
+request.AddParameter("application/json", "{\"name\":\"Test PDF\",\"documents\":[{\"name\":\"string\",\"file\":\"base64\",\"fields\":[{\"name\":\"string\",\"areas\":[{\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"page\":1}]}]}]}", ParameterType.RequestBody);
+var response = client.Execute(request);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from existing PDF",
+ "operationId": "createTemplateFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test PDF"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new PDF.",
+ "example": "unique-key"
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the document.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Merge templates
+
+The API endpoint allows you to merge multiple templates with documents and fields into a new combined template.
+
+```csharp
+var client = new RestClient("https://api.docuseal.com/templates/merge");
+var request = new RestRequest("", Method.Post);
+request.AddHeader("X-Auth-Token", "API_KEY");
+request.AddHeader("content-type", "application/json");
+request.AddParameter("application/json", "{\"template_ids\":[321,432],\"name\":\"Merged Template\"}", ParameterType.RequestBody);
+var response = client.Execute(request);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Merge templates",
+ "operationId": "mergeTemplate",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_ids"
+ ],
+ "properties": {
+ "template_ids": {
+ "type": "array",
+ "description": "An array of template ids to merge into a new template.",
+ "items": {
+ "type": "integer"
+ },
+ "example": [
+ 321,
+ 432
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "Template name. Existing name with (Merged) suffix will be used if not specified.",
+ "example": "Merged Template"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The name of the folder in which the merged template should be placed."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "roles": {
+ "type": "array",
+ "description": "An array of submitter role names to be used in the merged template.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Agent",
+ "Customer"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from PDF
+
+The API endpoint provides the functionality to create one-off submission request from a PDF. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```csharp
+var client = new RestClient("https://api.docuseal.com/submissions/pdf");
+var request = new RestRequest("", Method.Post);
+request.AddHeader("X-Auth-Token", "API_KEY");
+request.AddHeader("content-type", "application/json");
+request.AddParameter("application/json", "{\"name\":\"Test Submission Document\",\"documents\":[{\"name\":\"string\",\"file\":\"base64\",\"fields\":[{\"name\":\"string\",\"areas\":[{\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"page\":1}]}]}],\"submitters\":[{\"role\":\"First Party\",\"email\":\"john.doe@example.com\"}]}", ParameterType.RequestBody);
+var response = client.Execute(request);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from PDF",
+ "operationId": "createSubmissionFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission.",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ }
+ }
+ }
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the documents.",
+ "default": false
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from HTML
+
+This API endpoint allows you to create a one-off submission request document using the provided HTML content, with special field tags rendered as a fillable and signable form. Related Guides Create PDF document fillable form with HTML
+
+```csharp
+var client = new RestClient("https://api.docuseal.com/submissions/html");
+var request = new RestRequest("", Method.Post);
+request.AddHeader("X-Auth-Token", "API_KEY");
+request.AddHeader("content-type", "application/json");
+request.AddParameter("application/json", "{\"name\":\"Test Submission Document\",\"documents\":[{\"name\":\"Test Document\",\"html\":\"Lorem Ipsum is simply dummy text of the\\n\\n\\nand typesetting industry \\n\"}],\"submitters\":[{\"role\":\"First Party\",\"email\":\"john.doe@example.com\"}]}", ParameterType.RequestBody);
+var response = client.Execute(request);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from HTML",
+ "operationId": "createSubmissionFromHtml",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "The list of documents built from HTML. Can be used to create a submission with multiple documents.",
+ "items": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Document"
+ },
+ "html": {
+ "type": "string",
+ "description": "HTML document content with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "html_header": {
+ "type": "string",
+ "description": "HTML document content of the header to be displayed on every page."
+ },
+ "html_footer": {
+ "type": "string",
+ "description": "HTML document content of the footer to be displayed on every page."
+ },
+ "size": {
+ "type": "string",
+ "default": "Letter",
+ "description": "Page size. Letter 8.5 x 11 will be assigned when not specified.",
+ "enum": [
+ "Letter",
+ "Legal",
+ "Tabloid",
+ "Ledger",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6"
+ ],
+ "example": "A4"
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from PDF
+
+The API endpoint provides the functionality to create a fillable document template for a PDF file. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```csharp
+var client = new RestClient("https://api.docuseal.com/templates/pdf");
+var request = new RestRequest("", Method.Post);
+request.AddHeader("X-Auth-Token", "API_KEY");
+request.AddHeader("content-type", "application/json");
+request.AddParameter("application/json", "{\"name\":\"Test PDF\",\"documents\":[{\"name\":\"string\",\"file\":\"base64\",\"fields\":[{\"name\":\"string\",\"areas\":[{\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"page\":1}]}]}]}", ParameterType.RequestBody);
+var response = client.Execute(request);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from PDF",
+ "operationId": "createTemplateFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test PDF"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new PDF.",
+ "example": "unique-key"
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the documents.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from DOCX
+
+The API endpoint provides functionality to create a one-off submission request from a DOCX file with dynamic content variables. Use [[variable_name]] text tags to define dynamic content variables in the document. See https://www.docuseal.com/examples/demo_template.docx for the specific text variable syntax, including dynamic content tables and list. You can also use the {{signature}} fillable field syntax to define fillable fields, as in a PDF. Related Guides Use embedded text field tags to create a fillable form
+
+```csharp
+var client = new RestClient("https://api.docuseal.com/submissions/docx");
+var request = new RestRequest("", Method.Post);
+request.AddHeader("X-Auth-Token", "API_KEY");
+request.AddHeader("content-type", "application/json");
+request.AddParameter("application/json", "{\"name\":\"Test Submission Document\",\"variables\":{\"variable_name\":\"value\"},\"documents\":[{\"name\":\"string\",\"file\":\"base64\"}],\"submitters\":[{\"role\":\"First Party\",\"email\":\"john.doe@example.com\"}]}", ParameterType.RequestBody);
+var response = client.Execute(request);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from DOCX",
+ "operationId": "createSubmissionFromDocx",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission.",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "variables": {
+ "type": "object",
+ "description": "Dynamic content variables object",
+ "example": {
+ "variable_name": "value"
+ }
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF or DOCX file or downloadable file URL."
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
diff --git a/docs/api/go.md b/docs/api/go.md
new file mode 100644
index 00000000..c0622ea8
--- /dev/null
+++ b/docs/api/go.md
@@ -0,0 +1,4618 @@
+### List all templates
+
+The API endpoint provides the ability to retrieve a list of available document templates.
+
+```go
+package main
+
+import (
+ "fmt"
+ "net/http"
+ "io"
+)
+
+func main() {
+
+ url := "https://api.docuseal.com/templates"
+
+ req, _ := http.NewRequest("GET", url, nil)
+
+ req.Header.Add("X-Auth-Token", "API_KEY")
+
+ res, _ := http.DefaultClient.Do(req)
+
+ defer res.Body.Close()
+ body, _ := io.ReadAll(res.Body)
+
+ fmt.Println(res)
+ fmt.Println(string(body))
+
+}
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "List all templates",
+ "operationId": "getTemplates",
+ "parameters": [
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates based on the name partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates by unique slug.",
+ "example": "opaKWh8WWTAcVG"
+ },
+ {
+ "name": "external_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The unique applications-specific identifier provided for the template via API or Embedded template form builder. It allows you to receive only templates with your specified external id."
+ },
+ {
+ "name": "folder",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates by folder name."
+ },
+ {
+ "name": "archived",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ },
+ "description": "Get only archived templates instead of active ones."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of templates to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the template to start the list from. It allows you to receive only templates with id greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of templates."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the template to end the list with. It allows you to receive only templates with id less than the specified value."
+ }
+ ]
+}
+```
+
+### Get a template
+
+The API endpoint provides the functionality to retrieve information about a document template.
+
+```go
+package main
+
+import (
+ "fmt"
+ "net/http"
+ "io"
+)
+
+func main() {
+
+ url := "https://api.docuseal.com/templates/1000001"
+
+ req, _ := http.NewRequest("GET", url, nil)
+
+ req.Header.Add("X-Auth-Token", "API_KEY")
+
+ res, _ := http.DefaultClient.Do(req)
+
+ defer res.Body.Close()
+ body, _ := io.ReadAll(res.Body)
+
+ fmt.Println(res)
+ fmt.Println(string(body))
+
+}
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Get a template",
+ "operationId": "getTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ]
+}
+```
+
+### Archive a template
+
+The API endpoint allows you to archive a document template.
+
+```go
+package main
+
+import (
+ "fmt"
+ "net/http"
+ "io"
+)
+
+func main() {
+
+ url := "https://api.docuseal.com/templates/1000001"
+
+ req, _ := http.NewRequest("DELETE", url, nil)
+
+ req.Header.Add("X-Auth-Token", "API_KEY")
+
+ res, _ := http.DefaultClient.Do(req)
+
+ defer res.Body.Close()
+ body, _ := io.ReadAll(res.Body)
+
+ fmt.Println(res)
+ fmt.Println(string(body))
+
+}
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Archive a template",
+ "operationId": "archiveTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ]
+}
+```
+
+### Update a template
+
+The API endpoint provides the functionality to move a document template to a different folder and update the name of the template.
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io"
+)
+
+func main() {
+
+ url := "https://api.docuseal.com/templates/1000001"
+
+ payload := strings.NewReader("{\"name\":\"New Document Name\",\"folder_name\":\"New Folder\"}")
+
+ req, _ := http.NewRequest("PUT", url, payload)
+
+ req.Header.Add("X-Auth-Token", "API_KEY")
+ req.Header.Add("content-type", "application/json")
+
+ res, _ := http.DefaultClient.Do(req)
+
+ defer res.Body.Close()
+ body, _ := io.ReadAll(res.Body)
+
+ fmt.Println(res)
+ fmt.Println(string(body))
+
+}
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Update a template",
+ "operationId": "updateTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the template",
+ "example": "New Document Name"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be moved.",
+ "example": "New Folder"
+ },
+ "roles": {
+ "type": "array",
+ "description": "An array of submitter role names to update the template with.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Agent",
+ "Customer"
+ ]
+ },
+ "archived": {
+ "type": "boolean",
+ "description": "Set `false` to unarchive template."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### List all submissions
+
+The API endpoint provides the ability to retrieve a list of available submissions.
+
+```go
+package main
+
+import (
+ "fmt"
+ "net/http"
+ "io"
+)
+
+func main() {
+
+ url := "https://api.docuseal.com/submissions"
+
+ req, _ := http.NewRequest("GET", url, nil)
+
+ req.Header.Add("X-Auth-Token", "API_KEY")
+
+ res, _ := http.DefaultClient.Do(req)
+
+ defer res.Body.Close()
+ body, _ := io.ReadAll(res.Body)
+
+ fmt.Println(res)
+ fmt.Println(string(body))
+
+}
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "List all submissions",
+ "operationId": "getSubmissions",
+ "parameters": [
+ {
+ "name": "template_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The template ID allows you to receive only the submissions created from that specific template."
+ },
+ {
+ "name": "status",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "enum": [
+ "pending",
+ "completed",
+ "declined",
+ "expired"
+ ]
+ },
+ "description": "Filter submissions by status."
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions based on submitters name, email or phone partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions by unique slug.",
+ "example": "NtLDQM7eJX2ZMd"
+ },
+ {
+ "name": "template_folder",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions by template folder name."
+ },
+ {
+ "name": "archived",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ },
+ "description": "Returns only archived submissions when `true` and only active submissions when `false`."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of submissions to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission to start the list from. It allows you to receive only submissions with an ID greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of submissions."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission that marks the end of the list. It allows you to receive only submissions with an ID less than the specified value."
+ }
+ ]
+}
+```
+
+### Create a submission
+
+This API endpoint allows you to create signature requests (submissions) for a document template and send them to the specified submitters (signers). Related Guides Send documents for signature via API Pre-fill PDF document form fields with API
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io"
+)
+
+func main() {
+
+ url := "https://api.docuseal.com/submissions"
+
+ payload := strings.NewReader("{\"template_id\":1000001,\"send_email\":true,\"submitters\":[{\"role\":\"First Party\",\"email\":\"john.doe@example.com\"}]}")
+
+ req, _ := http.NewRequest("POST", url, payload)
+
+ req.Header.Add("X-Auth-Token", "API_KEY")
+ req.Header.Add("content-type", "application/json")
+
+ res, _ := http.DefaultClient.Do(req)
+
+ defer res.Body.Close()
+ body, _ := io.ReadAll(res.Body)
+
+ fmt.Println(res)
+ fmt.Println(string(body))
+
+}
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission",
+ "operationId": "createSubmission",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_id",
+ "submitters"
+ ],
+ "properties": {
+ "template_id": {
+ "type": "integer",
+ "description": "The unique identifier of the template. Document template forms can be created via the Web UI, PDF and DOCX API, or HTML API.",
+ "example": 1000001
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject for the submitter."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body for the submitter. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for template document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document template field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Get a submission
+
+The API endpoint provides the functionality to retrieve information about a submission.
+
+```go
+package main
+
+import (
+ "fmt"
+ "net/http"
+ "io"
+)
+
+func main() {
+
+ url := "https://api.docuseal.com/submissions/1001"
+
+ req, _ := http.NewRequest("GET", url, nil)
+
+ req.Header.Add("X-Auth-Token", "API_KEY")
+
+ res, _ := http.DefaultClient.Do(req)
+
+ defer res.Body.Close()
+ body, _ := io.ReadAll(res.Body)
+
+ fmt.Println(res)
+ fmt.Println(string(body))
+
+}
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Get a submission",
+ "operationId": "getSubmission",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Archive a submission
+
+The API endpoint allows you to archive a submission.
+
+```go
+package main
+
+import (
+ "fmt"
+ "net/http"
+ "io"
+)
+
+func main() {
+
+ url := "https://api.docuseal.com/submissions/1001"
+
+ req, _ := http.NewRequest("DELETE", url, nil)
+
+ req.Header.Add("X-Auth-Token", "API_KEY")
+
+ res, _ := http.DefaultClient.Do(req)
+
+ defer res.Body.Close()
+ body, _ := io.ReadAll(res.Body)
+
+ fmt.Println(res)
+ fmt.Println(string(body))
+
+}
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Archive a submission",
+ "operationId": "archiveSubmission",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Get submission documents
+
+This endpoint returns a list of partially filled documents for a submission. If the submission has been completed, the final signed documents are returned.
+
+```go
+package main
+
+import (
+ "fmt"
+ "net/http"
+ "io"
+)
+
+func main() {
+
+ url := "https://api.docuseal.com/submissions/1001/documents"
+
+ req, _ := http.NewRequest("GET", url, nil)
+
+ req.Header.Add("X-Auth-Token", "API_KEY")
+
+ res, _ := http.DefaultClient.Do(req)
+
+ defer res.Body.Close()
+ body, _ := io.ReadAll(res.Body)
+
+ fmt.Println(res)
+ fmt.Println(string(body))
+
+}
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Get submission documents",
+ "operationId": "getSubmissionDocuments",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Create submissions from emails
+
+This API endpoint allows you to create submissions for a document template and send them to the specified email addresses. This is a simplified version of the POST /submissions API to be used with Zapier or other automation tools.
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io"
+)
+
+func main() {
+
+ url := "https://api.docuseal.com/submissions/emails"
+
+ payload := strings.NewReader("{\"template_id\":1000001,\"emails\":\"hi@docuseal.com, example@docuseal.com\"}")
+
+ req, _ := http.NewRequest("POST", url, payload)
+
+ req.Header.Add("X-Auth-Token", "API_KEY")
+ req.Header.Add("content-type", "application/json")
+
+ res, _ := http.DefaultClient.Do(req)
+
+ defer res.Body.Close()
+ body, _ := io.ReadAll(res.Body)
+
+ fmt.Println(res)
+ fmt.Println(string(body))
+
+}
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create submissions from emails",
+ "operationId": "createSubmissionsFromEmails",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_id",
+ "emails"
+ ],
+ "properties": {
+ "template_id": {
+ "type": "integer",
+ "description": "The unique identifier of the template.",
+ "example": 1000001
+ },
+ "emails": {
+ "type": "string",
+ "description": "A comma-separated list of email addresses to send the submission to.",
+ "example": "{{emails}}"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Get a submitter
+
+The API endpoint provides functionality to retrieve information about a submitter, along with the submitter documents and field values.
+
+```go
+package main
+
+import (
+ "fmt"
+ "net/http"
+ "io"
+)
+
+func main() {
+
+ url := "https://api.docuseal.com/submitters/500001"
+
+ req, _ := http.NewRequest("GET", url, nil)
+
+ req.Header.Add("X-Auth-Token", "API_KEY")
+
+ res, _ := http.DefaultClient.Do(req)
+
+ defer res.Body.Close()
+ body, _ := io.ReadAll(res.Body)
+
+ fmt.Println(res)
+ fmt.Println(string(body))
+
+}
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "Get a submitter",
+ "operationId": "getSubmitter",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter.",
+ "example": 500001
+ }
+ ]
+}
+```
+
+### Update a submitter
+
+The API endpoint allows you to update submitter details, pre-fill or update field values and re-send emails. Related Guides Automatically sign documents via API
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io"
+)
+
+func main() {
+
+ url := "https://api.docuseal.com/submitters/500001"
+
+ payload := strings.NewReader("{\"email\":\"john.doe@example.com\",\"fields\":[{\"name\":\"First Name\",\"default_value\":\"Acme\"}]}")
+
+ req, _ := http.NewRequest("PUT", url, payload)
+
+ req.Header.Add("X-Auth-Token", "API_KEY")
+ req.Header.Add("content-type", "application/json")
+
+ res, _ := http.DefaultClient.Do(req)
+
+ defer res.Body.Close()
+ body, _ := io.ReadAll(res.Body)
+
+ fmt.Println(res)
+ fmt.Println(string(body))
+
+}
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "Update a submitter",
+ "operationId": "updateSubmitter",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter.",
+ "example": 500001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `true` to re-send signature request emails."
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to re-send signature request via phone number SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for template document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document template field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### List all submitters
+
+The API endpoint provides the ability to retrieve a list of submitters.
+
+```go
+package main
+
+import (
+ "fmt"
+ "net/http"
+ "io"
+)
+
+func main() {
+
+ url := "https://api.docuseal.com/submitters"
+
+ req, _ := http.NewRequest("GET", url, nil)
+
+ req.Header.Add("X-Auth-Token", "API_KEY")
+
+ res, _ := http.DefaultClient.Do(req)
+
+ defer res.Body.Close()
+ body, _ := io.ReadAll(res.Body)
+
+ fmt.Println(res)
+ fmt.Println(string(body))
+
+}
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "List all submitters",
+ "operationId": "getSubmitters",
+ "parameters": [
+ {
+ "name": "submission_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The submission ID allows you to receive only the submitters related to that specific submission."
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submitters on name, email or phone partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submitters by unique slug.",
+ "example": "zAyL9fH36Havvm"
+ },
+ {
+ "name": "completed_after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "example": "2024-03-05 9:32:20",
+ "description": "The date and time string value to filter submitters that completed the submission after the specified date and time."
+ },
+ {
+ "name": "completed_before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "example": "2024-03-06 19:32:20",
+ "description": "The date and time string value to filter submitters that completed the submission before the specified date and time."
+ },
+ {
+ "name": "external_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The unique applications-specific identifier provided for a submitter when initializing a signature request. It allows you to receive only submitters with a specified external id."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of submitters to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter to start the list from. It allows you to receive only submitters with id greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of submitters."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter to end the list with. It allows you to receive only submitters with id less than the specified value."
+ }
+ ]
+}
+```
+
+### Update template documents
+
+The API endpoint allows you to add, remove or replace documents in the template with provided PDF/DOCX file or HTML content.
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io"
+)
+
+func main() {
+
+ url := "https://api.docuseal.com/templates/1000001/documents"
+
+ payload := strings.NewReader("{\"documents\":[{\"file\":\"string\"}]}")
+
+ req, _ := http.NewRequest("PUT", url, payload)
+
+ req.Header.Add("X-Auth-Token", "API_KEY")
+ req.Header.Add("content-type", "application/json")
+
+ res, _ := http.DefaultClient.Do(req)
+
+ defer res.Body.Close()
+ body, _ := io.ReadAll(res.Body)
+
+ fmt.Println(res)
+ fmt.Println(string(body))
+
+}
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Update template documents",
+ "operationId": "addDocumentToTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the documents template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "documents": {
+ "type": "array",
+ "description": "The list of documents to add or replace in the template.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Template"
+ },
+ "file": {
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF or DOCX file or downloadable file URL. Leave it empty if you create a new document using HTML param."
+ },
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags. Leave it empty if you add a document via PDF or DOCX base64 encoded file param or URL."
+ },
+ "position": {
+ "type": "integer",
+ "description": "Position of the document. By default will be added as the last document in the template.",
+ "example": 0
+ },
+ "replace": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to replace existing document with a new file at `position`. Existing document fields will be transferred to the new document if it doesn't contain any fields."
+ },
+ "remove": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to remove existing document at given `position` or with given `name`."
+ }
+ }
+ }
+ },
+ "merge": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to merge all existing and new documents into a single PDF document in the template."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Clone a template
+
+The API endpoint allows you to clone existing template into a new template.
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io"
+)
+
+func main() {
+
+ url := "https://api.docuseal.com/templates/1000001/clone"
+
+ payload := strings.NewReader("{\"name\":\"Cloned Template\"}")
+
+ req, _ := http.NewRequest("POST", url, payload)
+
+ req.Header.Add("X-Auth-Token", "API_KEY")
+ req.Header.Add("content-type", "application/json")
+
+ res, _ := http.DefaultClient.Do(req)
+
+ defer res.Body.Close()
+ body, _ := io.ReadAll(res.Body)
+
+ fmt.Println(res)
+ fmt.Println(string(body))
+
+}
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Clone a template",
+ "operationId": "cloneTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the documents template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Template name. Existing name with (Clone) suffix will be used if not specified.",
+ "example": "Cloned Template"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be cloned."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from HTML
+
+The API endpoint provides the functionality to seamlessly generate a PDF document template by utilizing the provided HTML content while incorporating pre-defined fields. Related Guides Create PDF document fillable form with HTML
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io"
+)
+
+func main() {
+
+ url := "https://api.docuseal.com/templates/html"
+
+ payload := strings.NewReader("{\"html\":\"Lorem Ipsum is simply dummy text of the\\n\\n\\nand typesetting industry \\n\",\"name\":\"Test Template\"}")
+
+ req, _ := http.NewRequest("POST", url, payload)
+
+ req.Header.Add("X-Auth-Token", "API_KEY")
+ req.Header.Add("content-type", "application/json")
+
+ res, _ := http.DefaultClient.Do(req)
+
+ defer res.Body.Close()
+ body, _ := io.ReadAll(res.Body)
+
+ fmt.Println(res)
+ fmt.Println(string(body))
+
+}
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from HTML",
+ "operationId": "createTemplateFromHtml",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "html_header": {
+ "type": "string",
+ "description": "HTML template of the header to be displayed on every page."
+ },
+ "html_footer": {
+ "type": "string",
+ "description": "HTML template of the footer to be displayed on every page."
+ },
+ "name": {
+ "type": "string",
+ "description": "Template name. Random uuid will be assigned when not specified.",
+ "example": "Test Template"
+ },
+ "size": {
+ "type": "string",
+ "default": "Letter",
+ "description": "Page size. Letter 8.5 x 11 will be assigned when not specified.",
+ "enum": [
+ "Letter",
+ "Legal",
+ "Tabloid",
+ "Ledger",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6"
+ ],
+ "example": "A4"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new HTML.",
+ "example": "714d974e-83d8-11ee-b962-0242ac120002"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "description": "The list of documents built from HTML. Can be used to create a template with multiple documents. Leave `documents` param empty when using a top-level `html` param for a template with a single document.",
+ "items": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Document"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from Word DOCX
+
+The API endpoint provides the functionality to create a fillable document template for existing Microsoft Word document. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.docx for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io"
+)
+
+func main() {
+
+ url := "https://api.docuseal.com/templates/docx"
+
+ payload := strings.NewReader("{\"name\":\"Test DOCX\",\"documents\":[{\"name\":\"string\",\"file\":\"base64\"}]}")
+
+ req, _ := http.NewRequest("POST", url, payload)
+
+ req.Header.Add("X-Auth-Token", "API_KEY")
+ req.Header.Add("content-type", "application/json")
+
+ res, _ := http.DefaultClient.Do(req)
+
+ defer res.Body.Close()
+ body, _ := io.ReadAll(res.Body)
+
+ fmt.Println(res)
+ fmt.Println(string(body))
+
+}
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from Word DOCX",
+ "operationId": "createTemplateFromDocx",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test DOCX"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new document.",
+ "example": "unique-key"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "type": "string",
+ "example": "base64",
+ "format": "base64",
+ "description": "Base64-encoded content of the DOCX file or downloadable file URL"
+ },
+ "fields": {
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1."
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from existing PDF
+
+The API endpoint provides the functionality to create a fillable document template for existing PDF file. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io"
+)
+
+func main() {
+
+ url := "https://api.docuseal.com/templates/pdf"
+
+ payload := strings.NewReader("{\"name\":\"Test PDF\",\"documents\":[{\"name\":\"string\",\"file\":\"base64\",\"fields\":[{\"name\":\"string\",\"areas\":[{\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"page\":1}]}]}]}")
+
+ req, _ := http.NewRequest("POST", url, payload)
+
+ req.Header.Add("X-Auth-Token", "API_KEY")
+ req.Header.Add("content-type", "application/json")
+
+ res, _ := http.DefaultClient.Do(req)
+
+ defer res.Body.Close()
+ body, _ := io.ReadAll(res.Body)
+
+ fmt.Println(res)
+ fmt.Println(string(body))
+
+}
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from existing PDF",
+ "operationId": "createTemplateFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test PDF"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new PDF.",
+ "example": "unique-key"
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the document.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Merge templates
+
+The API endpoint allows you to merge multiple templates with documents and fields into a new combined template.
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io"
+)
+
+func main() {
+
+ url := "https://api.docuseal.com/templates/merge"
+
+ payload := strings.NewReader("{\"template_ids\":[321,432],\"name\":\"Merged Template\"}")
+
+ req, _ := http.NewRequest("POST", url, payload)
+
+ req.Header.Add("X-Auth-Token", "API_KEY")
+ req.Header.Add("content-type", "application/json")
+
+ res, _ := http.DefaultClient.Do(req)
+
+ defer res.Body.Close()
+ body, _ := io.ReadAll(res.Body)
+
+ fmt.Println(res)
+ fmt.Println(string(body))
+
+}
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Merge templates",
+ "operationId": "mergeTemplate",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_ids"
+ ],
+ "properties": {
+ "template_ids": {
+ "type": "array",
+ "description": "An array of template ids to merge into a new template.",
+ "items": {
+ "type": "integer"
+ },
+ "example": [
+ 321,
+ 432
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "Template name. Existing name with (Merged) suffix will be used if not specified.",
+ "example": "Merged Template"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The name of the folder in which the merged template should be placed."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "roles": {
+ "type": "array",
+ "description": "An array of submitter role names to be used in the merged template.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Agent",
+ "Customer"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from PDF
+
+The API endpoint provides the functionality to create one-off submission request from a PDF. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io"
+)
+
+func main() {
+
+ url := "https://api.docuseal.com/submissions/pdf"
+
+ payload := strings.NewReader("{\"name\":\"Test Submission Document\",\"documents\":[{\"name\":\"string\",\"file\":\"base64\",\"fields\":[{\"name\":\"string\",\"areas\":[{\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"page\":1}]}]}],\"submitters\":[{\"role\":\"First Party\",\"email\":\"john.doe@example.com\"}]}")
+
+ req, _ := http.NewRequest("POST", url, payload)
+
+ req.Header.Add("X-Auth-Token", "API_KEY")
+ req.Header.Add("content-type", "application/json")
+
+ res, _ := http.DefaultClient.Do(req)
+
+ defer res.Body.Close()
+ body, _ := io.ReadAll(res.Body)
+
+ fmt.Println(res)
+ fmt.Println(string(body))
+
+}
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from PDF",
+ "operationId": "createSubmissionFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission.",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ }
+ }
+ }
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the documents.",
+ "default": false
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from HTML
+
+This API endpoint allows you to create a one-off submission request document using the provided HTML content, with special field tags rendered as a fillable and signable form. Related Guides Create PDF document fillable form with HTML
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io"
+)
+
+func main() {
+
+ url := "https://api.docuseal.com/submissions/html"
+
+ payload := strings.NewReader("{\"name\":\"Test Submission Document\",\"documents\":[{\"name\":\"Test Document\",\"html\":\"Lorem Ipsum is simply dummy text of the\\n\\n\\nand typesetting industry \\n\"}],\"submitters\":[{\"role\":\"First Party\",\"email\":\"john.doe@example.com\"}]}")
+
+ req, _ := http.NewRequest("POST", url, payload)
+
+ req.Header.Add("X-Auth-Token", "API_KEY")
+ req.Header.Add("content-type", "application/json")
+
+ res, _ := http.DefaultClient.Do(req)
+
+ defer res.Body.Close()
+ body, _ := io.ReadAll(res.Body)
+
+ fmt.Println(res)
+ fmt.Println(string(body))
+
+}
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from HTML",
+ "operationId": "createSubmissionFromHtml",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "The list of documents built from HTML. Can be used to create a submission with multiple documents.",
+ "items": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Document"
+ },
+ "html": {
+ "type": "string",
+ "description": "HTML document content with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "html_header": {
+ "type": "string",
+ "description": "HTML document content of the header to be displayed on every page."
+ },
+ "html_footer": {
+ "type": "string",
+ "description": "HTML document content of the footer to be displayed on every page."
+ },
+ "size": {
+ "type": "string",
+ "default": "Letter",
+ "description": "Page size. Letter 8.5 x 11 will be assigned when not specified.",
+ "enum": [
+ "Letter",
+ "Legal",
+ "Tabloid",
+ "Ledger",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6"
+ ],
+ "example": "A4"
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from PDF
+
+The API endpoint provides the functionality to create a fillable document template for a PDF file. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io"
+)
+
+func main() {
+
+ url := "https://api.docuseal.com/templates/pdf"
+
+ payload := strings.NewReader("{\"name\":\"Test PDF\",\"documents\":[{\"name\":\"string\",\"file\":\"base64\",\"fields\":[{\"name\":\"string\",\"areas\":[{\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"page\":1}]}]}]}")
+
+ req, _ := http.NewRequest("POST", url, payload)
+
+ req.Header.Add("X-Auth-Token", "API_KEY")
+ req.Header.Add("content-type", "application/json")
+
+ res, _ := http.DefaultClient.Do(req)
+
+ defer res.Body.Close()
+ body, _ := io.ReadAll(res.Body)
+
+ fmt.Println(res)
+ fmt.Println(string(body))
+
+}
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from PDF",
+ "operationId": "createTemplateFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test PDF"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new PDF.",
+ "example": "unique-key"
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the documents.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from DOCX
+
+The API endpoint provides functionality to create a one-off submission request from a DOCX file with dynamic content variables. Use [[variable_name]] text tags to define dynamic content variables in the document. See https://www.docuseal.com/examples/demo_template.docx for the specific text variable syntax, including dynamic content tables and list. You can also use the {{signature}} fillable field syntax to define fillable fields, as in a PDF. Related Guides Use embedded text field tags to create a fillable form
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io"
+)
+
+func main() {
+
+ url := "https://api.docuseal.com/submissions/docx"
+
+ payload := strings.NewReader("{\"name\":\"Test Submission Document\",\"variables\":{\"variable_name\":\"value\"},\"documents\":[{\"name\":\"string\",\"file\":\"base64\"}],\"submitters\":[{\"role\":\"First Party\",\"email\":\"john.doe@example.com\"}]}")
+
+ req, _ := http.NewRequest("POST", url, payload)
+
+ req.Header.Add("X-Auth-Token", "API_KEY")
+ req.Header.Add("content-type", "application/json")
+
+ res, _ := http.DefaultClient.Do(req)
+
+ defer res.Body.Close()
+ body, _ := io.ReadAll(res.Body)
+
+ fmt.Println(res)
+ fmt.Println(string(body))
+
+}
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from DOCX",
+ "operationId": "createSubmissionFromDocx",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission.",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "variables": {
+ "type": "object",
+ "description": "Dynamic content variables object",
+ "example": {
+ "variable_name": "value"
+ }
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF or DOCX file or downloadable file URL."
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
diff --git a/docs/api/java.md b/docs/api/java.md
new file mode 100644
index 00000000..83375022
--- /dev/null
+++ b/docs/api/java.md
@@ -0,0 +1,4084 @@
+### List all templates
+
+The API endpoint provides the ability to retrieve a list of available document templates.
+
+```java
+HttpResponse response = Unirest.get("https://api.docuseal.com/templates")
+ .header("X-Auth-Token", "API_KEY")
+ .asString();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "List all templates",
+ "operationId": "getTemplates",
+ "parameters": [
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates based on the name partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates by unique slug.",
+ "example": "opaKWh8WWTAcVG"
+ },
+ {
+ "name": "external_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The unique applications-specific identifier provided for the template via API or Embedded template form builder. It allows you to receive only templates with your specified external id."
+ },
+ {
+ "name": "folder",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates by folder name."
+ },
+ {
+ "name": "archived",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ },
+ "description": "Get only archived templates instead of active ones."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of templates to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the template to start the list from. It allows you to receive only templates with id greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of templates."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the template to end the list with. It allows you to receive only templates with id less than the specified value."
+ }
+ ]
+}
+```
+
+### Get a template
+
+The API endpoint provides the functionality to retrieve information about a document template.
+
+```java
+HttpResponse response = Unirest.get("https://api.docuseal.com/templates/1000001")
+ .header("X-Auth-Token", "API_KEY")
+ .asString();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Get a template",
+ "operationId": "getTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ]
+}
+```
+
+### Archive a template
+
+The API endpoint allows you to archive a document template.
+
+```java
+HttpResponse response = Unirest.delete("https://api.docuseal.com/templates/1000001")
+ .header("X-Auth-Token", "API_KEY")
+ .asString();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Archive a template",
+ "operationId": "archiveTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ]
+}
+```
+
+### Update a template
+
+The API endpoint provides the functionality to move a document template to a different folder and update the name of the template.
+
+```java
+HttpResponse response = Unirest.put("https://api.docuseal.com/templates/1000001")
+ .header("X-Auth-Token", "API_KEY")
+ .header("content-type", "application/json")
+ .body("{\"name\":\"New Document Name\",\"folder_name\":\"New Folder\"}")
+ .asString();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Update a template",
+ "operationId": "updateTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the template",
+ "example": "New Document Name"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be moved.",
+ "example": "New Folder"
+ },
+ "roles": {
+ "type": "array",
+ "description": "An array of submitter role names to update the template with.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Agent",
+ "Customer"
+ ]
+ },
+ "archived": {
+ "type": "boolean",
+ "description": "Set `false` to unarchive template."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### List all submissions
+
+The API endpoint provides the ability to retrieve a list of available submissions.
+
+```java
+HttpResponse response = Unirest.get("https://api.docuseal.com/submissions")
+ .header("X-Auth-Token", "API_KEY")
+ .asString();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "List all submissions",
+ "operationId": "getSubmissions",
+ "parameters": [
+ {
+ "name": "template_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The template ID allows you to receive only the submissions created from that specific template."
+ },
+ {
+ "name": "status",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "enum": [
+ "pending",
+ "completed",
+ "declined",
+ "expired"
+ ]
+ },
+ "description": "Filter submissions by status."
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions based on submitters name, email or phone partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions by unique slug.",
+ "example": "NtLDQM7eJX2ZMd"
+ },
+ {
+ "name": "template_folder",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions by template folder name."
+ },
+ {
+ "name": "archived",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ },
+ "description": "Returns only archived submissions when `true` and only active submissions when `false`."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of submissions to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission to start the list from. It allows you to receive only submissions with an ID greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of submissions."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission that marks the end of the list. It allows you to receive only submissions with an ID less than the specified value."
+ }
+ ]
+}
+```
+
+### Create a submission
+
+This API endpoint allows you to create signature requests (submissions) for a document template and send them to the specified submitters (signers). Related Guides Send documents for signature via API Pre-fill PDF document form fields with API
+
+```java
+HttpResponse response = Unirest.post("https://api.docuseal.com/submissions")
+ .header("X-Auth-Token", "API_KEY")
+ .header("content-type", "application/json")
+ .body("{\"template_id\":1000001,\"send_email\":true,\"submitters\":[{\"role\":\"First Party\",\"email\":\"john.doe@example.com\"}]}")
+ .asString();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission",
+ "operationId": "createSubmission",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_id",
+ "submitters"
+ ],
+ "properties": {
+ "template_id": {
+ "type": "integer",
+ "description": "The unique identifier of the template. Document template forms can be created via the Web UI, PDF and DOCX API, or HTML API.",
+ "example": 1000001
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject for the submitter."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body for the submitter. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for template document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document template field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Get a submission
+
+The API endpoint provides the functionality to retrieve information about a submission.
+
+```java
+HttpResponse response = Unirest.get("https://api.docuseal.com/submissions/1001")
+ .header("X-Auth-Token", "API_KEY")
+ .asString();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Get a submission",
+ "operationId": "getSubmission",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Archive a submission
+
+The API endpoint allows you to archive a submission.
+
+```java
+HttpResponse response = Unirest.delete("https://api.docuseal.com/submissions/1001")
+ .header("X-Auth-Token", "API_KEY")
+ .asString();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Archive a submission",
+ "operationId": "archiveSubmission",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Get submission documents
+
+This endpoint returns a list of partially filled documents for a submission. If the submission has been completed, the final signed documents are returned.
+
+```java
+HttpResponse response = Unirest.get("https://api.docuseal.com/submissions/1001/documents")
+ .header("X-Auth-Token", "API_KEY")
+ .asString();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Get submission documents",
+ "operationId": "getSubmissionDocuments",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Create submissions from emails
+
+This API endpoint allows you to create submissions for a document template and send them to the specified email addresses. This is a simplified version of the POST /submissions API to be used with Zapier or other automation tools.
+
+```java
+HttpResponse response = Unirest.post("https://api.docuseal.com/submissions/emails")
+ .header("X-Auth-Token", "API_KEY")
+ .header("content-type", "application/json")
+ .body("{\"template_id\":1000001,\"emails\":\"hi@docuseal.com, example@docuseal.com\"}")
+ .asString();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create submissions from emails",
+ "operationId": "createSubmissionsFromEmails",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_id",
+ "emails"
+ ],
+ "properties": {
+ "template_id": {
+ "type": "integer",
+ "description": "The unique identifier of the template.",
+ "example": 1000001
+ },
+ "emails": {
+ "type": "string",
+ "description": "A comma-separated list of email addresses to send the submission to.",
+ "example": "{{emails}}"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Get a submitter
+
+The API endpoint provides functionality to retrieve information about a submitter, along with the submitter documents and field values.
+
+```java
+HttpResponse response = Unirest.get("https://api.docuseal.com/submitters/500001")
+ .header("X-Auth-Token", "API_KEY")
+ .asString();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "Get a submitter",
+ "operationId": "getSubmitter",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter.",
+ "example": 500001
+ }
+ ]
+}
+```
+
+### Update a submitter
+
+The API endpoint allows you to update submitter details, pre-fill or update field values and re-send emails. Related Guides Automatically sign documents via API
+
+```java
+HttpResponse response = Unirest.put("https://api.docuseal.com/submitters/500001")
+ .header("X-Auth-Token", "API_KEY")
+ .header("content-type", "application/json")
+ .body("{\"email\":\"john.doe@example.com\",\"fields\":[{\"name\":\"First Name\",\"default_value\":\"Acme\"}]}")
+ .asString();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "Update a submitter",
+ "operationId": "updateSubmitter",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter.",
+ "example": 500001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `true` to re-send signature request emails."
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to re-send signature request via phone number SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for template document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document template field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### List all submitters
+
+The API endpoint provides the ability to retrieve a list of submitters.
+
+```java
+HttpResponse response = Unirest.get("https://api.docuseal.com/submitters")
+ .header("X-Auth-Token", "API_KEY")
+ .asString();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "List all submitters",
+ "operationId": "getSubmitters",
+ "parameters": [
+ {
+ "name": "submission_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The submission ID allows you to receive only the submitters related to that specific submission."
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submitters on name, email or phone partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submitters by unique slug.",
+ "example": "zAyL9fH36Havvm"
+ },
+ {
+ "name": "completed_after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "example": "2024-03-05 9:32:20",
+ "description": "The date and time string value to filter submitters that completed the submission after the specified date and time."
+ },
+ {
+ "name": "completed_before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "example": "2024-03-06 19:32:20",
+ "description": "The date and time string value to filter submitters that completed the submission before the specified date and time."
+ },
+ {
+ "name": "external_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The unique applications-specific identifier provided for a submitter when initializing a signature request. It allows you to receive only submitters with a specified external id."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of submitters to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter to start the list from. It allows you to receive only submitters with id greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of submitters."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter to end the list with. It allows you to receive only submitters with id less than the specified value."
+ }
+ ]
+}
+```
+
+### Update template documents
+
+The API endpoint allows you to add, remove or replace documents in the template with provided PDF/DOCX file or HTML content.
+
+```java
+HttpResponse response = Unirest.put("https://api.docuseal.com/templates/1000001/documents")
+ .header("X-Auth-Token", "API_KEY")
+ .header("content-type", "application/json")
+ .body("{\"documents\":[{\"file\":\"string\"}]}")
+ .asString();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Update template documents",
+ "operationId": "addDocumentToTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the documents template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "documents": {
+ "type": "array",
+ "description": "The list of documents to add or replace in the template.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Template"
+ },
+ "file": {
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF or DOCX file or downloadable file URL. Leave it empty if you create a new document using HTML param."
+ },
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags. Leave it empty if you add a document via PDF or DOCX base64 encoded file param or URL."
+ },
+ "position": {
+ "type": "integer",
+ "description": "Position of the document. By default will be added as the last document in the template.",
+ "example": 0
+ },
+ "replace": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to replace existing document with a new file at `position`. Existing document fields will be transferred to the new document if it doesn't contain any fields."
+ },
+ "remove": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to remove existing document at given `position` or with given `name`."
+ }
+ }
+ }
+ },
+ "merge": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to merge all existing and new documents into a single PDF document in the template."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Clone a template
+
+The API endpoint allows you to clone existing template into a new template.
+
+```java
+HttpResponse response = Unirest.post("https://api.docuseal.com/templates/1000001/clone")
+ .header("X-Auth-Token", "API_KEY")
+ .header("content-type", "application/json")
+ .body("{\"name\":\"Cloned Template\"}")
+ .asString();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Clone a template",
+ "operationId": "cloneTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the documents template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Template name. Existing name with (Clone) suffix will be used if not specified.",
+ "example": "Cloned Template"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be cloned."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from HTML
+
+The API endpoint provides the functionality to seamlessly generate a PDF document template by utilizing the provided HTML content while incorporating pre-defined fields. Related Guides Create PDF document fillable form with HTML
+
+```java
+HttpResponse response = Unirest.post("https://api.docuseal.com/templates/html")
+ .header("X-Auth-Token", "API_KEY")
+ .header("content-type", "application/json")
+ .body("{\"html\":\"Lorem Ipsum is simply dummy text of the\\n\\n\\nand typesetting industry \\n\",\"name\":\"Test Template\"}")
+ .asString();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from HTML",
+ "operationId": "createTemplateFromHtml",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "html_header": {
+ "type": "string",
+ "description": "HTML template of the header to be displayed on every page."
+ },
+ "html_footer": {
+ "type": "string",
+ "description": "HTML template of the footer to be displayed on every page."
+ },
+ "name": {
+ "type": "string",
+ "description": "Template name. Random uuid will be assigned when not specified.",
+ "example": "Test Template"
+ },
+ "size": {
+ "type": "string",
+ "default": "Letter",
+ "description": "Page size. Letter 8.5 x 11 will be assigned when not specified.",
+ "enum": [
+ "Letter",
+ "Legal",
+ "Tabloid",
+ "Ledger",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6"
+ ],
+ "example": "A4"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new HTML.",
+ "example": "714d974e-83d8-11ee-b962-0242ac120002"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "description": "The list of documents built from HTML. Can be used to create a template with multiple documents. Leave `documents` param empty when using a top-level `html` param for a template with a single document.",
+ "items": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Document"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from Word DOCX
+
+The API endpoint provides the functionality to create a fillable document template for existing Microsoft Word document. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.docx for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```java
+HttpResponse response = Unirest.post("https://api.docuseal.com/templates/docx")
+ .header("X-Auth-Token", "API_KEY")
+ .header("content-type", "application/json")
+ .body("{\"name\":\"Test DOCX\",\"documents\":[{\"name\":\"string\",\"file\":\"base64\"}]}")
+ .asString();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from Word DOCX",
+ "operationId": "createTemplateFromDocx",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test DOCX"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new document.",
+ "example": "unique-key"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "type": "string",
+ "example": "base64",
+ "format": "base64",
+ "description": "Base64-encoded content of the DOCX file or downloadable file URL"
+ },
+ "fields": {
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1."
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from existing PDF
+
+The API endpoint provides the functionality to create a fillable document template for existing PDF file. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```java
+HttpResponse response = Unirest.post("https://api.docuseal.com/templates/pdf")
+ .header("X-Auth-Token", "API_KEY")
+ .header("content-type", "application/json")
+ .body("{\"name\":\"Test PDF\",\"documents\":[{\"name\":\"string\",\"file\":\"base64\",\"fields\":[{\"name\":\"string\",\"areas\":[{\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"page\":1}]}]}]}")
+ .asString();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from existing PDF",
+ "operationId": "createTemplateFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test PDF"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new PDF.",
+ "example": "unique-key"
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the document.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Merge templates
+
+The API endpoint allows you to merge multiple templates with documents and fields into a new combined template.
+
+```java
+HttpResponse response = Unirest.post("https://api.docuseal.com/templates/merge")
+ .header("X-Auth-Token", "API_KEY")
+ .header("content-type", "application/json")
+ .body("{\"template_ids\":[321,432],\"name\":\"Merged Template\"}")
+ .asString();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Merge templates",
+ "operationId": "mergeTemplate",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_ids"
+ ],
+ "properties": {
+ "template_ids": {
+ "type": "array",
+ "description": "An array of template ids to merge into a new template.",
+ "items": {
+ "type": "integer"
+ },
+ "example": [
+ 321,
+ 432
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "Template name. Existing name with (Merged) suffix will be used if not specified.",
+ "example": "Merged Template"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The name of the folder in which the merged template should be placed."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "roles": {
+ "type": "array",
+ "description": "An array of submitter role names to be used in the merged template.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Agent",
+ "Customer"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from PDF
+
+The API endpoint provides the functionality to create one-off submission request from a PDF. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```java
+HttpResponse response = Unirest.post("https://api.docuseal.com/submissions/pdf")
+ .header("X-Auth-Token", "API_KEY")
+ .header("content-type", "application/json")
+ .body("{\"name\":\"Test Submission Document\",\"documents\":[{\"name\":\"string\",\"file\":\"base64\",\"fields\":[{\"name\":\"string\",\"areas\":[{\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"page\":1}]}]}],\"submitters\":[{\"role\":\"First Party\",\"email\":\"john.doe@example.com\"}]}")
+ .asString();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from PDF",
+ "operationId": "createSubmissionFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission.",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ }
+ }
+ }
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the documents.",
+ "default": false
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from HTML
+
+This API endpoint allows you to create a one-off submission request document using the provided HTML content, with special field tags rendered as a fillable and signable form. Related Guides Create PDF document fillable form with HTML
+
+```java
+HttpResponse response = Unirest.post("https://api.docuseal.com/submissions/html")
+ .header("X-Auth-Token", "API_KEY")
+ .header("content-type", "application/json")
+ .body("{\"name\":\"Test Submission Document\",\"documents\":[{\"name\":\"Test Document\",\"html\":\"Lorem Ipsum is simply dummy text of the\\n\\n\\nand typesetting industry \\n\"}],\"submitters\":[{\"role\":\"First Party\",\"email\":\"john.doe@example.com\"}]}")
+ .asString();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from HTML",
+ "operationId": "createSubmissionFromHtml",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "The list of documents built from HTML. Can be used to create a submission with multiple documents.",
+ "items": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Document"
+ },
+ "html": {
+ "type": "string",
+ "description": "HTML document content with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "html_header": {
+ "type": "string",
+ "description": "HTML document content of the header to be displayed on every page."
+ },
+ "html_footer": {
+ "type": "string",
+ "description": "HTML document content of the footer to be displayed on every page."
+ },
+ "size": {
+ "type": "string",
+ "default": "Letter",
+ "description": "Page size. Letter 8.5 x 11 will be assigned when not specified.",
+ "enum": [
+ "Letter",
+ "Legal",
+ "Tabloid",
+ "Ledger",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6"
+ ],
+ "example": "A4"
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from PDF
+
+The API endpoint provides the functionality to create a fillable document template for a PDF file. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```java
+HttpResponse response = Unirest.post("https://api.docuseal.com/templates/pdf")
+ .header("X-Auth-Token", "API_KEY")
+ .header("content-type", "application/json")
+ .body("{\"name\":\"Test PDF\",\"documents\":[{\"name\":\"string\",\"file\":\"base64\",\"fields\":[{\"name\":\"string\",\"areas\":[{\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"page\":1}]}]}]}")
+ .asString();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from PDF",
+ "operationId": "createTemplateFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test PDF"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new PDF.",
+ "example": "unique-key"
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the documents.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from DOCX
+
+The API endpoint provides functionality to create a one-off submission request from a DOCX file with dynamic content variables. Use [[variable_name]] text tags to define dynamic content variables in the document. See https://www.docuseal.com/examples/demo_template.docx for the specific text variable syntax, including dynamic content tables and list. You can also use the {{signature}} fillable field syntax to define fillable fields, as in a PDF. Related Guides Use embedded text field tags to create a fillable form
+
+```java
+HttpResponse response = Unirest.post("https://api.docuseal.com/submissions/docx")
+ .header("X-Auth-Token", "API_KEY")
+ .header("content-type", "application/json")
+ .body("{\"name\":\"Test Submission Document\",\"variables\":{\"variable_name\":\"value\"},\"documents\":[{\"name\":\"string\",\"file\":\"base64\"}],\"submitters\":[{\"role\":\"First Party\",\"email\":\"john.doe@example.com\"}]}")
+ .asString();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from DOCX",
+ "operationId": "createSubmissionFromDocx",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission.",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "variables": {
+ "type": "object",
+ "description": "Dynamic content variables object",
+ "example": {
+ "variable_name": "value"
+ }
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF or DOCX file or downloadable file URL."
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
diff --git a/docs/api/javascript.md b/docs/api/javascript.md
new file mode 100644
index 00000000..c0635531
--- /dev/null
+++ b/docs/api/javascript.md
@@ -0,0 +1,4269 @@
+### List all templates
+
+The API endpoint provides the ability to retrieve a list of available document templates.
+
+```javascript
+const docuseal = require("@docuseal/api");
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const { data, pagination } = await docuseal.listTemplates({ limit: 10 });
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "List all templates",
+ "operationId": "getTemplates",
+ "parameters": [
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates based on the name partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates by unique slug.",
+ "example": "opaKWh8WWTAcVG"
+ },
+ {
+ "name": "external_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The unique applications-specific identifier provided for the template via API or Embedded template form builder. It allows you to receive only templates with your specified external id."
+ },
+ {
+ "name": "folder",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates by folder name."
+ },
+ {
+ "name": "archived",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ },
+ "description": "Get only archived templates instead of active ones."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of templates to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the template to start the list from. It allows you to receive only templates with id greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of templates."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the template to end the list with. It allows you to receive only templates with id less than the specified value."
+ }
+ ]
+}
+```
+
+### Get a template
+
+The API endpoint provides the functionality to retrieve information about a document template.
+
+```javascript
+const docuseal = require("@docuseal/api");
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const template = await docuseal.getTemplate(1000001);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Get a template",
+ "operationId": "getTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ]
+}
+```
+
+### Archive a template
+
+The API endpoint allows you to archive a document template.
+
+```javascript
+const docuseal = require("@docuseal/api");
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+await docuseal.archiveTemplate(1000001);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Archive a template",
+ "operationId": "archiveTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ]
+}
+```
+
+### Update a template
+
+The API endpoint provides the functionality to move a document template to a different folder and update the name of the template.
+
+```javascript
+const docuseal = require("@docuseal/api");
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const template = await docuseal.updateTemplate(1000001, {
+ name: "New Document Name",
+ folder_name: "New Folder"
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Update a template",
+ "operationId": "updateTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the template",
+ "example": "New Document Name"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be moved.",
+ "example": "New Folder"
+ },
+ "roles": {
+ "type": "array",
+ "description": "An array of submitter role names to update the template with.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Agent",
+ "Customer"
+ ]
+ },
+ "archived": {
+ "type": "boolean",
+ "description": "Set `false` to unarchive template."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### List all submissions
+
+The API endpoint provides the ability to retrieve a list of available submissions.
+
+```javascript
+const docuseal = require("@docuseal/api");
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const { data, pagination } = await docuseal.listSubmissions({ limit: 10 });
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "List all submissions",
+ "operationId": "getSubmissions",
+ "parameters": [
+ {
+ "name": "template_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The template ID allows you to receive only the submissions created from that specific template."
+ },
+ {
+ "name": "status",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "enum": [
+ "pending",
+ "completed",
+ "declined",
+ "expired"
+ ]
+ },
+ "description": "Filter submissions by status."
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions based on submitters name, email or phone partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions by unique slug.",
+ "example": "NtLDQM7eJX2ZMd"
+ },
+ {
+ "name": "template_folder",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions by template folder name."
+ },
+ {
+ "name": "archived",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ },
+ "description": "Returns only archived submissions when `true` and only active submissions when `false`."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of submissions to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission to start the list from. It allows you to receive only submissions with an ID greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of submissions."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission that marks the end of the list. It allows you to receive only submissions with an ID less than the specified value."
+ }
+ ]
+}
+```
+
+### Create a submission
+
+This API endpoint allows you to create signature requests (submissions) for a document template and send them to the specified submitters (signers). Related Guides Send documents for signature via API Pre-fill PDF document form fields with API
+
+```javascript
+const docuseal = require("@docuseal/api");
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const submission = await docuseal.createSubmission({
+ template_id: 1000001,
+ send_email: true,
+ submitters: [
+ {
+ role: "First Party",
+ email: "john.doe@example.com"
+ }
+ ]
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission",
+ "operationId": "createSubmission",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_id",
+ "submitters"
+ ],
+ "properties": {
+ "template_id": {
+ "type": "integer",
+ "description": "The unique identifier of the template. Document template forms can be created via the Web UI, PDF and DOCX API, or HTML API.",
+ "example": 1000001
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject for the submitter."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body for the submitter. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for template document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document template field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Get a submission
+
+The API endpoint provides the functionality to retrieve information about a submission.
+
+```javascript
+const docuseal = require("@docuseal/api");
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const submission = await docuseal.getSubmission(1001);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Get a submission",
+ "operationId": "getSubmission",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Archive a submission
+
+The API endpoint allows you to archive a submission.
+
+```javascript
+const docuseal = require("@docuseal/api");
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+await docuseal.archiveSubmission(1001);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Archive a submission",
+ "operationId": "archiveSubmission",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Get submission documents
+
+This endpoint returns a list of partially filled documents for a submission. If the submission has been completed, the final signed documents are returned.
+
+```javascript
+const docuseal = require("@docuseal/api");
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const submission = await docuseal.getSubmissionDocuments(1001);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Get submission documents",
+ "operationId": "getSubmissionDocuments",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Create submissions from emails
+
+This API endpoint allows you to create submissions for a document template and send them to the specified email addresses. This is a simplified version of the POST /submissions API to be used with Zapier or other automation tools.
+
+```javascript
+const docuseal = require("@docuseal/api");
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const submission = await docuseal.createSubmissionFromEmails({
+ template_id: 1000001,
+ emails: "hi@docuseal.com, example@docuseal.com"
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create submissions from emails",
+ "operationId": "createSubmissionsFromEmails",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_id",
+ "emails"
+ ],
+ "properties": {
+ "template_id": {
+ "type": "integer",
+ "description": "The unique identifier of the template.",
+ "example": 1000001
+ },
+ "emails": {
+ "type": "string",
+ "description": "A comma-separated list of email addresses to send the submission to.",
+ "example": "{{emails}}"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Get a submitter
+
+The API endpoint provides functionality to retrieve information about a submitter, along with the submitter documents and field values.
+
+```javascript
+const docuseal = require("@docuseal/api");
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const submitter = await docuseal.getSubmitter(500001);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "Get a submitter",
+ "operationId": "getSubmitter",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter.",
+ "example": 500001
+ }
+ ]
+}
+```
+
+### Update a submitter
+
+The API endpoint allows you to update submitter details, pre-fill or update field values and re-send emails. Related Guides Automatically sign documents via API
+
+```javascript
+const docuseal = require("@docuseal/api");
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const submitter = await docuseal.updateSubmitter(500001, {
+ email: "john.doe@example.com",
+ fields: [
+ {
+ name: "First Name",
+ default_value: "Acme"
+ }
+ ]
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "Update a submitter",
+ "operationId": "updateSubmitter",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter.",
+ "example": 500001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `true` to re-send signature request emails."
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to re-send signature request via phone number SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for template document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document template field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### List all submitters
+
+The API endpoint provides the ability to retrieve a list of submitters.
+
+```javascript
+const docuseal = require("@docuseal/api");
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const { data, pagination } = await docuseal.listSubmitters({ limit: 10 });
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "List all submitters",
+ "operationId": "getSubmitters",
+ "parameters": [
+ {
+ "name": "submission_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The submission ID allows you to receive only the submitters related to that specific submission."
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submitters on name, email or phone partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submitters by unique slug.",
+ "example": "zAyL9fH36Havvm"
+ },
+ {
+ "name": "completed_after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "example": "2024-03-05 9:32:20",
+ "description": "The date and time string value to filter submitters that completed the submission after the specified date and time."
+ },
+ {
+ "name": "completed_before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "example": "2024-03-06 19:32:20",
+ "description": "The date and time string value to filter submitters that completed the submission before the specified date and time."
+ },
+ {
+ "name": "external_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The unique applications-specific identifier provided for a submitter when initializing a signature request. It allows you to receive only submitters with a specified external id."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of submitters to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter to start the list from. It allows you to receive only submitters with id greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of submitters."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter to end the list with. It allows you to receive only submitters with id less than the specified value."
+ }
+ ]
+}
+```
+
+### Update template documents
+
+The API endpoint allows you to add, remove or replace documents in the template with provided PDF/DOCX file or HTML content.
+
+```javascript
+const docuseal = require("@docuseal/api");
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const template = await docuseal.updateTemplateDocuments(1000001, {
+ documents: [
+ {
+ file: "string"
+ }
+ ]
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Update template documents",
+ "operationId": "addDocumentToTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the documents template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "documents": {
+ "type": "array",
+ "description": "The list of documents to add or replace in the template.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Template"
+ },
+ "file": {
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF or DOCX file or downloadable file URL. Leave it empty if you create a new document using HTML param."
+ },
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags. Leave it empty if you add a document via PDF or DOCX base64 encoded file param or URL."
+ },
+ "position": {
+ "type": "integer",
+ "description": "Position of the document. By default will be added as the last document in the template.",
+ "example": 0
+ },
+ "replace": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to replace existing document with a new file at `position`. Existing document fields will be transferred to the new document if it doesn't contain any fields."
+ },
+ "remove": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to remove existing document at given `position` or with given `name`."
+ }
+ }
+ }
+ },
+ "merge": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to merge all existing and new documents into a single PDF document in the template."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Clone a template
+
+The API endpoint allows you to clone existing template into a new template.
+
+```javascript
+const docuseal = require("@docuseal/api");
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const template = await docuseal.cloneTemplate(1000001, {
+ name: "Cloned Template"
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Clone a template",
+ "operationId": "cloneTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the documents template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Template name. Existing name with (Clone) suffix will be used if not specified.",
+ "example": "Cloned Template"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be cloned."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from HTML
+
+The API endpoint provides the functionality to seamlessly generate a PDF document template by utilizing the provided HTML content while incorporating pre-defined fields. Related Guides Create PDF document fillable form with HTML
+
+```javascript
+const docuseal = require("@docuseal/api");
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const template = await docuseal.createTemplateFromHtml({
+ html: `Lorem Ipsum is simply dummy text of the
+
+
+and typesetting industry
+`,
+ name: "Test Template"
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from HTML",
+ "operationId": "createTemplateFromHtml",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "html_header": {
+ "type": "string",
+ "description": "HTML template of the header to be displayed on every page."
+ },
+ "html_footer": {
+ "type": "string",
+ "description": "HTML template of the footer to be displayed on every page."
+ },
+ "name": {
+ "type": "string",
+ "description": "Template name. Random uuid will be assigned when not specified.",
+ "example": "Test Template"
+ },
+ "size": {
+ "type": "string",
+ "default": "Letter",
+ "description": "Page size. Letter 8.5 x 11 will be assigned when not specified.",
+ "enum": [
+ "Letter",
+ "Legal",
+ "Tabloid",
+ "Ledger",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6"
+ ],
+ "example": "A4"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new HTML.",
+ "example": "714d974e-83d8-11ee-b962-0242ac120002"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "description": "The list of documents built from HTML. Can be used to create a template with multiple documents. Leave `documents` param empty when using a top-level `html` param for a template with a single document.",
+ "items": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Document"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from Word DOCX
+
+The API endpoint provides the functionality to create a fillable document template for existing Microsoft Word document. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.docx for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```javascript
+const docuseal = require("@docuseal/api");
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const template = await docuseal.createTemplateFromDocx({
+ name: "Test DOCX",
+ documents: [
+ {
+ name: "string",
+ file: "base64"
+ }
+ ]
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from Word DOCX",
+ "operationId": "createTemplateFromDocx",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test DOCX"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new document.",
+ "example": "unique-key"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "type": "string",
+ "example": "base64",
+ "format": "base64",
+ "description": "Base64-encoded content of the DOCX file or downloadable file URL"
+ },
+ "fields": {
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1."
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from existing PDF
+
+The API endpoint provides the functionality to create a fillable document template for existing PDF file. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```javascript
+const docuseal = require("@docuseal/api");
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const template = await docuseal.createTemplateFromPdf({
+ name: "Test PDF",
+ documents: [
+ {
+ name: "string",
+ file: "base64",
+ fields: [
+ {
+ name: "string",
+ areas: [
+ {
+ x: 0,
+ y: 0,
+ w: 0,
+ h: 0,
+ page: 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from existing PDF",
+ "operationId": "createTemplateFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test PDF"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new PDF.",
+ "example": "unique-key"
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the document.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Merge templates
+
+The API endpoint allows you to merge multiple templates with documents and fields into a new combined template.
+
+```javascript
+const docuseal = require("@docuseal/api");
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const template = await docuseal.mergeTemplates({
+ template_ids: [
+ 321,
+ 432
+ ],
+ name: "Merged Template"
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Merge templates",
+ "operationId": "mergeTemplate",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_ids"
+ ],
+ "properties": {
+ "template_ids": {
+ "type": "array",
+ "description": "An array of template ids to merge into a new template.",
+ "items": {
+ "type": "integer"
+ },
+ "example": [
+ 321,
+ 432
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "Template name. Existing name with (Merged) suffix will be used if not specified.",
+ "example": "Merged Template"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The name of the folder in which the merged template should be placed."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "roles": {
+ "type": "array",
+ "description": "An array of submitter role names to be used in the merged template.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Agent",
+ "Customer"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from PDF
+
+The API endpoint provides the functionality to create one-off submission request from a PDF. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```javascript
+const docuseal = require("@docuseal/api");
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const submission = await docuseal.createSubmissionFromPdf({
+ name: "Test Submission Document",
+ documents: [
+ {
+ name: "string",
+ file: "base64",
+ fields: [
+ {
+ name: "string",
+ areas: [
+ {
+ x: 0,
+ y: 0,
+ w: 0,
+ h: 0,
+ page: 1
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ submitters: [
+ {
+ role: "First Party",
+ email: "john.doe@example.com"
+ }
+ ]
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from PDF",
+ "operationId": "createSubmissionFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission.",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ }
+ }
+ }
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the documents.",
+ "default": false
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from HTML
+
+This API endpoint allows you to create a one-off submission request document using the provided HTML content, with special field tags rendered as a fillable and signable form. Related Guides Create PDF document fillable form with HTML
+
+```javascript
+const docuseal = require("@docuseal/api");
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const submission = await docuseal.createSubmissionFromHtml({
+ name: "Test Submission Document",
+ documents: [
+ {
+ name: "Test Document",
+ html: `Lorem Ipsum is simply dummy text of the
+
+
+and typesetting industry
+`
+ }
+ ],
+ submitters: [
+ {
+ role: "First Party",
+ email: "john.doe@example.com"
+ }
+ ]
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from HTML",
+ "operationId": "createSubmissionFromHtml",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "The list of documents built from HTML. Can be used to create a submission with multiple documents.",
+ "items": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Document"
+ },
+ "html": {
+ "type": "string",
+ "description": "HTML document content with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "html_header": {
+ "type": "string",
+ "description": "HTML document content of the header to be displayed on every page."
+ },
+ "html_footer": {
+ "type": "string",
+ "description": "HTML document content of the footer to be displayed on every page."
+ },
+ "size": {
+ "type": "string",
+ "default": "Letter",
+ "description": "Page size. Letter 8.5 x 11 will be assigned when not specified.",
+ "enum": [
+ "Letter",
+ "Legal",
+ "Tabloid",
+ "Ledger",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6"
+ ],
+ "example": "A4"
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from PDF
+
+The API endpoint provides the functionality to create a fillable document template for a PDF file. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```javascript
+const docuseal = require("@docuseal/api");
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const template = await docuseal.createTemplateFromPdf({
+ name: "Test PDF",
+ documents: [
+ {
+ name: "string",
+ file: "base64",
+ fields: [
+ {
+ name: "string",
+ areas: [
+ {
+ x: 0,
+ y: 0,
+ w: 0,
+ h: 0,
+ page: 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from PDF",
+ "operationId": "createTemplateFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test PDF"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new PDF.",
+ "example": "unique-key"
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the documents.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from DOCX
+
+The API endpoint provides functionality to create a one-off submission request from a DOCX file with dynamic content variables. Use [[variable_name]] text tags to define dynamic content variables in the document. See https://www.docuseal.com/examples/demo_template.docx for the specific text variable syntax, including dynamic content tables and list. You can also use the {{signature}} fillable field syntax to define fillable fields, as in a PDF. Related Guides Use embedded text field tags to create a fillable form
+
+```javascript
+const docuseal = require("@docuseal/api");
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const submission = await docuseal.createSubmissionFromDocx({
+ name: "Test Submission Document",
+ variables: {
+ variable_name: "value"
+ },
+ documents: [
+ {
+ name: "string",
+ file: "base64"
+ }
+ ],
+ submitters: [
+ {
+ role: "First Party",
+ email: "john.doe@example.com"
+ }
+ ]
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from DOCX",
+ "operationId": "createSubmissionFromDocx",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission.",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "variables": {
+ "type": "object",
+ "description": "Dynamic content variables object",
+ "example": {
+ "variable_name": "value"
+ }
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF or DOCX file or downloadable file URL."
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
diff --git a/docs/api/nodejs.md b/docs/api/nodejs.md
new file mode 100644
index 00000000..d5865715
--- /dev/null
+++ b/docs/api/nodejs.md
@@ -0,0 +1,4398 @@
+### List all templates
+
+The API endpoint provides the ability to retrieve a list of available document templates.
+
+```nodejs
+const fetch = require("node-fetch");
+
+const resp = await fetch("https://api.docuseal.com/templates", {
+ method: "GET",
+ headers: {
+ "X-Auth-Token": "API_KEY"
+ }
+});
+
+const { data, pagination } = await resp.json();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "List all templates",
+ "operationId": "getTemplates",
+ "parameters": [
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates based on the name partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates by unique slug.",
+ "example": "opaKWh8WWTAcVG"
+ },
+ {
+ "name": "external_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The unique applications-specific identifier provided for the template via API or Embedded template form builder. It allows you to receive only templates with your specified external id."
+ },
+ {
+ "name": "folder",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates by folder name."
+ },
+ {
+ "name": "archived",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ },
+ "description": "Get only archived templates instead of active ones."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of templates to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the template to start the list from. It allows you to receive only templates with id greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of templates."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the template to end the list with. It allows you to receive only templates with id less than the specified value."
+ }
+ ]
+}
+```
+
+### Get a template
+
+The API endpoint provides the functionality to retrieve information about a document template.
+
+```nodejs
+const fetch = require("node-fetch");
+
+const resp = await fetch("https://api.docuseal.com/templates/1000001", {
+ method: "GET",
+ headers: {
+ "X-Auth-Token": "API_KEY"
+ }
+});
+
+const template = await resp.json();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Get a template",
+ "operationId": "getTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ]
+}
+```
+
+### Archive a template
+
+The API endpoint allows you to archive a document template.
+
+```nodejs
+const fetch = require("node-fetch");
+
+const resp = await fetch("https://api.docuseal.com/templates/1000001", {
+ method: "DELETE",
+ headers: {
+ "X-Auth-Token": "API_KEY"
+ }
+});
+
+await resp.json();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Archive a template",
+ "operationId": "archiveTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ]
+}
+```
+
+### Update a template
+
+The API endpoint provides the functionality to move a document template to a different folder and update the name of the template.
+
+```nodejs
+const fetch = require("node-fetch");
+
+const resp = await fetch("https://api.docuseal.com/templates/1000001", {
+ method: "PUT",
+ headers: {
+ "X-Auth-Token": "API_KEY"
+ },
+ body: JSON.stringify({
+ name: "New Document Name",
+ folder_name: "New Folder"
+ })
+});
+
+const template = await resp.json();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Update a template",
+ "operationId": "updateTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the template",
+ "example": "New Document Name"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be moved.",
+ "example": "New Folder"
+ },
+ "roles": {
+ "type": "array",
+ "description": "An array of submitter role names to update the template with.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Agent",
+ "Customer"
+ ]
+ },
+ "archived": {
+ "type": "boolean",
+ "description": "Set `false` to unarchive template."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### List all submissions
+
+The API endpoint provides the ability to retrieve a list of available submissions.
+
+```nodejs
+const fetch = require("node-fetch");
+
+const resp = await fetch("https://api.docuseal.com/submissions", {
+ method: "GET",
+ headers: {
+ "X-Auth-Token": "API_KEY"
+ }
+});
+
+const { data, pagination } = await resp.json();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "List all submissions",
+ "operationId": "getSubmissions",
+ "parameters": [
+ {
+ "name": "template_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The template ID allows you to receive only the submissions created from that specific template."
+ },
+ {
+ "name": "status",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "enum": [
+ "pending",
+ "completed",
+ "declined",
+ "expired"
+ ]
+ },
+ "description": "Filter submissions by status."
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions based on submitters name, email or phone partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions by unique slug.",
+ "example": "NtLDQM7eJX2ZMd"
+ },
+ {
+ "name": "template_folder",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions by template folder name."
+ },
+ {
+ "name": "archived",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ },
+ "description": "Returns only archived submissions when `true` and only active submissions when `false`."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of submissions to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission to start the list from. It allows you to receive only submissions with an ID greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of submissions."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission that marks the end of the list. It allows you to receive only submissions with an ID less than the specified value."
+ }
+ ]
+}
+```
+
+### Create a submission
+
+This API endpoint allows you to create signature requests (submissions) for a document template and send them to the specified submitters (signers). Related Guides Send documents for signature via API Pre-fill PDF document form fields with API
+
+```nodejs
+const fetch = require("node-fetch");
+
+const resp = await fetch("https://api.docuseal.com/submissions", {
+ method: "POST",
+ headers: {
+ "X-Auth-Token": "API_KEY"
+ },
+ body: JSON.stringify({
+ template_id: 1000001,
+ send_email: true,
+ submitters: [
+ {
+ role: "First Party",
+ email: "john.doe@example.com"
+ }
+ ]
+ })
+});
+
+const submitters = await resp.json();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission",
+ "operationId": "createSubmission",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_id",
+ "submitters"
+ ],
+ "properties": {
+ "template_id": {
+ "type": "integer",
+ "description": "The unique identifier of the template. Document template forms can be created via the Web UI, PDF and DOCX API, or HTML API.",
+ "example": 1000001
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject for the submitter."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body for the submitter. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for template document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document template field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Get a submission
+
+The API endpoint provides the functionality to retrieve information about a submission.
+
+```nodejs
+const fetch = require("node-fetch");
+
+const resp = await fetch("https://api.docuseal.com/submissions/1001", {
+ method: "GET",
+ headers: {
+ "X-Auth-Token": "API_KEY"
+ }
+});
+
+const submission = await resp.json();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Get a submission",
+ "operationId": "getSubmission",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Archive a submission
+
+The API endpoint allows you to archive a submission.
+
+```nodejs
+const fetch = require("node-fetch");
+
+const resp = await fetch("https://api.docuseal.com/submissions/1001", {
+ method: "DELETE",
+ headers: {
+ "X-Auth-Token": "API_KEY"
+ }
+});
+
+await resp.json();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Archive a submission",
+ "operationId": "archiveSubmission",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Get submission documents
+
+This endpoint returns a list of partially filled documents for a submission. If the submission has been completed, the final signed documents are returned.
+
+```nodejs
+const fetch = require("node-fetch");
+
+const resp = await fetch("https://api.docuseal.com/submissions/1001/documents", {
+ method: "GET",
+ headers: {
+ "X-Auth-Token": "API_KEY"
+ }
+});
+
+const submission = await resp.json();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Get submission documents",
+ "operationId": "getSubmissionDocuments",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Create submissions from emails
+
+This API endpoint allows you to create submissions for a document template and send them to the specified email addresses. This is a simplified version of the POST /submissions API to be used with Zapier or other automation tools.
+
+```nodejs
+const fetch = require("node-fetch");
+
+const resp = await fetch("https://api.docuseal.com/submissions/emails", {
+ method: "POST",
+ headers: {
+ "X-Auth-Token": "API_KEY"
+ },
+ body: JSON.stringify({
+ template_id: 1000001,
+ emails: "hi@docuseal.com, example@docuseal.com"
+ })
+});
+
+const submitters = await resp.json();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create submissions from emails",
+ "operationId": "createSubmissionsFromEmails",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_id",
+ "emails"
+ ],
+ "properties": {
+ "template_id": {
+ "type": "integer",
+ "description": "The unique identifier of the template.",
+ "example": 1000001
+ },
+ "emails": {
+ "type": "string",
+ "description": "A comma-separated list of email addresses to send the submission to.",
+ "example": "{{emails}}"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Get a submitter
+
+The API endpoint provides functionality to retrieve information about a submitter, along with the submitter documents and field values.
+
+```nodejs
+const fetch = require("node-fetch");
+
+const resp = await fetch("https://api.docuseal.com/submitters/500001", {
+ method: "GET",
+ headers: {
+ "X-Auth-Token": "API_KEY"
+ }
+});
+
+const submitter = await resp.json();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "Get a submitter",
+ "operationId": "getSubmitter",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter.",
+ "example": 500001
+ }
+ ]
+}
+```
+
+### Update a submitter
+
+The API endpoint allows you to update submitter details, pre-fill or update field values and re-send emails. Related Guides Automatically sign documents via API
+
+```nodejs
+const fetch = require("node-fetch");
+
+const resp = await fetch("https://api.docuseal.com/submitters/500001", {
+ method: "PUT",
+ headers: {
+ "X-Auth-Token": "API_KEY"
+ },
+ body: JSON.stringify({
+ email: "john.doe@example.com",
+ fields: [
+ {
+ name: "First Name",
+ default_value: "Acme"
+ }
+ ]
+ })
+});
+
+const submitter = await resp.json();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "Update a submitter",
+ "operationId": "updateSubmitter",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter.",
+ "example": 500001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `true` to re-send signature request emails."
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to re-send signature request via phone number SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for template document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document template field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### List all submitters
+
+The API endpoint provides the ability to retrieve a list of submitters.
+
+```nodejs
+const fetch = require("node-fetch");
+
+const resp = await fetch("https://api.docuseal.com/submitters", {
+ method: "GET",
+ headers: {
+ "X-Auth-Token": "API_KEY"
+ }
+});
+
+const { data, pagination } = await resp.json();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "List all submitters",
+ "operationId": "getSubmitters",
+ "parameters": [
+ {
+ "name": "submission_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The submission ID allows you to receive only the submitters related to that specific submission."
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submitters on name, email or phone partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submitters by unique slug.",
+ "example": "zAyL9fH36Havvm"
+ },
+ {
+ "name": "completed_after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "example": "2024-03-05 9:32:20",
+ "description": "The date and time string value to filter submitters that completed the submission after the specified date and time."
+ },
+ {
+ "name": "completed_before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "example": "2024-03-06 19:32:20",
+ "description": "The date and time string value to filter submitters that completed the submission before the specified date and time."
+ },
+ {
+ "name": "external_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The unique applications-specific identifier provided for a submitter when initializing a signature request. It allows you to receive only submitters with a specified external id."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of submitters to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter to start the list from. It allows you to receive only submitters with id greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of submitters."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter to end the list with. It allows you to receive only submitters with id less than the specified value."
+ }
+ ]
+}
+```
+
+### Update template documents
+
+The API endpoint allows you to add, remove or replace documents in the template with provided PDF/DOCX file or HTML content.
+
+```nodejs
+const fetch = require("node-fetch");
+
+const resp = await fetch("https://api.docuseal.com/templates/1000001/documents", {
+ method: "PUT",
+ headers: {
+ "X-Auth-Token": "API_KEY"
+ },
+ body: JSON.stringify({
+ documents: [
+ {
+ file: "string"
+ }
+ ]
+ })
+});
+
+const template = await resp.json();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Update template documents",
+ "operationId": "addDocumentToTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the documents template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "documents": {
+ "type": "array",
+ "description": "The list of documents to add or replace in the template.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Template"
+ },
+ "file": {
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF or DOCX file or downloadable file URL. Leave it empty if you create a new document using HTML param."
+ },
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags. Leave it empty if you add a document via PDF or DOCX base64 encoded file param or URL."
+ },
+ "position": {
+ "type": "integer",
+ "description": "Position of the document. By default will be added as the last document in the template.",
+ "example": 0
+ },
+ "replace": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to replace existing document with a new file at `position`. Existing document fields will be transferred to the new document if it doesn't contain any fields."
+ },
+ "remove": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to remove existing document at given `position` or with given `name`."
+ }
+ }
+ }
+ },
+ "merge": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to merge all existing and new documents into a single PDF document in the template."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Clone a template
+
+The API endpoint allows you to clone existing template into a new template.
+
+```nodejs
+const fetch = require("node-fetch");
+
+const resp = await fetch("https://api.docuseal.com/templates/1000001/clone", {
+ method: "POST",
+ headers: {
+ "X-Auth-Token": "API_KEY"
+ },
+ body: JSON.stringify({
+ name: "Cloned Template"
+ })
+});
+
+const template = await resp.json();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Clone a template",
+ "operationId": "cloneTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the documents template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Template name. Existing name with (Clone) suffix will be used if not specified.",
+ "example": "Cloned Template"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be cloned."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from HTML
+
+The API endpoint provides the functionality to seamlessly generate a PDF document template by utilizing the provided HTML content while incorporating pre-defined fields. Related Guides Create PDF document fillable form with HTML
+
+```nodejs
+const fetch = require("node-fetch");
+
+const resp = await fetch("https://api.docuseal.com/templates/html", {
+ method: "POST",
+ headers: {
+ "X-Auth-Token": "API_KEY"
+ },
+ body: JSON.stringify({
+ html: `Lorem Ipsum is simply dummy text of the
+
+
+and typesetting industry
+`,
+ name: "Test Template"
+ })
+});
+
+const template = await resp.json();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from HTML",
+ "operationId": "createTemplateFromHtml",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "html_header": {
+ "type": "string",
+ "description": "HTML template of the header to be displayed on every page."
+ },
+ "html_footer": {
+ "type": "string",
+ "description": "HTML template of the footer to be displayed on every page."
+ },
+ "name": {
+ "type": "string",
+ "description": "Template name. Random uuid will be assigned when not specified.",
+ "example": "Test Template"
+ },
+ "size": {
+ "type": "string",
+ "default": "Letter",
+ "description": "Page size. Letter 8.5 x 11 will be assigned when not specified.",
+ "enum": [
+ "Letter",
+ "Legal",
+ "Tabloid",
+ "Ledger",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6"
+ ],
+ "example": "A4"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new HTML.",
+ "example": "714d974e-83d8-11ee-b962-0242ac120002"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "description": "The list of documents built from HTML. Can be used to create a template with multiple documents. Leave `documents` param empty when using a top-level `html` param for a template with a single document.",
+ "items": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Document"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from Word DOCX
+
+The API endpoint provides the functionality to create a fillable document template for existing Microsoft Word document. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.docx for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```nodejs
+const fetch = require("node-fetch");
+
+const resp = await fetch("https://api.docuseal.com/templates/docx", {
+ method: "POST",
+ headers: {
+ "X-Auth-Token": "API_KEY"
+ },
+ body: JSON.stringify({
+ name: "Test DOCX",
+ documents: [
+ {
+ name: "string",
+ file: "base64"
+ }
+ ]
+ })
+});
+
+const template = await resp.json();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from Word DOCX",
+ "operationId": "createTemplateFromDocx",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test DOCX"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new document.",
+ "example": "unique-key"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "type": "string",
+ "example": "base64",
+ "format": "base64",
+ "description": "Base64-encoded content of the DOCX file or downloadable file URL"
+ },
+ "fields": {
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1."
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from existing PDF
+
+The API endpoint provides the functionality to create a fillable document template for existing PDF file. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```nodejs
+const fetch = require("node-fetch");
+
+const resp = await fetch("https://api.docuseal.com/templates/pdf", {
+ method: "POST",
+ headers: {
+ "X-Auth-Token": "API_KEY"
+ },
+ body: JSON.stringify({
+ name: "Test PDF",
+ documents: [
+ {
+ name: "string",
+ file: "base64",
+ fields: [
+ {
+ name: "string",
+ areas: [
+ {
+ x: 0,
+ y: 0,
+ w: 0,
+ h: 0,
+ page: 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ })
+});
+
+const template = await resp.json();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from existing PDF",
+ "operationId": "createTemplateFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test PDF"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new PDF.",
+ "example": "unique-key"
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the document.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Merge templates
+
+The API endpoint allows you to merge multiple templates with documents and fields into a new combined template.
+
+```nodejs
+const fetch = require("node-fetch");
+
+const resp = await fetch("https://api.docuseal.com/templates/merge", {
+ method: "POST",
+ headers: {
+ "X-Auth-Token": "API_KEY"
+ },
+ body: JSON.stringify({
+ template_ids: [
+ 321,
+ 432
+ ],
+ name: "Merged Template"
+ })
+});
+
+const template = await resp.json();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Merge templates",
+ "operationId": "mergeTemplate",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_ids"
+ ],
+ "properties": {
+ "template_ids": {
+ "type": "array",
+ "description": "An array of template ids to merge into a new template.",
+ "items": {
+ "type": "integer"
+ },
+ "example": [
+ 321,
+ 432
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "Template name. Existing name with (Merged) suffix will be used if not specified.",
+ "example": "Merged Template"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The name of the folder in which the merged template should be placed."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "roles": {
+ "type": "array",
+ "description": "An array of submitter role names to be used in the merged template.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Agent",
+ "Customer"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from PDF
+
+The API endpoint provides the functionality to create one-off submission request from a PDF. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```nodejs
+const fetch = require("node-fetch");
+
+const resp = await fetch("https://api.docuseal.com/submissions/pdf", {
+ method: "POST",
+ headers: {
+ "X-Auth-Token": "API_KEY"
+ },
+ body: JSON.stringify({
+ name: "Test Submission Document",
+ documents: [
+ {
+ name: "string",
+ file: "base64",
+ fields: [
+ {
+ name: "string",
+ areas: [
+ {
+ x: 0,
+ y: 0,
+ w: 0,
+ h: 0,
+ page: 1
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ submitters: [
+ {
+ role: "First Party",
+ email: "john.doe@example.com"
+ }
+ ]
+ })
+});
+
+const submission = await resp.json();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from PDF",
+ "operationId": "createSubmissionFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission.",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ }
+ }
+ }
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the documents.",
+ "default": false
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from HTML
+
+This API endpoint allows you to create a one-off submission request document using the provided HTML content, with special field tags rendered as a fillable and signable form. Related Guides Create PDF document fillable form with HTML
+
+```nodejs
+const fetch = require("node-fetch");
+
+const resp = await fetch("https://api.docuseal.com/submissions/html", {
+ method: "POST",
+ headers: {
+ "X-Auth-Token": "API_KEY"
+ },
+ body: JSON.stringify({
+ name: "Test Submission Document",
+ documents: [
+ {
+ name: "Test Document",
+ html: `Lorem Ipsum is simply dummy text of the
+
+
+and typesetting industry
+`
+ }
+ ],
+ submitters: [
+ {
+ role: "First Party",
+ email: "john.doe@example.com"
+ }
+ ]
+ })
+});
+
+const submission = await resp.json();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from HTML",
+ "operationId": "createSubmissionFromHtml",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "The list of documents built from HTML. Can be used to create a submission with multiple documents.",
+ "items": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Document"
+ },
+ "html": {
+ "type": "string",
+ "description": "HTML document content with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "html_header": {
+ "type": "string",
+ "description": "HTML document content of the header to be displayed on every page."
+ },
+ "html_footer": {
+ "type": "string",
+ "description": "HTML document content of the footer to be displayed on every page."
+ },
+ "size": {
+ "type": "string",
+ "default": "Letter",
+ "description": "Page size. Letter 8.5 x 11 will be assigned when not specified.",
+ "enum": [
+ "Letter",
+ "Legal",
+ "Tabloid",
+ "Ledger",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6"
+ ],
+ "example": "A4"
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from PDF
+
+The API endpoint provides the functionality to create a fillable document template for a PDF file. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```nodejs
+const fetch = require("node-fetch");
+
+const resp = await fetch("https://api.docuseal.com/templates/pdf", {
+ method: "POST",
+ headers: {
+ "X-Auth-Token": "API_KEY"
+ },
+ body: JSON.stringify({
+ name: "Test PDF",
+ documents: [
+ {
+ name: "string",
+ file: "base64",
+ fields: [
+ {
+ name: "string",
+ areas: [
+ {
+ x: 0,
+ y: 0,
+ w: 0,
+ h: 0,
+ page: 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ })
+});
+
+const template = await resp.json();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from PDF",
+ "operationId": "createTemplateFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test PDF"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new PDF.",
+ "example": "unique-key"
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the documents.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from DOCX
+
+The API endpoint provides functionality to create a one-off submission request from a DOCX file with dynamic content variables. Use [[variable_name]] text tags to define dynamic content variables in the document. See https://www.docuseal.com/examples/demo_template.docx for the specific text variable syntax, including dynamic content tables and list. You can also use the {{signature}} fillable field syntax to define fillable fields, as in a PDF. Related Guides Use embedded text field tags to create a fillable form
+
+```nodejs
+const fetch = require("node-fetch");
+
+const resp = await fetch("https://api.docuseal.com/submissions/docx", {
+ method: "POST",
+ headers: {
+ "X-Auth-Token": "API_KEY"
+ },
+ body: JSON.stringify({
+ name: "Test Submission Document",
+ variables: {
+ variable_name: "value"
+ },
+ documents: [
+ {
+ name: "string",
+ file: "base64"
+ }
+ ],
+ submitters: [
+ {
+ role: "First Party",
+ email: "john.doe@example.com"
+ }
+ ]
+ })
+});
+
+const submitters = await resp.json();
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from DOCX",
+ "operationId": "createSubmissionFromDocx",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission.",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "variables": {
+ "type": "object",
+ "description": "Dynamic content variables object",
+ "example": {
+ "variable_name": "value"
+ }
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF or DOCX file or downloadable file URL."
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
diff --git a/docs/api/php.md b/docs/api/php.md
new file mode 100644
index 00000000..81c10af2
--- /dev/null
+++ b/docs/api/php.md
@@ -0,0 +1,4223 @@
+### List all templates
+
+The API endpoint provides the ability to retrieve a list of available document templates.
+
+```php
+$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com');
+
+$docuseal->listTemplates(['limit' => 10]);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "List all templates",
+ "operationId": "getTemplates",
+ "parameters": [
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates based on the name partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates by unique slug.",
+ "example": "opaKWh8WWTAcVG"
+ },
+ {
+ "name": "external_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The unique applications-specific identifier provided for the template via API or Embedded template form builder. It allows you to receive only templates with your specified external id."
+ },
+ {
+ "name": "folder",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates by folder name."
+ },
+ {
+ "name": "archived",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ },
+ "description": "Get only archived templates instead of active ones."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of templates to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the template to start the list from. It allows you to receive only templates with id greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of templates."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the template to end the list with. It allows you to receive only templates with id less than the specified value."
+ }
+ ]
+}
+```
+
+### Get a template
+
+The API endpoint provides the functionality to retrieve information about a document template.
+
+```php
+$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com');
+
+$docuseal->getTemplate(1000001);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Get a template",
+ "operationId": "getTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ]
+}
+```
+
+### Archive a template
+
+The API endpoint allows you to archive a document template.
+
+```php
+$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com');
+
+$docuseal->archiveTemplate(1000001);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Archive a template",
+ "operationId": "archiveTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ]
+}
+```
+
+### Update a template
+
+The API endpoint provides the functionality to move a document template to a different folder and update the name of the template.
+
+```php
+$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com');
+
+$docuseal->updateTemplate(1000001, [
+ 'name' => 'New Document Name',
+ 'folder_name' => 'New Folder'
+]);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Update a template",
+ "operationId": "updateTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the template",
+ "example": "New Document Name"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be moved.",
+ "example": "New Folder"
+ },
+ "roles": {
+ "type": "array",
+ "description": "An array of submitter role names to update the template with.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Agent",
+ "Customer"
+ ]
+ },
+ "archived": {
+ "type": "boolean",
+ "description": "Set `false` to unarchive template."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### List all submissions
+
+The API endpoint provides the ability to retrieve a list of available submissions.
+
+```php
+$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com');
+
+$docuseal->listSubmissions(['limit' => 10]);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "List all submissions",
+ "operationId": "getSubmissions",
+ "parameters": [
+ {
+ "name": "template_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The template ID allows you to receive only the submissions created from that specific template."
+ },
+ {
+ "name": "status",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "enum": [
+ "pending",
+ "completed",
+ "declined",
+ "expired"
+ ]
+ },
+ "description": "Filter submissions by status."
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions based on submitters name, email or phone partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions by unique slug.",
+ "example": "NtLDQM7eJX2ZMd"
+ },
+ {
+ "name": "template_folder",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions by template folder name."
+ },
+ {
+ "name": "archived",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ },
+ "description": "Returns only archived submissions when `true` and only active submissions when `false`."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of submissions to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission to start the list from. It allows you to receive only submissions with an ID greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of submissions."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission that marks the end of the list. It allows you to receive only submissions with an ID less than the specified value."
+ }
+ ]
+}
+```
+
+### Create a submission
+
+This API endpoint allows you to create signature requests (submissions) for a document template and send them to the specified submitters (signers). Related Guides Send documents for signature via API Pre-fill PDF document form fields with API
+
+```php
+$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com');
+
+$docuseal->createSubmission([
+ 'template_id' => 1000001,
+ 'send_email' => true,
+ 'submitters' => [
+ [
+ 'role' => 'First Party',
+ 'email' => 'john.doe@example.com'
+ ]
+ ]
+]);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission",
+ "operationId": "createSubmission",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_id",
+ "submitters"
+ ],
+ "properties": {
+ "template_id": {
+ "type": "integer",
+ "description": "The unique identifier of the template. Document template forms can be created via the Web UI, PDF and DOCX API, or HTML API.",
+ "example": 1000001
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject for the submitter."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body for the submitter. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for template document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document template field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Get a submission
+
+The API endpoint provides the functionality to retrieve information about a submission.
+
+```php
+$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com');
+
+$docuseal->getSubmission(1001);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Get a submission",
+ "operationId": "getSubmission",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Archive a submission
+
+The API endpoint allows you to archive a submission.
+
+```php
+$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com');
+
+$docuseal->archiveSubmission(1001);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Archive a submission",
+ "operationId": "archiveSubmission",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Get submission documents
+
+This endpoint returns a list of partially filled documents for a submission. If the submission has been completed, the final signed documents are returned.
+
+```php
+$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com');
+
+$docuseal->getSubmissionDocuments(1001);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Get submission documents",
+ "operationId": "getSubmissionDocuments",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Create submissions from emails
+
+This API endpoint allows you to create submissions for a document template and send them to the specified email addresses. This is a simplified version of the POST /submissions API to be used with Zapier or other automation tools.
+
+```php
+$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com');
+
+$docuseal->createSubmissionFromEmails([
+ 'template_id' => 1000001,
+ 'emails' => 'hi@docuseal.com, example@docuseal.com'
+]);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create submissions from emails",
+ "operationId": "createSubmissionsFromEmails",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_id",
+ "emails"
+ ],
+ "properties": {
+ "template_id": {
+ "type": "integer",
+ "description": "The unique identifier of the template.",
+ "example": 1000001
+ },
+ "emails": {
+ "type": "string",
+ "description": "A comma-separated list of email addresses to send the submission to.",
+ "example": "{{emails}}"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Get a submitter
+
+The API endpoint provides functionality to retrieve information about a submitter, along with the submitter documents and field values.
+
+```php
+$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com');
+
+$docuseal->getSubmitter(500001);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "Get a submitter",
+ "operationId": "getSubmitter",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter.",
+ "example": 500001
+ }
+ ]
+}
+```
+
+### Update a submitter
+
+The API endpoint allows you to update submitter details, pre-fill or update field values and re-send emails. Related Guides Automatically sign documents via API
+
+```php
+$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com');
+
+$docuseal->updateSubmitter(500001, [
+ 'email' => 'john.doe@example.com',
+ 'fields' => [
+ [
+ 'name' => 'First Name',
+ 'default_value' => 'Acme'
+ ]
+ ]
+]);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "Update a submitter",
+ "operationId": "updateSubmitter",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter.",
+ "example": 500001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `true` to re-send signature request emails."
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to re-send signature request via phone number SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for template document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document template field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### List all submitters
+
+The API endpoint provides the ability to retrieve a list of submitters.
+
+```php
+$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com');
+
+$docuseal->listSubmitters(['limit' => 10]);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "List all submitters",
+ "operationId": "getSubmitters",
+ "parameters": [
+ {
+ "name": "submission_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The submission ID allows you to receive only the submitters related to that specific submission."
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submitters on name, email or phone partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submitters by unique slug.",
+ "example": "zAyL9fH36Havvm"
+ },
+ {
+ "name": "completed_after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "example": "2024-03-05 9:32:20",
+ "description": "The date and time string value to filter submitters that completed the submission after the specified date and time."
+ },
+ {
+ "name": "completed_before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "example": "2024-03-06 19:32:20",
+ "description": "The date and time string value to filter submitters that completed the submission before the specified date and time."
+ },
+ {
+ "name": "external_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The unique applications-specific identifier provided for a submitter when initializing a signature request. It allows you to receive only submitters with a specified external id."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of submitters to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter to start the list from. It allows you to receive only submitters with id greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of submitters."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter to end the list with. It allows you to receive only submitters with id less than the specified value."
+ }
+ ]
+}
+```
+
+### Update template documents
+
+The API endpoint allows you to add, remove or replace documents in the template with provided PDF/DOCX file or HTML content.
+
+```php
+$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com');
+
+$docuseal->updateTemplateDocuments(1000001, [
+ 'documents' => [
+ [
+ 'file' => 'string'
+ ]
+ ]
+]);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Update template documents",
+ "operationId": "addDocumentToTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the documents template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "documents": {
+ "type": "array",
+ "description": "The list of documents to add or replace in the template.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Template"
+ },
+ "file": {
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF or DOCX file or downloadable file URL. Leave it empty if you create a new document using HTML param."
+ },
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags. Leave it empty if you add a document via PDF or DOCX base64 encoded file param or URL."
+ },
+ "position": {
+ "type": "integer",
+ "description": "Position of the document. By default will be added as the last document in the template.",
+ "example": 0
+ },
+ "replace": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to replace existing document with a new file at `position`. Existing document fields will be transferred to the new document if it doesn't contain any fields."
+ },
+ "remove": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to remove existing document at given `position` or with given `name`."
+ }
+ }
+ }
+ },
+ "merge": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to merge all existing and new documents into a single PDF document in the template."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Clone a template
+
+The API endpoint allows you to clone existing template into a new template.
+
+```php
+$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com');
+
+$docuseal->cloneTemplate(1000001, [
+ 'name' => 'Cloned Template'
+]);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Clone a template",
+ "operationId": "cloneTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the documents template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Template name. Existing name with (Clone) suffix will be used if not specified.",
+ "example": "Cloned Template"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be cloned."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from HTML
+
+The API endpoint provides the functionality to seamlessly generate a PDF document template by utilizing the provided HTML content while incorporating pre-defined fields. Related Guides Create PDF document fillable form with HTML
+
+```php
+$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com');
+
+$docuseal->createTemplateFromHtml([
+ 'html' => 'Lorem Ipsum is simply dummy text of the
+
+
+and typesetting industry
+',
+ 'name' => 'Test Template'
+]);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from HTML",
+ "operationId": "createTemplateFromHtml",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "html_header": {
+ "type": "string",
+ "description": "HTML template of the header to be displayed on every page."
+ },
+ "html_footer": {
+ "type": "string",
+ "description": "HTML template of the footer to be displayed on every page."
+ },
+ "name": {
+ "type": "string",
+ "description": "Template name. Random uuid will be assigned when not specified.",
+ "example": "Test Template"
+ },
+ "size": {
+ "type": "string",
+ "default": "Letter",
+ "description": "Page size. Letter 8.5 x 11 will be assigned when not specified.",
+ "enum": [
+ "Letter",
+ "Legal",
+ "Tabloid",
+ "Ledger",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6"
+ ],
+ "example": "A4"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new HTML.",
+ "example": "714d974e-83d8-11ee-b962-0242ac120002"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "description": "The list of documents built from HTML. Can be used to create a template with multiple documents. Leave `documents` param empty when using a top-level `html` param for a template with a single document.",
+ "items": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Document"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from Word DOCX
+
+The API endpoint provides the functionality to create a fillable document template for existing Microsoft Word document. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.docx for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```php
+$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com');
+
+$docuseal->createTemplateFromDocx([
+ 'name' => 'Test DOCX',
+ 'documents' => [
+ [
+ 'name' => 'string',
+ 'file' => 'base64'
+ ]
+ ]
+]);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from Word DOCX",
+ "operationId": "createTemplateFromDocx",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test DOCX"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new document.",
+ "example": "unique-key"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "type": "string",
+ "example": "base64",
+ "format": "base64",
+ "description": "Base64-encoded content of the DOCX file or downloadable file URL"
+ },
+ "fields": {
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1."
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from existing PDF
+
+The API endpoint provides the functionality to create a fillable document template for existing PDF file. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```php
+$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com');
+
+$docuseal->createTemplateFromPdf([
+ 'name' => 'Test PDF',
+ 'documents' => [
+ [
+ 'name' => 'string',
+ 'file' => 'base64',
+ 'fields' => [
+ [
+ 'name' => 'string',
+ 'areas' => [
+ [
+ 'x' => 0,
+ 'y' => 0,
+ 'w' => 0,
+ 'h' => 0,
+ 'page' => 1
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]
+]);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from existing PDF",
+ "operationId": "createTemplateFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test PDF"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new PDF.",
+ "example": "unique-key"
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the document.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Merge templates
+
+The API endpoint allows you to merge multiple templates with documents and fields into a new combined template.
+
+```php
+$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com');
+
+$docuseal->mergeTemplates([
+ 'template_ids' => [
+ 321,
+ 432
+ ],
+ 'name' => 'Merged Template'
+]);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Merge templates",
+ "operationId": "mergeTemplate",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_ids"
+ ],
+ "properties": {
+ "template_ids": {
+ "type": "array",
+ "description": "An array of template ids to merge into a new template.",
+ "items": {
+ "type": "integer"
+ },
+ "example": [
+ 321,
+ 432
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "Template name. Existing name with (Merged) suffix will be used if not specified.",
+ "example": "Merged Template"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The name of the folder in which the merged template should be placed."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "roles": {
+ "type": "array",
+ "description": "An array of submitter role names to be used in the merged template.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Agent",
+ "Customer"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from PDF
+
+The API endpoint provides the functionality to create one-off submission request from a PDF. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```php
+$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com');
+
+$docuseal->createSubmissionFromPdf([
+ 'name' => 'Test Submission Document',
+ 'documents' => [
+ [
+ 'name' => 'string',
+ 'file' => 'base64',
+ 'fields' => [
+ [
+ 'name' => 'string',
+ 'areas' => [
+ [
+ 'x' => 0,
+ 'y' => 0,
+ 'w' => 0,
+ 'h' => 0,
+ 'page' => 1
+ ]
+ ]
+ ]
+ ]
+ ]
+ ],
+ 'submitters' => [
+ [
+ 'role' => 'First Party',
+ 'email' => 'john.doe@example.com'
+ ]
+ ]
+]);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from PDF",
+ "operationId": "createSubmissionFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission.",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ }
+ }
+ }
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the documents.",
+ "default": false
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from HTML
+
+This API endpoint allows you to create a one-off submission request document using the provided HTML content, with special field tags rendered as a fillable and signable form. Related Guides Create PDF document fillable form with HTML
+
+```php
+$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com');
+
+$docuseal->createSubmissionFromHtml([
+ 'name' => 'Test Submission Document',
+ 'documents' => [
+ [
+ 'name' => 'Test Document',
+ 'html' => 'Lorem Ipsum is simply dummy text of the
+
+
+and typesetting industry
+'
+ ]
+ ],
+ 'submitters' => [
+ [
+ 'role' => 'First Party',
+ 'email' => 'john.doe@example.com'
+ ]
+ ]
+]);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from HTML",
+ "operationId": "createSubmissionFromHtml",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "The list of documents built from HTML. Can be used to create a submission with multiple documents.",
+ "items": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Document"
+ },
+ "html": {
+ "type": "string",
+ "description": "HTML document content with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "html_header": {
+ "type": "string",
+ "description": "HTML document content of the header to be displayed on every page."
+ },
+ "html_footer": {
+ "type": "string",
+ "description": "HTML document content of the footer to be displayed on every page."
+ },
+ "size": {
+ "type": "string",
+ "default": "Letter",
+ "description": "Page size. Letter 8.5 x 11 will be assigned when not specified.",
+ "enum": [
+ "Letter",
+ "Legal",
+ "Tabloid",
+ "Ledger",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6"
+ ],
+ "example": "A4"
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from PDF
+
+The API endpoint provides the functionality to create a fillable document template for a PDF file. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```php
+$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com');
+
+$docuseal->createTemplateFromPdf([
+ 'name' => 'Test PDF',
+ 'documents' => [
+ [
+ 'name' => 'string',
+ 'file' => 'base64',
+ 'fields' => [
+ [
+ 'name' => 'string',
+ 'areas' => [
+ [
+ 'x' => 0,
+ 'y' => 0,
+ 'w' => 0,
+ 'h' => 0,
+ 'page' => 1
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]
+]);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from PDF",
+ "operationId": "createTemplateFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test PDF"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new PDF.",
+ "example": "unique-key"
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the documents.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from DOCX
+
+The API endpoint provides functionality to create a one-off submission request from a DOCX file with dynamic content variables. Use [[variable_name]] text tags to define dynamic content variables in the document. See https://www.docuseal.com/examples/demo_template.docx for the specific text variable syntax, including dynamic content tables and list. You can also use the {{signature}} fillable field syntax to define fillable fields, as in a PDF. Related Guides Use embedded text field tags to create a fillable form
+
+```php
+$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com');
+
+$docuseal->createSubmissionFromDocx([
+ 'name' => 'Test Submission Document',
+ 'variables' => [
+ 'variable_name' => 'value'
+ ],
+ 'documents' => [
+ [
+ 'name' => 'string',
+ 'file' => 'base64'
+ ]
+ ],
+ 'submitters' => [
+ [
+ 'role' => 'First Party',
+ 'email' => 'john.doe@example.com'
+ ]
+ ]
+]);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from DOCX",
+ "operationId": "createSubmissionFromDocx",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission.",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "variables": {
+ "type": "object",
+ "description": "Dynamic content variables object",
+ "example": {
+ "variable_name": "value"
+ }
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF or DOCX file or downloadable file URL."
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
diff --git a/docs/api/python.md b/docs/api/python.md
new file mode 100644
index 00000000..07dc3bbd
--- /dev/null
+++ b/docs/api/python.md
@@ -0,0 +1,4292 @@
+### List all templates
+
+The API endpoint provides the ability to retrieve a list of available document templates.
+
+```python
+from docuseal import docuseal
+
+docuseal.key = "API_KEY"
+docuseal.url = "https://api.docuseal.com"
+
+docuseal.list_submissions({ "limit": 10 })
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "List all templates",
+ "operationId": "getTemplates",
+ "parameters": [
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates based on the name partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates by unique slug.",
+ "example": "opaKWh8WWTAcVG"
+ },
+ {
+ "name": "external_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The unique applications-specific identifier provided for the template via API or Embedded template form builder. It allows you to receive only templates with your specified external id."
+ },
+ {
+ "name": "folder",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates by folder name."
+ },
+ {
+ "name": "archived",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ },
+ "description": "Get only archived templates instead of active ones."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of templates to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the template to start the list from. It allows you to receive only templates with id greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of templates."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the template to end the list with. It allows you to receive only templates with id less than the specified value."
+ }
+ ]
+}
+```
+
+### Get a template
+
+The API endpoint provides the functionality to retrieve information about a document template.
+
+```python
+from docuseal import docuseal
+
+docuseal.key = "API_KEY"
+docuseal.url = "https://api.docuseal.com"
+
+docuseal.get_template(1000001)
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Get a template",
+ "operationId": "getTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ]
+}
+```
+
+### Archive a template
+
+The API endpoint allows you to archive a document template.
+
+```python
+from docuseal import docuseal
+
+docuseal.key = "API_KEY"
+docuseal.url = "https://api.docuseal.com"
+
+docuseal.archive_template(1000001)
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Archive a template",
+ "operationId": "archiveTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ]
+}
+```
+
+### Update a template
+
+The API endpoint provides the functionality to move a document template to a different folder and update the name of the template.
+
+```python
+from docuseal import docuseal
+
+docuseal.key = "API_KEY"
+docuseal.url = "https://api.docuseal.com"
+
+docuseal.update_template(1000001, {
+ "name": "New Document Name",
+ "folder_name": "New Folder"
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Update a template",
+ "operationId": "updateTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the template",
+ "example": "New Document Name"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be moved.",
+ "example": "New Folder"
+ },
+ "roles": {
+ "type": "array",
+ "description": "An array of submitter role names to update the template with.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Agent",
+ "Customer"
+ ]
+ },
+ "archived": {
+ "type": "boolean",
+ "description": "Set `false` to unarchive template."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### List all submissions
+
+The API endpoint provides the ability to retrieve a list of available submissions.
+
+```python
+from docuseal import docuseal
+
+docuseal.key = "API_KEY"
+docuseal.url = "https://api.docuseal.com"
+
+docuseal.list_submissions({ "limit": 10 })
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "List all submissions",
+ "operationId": "getSubmissions",
+ "parameters": [
+ {
+ "name": "template_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The template ID allows you to receive only the submissions created from that specific template."
+ },
+ {
+ "name": "status",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "enum": [
+ "pending",
+ "completed",
+ "declined",
+ "expired"
+ ]
+ },
+ "description": "Filter submissions by status."
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions based on submitters name, email or phone partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions by unique slug.",
+ "example": "NtLDQM7eJX2ZMd"
+ },
+ {
+ "name": "template_folder",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions by template folder name."
+ },
+ {
+ "name": "archived",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ },
+ "description": "Returns only archived submissions when `true` and only active submissions when `false`."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of submissions to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission to start the list from. It allows you to receive only submissions with an ID greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of submissions."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission that marks the end of the list. It allows you to receive only submissions with an ID less than the specified value."
+ }
+ ]
+}
+```
+
+### Create a submission
+
+This API endpoint allows you to create signature requests (submissions) for a document template and send them to the specified submitters (signers). Related Guides Send documents for signature via API Pre-fill PDF document form fields with API
+
+```python
+from docuseal import docuseal
+
+docuseal.key = "API_KEY"
+docuseal.url = "https://api.docuseal.com"
+
+docuseal.create_submission({
+ "template_id": 1000001,
+ "send_email": True,
+ "submitters": [
+ {
+ "role": "First Party",
+ "email": "john.doe@example.com"
+ }
+ ]
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission",
+ "operationId": "createSubmission",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_id",
+ "submitters"
+ ],
+ "properties": {
+ "template_id": {
+ "type": "integer",
+ "description": "The unique identifier of the template. Document template forms can be created via the Web UI, PDF and DOCX API, or HTML API.",
+ "example": 1000001
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject for the submitter."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body for the submitter. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for template document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document template field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Get a submission
+
+The API endpoint provides the functionality to retrieve information about a submission.
+
+```python
+from docuseal import docuseal
+
+docuseal.key = "API_KEY"
+docuseal.url = "https://api.docuseal.com"
+
+docuseal.get_submission(1001)
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Get a submission",
+ "operationId": "getSubmission",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Archive a submission
+
+The API endpoint allows you to archive a submission.
+
+```python
+from docuseal import docuseal
+
+docuseal.key = "API_KEY"
+docuseal.url = "https://api.docuseal.com"
+
+docuseal.archive_submission(1001)
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Archive a submission",
+ "operationId": "archiveSubmission",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Get submission documents
+
+This endpoint returns a list of partially filled documents for a submission. If the submission has been completed, the final signed documents are returned.
+
+```python
+from docuseal import docuseal
+
+docuseal.key = "API_KEY"
+docuseal.url = "https://api.docuseal.com"
+
+docuseal.get_submission_documents(1001)
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Get submission documents",
+ "operationId": "getSubmissionDocuments",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Create submissions from emails
+
+This API endpoint allows you to create submissions for a document template and send them to the specified email addresses. This is a simplified version of the POST /submissions API to be used with Zapier or other automation tools.
+
+```python
+from docuseal import docuseal
+
+docuseal.key = "API_KEY"
+docuseal.url = "https://api.docuseal.com"
+
+docuseal.create_submission_from_emails({
+ "template_id": 1000001,
+ "emails": "hi@docuseal.com, example@docuseal.com"
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create submissions from emails",
+ "operationId": "createSubmissionsFromEmails",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_id",
+ "emails"
+ ],
+ "properties": {
+ "template_id": {
+ "type": "integer",
+ "description": "The unique identifier of the template.",
+ "example": 1000001
+ },
+ "emails": {
+ "type": "string",
+ "description": "A comma-separated list of email addresses to send the submission to.",
+ "example": "{{emails}}"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Get a submitter
+
+The API endpoint provides functionality to retrieve information about a submitter, along with the submitter documents and field values.
+
+```python
+from docuseal import docuseal
+
+docuseal.key = "API_KEY"
+docuseal.url = "https://api.docuseal.com"
+
+docuseal.get_submitter(500001)
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "Get a submitter",
+ "operationId": "getSubmitter",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter.",
+ "example": 500001
+ }
+ ]
+}
+```
+
+### Update a submitter
+
+The API endpoint allows you to update submitter details, pre-fill or update field values and re-send emails. Related Guides Automatically sign documents via API
+
+```python
+from docuseal import docuseal
+
+docuseal.key = "API_KEY"
+docuseal.url = "https://api.docuseal.com"
+
+docuseal.update_submitter(500001, {
+ "email": "john.doe@example.com",
+ "fields": [
+ {
+ "name": "First Name",
+ "default_value": "Acme"
+ }
+ ]
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "Update a submitter",
+ "operationId": "updateSubmitter",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter.",
+ "example": 500001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `true` to re-send signature request emails."
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to re-send signature request via phone number SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for template document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document template field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### List all submitters
+
+The API endpoint provides the ability to retrieve a list of submitters.
+
+```python
+from docuseal import docuseal
+
+docuseal.key = "API_KEY"
+docuseal.url = "https://api.docuseal.com"
+
+docuseal.list_submissions({ "limit": 10 })
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "List all submitters",
+ "operationId": "getSubmitters",
+ "parameters": [
+ {
+ "name": "submission_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The submission ID allows you to receive only the submitters related to that specific submission."
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submitters on name, email or phone partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submitters by unique slug.",
+ "example": "zAyL9fH36Havvm"
+ },
+ {
+ "name": "completed_after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "example": "2024-03-05 9:32:20",
+ "description": "The date and time string value to filter submitters that completed the submission after the specified date and time."
+ },
+ {
+ "name": "completed_before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "example": "2024-03-06 19:32:20",
+ "description": "The date and time string value to filter submitters that completed the submission before the specified date and time."
+ },
+ {
+ "name": "external_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The unique applications-specific identifier provided for a submitter when initializing a signature request. It allows you to receive only submitters with a specified external id."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of submitters to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter to start the list from. It allows you to receive only submitters with id greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of submitters."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter to end the list with. It allows you to receive only submitters with id less than the specified value."
+ }
+ ]
+}
+```
+
+### Update template documents
+
+The API endpoint allows you to add, remove or replace documents in the template with provided PDF/DOCX file or HTML content.
+
+```python
+from docuseal import docuseal
+
+docuseal.key = "API_KEY"
+docuseal.url = "https://api.docuseal.com"
+
+docuseal.update_template_documents(1000001, {
+ "documents": [
+ {
+ "file": "string"
+ }
+ ]
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Update template documents",
+ "operationId": "addDocumentToTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the documents template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "documents": {
+ "type": "array",
+ "description": "The list of documents to add or replace in the template.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Template"
+ },
+ "file": {
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF or DOCX file or downloadable file URL. Leave it empty if you create a new document using HTML param."
+ },
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags. Leave it empty if you add a document via PDF or DOCX base64 encoded file param or URL."
+ },
+ "position": {
+ "type": "integer",
+ "description": "Position of the document. By default will be added as the last document in the template.",
+ "example": 0
+ },
+ "replace": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to replace existing document with a new file at `position`. Existing document fields will be transferred to the new document if it doesn't contain any fields."
+ },
+ "remove": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to remove existing document at given `position` or with given `name`."
+ }
+ }
+ }
+ },
+ "merge": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to merge all existing and new documents into a single PDF document in the template."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Clone a template
+
+The API endpoint allows you to clone existing template into a new template.
+
+```python
+from docuseal import docuseal
+
+docuseal.key = "API_KEY"
+docuseal.url = "https://api.docuseal.com"
+
+docuseal.clone_template(1000001, {
+ "name": "Cloned Template"
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Clone a template",
+ "operationId": "cloneTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the documents template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Template name. Existing name with (Clone) suffix will be used if not specified.",
+ "example": "Cloned Template"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be cloned."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from HTML
+
+The API endpoint provides the functionality to seamlessly generate a PDF document template by utilizing the provided HTML content while incorporating pre-defined fields. Related Guides Create PDF document fillable form with HTML
+
+```python
+from docuseal import docuseal
+
+docuseal.key = "API_KEY"
+docuseal.url = "https://api.docuseal.com"
+
+docuseal.create_template_from_html({
+ "html": """Lorem Ipsum is simply dummy text of the
+
+
+and typesetting industry
+""",
+ "name": "Test Template"
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from HTML",
+ "operationId": "createTemplateFromHtml",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "html_header": {
+ "type": "string",
+ "description": "HTML template of the header to be displayed on every page."
+ },
+ "html_footer": {
+ "type": "string",
+ "description": "HTML template of the footer to be displayed on every page."
+ },
+ "name": {
+ "type": "string",
+ "description": "Template name. Random uuid will be assigned when not specified.",
+ "example": "Test Template"
+ },
+ "size": {
+ "type": "string",
+ "default": "Letter",
+ "description": "Page size. Letter 8.5 x 11 will be assigned when not specified.",
+ "enum": [
+ "Letter",
+ "Legal",
+ "Tabloid",
+ "Ledger",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6"
+ ],
+ "example": "A4"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new HTML.",
+ "example": "714d974e-83d8-11ee-b962-0242ac120002"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "description": "The list of documents built from HTML. Can be used to create a template with multiple documents. Leave `documents` param empty when using a top-level `html` param for a template with a single document.",
+ "items": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Document"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from Word DOCX
+
+The API endpoint provides the functionality to create a fillable document template for existing Microsoft Word document. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.docx for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```python
+from docuseal import docuseal
+
+docuseal.key = "API_KEY"
+docuseal.url = "https://api.docuseal.com"
+
+docuseal.create_template_from_docx({
+ "name": "Test DOCX",
+ "documents": [
+ {
+ "name": "string",
+ "file": "base64"
+ }
+ ]
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from Word DOCX",
+ "operationId": "createTemplateFromDocx",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test DOCX"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new document.",
+ "example": "unique-key"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "type": "string",
+ "example": "base64",
+ "format": "base64",
+ "description": "Base64-encoded content of the DOCX file or downloadable file URL"
+ },
+ "fields": {
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1."
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from existing PDF
+
+The API endpoint provides the functionality to create a fillable document template for existing PDF file. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```python
+from docuseal import docuseal
+
+docuseal.key = "API_KEY"
+docuseal.url = "https://api.docuseal.com"
+
+docuseal.create_template_from_pdf({
+ "name": "Test PDF",
+ "documents": [
+ {
+ "name": "string",
+ "file": "base64",
+ "fields": [
+ {
+ "name": "string",
+ "areas": [
+ {
+ "x": 0,
+ "y": 0,
+ "w": 0,
+ "h": 0,
+ "page": 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from existing PDF",
+ "operationId": "createTemplateFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test PDF"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new PDF.",
+ "example": "unique-key"
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the document.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Merge templates
+
+The API endpoint allows you to merge multiple templates with documents and fields into a new combined template.
+
+```python
+from docuseal import docuseal
+
+docuseal.key = "API_KEY"
+docuseal.url = "https://api.docuseal.com"
+
+docuseal.merge_templates({
+ "template_ids": [
+ 321,
+ 432
+ ],
+ "name": "Merged Template"
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Merge templates",
+ "operationId": "mergeTemplate",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_ids"
+ ],
+ "properties": {
+ "template_ids": {
+ "type": "array",
+ "description": "An array of template ids to merge into a new template.",
+ "items": {
+ "type": "integer"
+ },
+ "example": [
+ 321,
+ 432
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "Template name. Existing name with (Merged) suffix will be used if not specified.",
+ "example": "Merged Template"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The name of the folder in which the merged template should be placed."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "roles": {
+ "type": "array",
+ "description": "An array of submitter role names to be used in the merged template.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Agent",
+ "Customer"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from PDF
+
+The API endpoint provides the functionality to create one-off submission request from a PDF. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```python
+from docuseal import docuseal
+
+docuseal.key = "API_KEY"
+docuseal.url = "https://api.docuseal.com"
+
+docuseal.create_submission_from_pdf({
+ "name": "Test Submission Document",
+ "documents": [
+ {
+ "name": "string",
+ "file": "base64",
+ "fields": [
+ {
+ "name": "string",
+ "areas": [
+ {
+ "x": 0,
+ "y": 0,
+ "w": 0,
+ "h": 0,
+ "page": 1
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "submitters": [
+ {
+ "role": "First Party",
+ "email": "john.doe@example.com"
+ }
+ ]
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from PDF",
+ "operationId": "createSubmissionFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission.",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ }
+ }
+ }
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the documents.",
+ "default": false
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from HTML
+
+This API endpoint allows you to create a one-off submission request document using the provided HTML content, with special field tags rendered as a fillable and signable form. Related Guides Create PDF document fillable form with HTML
+
+```python
+from docuseal import docuseal
+
+docuseal.key = "API_KEY"
+docuseal.url = "https://api.docuseal.com"
+
+docuseal.create_submission_from_html({
+ "name": "Test Submission Document",
+ "documents": [
+ {
+ "name": "Test Document",
+ "html": """Lorem Ipsum is simply dummy text of the
+
+
+and typesetting industry
+"""
+ }
+ ],
+ "submitters": [
+ {
+ "role": "First Party",
+ "email": "john.doe@example.com"
+ }
+ ]
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from HTML",
+ "operationId": "createSubmissionFromHtml",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "The list of documents built from HTML. Can be used to create a submission with multiple documents.",
+ "items": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Document"
+ },
+ "html": {
+ "type": "string",
+ "description": "HTML document content with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "html_header": {
+ "type": "string",
+ "description": "HTML document content of the header to be displayed on every page."
+ },
+ "html_footer": {
+ "type": "string",
+ "description": "HTML document content of the footer to be displayed on every page."
+ },
+ "size": {
+ "type": "string",
+ "default": "Letter",
+ "description": "Page size. Letter 8.5 x 11 will be assigned when not specified.",
+ "enum": [
+ "Letter",
+ "Legal",
+ "Tabloid",
+ "Ledger",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6"
+ ],
+ "example": "A4"
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from PDF
+
+The API endpoint provides the functionality to create a fillable document template for a PDF file. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```python
+from docuseal import docuseal
+
+docuseal.key = "API_KEY"
+docuseal.url = "https://api.docuseal.com"
+
+docuseal.create_template_from_pdf({
+ "name": "Test PDF",
+ "documents": [
+ {
+ "name": "string",
+ "file": "base64",
+ "fields": [
+ {
+ "name": "string",
+ "areas": [
+ {
+ "x": 0,
+ "y": 0,
+ "w": 0,
+ "h": 0,
+ "page": 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from PDF",
+ "operationId": "createTemplateFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test PDF"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new PDF.",
+ "example": "unique-key"
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the documents.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from DOCX
+
+The API endpoint provides functionality to create a one-off submission request from a DOCX file with dynamic content variables. Use [[variable_name]] text tags to define dynamic content variables in the document. See https://www.docuseal.com/examples/demo_template.docx for the specific text variable syntax, including dynamic content tables and list. You can also use the {{signature}} fillable field syntax to define fillable fields, as in a PDF. Related Guides Use embedded text field tags to create a fillable form
+
+```python
+from docuseal import docuseal
+
+docuseal.key = "API_KEY"
+docuseal.url = "https://api.docuseal.com"
+
+docuseal.create_submission_from_docx({
+ "name": "Test Submission Document",
+ "variables": {
+ "variable_name": "value"
+ },
+ "documents": [
+ {
+ "name": "string",
+ "file": "base64"
+ }
+ ],
+ "submitters": [
+ {
+ "role": "First Party",
+ "email": "john.doe@example.com"
+ }
+ ]
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from DOCX",
+ "operationId": "createSubmissionFromDocx",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission.",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "variables": {
+ "type": "object",
+ "description": "Dynamic content variables object",
+ "example": {
+ "variable_name": "value"
+ }
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF or DOCX file or downloadable file URL."
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
diff --git a/docs/api/ruby.md b/docs/api/ruby.md
new file mode 100644
index 00000000..45be27ae
--- /dev/null
+++ b/docs/api/ruby.md
@@ -0,0 +1,4292 @@
+### List all templates
+
+The API endpoint provides the ability to retrieve a list of available document templates.
+
+```ruby
+require "docuseal"
+
+Docuseal.key = ENV["DOCUSEAL_API_KEY"]
+Docuseal.url = "https://api.docuseal.com"
+
+Docuseal.list_templates(limit: 10)
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "List all templates",
+ "operationId": "getTemplates",
+ "parameters": [
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates based on the name partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates by unique slug.",
+ "example": "opaKWh8WWTAcVG"
+ },
+ {
+ "name": "external_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The unique applications-specific identifier provided for the template via API or Embedded template form builder. It allows you to receive only templates with your specified external id."
+ },
+ {
+ "name": "folder",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates by folder name."
+ },
+ {
+ "name": "archived",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ },
+ "description": "Get only archived templates instead of active ones."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of templates to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the template to start the list from. It allows you to receive only templates with id greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of templates."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the template to end the list with. It allows you to receive only templates with id less than the specified value."
+ }
+ ]
+}
+```
+
+### Get a template
+
+The API endpoint provides the functionality to retrieve information about a document template.
+
+```ruby
+require "docuseal"
+
+Docuseal.key = ENV["DOCUSEAL_API_KEY"]
+Docuseal.url = "https://api.docuseal.com"
+
+Docuseal.get_template(1000001)
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Get a template",
+ "operationId": "getTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ]
+}
+```
+
+### Archive a template
+
+The API endpoint allows you to archive a document template.
+
+```ruby
+require "docuseal"
+
+Docuseal.key = ENV["DOCUSEAL_API_KEY"]
+Docuseal.url = "https://api.docuseal.com"
+
+Docuseal.archive_template(1000001)
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Archive a template",
+ "operationId": "archiveTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ]
+}
+```
+
+### Update a template
+
+The API endpoint provides the functionality to move a document template to a different folder and update the name of the template.
+
+```ruby
+require "docuseal"
+
+Docuseal.key = ENV["DOCUSEAL_API_KEY"]
+Docuseal.url = "https://api.docuseal.com"
+
+Docuseal.update_template(1000001, {
+ name: "New Document Name",
+ folder_name: "New Folder"
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Update a template",
+ "operationId": "updateTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the template",
+ "example": "New Document Name"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be moved.",
+ "example": "New Folder"
+ },
+ "roles": {
+ "type": "array",
+ "description": "An array of submitter role names to update the template with.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Agent",
+ "Customer"
+ ]
+ },
+ "archived": {
+ "type": "boolean",
+ "description": "Set `false` to unarchive template."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### List all submissions
+
+The API endpoint provides the ability to retrieve a list of available submissions.
+
+```ruby
+require "docuseal"
+
+Docuseal.key = ENV["DOCUSEAL_API_KEY"]
+Docuseal.url = "https://api.docuseal.com"
+
+Docuseal.list_submissions(limit: 10)
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "List all submissions",
+ "operationId": "getSubmissions",
+ "parameters": [
+ {
+ "name": "template_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The template ID allows you to receive only the submissions created from that specific template."
+ },
+ {
+ "name": "status",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "enum": [
+ "pending",
+ "completed",
+ "declined",
+ "expired"
+ ]
+ },
+ "description": "Filter submissions by status."
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions based on submitters name, email or phone partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions by unique slug.",
+ "example": "NtLDQM7eJX2ZMd"
+ },
+ {
+ "name": "template_folder",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions by template folder name."
+ },
+ {
+ "name": "archived",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ },
+ "description": "Returns only archived submissions when `true` and only active submissions when `false`."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of submissions to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission to start the list from. It allows you to receive only submissions with an ID greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of submissions."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission that marks the end of the list. It allows you to receive only submissions with an ID less than the specified value."
+ }
+ ]
+}
+```
+
+### Create a submission
+
+This API endpoint allows you to create signature requests (submissions) for a document template and send them to the specified submitters (signers). Related Guides Send documents for signature via API Pre-fill PDF document form fields with API
+
+```ruby
+require "docuseal"
+
+Docuseal.key = ENV["DOCUSEAL_API_KEY"]
+Docuseal.url = "https://api.docuseal.com"
+
+Docuseal.create_submission({
+ template_id: 1000001,
+ send_email: true,
+ submitters: [
+ {
+ role: "First Party",
+ email: "john.doe@example.com"
+ }
+ ]
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission",
+ "operationId": "createSubmission",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_id",
+ "submitters"
+ ],
+ "properties": {
+ "template_id": {
+ "type": "integer",
+ "description": "The unique identifier of the template. Document template forms can be created via the Web UI, PDF and DOCX API, or HTML API.",
+ "example": 1000001
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject for the submitter."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body for the submitter. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for template document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document template field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Get a submission
+
+The API endpoint provides the functionality to retrieve information about a submission.
+
+```ruby
+require "docuseal"
+
+Docuseal.key = ENV["DOCUSEAL_API_KEY"]
+Docuseal.url = "https://api.docuseal.com"
+
+Docuseal.get_submission(1001)
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Get a submission",
+ "operationId": "getSubmission",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Archive a submission
+
+The API endpoint allows you to archive a submission.
+
+```ruby
+require "docuseal"
+
+Docuseal.key = ENV["DOCUSEAL_API_KEY"]
+Docuseal.url = "https://api.docuseal.com"
+
+Docuseal.archive_submission(1001)
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Archive a submission",
+ "operationId": "archiveSubmission",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Get submission documents
+
+This endpoint returns a list of partially filled documents for a submission. If the submission has been completed, the final signed documents are returned.
+
+```ruby
+require "docuseal"
+
+Docuseal.key = ENV["DOCUSEAL_API_KEY"]
+Docuseal.url = "https://api.docuseal.com"
+
+Docuseal.get_submission_documents(1001)
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Get submission documents",
+ "operationId": "getSubmissionDocuments",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Create submissions from emails
+
+This API endpoint allows you to create submissions for a document template and send them to the specified email addresses. This is a simplified version of the POST /submissions API to be used with Zapier or other automation tools.
+
+```ruby
+require "docuseal"
+
+Docuseal.key = ENV["DOCUSEAL_API_KEY"]
+Docuseal.url = "https://api.docuseal.com"
+
+Docuseal.create_submission_from_emails({
+ template_id: 1000001,
+ emails: "hi@docuseal.com, example@docuseal.com"
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create submissions from emails",
+ "operationId": "createSubmissionsFromEmails",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_id",
+ "emails"
+ ],
+ "properties": {
+ "template_id": {
+ "type": "integer",
+ "description": "The unique identifier of the template.",
+ "example": 1000001
+ },
+ "emails": {
+ "type": "string",
+ "description": "A comma-separated list of email addresses to send the submission to.",
+ "example": "{{emails}}"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Get a submitter
+
+The API endpoint provides functionality to retrieve information about a submitter, along with the submitter documents and field values.
+
+```ruby
+require "docuseal"
+
+Docuseal.key = ENV["DOCUSEAL_API_KEY"]
+Docuseal.url = "https://api.docuseal.com"
+
+Docuseal.get_submitter(500001)
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "Get a submitter",
+ "operationId": "getSubmitter",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter.",
+ "example": 500001
+ }
+ ]
+}
+```
+
+### Update a submitter
+
+The API endpoint allows you to update submitter details, pre-fill or update field values and re-send emails. Related Guides Automatically sign documents via API
+
+```ruby
+require "docuseal"
+
+Docuseal.key = ENV["DOCUSEAL_API_KEY"]
+Docuseal.url = "https://api.docuseal.com"
+
+Docuseal.update_submitter(500001, {
+ email: "john.doe@example.com",
+ fields: [
+ {
+ name: "First Name",
+ default_value: "Acme"
+ }
+ ]
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "Update a submitter",
+ "operationId": "updateSubmitter",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter.",
+ "example": 500001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `true` to re-send signature request emails."
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to re-send signature request via phone number SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for template document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document template field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### List all submitters
+
+The API endpoint provides the ability to retrieve a list of submitters.
+
+```ruby
+require "docuseal"
+
+Docuseal.key = ENV["DOCUSEAL_API_KEY"]
+Docuseal.url = "https://api.docuseal.com"
+
+Docuseal.list_submitters(limit: 10)
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "List all submitters",
+ "operationId": "getSubmitters",
+ "parameters": [
+ {
+ "name": "submission_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The submission ID allows you to receive only the submitters related to that specific submission."
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submitters on name, email or phone partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submitters by unique slug.",
+ "example": "zAyL9fH36Havvm"
+ },
+ {
+ "name": "completed_after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "example": "2024-03-05 9:32:20",
+ "description": "The date and time string value to filter submitters that completed the submission after the specified date and time."
+ },
+ {
+ "name": "completed_before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "example": "2024-03-06 19:32:20",
+ "description": "The date and time string value to filter submitters that completed the submission before the specified date and time."
+ },
+ {
+ "name": "external_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The unique applications-specific identifier provided for a submitter when initializing a signature request. It allows you to receive only submitters with a specified external id."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of submitters to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter to start the list from. It allows you to receive only submitters with id greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of submitters."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter to end the list with. It allows you to receive only submitters with id less than the specified value."
+ }
+ ]
+}
+```
+
+### Update template documents
+
+The API endpoint allows you to add, remove or replace documents in the template with provided PDF/DOCX file or HTML content.
+
+```ruby
+require "docuseal"
+
+Docuseal.key = ENV["DOCUSEAL_API_KEY"]
+Docuseal.url = "https://api.docuseal.com"
+
+Docuseal.update_template_documents(1000001, {
+ documents: [
+ {
+ file: "string"
+ }
+ ]
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Update template documents",
+ "operationId": "addDocumentToTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the documents template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "documents": {
+ "type": "array",
+ "description": "The list of documents to add or replace in the template.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Template"
+ },
+ "file": {
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF or DOCX file or downloadable file URL. Leave it empty if you create a new document using HTML param."
+ },
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags. Leave it empty if you add a document via PDF or DOCX base64 encoded file param or URL."
+ },
+ "position": {
+ "type": "integer",
+ "description": "Position of the document. By default will be added as the last document in the template.",
+ "example": 0
+ },
+ "replace": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to replace existing document with a new file at `position`. Existing document fields will be transferred to the new document if it doesn't contain any fields."
+ },
+ "remove": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to remove existing document at given `position` or with given `name`."
+ }
+ }
+ }
+ },
+ "merge": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to merge all existing and new documents into a single PDF document in the template."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Clone a template
+
+The API endpoint allows you to clone existing template into a new template.
+
+```ruby
+require "docuseal"
+
+Docuseal.key = ENV["DOCUSEAL_API_KEY"]
+Docuseal.url = "https://api.docuseal.com"
+
+Docuseal.clone_template(1000001, {
+ name: "Cloned Template"
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Clone a template",
+ "operationId": "cloneTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the documents template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Template name. Existing name with (Clone) suffix will be used if not specified.",
+ "example": "Cloned Template"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be cloned."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from HTML
+
+The API endpoint provides the functionality to seamlessly generate a PDF document template by utilizing the provided HTML content while incorporating pre-defined fields. Related Guides Create PDF document fillable form with HTML
+
+```ruby
+require "docuseal"
+
+Docuseal.key = ENV["DOCUSEAL_API_KEY"]
+Docuseal.url = "https://api.docuseal.com"
+
+Docuseal.create_template_from_html({
+ html: "Lorem Ipsum is simply dummy text of the
+
+
+and typesetting industry
+",
+ name: "Test Template"
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from HTML",
+ "operationId": "createTemplateFromHtml",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "html_header": {
+ "type": "string",
+ "description": "HTML template of the header to be displayed on every page."
+ },
+ "html_footer": {
+ "type": "string",
+ "description": "HTML template of the footer to be displayed on every page."
+ },
+ "name": {
+ "type": "string",
+ "description": "Template name. Random uuid will be assigned when not specified.",
+ "example": "Test Template"
+ },
+ "size": {
+ "type": "string",
+ "default": "Letter",
+ "description": "Page size. Letter 8.5 x 11 will be assigned when not specified.",
+ "enum": [
+ "Letter",
+ "Legal",
+ "Tabloid",
+ "Ledger",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6"
+ ],
+ "example": "A4"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new HTML.",
+ "example": "714d974e-83d8-11ee-b962-0242ac120002"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "description": "The list of documents built from HTML. Can be used to create a template with multiple documents. Leave `documents` param empty when using a top-level `html` param for a template with a single document.",
+ "items": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Document"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from Word DOCX
+
+The API endpoint provides the functionality to create a fillable document template for existing Microsoft Word document. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.docx for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```ruby
+require "docuseal"
+
+Docuseal.key = ENV["DOCUSEAL_API_KEY"]
+Docuseal.url = "https://api.docuseal.com"
+
+Docuseal.create_template_from_docx({
+ name: "Test DOCX",
+ documents: [
+ {
+ name: "string",
+ file: "base64"
+ }
+ ]
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from Word DOCX",
+ "operationId": "createTemplateFromDocx",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test DOCX"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new document.",
+ "example": "unique-key"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "type": "string",
+ "example": "base64",
+ "format": "base64",
+ "description": "Base64-encoded content of the DOCX file or downloadable file URL"
+ },
+ "fields": {
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1."
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from existing PDF
+
+The API endpoint provides the functionality to create a fillable document template for existing PDF file. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```ruby
+require "docuseal"
+
+Docuseal.key = ENV["DOCUSEAL_API_KEY"]
+Docuseal.url = "https://api.docuseal.com"
+
+Docuseal.create_template_from_pdf({
+ name: "Test PDF",
+ documents: [
+ {
+ name: "string",
+ file: "base64",
+ fields: [
+ {
+ name: "string",
+ areas: [
+ {
+ x: 0,
+ y: 0,
+ w: 0,
+ h: 0,
+ page: 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from existing PDF",
+ "operationId": "createTemplateFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test PDF"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new PDF.",
+ "example": "unique-key"
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the document.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Merge templates
+
+The API endpoint allows you to merge multiple templates with documents and fields into a new combined template.
+
+```ruby
+require "docuseal"
+
+Docuseal.key = ENV["DOCUSEAL_API_KEY"]
+Docuseal.url = "https://api.docuseal.com"
+
+Docuseal.merge_templates({
+ template_ids: [
+ 321,
+ 432
+ ],
+ name: "Merged Template"
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Merge templates",
+ "operationId": "mergeTemplate",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_ids"
+ ],
+ "properties": {
+ "template_ids": {
+ "type": "array",
+ "description": "An array of template ids to merge into a new template.",
+ "items": {
+ "type": "integer"
+ },
+ "example": [
+ 321,
+ 432
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "Template name. Existing name with (Merged) suffix will be used if not specified.",
+ "example": "Merged Template"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The name of the folder in which the merged template should be placed."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "roles": {
+ "type": "array",
+ "description": "An array of submitter role names to be used in the merged template.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Agent",
+ "Customer"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from PDF
+
+The API endpoint provides the functionality to create one-off submission request from a PDF. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```ruby
+require "docuseal"
+
+Docuseal.key = ENV["DOCUSEAL_API_KEY"]
+Docuseal.url = "https://api.docuseal.com"
+
+Docuseal.create_submission_from_pdf({
+ name: "Test Submission Document",
+ documents: [
+ {
+ name: "string",
+ file: "base64",
+ fields: [
+ {
+ name: "string",
+ areas: [
+ {
+ x: 0,
+ y: 0,
+ w: 0,
+ h: 0,
+ page: 1
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ submitters: [
+ {
+ role: "First Party",
+ email: "john.doe@example.com"
+ }
+ ]
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from PDF",
+ "operationId": "createSubmissionFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission.",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ }
+ }
+ }
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the documents.",
+ "default": false
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from HTML
+
+This API endpoint allows you to create a one-off submission request document using the provided HTML content, with special field tags rendered as a fillable and signable form. Related Guides Create PDF document fillable form with HTML
+
+```ruby
+require "docuseal"
+
+Docuseal.key = ENV["DOCUSEAL_API_KEY"]
+Docuseal.url = "https://api.docuseal.com"
+
+Docuseal.create_submission_from_html({
+ name: "Test Submission Document",
+ documents: [
+ {
+ name: "Test Document",
+ html: "Lorem Ipsum is simply dummy text of the
+
+
+and typesetting industry
+"
+ }
+ ],
+ submitters: [
+ {
+ role: "First Party",
+ email: "john.doe@example.com"
+ }
+ ]
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from HTML",
+ "operationId": "createSubmissionFromHtml",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "The list of documents built from HTML. Can be used to create a submission with multiple documents.",
+ "items": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Document"
+ },
+ "html": {
+ "type": "string",
+ "description": "HTML document content with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "html_header": {
+ "type": "string",
+ "description": "HTML document content of the header to be displayed on every page."
+ },
+ "html_footer": {
+ "type": "string",
+ "description": "HTML document content of the footer to be displayed on every page."
+ },
+ "size": {
+ "type": "string",
+ "default": "Letter",
+ "description": "Page size. Letter 8.5 x 11 will be assigned when not specified.",
+ "enum": [
+ "Letter",
+ "Legal",
+ "Tabloid",
+ "Ledger",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6"
+ ],
+ "example": "A4"
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from PDF
+
+The API endpoint provides the functionality to create a fillable document template for a PDF file. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```ruby
+require "docuseal"
+
+Docuseal.key = ENV["DOCUSEAL_API_KEY"]
+Docuseal.url = "https://api.docuseal.com"
+
+Docuseal.create_template_from_pdf({
+ name: "Test PDF",
+ documents: [
+ {
+ name: "string",
+ file: "base64",
+ fields: [
+ {
+ name: "string",
+ areas: [
+ {
+ x: 0,
+ y: 0,
+ w: 0,
+ h: 0,
+ page: 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from PDF",
+ "operationId": "createTemplateFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test PDF"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new PDF.",
+ "example": "unique-key"
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the documents.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from DOCX
+
+The API endpoint provides functionality to create a one-off submission request from a DOCX file with dynamic content variables. Use [[variable_name]] text tags to define dynamic content variables in the document. See https://www.docuseal.com/examples/demo_template.docx for the specific text variable syntax, including dynamic content tables and list. You can also use the {{signature}} fillable field syntax to define fillable fields, as in a PDF. Related Guides Use embedded text field tags to create a fillable form
+
+```ruby
+require "docuseal"
+
+Docuseal.key = ENV["DOCUSEAL_API_KEY"]
+Docuseal.url = "https://api.docuseal.com"
+
+Docuseal.create_submission_from_docx({
+ name: "Test Submission Document",
+ variables: {
+ variable_name: "value"
+ },
+ documents: [
+ {
+ name: "string",
+ file: "base64"
+ }
+ ],
+ submitters: [
+ {
+ role: "First Party",
+ email: "john.doe@example.com"
+ }
+ ]
+})
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from DOCX",
+ "operationId": "createSubmissionFromDocx",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission.",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "variables": {
+ "type": "object",
+ "description": "Dynamic content variables object",
+ "example": {
+ "variable_name": "value"
+ }
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF or DOCX file or downloadable file URL."
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
diff --git a/docs/api/shell.md b/docs/api/shell.md
new file mode 100644
index 00000000..f5132490
--- /dev/null
+++ b/docs/api/shell.md
@@ -0,0 +1,4084 @@
+### List all templates
+
+The API endpoint provides the ability to retrieve a list of available document templates.
+
+```shell
+curl --request GET \
+ --url https://api.docuseal.com/templates \
+ --header 'X-Auth-Token: API_KEY'
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "List all templates",
+ "operationId": "getTemplates",
+ "parameters": [
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates based on the name partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates by unique slug.",
+ "example": "opaKWh8WWTAcVG"
+ },
+ {
+ "name": "external_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The unique applications-specific identifier provided for the template via API or Embedded template form builder. It allows you to receive only templates with your specified external id."
+ },
+ {
+ "name": "folder",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates by folder name."
+ },
+ {
+ "name": "archived",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ },
+ "description": "Get only archived templates instead of active ones."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of templates to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the template to start the list from. It allows you to receive only templates with id greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of templates."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the template to end the list with. It allows you to receive only templates with id less than the specified value."
+ }
+ ]
+}
+```
+
+### Get a template
+
+The API endpoint provides the functionality to retrieve information about a document template.
+
+```shell
+curl --request GET \
+ --url https://api.docuseal.com/templates/1000001 \
+ --header 'X-Auth-Token: API_KEY'
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Get a template",
+ "operationId": "getTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ]
+}
+```
+
+### Archive a template
+
+The API endpoint allows you to archive a document template.
+
+```shell
+curl --request DELETE \
+ --url https://api.docuseal.com/templates/1000001 \
+ --header 'X-Auth-Token: API_KEY'
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Archive a template",
+ "operationId": "archiveTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ]
+}
+```
+
+### Update a template
+
+The API endpoint provides the functionality to move a document template to a different folder and update the name of the template.
+
+```shell
+curl --request PUT \
+ --url https://api.docuseal.com/templates/1000001 \
+ --header 'X-Auth-Token: API_KEY' \
+ --header 'content-type: application/json' \
+ --data '{"name":"New Document Name","folder_name":"New Folder"}'
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Update a template",
+ "operationId": "updateTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the template",
+ "example": "New Document Name"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be moved.",
+ "example": "New Folder"
+ },
+ "roles": {
+ "type": "array",
+ "description": "An array of submitter role names to update the template with.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Agent",
+ "Customer"
+ ]
+ },
+ "archived": {
+ "type": "boolean",
+ "description": "Set `false` to unarchive template."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### List all submissions
+
+The API endpoint provides the ability to retrieve a list of available submissions.
+
+```shell
+curl --request GET \
+ --url https://api.docuseal.com/submissions \
+ --header 'X-Auth-Token: API_KEY'
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "List all submissions",
+ "operationId": "getSubmissions",
+ "parameters": [
+ {
+ "name": "template_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The template ID allows you to receive only the submissions created from that specific template."
+ },
+ {
+ "name": "status",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "enum": [
+ "pending",
+ "completed",
+ "declined",
+ "expired"
+ ]
+ },
+ "description": "Filter submissions by status."
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions based on submitters name, email or phone partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions by unique slug.",
+ "example": "NtLDQM7eJX2ZMd"
+ },
+ {
+ "name": "template_folder",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions by template folder name."
+ },
+ {
+ "name": "archived",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ },
+ "description": "Returns only archived submissions when `true` and only active submissions when `false`."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of submissions to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission to start the list from. It allows you to receive only submissions with an ID greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of submissions."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission that marks the end of the list. It allows you to receive only submissions with an ID less than the specified value."
+ }
+ ]
+}
+```
+
+### Create a submission
+
+This API endpoint allows you to create signature requests (submissions) for a document template and send them to the specified submitters (signers). Related Guides Send documents for signature via API Pre-fill PDF document form fields with API
+
+```shell
+curl --request POST \
+ --url https://api.docuseal.com/submissions \
+ --header 'X-Auth-Token: API_KEY' \
+ --header 'content-type: application/json' \
+ --data '{"template_id":1000001,"send_email":true,"submitters":[{"role":"First Party","email":"john.doe@example.com"}]}'
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission",
+ "operationId": "createSubmission",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_id",
+ "submitters"
+ ],
+ "properties": {
+ "template_id": {
+ "type": "integer",
+ "description": "The unique identifier of the template. Document template forms can be created via the Web UI, PDF and DOCX API, or HTML API.",
+ "example": 1000001
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject for the submitter."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body for the submitter. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for template document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document template field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Get a submission
+
+The API endpoint provides the functionality to retrieve information about a submission.
+
+```shell
+curl --request GET \
+ --url https://api.docuseal.com/submissions/1001 \
+ --header 'X-Auth-Token: API_KEY'
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Get a submission",
+ "operationId": "getSubmission",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Archive a submission
+
+The API endpoint allows you to archive a submission.
+
+```shell
+curl --request DELETE \
+ --url https://api.docuseal.com/submissions/1001 \
+ --header 'X-Auth-Token: API_KEY'
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Archive a submission",
+ "operationId": "archiveSubmission",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Get submission documents
+
+This endpoint returns a list of partially filled documents for a submission. If the submission has been completed, the final signed documents are returned.
+
+```shell
+curl --request GET \
+ --url https://api.docuseal.com/submissions/1001/documents \
+ --header 'X-Auth-Token: API_KEY'
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Get submission documents",
+ "operationId": "getSubmissionDocuments",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Create submissions from emails
+
+This API endpoint allows you to create submissions for a document template and send them to the specified email addresses. This is a simplified version of the POST /submissions API to be used with Zapier or other automation tools.
+
+```shell
+curl --request POST \
+ --url https://api.docuseal.com/submissions/emails \
+ --header 'X-Auth-Token: API_KEY' \
+ --header 'content-type: application/json' \
+ --data '{"template_id":1000001,"emails":"hi@docuseal.com, example@docuseal.com"}'
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create submissions from emails",
+ "operationId": "createSubmissionsFromEmails",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_id",
+ "emails"
+ ],
+ "properties": {
+ "template_id": {
+ "type": "integer",
+ "description": "The unique identifier of the template.",
+ "example": 1000001
+ },
+ "emails": {
+ "type": "string",
+ "description": "A comma-separated list of email addresses to send the submission to.",
+ "example": "{{emails}}"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Get a submitter
+
+The API endpoint provides functionality to retrieve information about a submitter, along with the submitter documents and field values.
+
+```shell
+curl --request GET \
+ --url https://api.docuseal.com/submitters/500001 \
+ --header 'X-Auth-Token: API_KEY'
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "Get a submitter",
+ "operationId": "getSubmitter",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter.",
+ "example": 500001
+ }
+ ]
+}
+```
+
+### Update a submitter
+
+The API endpoint allows you to update submitter details, pre-fill or update field values and re-send emails. Related Guides Automatically sign documents via API
+
+```shell
+curl --request PUT \
+ --url https://api.docuseal.com/submitters/500001 \
+ --header 'X-Auth-Token: API_KEY' \
+ --header 'content-type: application/json' \
+ --data '{"email":"john.doe@example.com","fields":[{"name":"First Name","default_value":"Acme"}]}'
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "Update a submitter",
+ "operationId": "updateSubmitter",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter.",
+ "example": 500001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `true` to re-send signature request emails."
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to re-send signature request via phone number SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for template document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document template field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### List all submitters
+
+The API endpoint provides the ability to retrieve a list of submitters.
+
+```shell
+curl --request GET \
+ --url https://api.docuseal.com/submitters \
+ --header 'X-Auth-Token: API_KEY'
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "List all submitters",
+ "operationId": "getSubmitters",
+ "parameters": [
+ {
+ "name": "submission_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The submission ID allows you to receive only the submitters related to that specific submission."
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submitters on name, email or phone partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submitters by unique slug.",
+ "example": "zAyL9fH36Havvm"
+ },
+ {
+ "name": "completed_after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "example": "2024-03-05 9:32:20",
+ "description": "The date and time string value to filter submitters that completed the submission after the specified date and time."
+ },
+ {
+ "name": "completed_before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "example": "2024-03-06 19:32:20",
+ "description": "The date and time string value to filter submitters that completed the submission before the specified date and time."
+ },
+ {
+ "name": "external_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The unique applications-specific identifier provided for a submitter when initializing a signature request. It allows you to receive only submitters with a specified external id."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of submitters to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter to start the list from. It allows you to receive only submitters with id greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of submitters."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter to end the list with. It allows you to receive only submitters with id less than the specified value."
+ }
+ ]
+}
+```
+
+### Update template documents
+
+The API endpoint allows you to add, remove or replace documents in the template with provided PDF/DOCX file or HTML content.
+
+```shell
+curl --request PUT \
+ --url https://api.docuseal.com/templates/1000001/documents \
+ --header 'X-Auth-Token: API_KEY' \
+ --header 'content-type: application/json' \
+ --data '{"documents":[{"file":"string"}]}'
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Update template documents",
+ "operationId": "addDocumentToTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the documents template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "documents": {
+ "type": "array",
+ "description": "The list of documents to add or replace in the template.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Template"
+ },
+ "file": {
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF or DOCX file or downloadable file URL. Leave it empty if you create a new document using HTML param."
+ },
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags. Leave it empty if you add a document via PDF or DOCX base64 encoded file param or URL."
+ },
+ "position": {
+ "type": "integer",
+ "description": "Position of the document. By default will be added as the last document in the template.",
+ "example": 0
+ },
+ "replace": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to replace existing document with a new file at `position`. Existing document fields will be transferred to the new document if it doesn't contain any fields."
+ },
+ "remove": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to remove existing document at given `position` or with given `name`."
+ }
+ }
+ }
+ },
+ "merge": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to merge all existing and new documents into a single PDF document in the template."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Clone a template
+
+The API endpoint allows you to clone existing template into a new template.
+
+```shell
+curl --request POST \
+ --url https://api.docuseal.com/templates/1000001/clone \
+ --header 'X-Auth-Token: API_KEY' \
+ --header 'content-type: application/json' \
+ --data '{"name":"Cloned Template"}'
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Clone a template",
+ "operationId": "cloneTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the documents template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Template name. Existing name with (Clone) suffix will be used if not specified.",
+ "example": "Cloned Template"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be cloned."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from HTML
+
+The API endpoint provides the functionality to seamlessly generate a PDF document template by utilizing the provided HTML content while incorporating pre-defined fields. Related Guides Create PDF document fillable form with HTML
+
+```shell
+curl --request POST \
+ --url https://api.docuseal.com/templates/html \
+ --header 'X-Auth-Token: API_KEY' \
+ --header 'content-type: application/json' \
+ --data '{"html":"Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n","name":"Test Template"}'
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from HTML",
+ "operationId": "createTemplateFromHtml",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "html_header": {
+ "type": "string",
+ "description": "HTML template of the header to be displayed on every page."
+ },
+ "html_footer": {
+ "type": "string",
+ "description": "HTML template of the footer to be displayed on every page."
+ },
+ "name": {
+ "type": "string",
+ "description": "Template name. Random uuid will be assigned when not specified.",
+ "example": "Test Template"
+ },
+ "size": {
+ "type": "string",
+ "default": "Letter",
+ "description": "Page size. Letter 8.5 x 11 will be assigned when not specified.",
+ "enum": [
+ "Letter",
+ "Legal",
+ "Tabloid",
+ "Ledger",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6"
+ ],
+ "example": "A4"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new HTML.",
+ "example": "714d974e-83d8-11ee-b962-0242ac120002"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "description": "The list of documents built from HTML. Can be used to create a template with multiple documents. Leave `documents` param empty when using a top-level `html` param for a template with a single document.",
+ "items": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Document"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from Word DOCX
+
+The API endpoint provides the functionality to create a fillable document template for existing Microsoft Word document. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.docx for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```shell
+curl --request POST \
+ --url https://api.docuseal.com/templates/docx \
+ --header 'X-Auth-Token: API_KEY' \
+ --header 'content-type: application/json' \
+ --data '{"name":"Test DOCX","documents":[{"name":"string","file":"base64"}]}'
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from Word DOCX",
+ "operationId": "createTemplateFromDocx",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test DOCX"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new document.",
+ "example": "unique-key"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "type": "string",
+ "example": "base64",
+ "format": "base64",
+ "description": "Base64-encoded content of the DOCX file or downloadable file URL"
+ },
+ "fields": {
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1."
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from existing PDF
+
+The API endpoint provides the functionality to create a fillable document template for existing PDF file. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```shell
+curl --request POST \
+ --url https://api.docuseal.com/templates/pdf \
+ --header 'X-Auth-Token: API_KEY' \
+ --header 'content-type: application/json' \
+ --data '{"name":"Test PDF","documents":[{"name":"string","file":"base64","fields":[{"name":"string","areas":[{"x":0,"y":0,"w":0,"h":0,"page":1}]}]}]}'
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from existing PDF",
+ "operationId": "createTemplateFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test PDF"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new PDF.",
+ "example": "unique-key"
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the document.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Merge templates
+
+The API endpoint allows you to merge multiple templates with documents and fields into a new combined template.
+
+```shell
+curl --request POST \
+ --url https://api.docuseal.com/templates/merge \
+ --header 'X-Auth-Token: API_KEY' \
+ --header 'content-type: application/json' \
+ --data '{"template_ids":[321,432],"name":"Merged Template"}'
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Merge templates",
+ "operationId": "mergeTemplate",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_ids"
+ ],
+ "properties": {
+ "template_ids": {
+ "type": "array",
+ "description": "An array of template ids to merge into a new template.",
+ "items": {
+ "type": "integer"
+ },
+ "example": [
+ 321,
+ 432
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "Template name. Existing name with (Merged) suffix will be used if not specified.",
+ "example": "Merged Template"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The name of the folder in which the merged template should be placed."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "roles": {
+ "type": "array",
+ "description": "An array of submitter role names to be used in the merged template.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Agent",
+ "Customer"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from PDF
+
+The API endpoint provides the functionality to create one-off submission request from a PDF. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```shell
+curl --request POST \
+ --url https://api.docuseal.com/submissions/pdf \
+ --header 'X-Auth-Token: API_KEY' \
+ --header 'content-type: application/json' \
+ --data '{"name":"Test Submission Document","documents":[{"name":"string","file":"base64","fields":[{"name":"string","areas":[{"x":0,"y":0,"w":0,"h":0,"page":1}]}]}],"submitters":[{"role":"First Party","email":"john.doe@example.com"}]}'
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from PDF",
+ "operationId": "createSubmissionFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission.",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ }
+ }
+ }
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the documents.",
+ "default": false
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from HTML
+
+This API endpoint allows you to create a one-off submission request document using the provided HTML content, with special field tags rendered as a fillable and signable form. Related Guides Create PDF document fillable form with HTML
+
+```shell
+curl --request POST \
+ --url https://api.docuseal.com/submissions/html \
+ --header 'X-Auth-Token: API_KEY' \
+ --header 'content-type: application/json' \
+ --data '{"name":"Test Submission Document","documents":[{"name":"Test Document","html":"Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"}],"submitters":[{"role":"First Party","email":"john.doe@example.com"}]}'
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from HTML",
+ "operationId": "createSubmissionFromHtml",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "The list of documents built from HTML. Can be used to create a submission with multiple documents.",
+ "items": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Document"
+ },
+ "html": {
+ "type": "string",
+ "description": "HTML document content with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "html_header": {
+ "type": "string",
+ "description": "HTML document content of the header to be displayed on every page."
+ },
+ "html_footer": {
+ "type": "string",
+ "description": "HTML document content of the footer to be displayed on every page."
+ },
+ "size": {
+ "type": "string",
+ "default": "Letter",
+ "description": "Page size. Letter 8.5 x 11 will be assigned when not specified.",
+ "enum": [
+ "Letter",
+ "Legal",
+ "Tabloid",
+ "Ledger",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6"
+ ],
+ "example": "A4"
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from PDF
+
+The API endpoint provides the functionality to create a fillable document template for a PDF file. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```shell
+curl --request POST \
+ --url https://api.docuseal.com/templates/pdf \
+ --header 'X-Auth-Token: API_KEY' \
+ --header 'content-type: application/json' \
+ --data '{"name":"Test PDF","documents":[{"name":"string","file":"base64","fields":[{"name":"string","areas":[{"x":0,"y":0,"w":0,"h":0,"page":1}]}]}]}'
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from PDF",
+ "operationId": "createTemplateFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test PDF"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new PDF.",
+ "example": "unique-key"
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the documents.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from DOCX
+
+The API endpoint provides functionality to create a one-off submission request from a DOCX file with dynamic content variables. Use [[variable_name]] text tags to define dynamic content variables in the document. See https://www.docuseal.com/examples/demo_template.docx for the specific text variable syntax, including dynamic content tables and list. You can also use the {{signature}} fillable field syntax to define fillable fields, as in a PDF. Related Guides Use embedded text field tags to create a fillable form
+
+```shell
+curl --request POST \
+ --url https://api.docuseal.com/submissions/docx \
+ --header 'X-Auth-Token: API_KEY' \
+ --header 'content-type: application/json' \
+ --data '{"name":"Test Submission Document","variables":{"variable_name":"value"},"documents":[{"name":"string","file":"base64"}],"submitters":[{"role":"First Party","email":"john.doe@example.com"}]}'
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from DOCX",
+ "operationId": "createSubmissionFromDocx",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission.",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "variables": {
+ "type": "object",
+ "description": "Dynamic content variables object",
+ "example": {
+ "variable_name": "value"
+ }
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF or DOCX file or downloadable file URL."
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
diff --git a/docs/api/typescript.md b/docs/api/typescript.md
new file mode 100644
index 00000000..65d4b084
--- /dev/null
+++ b/docs/api/typescript.md
@@ -0,0 +1,4269 @@
+### List all templates
+
+The API endpoint provides the ability to retrieve a list of available document templates.
+
+```typescript
+import docuseal from "@docuseal/api";
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const { data, pagination } = await docuseal.listTemplates({ limit: 10 });
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "List all templates",
+ "operationId": "getTemplates",
+ "parameters": [
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates based on the name partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates by unique slug.",
+ "example": "opaKWh8WWTAcVG"
+ },
+ {
+ "name": "external_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The unique applications-specific identifier provided for the template via API or Embedded template form builder. It allows you to receive only templates with your specified external id."
+ },
+ {
+ "name": "folder",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates by folder name."
+ },
+ {
+ "name": "archived",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ },
+ "description": "Get only archived templates instead of active ones."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of templates to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the template to start the list from. It allows you to receive only templates with id greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of templates."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the template to end the list with. It allows you to receive only templates with id less than the specified value."
+ }
+ ]
+}
+```
+
+### Get a template
+
+The API endpoint provides the functionality to retrieve information about a document template.
+
+```typescript
+import docuseal from "@docuseal/api";
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const template = await docuseal.getTemplate(1000001);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Get a template",
+ "operationId": "getTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ]
+}
+```
+
+### Archive a template
+
+The API endpoint allows you to archive a document template.
+
+```typescript
+import docuseal from "@docuseal/api";
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+await docuseal.archiveTemplate(1000001);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Archive a template",
+ "operationId": "archiveTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ]
+}
+```
+
+### Update a template
+
+The API endpoint provides the functionality to move a document template to a different folder and update the name of the template.
+
+```typescript
+import docuseal from "@docuseal/api";
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const template = await docuseal.updateTemplate(1000001, {
+ name: "New Document Name",
+ folder_name: "New Folder"
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Update a template",
+ "operationId": "updateTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the template",
+ "example": "New Document Name"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be moved.",
+ "example": "New Folder"
+ },
+ "roles": {
+ "type": "array",
+ "description": "An array of submitter role names to update the template with.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Agent",
+ "Customer"
+ ]
+ },
+ "archived": {
+ "type": "boolean",
+ "description": "Set `false` to unarchive template."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### List all submissions
+
+The API endpoint provides the ability to retrieve a list of available submissions.
+
+```typescript
+import docuseal from "@docuseal/api";
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const { data, pagination } = await docuseal.listSubmissions({ limit: 10 });
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "List all submissions",
+ "operationId": "getSubmissions",
+ "parameters": [
+ {
+ "name": "template_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The template ID allows you to receive only the submissions created from that specific template."
+ },
+ {
+ "name": "status",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "enum": [
+ "pending",
+ "completed",
+ "declined",
+ "expired"
+ ]
+ },
+ "description": "Filter submissions by status."
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions based on submitters name, email or phone partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions by unique slug.",
+ "example": "NtLDQM7eJX2ZMd"
+ },
+ {
+ "name": "template_folder",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions by template folder name."
+ },
+ {
+ "name": "archived",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ },
+ "description": "Returns only archived submissions when `true` and only active submissions when `false`."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of submissions to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission to start the list from. It allows you to receive only submissions with an ID greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of submissions."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission that marks the end of the list. It allows you to receive only submissions with an ID less than the specified value."
+ }
+ ]
+}
+```
+
+### Create a submission
+
+This API endpoint allows you to create signature requests (submissions) for a document template and send them to the specified submitters (signers). Related Guides Send documents for signature via API Pre-fill PDF document form fields with API
+
+```typescript
+import docuseal from "@docuseal/api";
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const submission = await docuseal.createSubmission({
+ template_id: 1000001,
+ send_email: true,
+ submitters: [
+ {
+ role: "First Party",
+ email: "john.doe@example.com"
+ }
+ ]
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission",
+ "operationId": "createSubmission",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_id",
+ "submitters"
+ ],
+ "properties": {
+ "template_id": {
+ "type": "integer",
+ "description": "The unique identifier of the template. Document template forms can be created via the Web UI, PDF and DOCX API, or HTML API.",
+ "example": 1000001
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject for the submitter."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body for the submitter. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for template document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document template field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Get a submission
+
+The API endpoint provides the functionality to retrieve information about a submission.
+
+```typescript
+import docuseal from "@docuseal/api";
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const submission = await docuseal.getSubmission(1001);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Get a submission",
+ "operationId": "getSubmission",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Archive a submission
+
+The API endpoint allows you to archive a submission.
+
+```typescript
+import docuseal from "@docuseal/api";
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+await docuseal.archiveSubmission(1001);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Archive a submission",
+ "operationId": "archiveSubmission",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Get submission documents
+
+This endpoint returns a list of partially filled documents for a submission. If the submission has been completed, the final signed documents are returned.
+
+```typescript
+import docuseal from "@docuseal/api";
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const submission = await docuseal.getSubmissionDocuments(1001);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Get submission documents",
+ "operationId": "getSubmissionDocuments",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ]
+}
+```
+
+### Create submissions from emails
+
+This API endpoint allows you to create submissions for a document template and send them to the specified email addresses. This is a simplified version of the POST /submissions API to be used with Zapier or other automation tools.
+
+```typescript
+import docuseal from "@docuseal/api";
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const submission = await docuseal.createSubmissionFromEmails({
+ template_id: 1000001,
+ emails: "hi@docuseal.com, example@docuseal.com"
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create submissions from emails",
+ "operationId": "createSubmissionsFromEmails",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_id",
+ "emails"
+ ],
+ "properties": {
+ "template_id": {
+ "type": "integer",
+ "description": "The unique identifier of the template.",
+ "example": 1000001
+ },
+ "emails": {
+ "type": "string",
+ "description": "A comma-separated list of email addresses to send the submission to.",
+ "example": "{{emails}}"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Get a submitter
+
+The API endpoint provides functionality to retrieve information about a submitter, along with the submitter documents and field values.
+
+```typescript
+import docuseal from "@docuseal/api";
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const submitter = await docuseal.getSubmitter(500001);
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "Get a submitter",
+ "operationId": "getSubmitter",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter.",
+ "example": 500001
+ }
+ ]
+}
+```
+
+### Update a submitter
+
+The API endpoint allows you to update submitter details, pre-fill or update field values and re-send emails. Related Guides Automatically sign documents via API
+
+```typescript
+import docuseal from "@docuseal/api";
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const submitter = await docuseal.updateSubmitter(500001, {
+ email: "john.doe@example.com",
+ fields: [
+ {
+ name: "First Name",
+ default_value: "Acme"
+ }
+ ]
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "Update a submitter",
+ "operationId": "updateSubmitter",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter.",
+ "example": 500001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `true` to re-send signature request emails."
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to re-send signature request via phone number SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for template document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document template field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### List all submitters
+
+The API endpoint provides the ability to retrieve a list of submitters.
+
+```typescript
+import docuseal from "@docuseal/api";
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const { data, pagination } = await docuseal.listSubmitters({ limit: 10 });
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "List all submitters",
+ "operationId": "getSubmitters",
+ "parameters": [
+ {
+ "name": "submission_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The submission ID allows you to receive only the submitters related to that specific submission."
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submitters on name, email or phone partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submitters by unique slug.",
+ "example": "zAyL9fH36Havvm"
+ },
+ {
+ "name": "completed_after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "example": "2024-03-05 9:32:20",
+ "description": "The date and time string value to filter submitters that completed the submission after the specified date and time."
+ },
+ {
+ "name": "completed_before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "example": "2024-03-06 19:32:20",
+ "description": "The date and time string value to filter submitters that completed the submission before the specified date and time."
+ },
+ {
+ "name": "external_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The unique applications-specific identifier provided for a submitter when initializing a signature request. It allows you to receive only submitters with a specified external id."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of submitters to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter to start the list from. It allows you to receive only submitters with id greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of submitters."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter to end the list with. It allows you to receive only submitters with id less than the specified value."
+ }
+ ]
+}
+```
+
+### Update template documents
+
+The API endpoint allows you to add, remove or replace documents in the template with provided PDF/DOCX file or HTML content.
+
+```typescript
+import docuseal from "@docuseal/api";
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const template = await docuseal.updateTemplateDocuments(1000001, {
+ documents: [
+ {
+ file: "string"
+ }
+ ]
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Update template documents",
+ "operationId": "addDocumentToTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the documents template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "documents": {
+ "type": "array",
+ "description": "The list of documents to add or replace in the template.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Template"
+ },
+ "file": {
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF or DOCX file or downloadable file URL. Leave it empty if you create a new document using HTML param."
+ },
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags. Leave it empty if you add a document via PDF or DOCX base64 encoded file param or URL."
+ },
+ "position": {
+ "type": "integer",
+ "description": "Position of the document. By default will be added as the last document in the template.",
+ "example": 0
+ },
+ "replace": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to replace existing document with a new file at `position`. Existing document fields will be transferred to the new document if it doesn't contain any fields."
+ },
+ "remove": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to remove existing document at given `position` or with given `name`."
+ }
+ }
+ }
+ },
+ "merge": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to merge all existing and new documents into a single PDF document in the template."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Clone a template
+
+The API endpoint allows you to clone existing template into a new template.
+
+```typescript
+import docuseal from "@docuseal/api";
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const template = await docuseal.cloneTemplate(1000001, {
+ name: "Cloned Template"
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Clone a template",
+ "operationId": "cloneTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the documents template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Template name. Existing name with (Clone) suffix will be used if not specified.",
+ "example": "Cloned Template"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be cloned."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from HTML
+
+The API endpoint provides the functionality to seamlessly generate a PDF document template by utilizing the provided HTML content while incorporating pre-defined fields. Related Guides Create PDF document fillable form with HTML
+
+```typescript
+import docuseal from "@docuseal/api";
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const template = await docuseal.createTemplateFromHtml({
+ html: `Lorem Ipsum is simply dummy text of the
+
+
+and typesetting industry
+`,
+ name: "Test Template"
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from HTML",
+ "operationId": "createTemplateFromHtml",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "html_header": {
+ "type": "string",
+ "description": "HTML template of the header to be displayed on every page."
+ },
+ "html_footer": {
+ "type": "string",
+ "description": "HTML template of the footer to be displayed on every page."
+ },
+ "name": {
+ "type": "string",
+ "description": "Template name. Random uuid will be assigned when not specified.",
+ "example": "Test Template"
+ },
+ "size": {
+ "type": "string",
+ "default": "Letter",
+ "description": "Page size. Letter 8.5 x 11 will be assigned when not specified.",
+ "enum": [
+ "Letter",
+ "Legal",
+ "Tabloid",
+ "Ledger",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6"
+ ],
+ "example": "A4"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new HTML.",
+ "example": "714d974e-83d8-11ee-b962-0242ac120002"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "description": "The list of documents built from HTML. Can be used to create a template with multiple documents. Leave `documents` param empty when using a top-level `html` param for a template with a single document.",
+ "items": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Document"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from Word DOCX
+
+The API endpoint provides the functionality to create a fillable document template for existing Microsoft Word document. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.docx for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```typescript
+import docuseal from "@docuseal/api";
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const template = await docuseal.createTemplateFromDocx({
+ name: "Test DOCX",
+ documents: [
+ {
+ name: "string",
+ file: "base64"
+ }
+ ]
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from Word DOCX",
+ "operationId": "createTemplateFromDocx",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test DOCX"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new document.",
+ "example": "unique-key"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "type": "string",
+ "example": "base64",
+ "format": "base64",
+ "description": "Base64-encoded content of the DOCX file or downloadable file URL"
+ },
+ "fields": {
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1."
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from existing PDF
+
+The API endpoint provides the functionality to create a fillable document template for existing PDF file. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```typescript
+import docuseal from "@docuseal/api";
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const template = await docuseal.createTemplateFromPdf({
+ name: "Test PDF",
+ documents: [
+ {
+ name: "string",
+ file: "base64",
+ fields: [
+ {
+ name: "string",
+ areas: [
+ {
+ x: 0,
+ y: 0,
+ w: 0,
+ h: 0,
+ page: 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from existing PDF",
+ "operationId": "createTemplateFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test PDF"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new PDF.",
+ "example": "unique-key"
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the document.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Merge templates
+
+The API endpoint allows you to merge multiple templates with documents and fields into a new combined template.
+
+```typescript
+import docuseal from "@docuseal/api";
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const template = await docuseal.mergeTemplates({
+ template_ids: [
+ 321,
+ 432
+ ],
+ name: "Merged Template"
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Merge templates",
+ "operationId": "mergeTemplate",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_ids"
+ ],
+ "properties": {
+ "template_ids": {
+ "type": "array",
+ "description": "An array of template ids to merge into a new template.",
+ "items": {
+ "type": "integer"
+ },
+ "example": [
+ 321,
+ 432
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "Template name. Existing name with (Merged) suffix will be used if not specified.",
+ "example": "Merged Template"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The name of the folder in which the merged template should be placed."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "roles": {
+ "type": "array",
+ "description": "An array of submitter role names to be used in the merged template.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Agent",
+ "Customer"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from PDF
+
+The API endpoint provides the functionality to create one-off submission request from a PDF. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```typescript
+import docuseal from "@docuseal/api";
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const submission = await docuseal.createSubmissionFromPdf({
+ name: "Test Submission Document",
+ documents: [
+ {
+ name: "string",
+ file: "base64",
+ fields: [
+ {
+ name: "string",
+ areas: [
+ {
+ x: 0,
+ y: 0,
+ w: 0,
+ h: 0,
+ page: 1
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ submitters: [
+ {
+ role: "First Party",
+ email: "john.doe@example.com"
+ }
+ ]
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from PDF",
+ "operationId": "createSubmissionFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission.",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ }
+ }
+ }
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the documents.",
+ "default": false
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from HTML
+
+This API endpoint allows you to create a one-off submission request document using the provided HTML content, with special field tags rendered as a fillable and signable form. Related Guides Create PDF document fillable form with HTML
+
+```typescript
+import docuseal from "@docuseal/api";
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const submission = await docuseal.createSubmissionFromHtml({
+ name: "Test Submission Document",
+ documents: [
+ {
+ name: "Test Document",
+ html: `Lorem Ipsum is simply dummy text of the
+
+
+and typesetting industry
+`
+ }
+ ],
+ submitters: [
+ {
+ role: "First Party",
+ email: "john.doe@example.com"
+ }
+ ]
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from HTML",
+ "operationId": "createSubmissionFromHtml",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "The list of documents built from HTML. Can be used to create a submission with multiple documents.",
+ "items": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Document"
+ },
+ "html": {
+ "type": "string",
+ "description": "HTML document content with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "html_header": {
+ "type": "string",
+ "description": "HTML document content of the header to be displayed on every page."
+ },
+ "html_footer": {
+ "type": "string",
+ "description": "HTML document content of the footer to be displayed on every page."
+ },
+ "size": {
+ "type": "string",
+ "default": "Letter",
+ "description": "Page size. Letter 8.5 x 11 will be assigned when not specified.",
+ "enum": [
+ "Letter",
+ "Legal",
+ "Tabloid",
+ "Ledger",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6"
+ ],
+ "example": "A4"
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a template from PDF
+
+The API endpoint provides the functionality to create a fillable document template for a PDF file. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form
+
+
+```typescript
+import docuseal from "@docuseal/api";
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const template = await docuseal.createTemplateFromPdf({
+ name: "Test PDF",
+ documents: [
+ {
+ name: "string",
+ file: "base64",
+ fields: [
+ {
+ name: "string",
+ areas: [
+ {
+ x: 0,
+ y: 0,
+ w: 0,
+ h: 0,
+ page: 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from PDF",
+ "operationId": "createTemplateFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test PDF"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new PDF.",
+ "example": "unique-key"
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the documents.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Create a submission from DOCX
+
+The API endpoint provides functionality to create a one-off submission request from a DOCX file with dynamic content variables. Use [[variable_name]] text tags to define dynamic content variables in the document. See https://www.docuseal.com/examples/demo_template.docx for the specific text variable syntax, including dynamic content tables and list. You can also use the {{signature}} fillable field syntax to define fillable fields, as in a PDF. Related Guides Use embedded text field tags to create a fillable form
+
+```typescript
+import docuseal from "@docuseal/api";
+
+docuseal.configure({ key: "API_KEY", url: "https://api.docuseal.com" });
+
+const submission = await docuseal.createSubmissionFromDocx({
+ name: "Test Submission Document",
+ variables: {
+ variable_name: "value"
+ },
+ documents: [
+ {
+ name: "string",
+ file: "base64"
+ }
+ ],
+ submitters: [
+ {
+ role: "First Party",
+ email: "john.doe@example.com"
+ }
+ ]
+});
+```
+
+```json
+{
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from DOCX",
+ "operationId": "createSubmissionFromDocx",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission.",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "variables": {
+ "type": "object",
+ "description": "Dynamic content variables object",
+ "example": {
+ "variable_name": "value"
+ }
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF or DOCX file or downloadable file URL."
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
diff --git a/docs/embedding/form-builder-angular.md b/docs/embedding/form-builder-angular.md
new file mode 100644
index 00000000..b78fafd2
--- /dev/null
+++ b/docs/embedding/form-builder-angular.md
@@ -0,0 +1,544 @@
+# Angular Form Builder
+
+### Example Code
+
+```angular
+import { Component, OnInit } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { DocusealBuilderComponent } from '@docuseal/angular';
+
+@Component({
+ selector: 'app-root',
+ standalone: true,
+ imports: [DocusealBuilderComponent],
+ template: `
+
+
+
+
+
+ `
+})
+export class AppComponent implements OnInit {
+ token: string = ''
+
+ constructor(private http: HttpClient) {}
+
+ ngOnInit() {
+ this.http.post('/api/docuseal/builder_token', {}).subscribe((data: any) => {
+ this.token = data.token;
+ });
+ }
+}
+
+```
+
+```javascript
+const jwt = require('jsonwebtoken');
+
+const token = jwt.sign({
+ user_email: '{{admin_user_email}}',
+ integration_email: '{{signer_email}}',
+ external_id: 'TestForm123',
+ name: 'Integration W-9 Test Form',
+ document_urls: ['https://www.irs.gov/pub/irs-pdf/fw9.pdf'],
+}, '{{api_key}}');
+
+```
+
+### Attributes
+
+```json
+{
+ "token": {
+ "type": "string",
+ "doc_type": "object",
+ "description": "JSON Web Token (JWT HS256) with a payload signed using the API key. Ensure that the JWT token is generated on the backend to prevent unauthorized access to your documents.",
+ "required": true,
+ "properties": {
+ "user_email": {
+ "type": "string",
+ "required": true,
+ "description": "Email of the owner of the API signing key - admin user email."
+ },
+ "integration_email": {
+ "type": "string",
+ "required": false,
+ "description": "Email of the user to create a template for.",
+ "example": "signer@example.com"
+ },
+ "template_id": {
+ "type": "number",
+ "required": false,
+ "description": "ID of the template to open in the form builder. Optional when `document_urls` are specified."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app.",
+ "required": false
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder name in which the template should be created.",
+ "required": false
+ },
+ "document_urls": {
+ "type": "array",
+ "required": false,
+ "description": "An Array of URLs with PDF files to open in the form builder. Optional when `template_id` is specified.",
+ "example": "['https://www.irs.gov/pub/irs-pdf/fw9.pdf']"
+ },
+ "name": {
+ "type": "string",
+ "required": false,
+ "description": "New template name when creating a template with document_urls specified.",
+ "example": "Integration W-9 Test Form"
+ },
+ "extract_fields": {
+ "type": "boolean",
+ "required": false,
+ "description": "Pass `false` to disable automatic PDF form fields extraction. PDF fields are automatically added by default."
+ }
+ }
+ },
+ "host": {
+ "type": "string",
+ "required": false,
+ "description": "DocuSeal host domain name. Only use this attribute if you are using the on-premises DocuSeal installation or docuseal.eu Cloud.",
+ "example": "yourdomain.com"
+ },
+ "customButton": {
+ "type": "object",
+ "required": false,
+ "description": "Custom button will be displayed on the top right corner of the form builder.",
+ "properties": {
+ "title": {
+ "type": "string",
+ "required": true,
+ "description": "Custom button title."
+ },
+ "url": {
+ "type": "string",
+ "required": true,
+ "description": "Custom button URL. Only absolute URLs are supported."
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "required": false,
+ "description": "Submitter role names to be used by default in the form."
+ },
+ "fieldTypes": {
+ "type": "array",
+ "required": false,
+ "description": "Field type names to be used in the form builder. All field types are used by default.",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "datenow",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "drawFieldType": {
+ "type": "string",
+ "required": false,
+ "default": "text",
+ "description": "Field type to be used by default with the field drawing tool.",
+ "example": "signature"
+ },
+ "fields": {
+ "type": "array",
+ "required": false,
+ "description": "An array of default custom field properties with `name` to be added to the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "required": true,
+ "description": "Field name."
+ },
+ "type": {
+ "type": "string",
+ "required": false,
+ "description": "Field type.",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "required": false,
+ "description": "Submitter role name for the field."
+ },
+ "default_value": {
+ "type": "string",
+ "required": false,
+ "description": "Default value of the field."
+ },
+ "title": {
+ "type": "string",
+ "required": false,
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "required": false,
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "width": {
+ "type": "number",
+ "required": false,
+ "description": "Field width in pixels."
+ },
+ "height": {
+ "type": "number",
+ "required": false,
+ "description": "Field height in pixels."
+ },
+ "format": {
+ "type": "string",
+ "required": false,
+ "description": "Field format. Depends on the field type."
+ },
+ "options": {
+ "type": "array",
+ "required": false,
+ "description": "Field options. Required for the select field type."
+ },
+ "validation": {
+ "type": "object",
+ "required": false,
+ "description": "Field validation rules.",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "required": false,
+ "description": "Field pattern.",
+ "example": "^[0-9]{5}$"
+ },
+ "message": {
+ "type": "string",
+ "required": false,
+ "description": "Validation error message."
+ }
+ }
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "required": false,
+ "description": "An array of default submitters with `role` name to be added to the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "email": {
+ "type": "string",
+ "required": false,
+ "description": "Submitter email."
+ },
+ "role": {
+ "type": "string",
+ "required": true,
+ "description": "Submitter role name."
+ },
+ "name": {
+ "type": "string",
+ "required": false,
+ "description": "Submitter name."
+ },
+ "phone": {
+ "type": "string",
+ "required": false,
+ "description": "Submitter phone number, formatted according to the E.164 standard."
+ }
+ }
+ }
+ },
+ "requiredFields": {
+ "type": "array",
+ "required": false,
+ "description": "An array of default required custom field properties with `name` that should be added to the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "required": true,
+ "description": "Field name."
+ },
+ "type": {
+ "type": "string",
+ "required": false,
+ "description": "Field type.",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "required": false,
+ "description": "Submitter role name for the field."
+ },
+ "default_value": {
+ "type": "string",
+ "required": false,
+ "description": "Default value of the field."
+ },
+ "title": {
+ "type": "string",
+ "required": false,
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "required": false,
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "width": {
+ "type": "number",
+ "required": false,
+ "description": "Field width in pixels."
+ },
+ "height": {
+ "type": "number",
+ "required": false,
+ "description": "Field height in pixels."
+ },
+ "format": {
+ "type": "string",
+ "required": false,
+ "description": "Field format. Depends on the field type."
+ },
+ "options": {
+ "type": "array",
+ "required": false,
+ "description": "Field options. Required for the select field type."
+ },
+ "validation": {
+ "type": "object",
+ "required": false,
+ "description": "Field validation rules.",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "required": false,
+ "description": "Field pattern.",
+ "example": "^[0-9]{5}$"
+ },
+ "message": {
+ "type": "string",
+ "required": false,
+ "description": "Validation error message."
+ }
+ }
+ }
+ }
+ }
+ },
+ "emailMessage": {
+ "type": "object",
+ "required": false,
+ "description": "Email subject and body for the signature request.",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "required": true,
+ "description": "Email subject for the signature request."
+ },
+ "body": {
+ "type": "string",
+ "required": true,
+ "description": "Email body for the signature request."
+ }
+ }
+ },
+ "withTitle": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to remove document title from the builder."
+ },
+ "withSendButton": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Show the \"Send\" button."
+ },
+ "withUploadButton": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Show the \"Upload\" button."
+ },
+ "withAddPageButton": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Show the \"Add Blank Page\" button."
+ },
+ "withSignYourselfButton": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Show the \"Sign Yourself\" button."
+ },
+ "withDocumentsList": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to now show the documents list on the left. Documents list is displayed by default."
+ },
+ "withFieldsList": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to now show the fields list on the right. Fields list is displayed by default."
+ },
+ "withFieldPlaceholder": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Set `true` to display field name placeholders instead of the field type icons."
+ },
+ "withSignatureId": {
+ "type": "boolean",
+ "required": false,
+ "description": "Set to `true` to enable Signature ID by default for newly added fields. If set to `false`, the Signature ID toggle will be displayed under field settings, with the Signature ID turned off by default."
+ },
+ "onlyDefinedFields": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Allow to add fields only defined in the `fields` prop."
+ },
+ "preview": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Show template in preview mode without ability to edit it."
+ },
+ "inputMode": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Open template in data input mode to prefill fields with default values."
+ },
+ "autosave": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to disable form changes autosaving."
+ },
+ "language": {
+ "type": "string",
+ "required": false,
+ "default": "en",
+ "description": "UI language, 'en', 'es', 'de', 'fr', 'pt', 'he', 'ar' languages are available."
+ },
+ "i18n": {
+ "type": "object",
+ "required": false,
+ "default": "{}",
+ "description": "Object that contains i18n keys to replace the default UI text with custom values. See template_builder/i18n.js for available i18n keys."
+ },
+ "backgroundColor": {
+ "type": "string",
+ "required": false,
+ "description": "The form builder background color. Only HEX color codes are supported.",
+ "example": "#ffffff"
+ },
+ "customCss": {
+ "type": "string",
+ "required": false,
+ "description": "Custom CSS styles to be applied to the form builder.",
+ "example": "#sign_yourself_button { background-color: #FFA500; }"
+ }
+}
+```
+
+### Callback
+
+```json
+{
+ "onLoad": {
+ "type": "event emitter",
+ "required": false,
+ "description": "Event emitted on loading the form builder template data.",
+ "example": "handleLoad($event)"
+ },
+ "onUpload": {
+ "type": "event emitter",
+ "required": false,
+ "description": "Event emitted on uploading a document to the template.",
+ "example": "handleUpload($event)"
+ },
+ "onSend": {
+ "type": "event emitter",
+ "required": false,
+ "description": "Event emitted on sending documents for signature to recipients.",
+ "example": "handleSend($event)"
+ },
+ "onChange": {
+ "type": "function",
+ "required": false,
+ "description": "Function to be called when changes are made to the template form.",
+ "example": "handleChange($event)"
+ },
+ "onSave": {
+ "type": "event emitter",
+ "required": false,
+ "description": "Event emitted on saving changes of the template form.",
+ "example": "handleSave($event)"
+ }
+}
+```
diff --git a/docs/embedding/form-builder-javascript.md b/docs/embedding/form-builder-javascript.md
new file mode 100644
index 00000000..4953b54f
--- /dev/null
+++ b/docs/embedding/form-builder-javascript.md
@@ -0,0 +1,508 @@
+# JavaScript Form Builder
+
+### Example Code
+
+```javascript
+
+
+
+
+
+```
+
+### Attributes
+
+```json
+{
+ "data-token": {
+ "type": "string",
+ "doc_type": "object",
+ "description": "JSON Web Token (JWT HS256) with a payload signed using the API key. Ensure that the JWT token is generated on the backend to prevent unauthorized access to your documents.",
+ "required": true,
+ "properties": {
+ "user_email": {
+ "type": "string",
+ "required": true,
+ "description": "Email of the owner of the API signing key - admin user email."
+ },
+ "integration_email": {
+ "type": "string",
+ "required": false,
+ "description": "Email of the user to create a template for.",
+ "example": "signer@example.com"
+ },
+ "template_id": {
+ "type": "number",
+ "required": false,
+ "description": "ID of the template to open in the form builder. Optional when `document_urls` are specified."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app.",
+ "required": false
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder name in which the template should be created.",
+ "required": false
+ },
+ "document_urls": {
+ "type": "array",
+ "required": false,
+ "description": "An Array of URLs with PDF files to open in the form builder. Optional when `template_id` is specified.",
+ "example": "['https://www.irs.gov/pub/irs-pdf/fw9.pdf']"
+ },
+ "name": {
+ "type": "string",
+ "required": false,
+ "description": "New template name when creating a template with document_urls specified.",
+ "example": "Integration W-9 Test Form"
+ },
+ "extract_fields": {
+ "type": "boolean",
+ "required": false,
+ "description": "Pass `false` to disable automatic PDF form fields extraction. PDF fields are automatically added by default."
+ }
+ }
+ },
+ "data-host": {
+ "type": "string",
+ "required": false,
+ "description": "DocuSeal host domain name. Only use this attribute if you are using the on-premises DocuSeal installation or docuseal.eu Cloud.",
+ "example": "yourdomain.com"
+ },
+ "data-roles": {
+ "type": "string",
+ "required": false,
+ "description": "Comma separated submitter role names to be used by default in the form.",
+ "example": "Company,Customer"
+ },
+ "data-fields": {
+ "type": "string",
+ "doc_type": "array",
+ "required": false,
+ "description": "A list of default custom fields with `name` to be added to the document. Should contain an array of field properties as a JSON encoded string.",
+ "example": "[{ \"name\": \"FIELD_1\", \"type\": \"date\", \"role\": \"Customer\", \"default_value\": \"2021-01-01\" }]",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "required": true,
+ "description": "Field name."
+ },
+ "type": {
+ "type": "string",
+ "required": false,
+ "description": "Field type.",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "required": false,
+ "description": "Submitter role name for the field."
+ },
+ "default_value": {
+ "type": "string",
+ "required": false,
+ "description": "Default value of the field."
+ },
+ "title": {
+ "type": "string",
+ "required": false,
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "required": false,
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "width": {
+ "type": "number",
+ "required": false,
+ "description": "Field width in pixels."
+ },
+ "height": {
+ "type": "number",
+ "required": false,
+ "description": "Field height in pixels."
+ },
+ "format": {
+ "type": "string",
+ "required": false,
+ "description": "Field format. Depends on the field type."
+ },
+ "options": {
+ "type": "array",
+ "required": false,
+ "description": "Field options. Required for the select field type."
+ },
+ "validation": {
+ "type": "object",
+ "required": false,
+ "description": "Field validation rules.",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "required": false,
+ "description": "Field pattern.",
+ "example": "^[0-9]{5}$"
+ },
+ "message": {
+ "type": "string",
+ "required": false,
+ "description": "Validation error message."
+ }
+ }
+ }
+ }
+ }
+ },
+ "data-submitters": {
+ "type": "string",
+ "doc_type": "array",
+ "required": false,
+ "description": "A list of default submitters with `role` name to be added to the document. Should contain an array of field properties as a JSON encoded string.",
+ "example": "[{ \"email\": \"example@company.com\", \"name\": \"John Doe\", \"phone\": \"+1234567890\", \"role\": \"Customer\" }]",
+ "items": {
+ "type": "object",
+ "properties": {
+ "email": {
+ "type": "string",
+ "required": false,
+ "description": "Submitter email."
+ },
+ "role": {
+ "type": "string",
+ "required": true,
+ "description": "Submitter role name."
+ },
+ "name": {
+ "type": "string",
+ "required": false,
+ "description": "Submitter name."
+ },
+ "phone": {
+ "type": "string",
+ "required": false,
+ "description": "Submitter phone number, formatted according to the E.164 standard."
+ }
+ }
+ }
+ },
+ "data-required-fields": {
+ "type": "string",
+ "doc_type": "array",
+ "required": false,
+ "description": "A list of required default custom fields with `name` that should be added to the document. Should contain an array of field properties as a JSON encoded string.",
+ "example": "[{ \"name\": \"FIELD_1\", \"type\": \"date\", \"role\": \"Customer\", \"default_value\": \"2021-01-01\" }]",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "required": true,
+ "description": "Field name."
+ },
+ "type": {
+ "type": "string",
+ "required": false,
+ "description": "Field type.",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "required": false,
+ "description": "Submitter role name for the field."
+ },
+ "default_value": {
+ "type": "string",
+ "required": false,
+ "description": "Default value of the field."
+ },
+ "title": {
+ "type": "string",
+ "required": false,
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "required": false,
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "width": {
+ "type": "number",
+ "required": false,
+ "description": "Field width in pixels."
+ },
+ "height": {
+ "type": "number",
+ "required": false,
+ "description": "Field height in pixels."
+ },
+ "format": {
+ "type": "string",
+ "required": false,
+ "description": "Field format. Depends on the field type."
+ },
+ "options": {
+ "type": "array",
+ "required": false,
+ "description": "Field options. Required for the select field type."
+ },
+ "validation": {
+ "type": "object",
+ "required": false,
+ "description": "Field validation rules.",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "required": false,
+ "description": "Field pattern.",
+ "example": "^[0-9]{5}$"
+ },
+ "message": {
+ "type": "string",
+ "required": false,
+ "description": "Validation error message."
+ }
+ }
+ }
+ }
+ }
+ },
+ "data-field-types": {
+ "type": "string",
+ "required": false,
+ "description": "Comma separated field type names to be used in the form builder. All field types are used by default.",
+ "example": "text,date",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "datenow",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "data-draw-field-type": {
+ "type": "string",
+ "required": false,
+ "default": "text",
+ "description": "Field type to be used by default with the field drawing tool.",
+ "example": "signature"
+ },
+ "data-custom-button-title": {
+ "type": "string",
+ "required": false,
+ "description": "Custom button title. This button will be displayed on the top right corner of the form builder."
+ },
+ "data-custom-button-url": {
+ "type": "string",
+ "required": false,
+ "description": "Custom button URL. Only absolute URLs are supported."
+ },
+ "data-with-title": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to remove document title from the builder."
+ },
+ "email-subject": {
+ "type": "string",
+ "required": false,
+ "description": "Email subject for the signature request. Required if `email-body` specified"
+ },
+ "email-body": {
+ "type": "string",
+ "required": false,
+ "description": "Email body for the signature request. Required if `email-subject` specified"
+ },
+ "data-with-send-button": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Show the \"Recipients\" button."
+ },
+ "data-with-upload-button": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Show the \"Upload\" button."
+ },
+ "data-with-add-page-button": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Show the \"Add Blank Page\" button."
+ },
+ "data-with-sign-yourself-button": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Show the \"Sign Yourself\" button."
+ },
+ "data-with-documents-list": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to now show the documents list on the left. Documents list is displayed by default."
+ },
+ "data-with-fields-list": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to now show the fields list on the right. Fields list is displayed by default."
+ },
+ "data-with-field-placeholder": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Set `true` to display field name placeholders instead of the field type icons."
+ },
+ "data-with-signature-id": {
+ "type": "boolean",
+ "required": false,
+ "description": "Set to `true` to enable Signature ID by default for newly added fields. If set to `false`, the Signature ID toggle will be displayed under field settings, with the Signature ID turned off by default."
+ },
+ "data-preview": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Show template in preview mode without ability to edit it."
+ },
+ "data-input-mode": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Open template in data input mode to prefill fields with default values."
+ },
+ "data-only-defined-fields": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Allow to add fields only defined in the `data-fields` attribute."
+ },
+ "data-autosave": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to disable form changes autosaving."
+ },
+ "data-i18n": {
+ "type": "string",
+ "required": false,
+ "default": "{}",
+ "description": "JSON encoded string that contains i18n keys to replace the default UI text with custom values. See template_builder/i18n.js for available i18n keys."
+ },
+ "data-language": {
+ "type": "string",
+ "required": false,
+ "default": "en",
+ "description": "UI language, 'en', 'es', 'de', 'fr', 'pt', 'he', 'ar' languages are available."
+ },
+ "data-background-color": {
+ "type": "string",
+ "required": false,
+ "description": "The form builder background color. Only HEX color codes are supported.",
+ "example": "#ffffff"
+ },
+ "data-custom-css": {
+ "type": "string",
+ "required": false,
+ "description": "Custom CSS styles to be applied to the form builder.",
+ "example": "#sign_yourself_button { background-color: #FFA500; }"
+ }
+}
+```
+
+### Callback
+
+```json
+{
+ "load": {
+ "type": "event",
+ "required": false,
+ "description": "Custom event to be triggered on loading the form builder template data.",
+ "example": "document.querySelector('docuseal-builder').addEventListener('load', (e) => e.detail)"
+ },
+ "upload": {
+ "type": "event",
+ "required": false,
+ "description": "Custom event to be triggered on uploading a document to the template.",
+ "example": "document.querySelector('docuseal-builder').addEventListener('upload', (e) => e.detail)"
+ },
+ "send": {
+ "type": "event",
+ "required": false,
+ "description": "Custom event to be triggered on sending documents for signature to recipients.",
+ "example": "document.querySelector('docuseal-builder').addEventListener('send', (e) => e.detail)"
+ },
+ "change": {
+ "type": "event",
+ "required": false,
+ "description": "Custom event to be triggered every time a change to the template is made.",
+ "example": "document.querySelector('docuseal-builder').addEventListener('change', (e) => e.detail)"
+ },
+ "save": {
+ "type": "event",
+ "required": false,
+ "description": "Custom event to be triggered on saving changes of the template form.",
+ "example": "document.querySelector('docuseal-builder').addEventListener('save', (e) => e.detail)"
+ }
+}
+```
diff --git a/docs/embedding/form-builder-react.md b/docs/embedding/form-builder-react.md
new file mode 100644
index 00000000..894f684a
--- /dev/null
+++ b/docs/embedding/form-builder-react.md
@@ -0,0 +1,535 @@
+# React Form Builder
+
+### Example Code
+
+```react
+import React, { useState, useEffect } from 'react';
+import { DocusealBuilder } from '@docuseal/react'
+
+const App = () => {
+ const [token, setToken] = useState();
+
+ useEffect(() => {
+ fetch('/api/docuseal/builder_token', {
+ method: 'POST',
+ })
+ .then((response) => response.json())
+ .then((data) => {
+ setToken(data.token);
+ });
+ }, []);
+
+ return token && ;
+};
+
+```
+
+```javascript
+const jwt = require('jsonwebtoken');
+
+const token = jwt.sign({
+ user_email: '{{admin_user_email}}',
+ integration_email: '{{signer_email}}',
+ external_id: 'TestForm123',
+ name: 'Integration W-9 Test Form',
+ document_urls: ['https://www.irs.gov/pub/irs-pdf/fw9.pdf'],
+}, '{{api_key}}');
+
+```
+
+### Attributes
+
+```json
+{
+ "token": {
+ "type": "string",
+ "doc_type": "object",
+ "description": "JSON Web Token (JWT HS256) with a payload signed using the API key. Ensure that the JWT token is generated on the backend to prevent unauthorized access to your documents.",
+ "required": true,
+ "properties": {
+ "user_email": {
+ "type": "string",
+ "required": true,
+ "description": "Email of the owner of the API signing key - admin user email."
+ },
+ "integration_email": {
+ "type": "string",
+ "required": false,
+ "description": "Email of the user to create a template for.",
+ "example": "signer@example.com"
+ },
+ "template_id": {
+ "type": "number",
+ "required": false,
+ "description": "ID of the template to open in the form builder. Optional when `document_urls` are specified."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app.",
+ "required": false
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder name in which the template should be created.",
+ "required": false
+ },
+ "document_urls": {
+ "type": "array",
+ "required": false,
+ "description": "An Array of URLs with PDF files to open in the form builder. Optional when `template_id` is specified.",
+ "example": "['https://www.irs.gov/pub/irs-pdf/fw9.pdf']"
+ },
+ "name": {
+ "type": "string",
+ "required": false,
+ "description": "New template name when creating a template with document_urls specified.",
+ "example": "Integration W-9 Test Form"
+ },
+ "extract_fields": {
+ "type": "boolean",
+ "required": false,
+ "description": "Pass `false` to disable automatic PDF form fields extraction. PDF fields are automatically added by default."
+ }
+ }
+ },
+ "host": {
+ "type": "string",
+ "required": false,
+ "description": "DocuSeal host domain name. Only use this attribute if you are using the on-premises DocuSeal installation or docuseal.eu Cloud.",
+ "example": "yourdomain.com"
+ },
+ "customButton": {
+ "type": "object",
+ "required": false,
+ "description": "Custom button will be displayed on the top right corner of the form builder.",
+ "properties": {
+ "title": {
+ "type": "string",
+ "required": true,
+ "description": "Custom button title."
+ },
+ "url": {
+ "type": "string",
+ "required": true,
+ "description": "Custom button URL. Only absolute URLs are supported."
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "required": false,
+ "description": "Submitter role names to be used by default in the form."
+ },
+ "fieldTypes": {
+ "type": "array",
+ "required": false,
+ "description": "Field type names to be used in the form builder. All field types are used by default.",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "datenow",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "drawFieldType": {
+ "type": "string",
+ "required": false,
+ "default": "text",
+ "description": "Field type to be used by default with the field drawing tool.",
+ "example": "signature"
+ },
+ "fields": {
+ "type": "array",
+ "required": false,
+ "description": "An array of default custom field properties with `name` to be added to the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "required": true,
+ "description": "Field name."
+ },
+ "type": {
+ "type": "string",
+ "required": false,
+ "description": "Field type.",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "required": false,
+ "description": "Submitter role name for the field."
+ },
+ "default_value": {
+ "type": "string",
+ "required": false,
+ "description": "Default value of the field."
+ },
+ "title": {
+ "type": "string",
+ "required": false,
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "required": false,
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "width": {
+ "type": "number",
+ "required": false,
+ "description": "Field width in pixels."
+ },
+ "height": {
+ "type": "number",
+ "required": false,
+ "description": "Field height in pixels."
+ },
+ "format": {
+ "type": "string",
+ "required": false,
+ "description": "Field format. Depends on the field type."
+ },
+ "options": {
+ "type": "array",
+ "required": false,
+ "description": "Field options. Required for the select field type."
+ },
+ "validation": {
+ "type": "object",
+ "required": false,
+ "description": "Field validation rules.",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "required": false,
+ "description": "Field pattern.",
+ "example": "^[0-9]{5}$"
+ },
+ "message": {
+ "type": "string",
+ "required": false,
+ "description": "Validation error message."
+ }
+ }
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "required": false,
+ "description": "An array of default submitters with `role` name to be added to the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "email": {
+ "type": "string",
+ "required": false,
+ "description": "Submitter email."
+ },
+ "role": {
+ "type": "string",
+ "required": true,
+ "description": "Submitter role name."
+ },
+ "name": {
+ "type": "string",
+ "required": false,
+ "description": "Submitter name."
+ },
+ "phone": {
+ "type": "string",
+ "required": false,
+ "description": "Submitter phone number, formatted according to the E.164 standard."
+ }
+ }
+ }
+ },
+ "requiredFields": {
+ "type": "array",
+ "required": false,
+ "description": "An array of default required custom field properties with `name` that should be added to the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "required": true,
+ "description": "Field name."
+ },
+ "type": {
+ "type": "string",
+ "required": false,
+ "description": "Field type.",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "required": false,
+ "description": "Submitter role name for the field."
+ },
+ "default_value": {
+ "type": "string",
+ "required": false,
+ "description": "Default value of the field."
+ },
+ "title": {
+ "type": "string",
+ "required": false,
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "required": false,
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "width": {
+ "type": "number",
+ "required": false,
+ "description": "Field width in pixels."
+ },
+ "height": {
+ "type": "number",
+ "required": false,
+ "description": "Field height in pixels."
+ },
+ "format": {
+ "type": "string",
+ "required": false,
+ "description": "Field format. Depends on the field type."
+ },
+ "options": {
+ "type": "array",
+ "required": false,
+ "description": "Field options. Required for the select field type."
+ },
+ "validation": {
+ "type": "object",
+ "required": false,
+ "description": "Field validation rules.",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "required": false,
+ "description": "Field pattern.",
+ "example": "^[0-9]{5}$"
+ },
+ "message": {
+ "type": "string",
+ "required": false,
+ "description": "Validation error message."
+ }
+ }
+ }
+ }
+ }
+ },
+ "emailMessage": {
+ "type": "object",
+ "required": false,
+ "description": "Email subject and body for the signature request.",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "required": true,
+ "description": "Email subject for the signature request."
+ },
+ "body": {
+ "type": "string",
+ "required": true,
+ "description": "Email body for the signature request."
+ }
+ }
+ },
+ "withTitle": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to remove document title from the builder."
+ },
+ "withSendButton": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Show the \"Send\" button."
+ },
+ "withUploadButton": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Show the \"Upload\" button."
+ },
+ "withAddPageButton": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Show the \"Add Blank Page\" button."
+ },
+ "withSignYourselfButton": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Show the \"Sign Yourself\" button."
+ },
+ "withDocumentsList": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to now show the documents list on the left. Documents list is displayed by default."
+ },
+ "withFieldsList": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to now show the fields list on the right. Fields list is displayed by default."
+ },
+ "withFieldPlaceholder": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Set `true` to display field name placeholders instead of the field type icons."
+ },
+ "withSignatureId": {
+ "type": "boolean",
+ "required": false,
+ "description": "Set to `true` to enable Signature ID by default for newly added fields. If set to `false`, the Signature ID toggle will be displayed under field settings, with the Signature ID turned off by default."
+ },
+ "onlyDefinedFields": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Allow to add fields only defined in the `fields` prop."
+ },
+ "preview": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Show template in preview mode without ability to edit it."
+ },
+ "inputMode": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Open template in data input mode to prefill fields with default values."
+ },
+ "autosave": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to disable form changes autosaving."
+ },
+ "language": {
+ "type": "string",
+ "required": false,
+ "default": "en",
+ "description": "UI language, 'en', 'es', 'de', 'fr', 'pt', 'he', 'ar' languages are available."
+ },
+ "i18n": {
+ "type": "object",
+ "required": false,
+ "default": "{}",
+ "description": "Object that contains i18n keys to replace the default UI text with custom values. See template_builder/i18n.js for available i18n keys."
+ },
+ "backgroundColor": {
+ "type": "string",
+ "required": false,
+ "description": "The form builder background color. Only HEX color codes are supported.",
+ "example": "#ffffff"
+ },
+ "customCss": {
+ "type": "string",
+ "required": false,
+ "description": "Custom CSS styles to be applied to the form builder.",
+ "example": "#sign_yourself_button { background-color: #FFA500; }"
+ }
+}
+```
+
+### Callback
+
+```json
+{
+ "onLoad": {
+ "type": "function",
+ "required": false,
+ "description": "Function to be called on loading the form builder template data.",
+ "example": "(data) => { console.log(data) }"
+ },
+ "onUpload": {
+ "type": "function",
+ "required": false,
+ "description": "Function to be called on uploading a document to the template.",
+ "example": "(data) => { console.log(data) }"
+ },
+ "onSend": {
+ "type": "function",
+ "required": false,
+ "description": "Function to be called on sending documents for signature to recipients.",
+ "example": "(data) => { console.log(data) }"
+ },
+ "onChange": {
+ "type": "function",
+ "required": false,
+ "description": "Function to be called when changes are made to the template form.",
+ "example": "(data) => { console.log(data) }"
+ },
+ "onSave": {
+ "type": "function",
+ "required": false,
+ "description": "Function to be called on saving changes of the template form.",
+ "example": "(data) => { console.log(data) }"
+ }
+}
+```
diff --git a/docs/embedding/form-builder-vue.md b/docs/embedding/form-builder-vue.md
new file mode 100644
index 00000000..f745be19
--- /dev/null
+++ b/docs/embedding/form-builder-vue.md
@@ -0,0 +1,544 @@
+# Vue Form Builder
+
+### Example Code
+
+```vue
+
+
+
+
+
+
+```
+
+```javascript
+const jwt = require('jsonwebtoken');
+
+const token = jwt.sign({
+ user_email: '{{admin_user_email}}',
+ integration_email: '{{signer_email}}',
+ external_id: 'TestForm123',
+ name: 'Integration W-9 Test Form',
+ document_urls: ['https://www.irs.gov/pub/irs-pdf/fw9.pdf'],
+}, '{{api_key}}');
+
+```
+
+### Attributes
+
+```json
+{
+ "token": {
+ "type": "string",
+ "doc_type": "object",
+ "description": "JSON Web Token (JWT HS256) with a payload signed using the API key. Ensure that the JWT token is generated on the backend to prevent unauthorized access to your documents.",
+ "required": true,
+ "properties": {
+ "user_email": {
+ "type": "string",
+ "required": true,
+ "description": "Email of the owner of the API signing key - admin user email."
+ },
+ "integration_email": {
+ "type": "string",
+ "required": false,
+ "description": "Email of the user to create a template for.",
+ "example": "signer@example.com"
+ },
+ "template_id": {
+ "type": "number",
+ "required": false,
+ "description": "ID of the template to open in the form builder. Optional when `document_urls` are specified."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app.",
+ "required": false
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder name in which the template should be created.",
+ "required": false
+ },
+ "document_urls": {
+ "type": "array",
+ "required": false,
+ "description": "An Array of URLs with PDF files to open in the form builder. Optional when `template_id` is specified.",
+ "example": "['https://www.irs.gov/pub/irs-pdf/fw9.pdf']"
+ },
+ "name": {
+ "type": "string",
+ "required": false,
+ "description": "New template name when creating a template with document_urls specified.",
+ "example": "Integration W-9 Test Form"
+ },
+ "extract_fields": {
+ "type": "boolean",
+ "required": false,
+ "description": "Pass `false` to disable automatic PDF form fields extraction. PDF fields are automatically added by default."
+ }
+ }
+ },
+ "host": {
+ "type": "string",
+ "required": false,
+ "description": "DocuSeal host domain name. Only use this attribute if you are using the on-premises DocuSeal installation or docuseal.eu Cloud.",
+ "example": "yourdomain.com"
+ },
+ "custom-button": {
+ "type": "object",
+ "required": false,
+ "description": "Custom button will be displayed on the top right corner of the form builder.",
+ "properties": {
+ "title": {
+ "type": "string",
+ "required": true,
+ "description": "Custom button title."
+ },
+ "url": {
+ "type": "string",
+ "required": true,
+ "description": "Custom button URL. Only absolute URLs are supported."
+ }
+ }
+ },
+ "only-defined-fields": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Allow to add fields only defined in the `:fields` prop."
+ },
+ "with-send-button": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Show the \"Recipients\" button."
+ },
+ "roles": {
+ "type": "array",
+ "required": false,
+ "description": "Submitter role names to be used by default in the form."
+ },
+ "field-types": {
+ "type": "array",
+ "required": false,
+ "description": "Field type names to be used in the form builder. All field types are used by default.",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "datenow",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "draw-field-type": {
+ "type": "string",
+ "required": false,
+ "default": "text",
+ "description": "Field type to be used by default with the field drawing tool.",
+ "example": "signature"
+ },
+ "fields": {
+ "type": "array",
+ "required": false,
+ "description": "An array of default custom field properties with `name` to be added to the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "required": true,
+ "description": "Field name."
+ },
+ "type": {
+ "type": "string",
+ "required": false,
+ "description": "Field type.",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "required": false,
+ "description": "Submitter role name for the field."
+ },
+ "default_value": {
+ "type": "string",
+ "required": false,
+ "description": "Default value of the field."
+ },
+ "title": {
+ "type": "string",
+ "required": false,
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "required": false,
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "width": {
+ "type": "number",
+ "required": false,
+ "description": "Field width in pixels."
+ },
+ "height": {
+ "type": "number",
+ "required": false,
+ "description": "Field height in pixels."
+ },
+ "format": {
+ "type": "string",
+ "required": false,
+ "description": "Field format. Depends on the field type."
+ },
+ "options": {
+ "type": "array",
+ "required": false,
+ "description": "Field options. Required for the select field type."
+ },
+ "validation": {
+ "type": "object",
+ "required": false,
+ "description": "Field validation rules.",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "required": false,
+ "description": "Field pattern.",
+ "example": "^[0-9]{5}$"
+ },
+ "message": {
+ "type": "string",
+ "required": false,
+ "description": "Validation error message."
+ }
+ }
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "required": false,
+ "description": "An array of default submitters with `role` name to be added to the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "email": {
+ "type": "string",
+ "required": false,
+ "description": "Submitter email."
+ },
+ "role": {
+ "type": "string",
+ "required": true,
+ "description": "Submitter role name."
+ },
+ "name": {
+ "type": "string",
+ "required": false,
+ "description": "Submitter name."
+ },
+ "phone": {
+ "type": "string",
+ "required": false,
+ "description": "Submitter phone number, formatted according to the E.164 standard."
+ }
+ }
+ }
+ },
+ "required-fields": {
+ "type": "array",
+ "required": false,
+ "description": "An array of default required custom field properties with `name` that should be added to the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "required": true,
+ "description": "Field name."
+ },
+ "type": {
+ "type": "string",
+ "required": false,
+ "description": "Field type.",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "required": false,
+ "description": "Submitter role name for the field."
+ },
+ "default_value": {
+ "type": "string",
+ "required": false,
+ "description": "Default value of the field."
+ },
+ "title": {
+ "type": "string",
+ "required": false,
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "required": false,
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "width": {
+ "type": "number",
+ "required": false,
+ "description": "Field width in pixels."
+ },
+ "height": {
+ "type": "number",
+ "required": false,
+ "description": "Field height in pixels."
+ },
+ "format": {
+ "type": "string",
+ "required": false,
+ "description": "Field format. Depends on the field type."
+ },
+ "options": {
+ "type": "array",
+ "required": false,
+ "description": "Field options. Required for the select field type."
+ },
+ "validation": {
+ "type": "object",
+ "required": false,
+ "description": "Field validation rules.",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "required": false,
+ "description": "Field pattern.",
+ "example": "^[0-9]{5}$"
+ },
+ "message": {
+ "type": "string",
+ "required": false,
+ "description": "Validation error message."
+ }
+ }
+ }
+ }
+ }
+ },
+ "email-message": {
+ "type": "object",
+ "required": false,
+ "description": "Email subject and body for the signature request.",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "required": true,
+ "description": "Email subject for the signature request."
+ },
+ "body": {
+ "type": "string",
+ "required": true,
+ "description": "Email body for the signature request."
+ }
+ }
+ },
+ "with-title": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to remove document title from the builder."
+ },
+ "with-upload-button": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Show the \"Upload\" button."
+ },
+ "with-add-page-button": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Show the \"Add Blank Page\" button."
+ },
+ "with-sign-yourself-button": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Show the \"Sign Yourself\" button."
+ },
+ "with-documents-list": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to now show the documents list on the left. Documents list is displayed by default."
+ },
+ "with-fields-list": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to now show the fields list on the right. Fields list is displayed by default."
+ },
+ "with-field-placeholder": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Set `true` to display field name placeholders instead of the field type icons."
+ },
+ "with-signature-id": {
+ "type": "boolean",
+ "required": false,
+ "description": "Set to `true` to enable Signature ID by default for newly added fields. If set to `false`, the Signature ID toggle will be displayed under field settings, with the Signature ID turned off by default."
+ },
+ "autosave": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to disable form changes autosaving."
+ },
+ "preview": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Show template in preview mode without ability to edit it."
+ },
+ "input-mode": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Open template in data input mode to prefill fields with default values."
+ },
+ "language": {
+ "type": "string",
+ "required": false,
+ "default": "en",
+ "description": "UI language, 'en', 'es', 'de', 'fr', 'pt', 'he', 'ar' languages are available."
+ },
+ "i18n": {
+ "type": "object",
+ "required": false,
+ "default": "{}",
+ "description": "Object that contains i18n keys to replace the default UI text with custom values. See template_builder/i18n.js for available i18n keys."
+ },
+ "background-color": {
+ "type": "string",
+ "required": false,
+ "description": "The form builder background color. Only HEX color codes are supported.",
+ "example": "#ffffff"
+ },
+ "custom-css": {
+ "type": "string",
+ "required": false,
+ "description": "Custom CSS styles to be applied to the form builder.",
+ "example": "#sign_yourself_button { background-color: #FFA500; }"
+ }
+}
+```
+
+### Callback
+
+```json
+{
+ "@load": {
+ "type": "function",
+ "required": false,
+ "description": "Function to be called on loading the form builder template data.",
+ "example": "onBuilderLoad"
+ },
+ "@upload": {
+ "type": "function",
+ "required": false,
+ "description": "Function to be called on uploading a document to the template.",
+ "example": "onBuilderUpload"
+ },
+ "@send": {
+ "type": "function",
+ "required": false,
+ "description": "Function to be called on sending documents for signature to recipients.",
+ "example": "onBuilderSend"
+ },
+ "@change": {
+ "type": "function",
+ "required": false,
+ "description": "Function to be called when changes are made to the template form.",
+ "example": "onBuilderChange"
+ },
+ "@save": {
+ "type": "function",
+ "required": false,
+ "description": "Function to be called on saving changes of the template form.",
+ "example": "onBuilderSave"
+ }
+}
+```
diff --git a/docs/embedding/signing-form-angular.md b/docs/embedding/signing-form-angular.md
new file mode 100644
index 00000000..8bbad1a0
--- /dev/null
+++ b/docs/embedding/signing-form-angular.md
@@ -0,0 +1,324 @@
+# Angular Signing Form
+
+### Example Code
+
+```angular
+import { Component } from '@angular/core';
+import { DocusealFormComponent } from '@docuseal/angular';
+
+@Component({
+ selector: 'app-root',
+ standalone: true,
+ imports: [DocusealFormComponent],
+ template: `
+
+
+
+
+ `
+})
+export class AppComponent {}
+
+```
+
+### Attributes
+
+```json
+{
+ "src": {
+ "type": "string",
+ "required": true,
+ "description": "Public URL of the document signing form. There are two types of URLs: /d/{slug} - template form signing URL can be copied from the template page in the admin dashboard. Also template \"slug\" key can be obtained via the /templates API./s/{slug} - individual signer URL. Signer \"slug\" key can be obtained via the /submissions API which is used to initiate signature requests for a template form with recipients."
+ },
+ "email": {
+ "type": "string",
+ "required": false,
+ "description": "Email address of the signer. Additional email form step will be displayed if the email attribute is not specified."
+ },
+ "name": {
+ "type": "string",
+ "required": false,
+ "description": "Name of the signer."
+ },
+ "role": {
+ "type": "string",
+ "required": false,
+ "description": "The role name or title of the signer.",
+ "example": "First Party"
+ },
+ "token": {
+ "type": "string",
+ "doc_type": "object",
+ "description": "JSON Web Token (JWT HS256) with a payload signed using the API key. JWT can be generated only on the backend..",
+ "required": false,
+ "properties": {
+ "slug": {
+ "type": "string",
+ "required": true,
+ "description": "Template or Submitter slug. When Submitter slug is used no need to pass additional email param."
+ },
+ "email": {
+ "type": "string",
+ "required": false,
+ "description": "Email address of the signer. Additional email form step will be displayed if the email attribute is not specified with Template slug."
+ },
+ "external_id": {
+ "type": "string",
+ "required": false,
+ "description": "Your application-specific unique string key to identify signer within your app."
+ },
+ "preview": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Show form in preview mode without ability to submit it."
+ }
+ }
+ },
+ "preview": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Show form in preview mode without ability to submit it. Completed documents embedded in preview mode require `data-token` authentication."
+ },
+ "expand": {
+ "type": "boolean",
+ "required": false,
+ "description": "Expand form on open.",
+ "default": true
+ },
+ "minimize": {
+ "type": "boolean",
+ "required": false,
+ "description": "Set to `true` to always minimize form fields. Requires to click on the field to expand the form.",
+ "default": false
+ },
+ "orderAsOnPage": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Order form fields based on their position on the pages."
+ },
+ "logo": {
+ "type": "string",
+ "required": false,
+ "description": "Public logo image URL to use in the signing form."
+ },
+ "language": {
+ "type": "string",
+ "required": false,
+ "description": "UI language: en, es, it, de, fr, nl, pl, uk, cs, pt, he, ar, kr, ja languages are available. Be default the form is displayed in the user browser language automatically."
+ },
+ "i18n": {
+ "type": "object",
+ "required": false,
+ "default": "{}",
+ "description": "Object that contains i18n keys to replace the default UI text with custom values. See submission_form/i18n.js for available i18n keys."
+ },
+ "goToLast": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Navigate to the last unfinished step."
+ },
+ "withFieldNames": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to hide field name. Hidding field names can be useful for when they are not in the human readable format. Field names are displayed by default."
+ },
+ "withFieldPlaceholder": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Set `true` to display field name placeholders instead of the field type icons."
+ },
+ "skipFields": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Allow skipping form fields."
+ },
+ "autoscrollFields": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to disable auto-scrolling to the next document field."
+ },
+ "sendCopyEmail": {
+ "type": "boolean",
+ "required": false,
+ "description": "Set `false` to disable automatic email sending with signed documents to the signers. Emails with signed documents are sent to the signers by default."
+ },
+ "backgroundColor": {
+ "type": "string",
+ "required": false,
+ "description": "Form background color. Only HEX color codes are supported.",
+ "example": "#d9d9d9"
+ },
+ "completedRedirectUrl": {
+ "type": "string",
+ "required": false,
+ "description": "URL to redirect to after the submission completion.",
+ "example": "https://docuseal.com/success"
+ },
+ "completedMessage": {
+ "type": "object",
+ "required": false,
+ "description": "Message displayed after the form completion.",
+ "properties": {
+ "title": {
+ "type": "string",
+ "required": false,
+ "description": "Message title.",
+ "example": "Documents have been signed!"
+ },
+ "body": {
+ "type": "string",
+ "required": false,
+ "description": "Message content.",
+ "example": "If you have any questions, please contact us."
+ }
+ }
+ },
+ "completedButton": {
+ "type": "object",
+ "required": false,
+ "description": "Customizable button after form completion.",
+ "properties": {
+ "title": {
+ "type": "string",
+ "required": true,
+ "description": "Button label.",
+ "example": "Go Back"
+ },
+ "url": {
+ "type": "string",
+ "required": true,
+ "description": "Button link. Only absolute URLs are supported.",
+ "example": "https://example.com"
+ }
+ }
+ },
+ "withTitle": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to remove the document title from the form."
+ },
+ "withDecline": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Set `true` to display the decline button in the form."
+ },
+ "withDownloadButton": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to remove the signed document download button from the completed form card."
+ },
+ "withSendCopyButton": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to remove the signed document send email button from the completed form card."
+ },
+ "withCompleteButton": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Set `true` to display the complete button in the form header."
+ },
+ "allowToResubmit": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to disallow user to re-submit the form."
+ },
+ "signature": {
+ "type": "string",
+ "required": false,
+ "description": "Allows pre-filling signature fields. The value can be a base64 encoded image string, a public URL to an image, or plain text that will be rendered as a typed signature using a standard font."
+ },
+ "rememberSignature": {
+ "type": "boolean",
+ "required": false,
+ "description": "Allows to specify whether the signature should be remembered for future use. Remembered signatures are stored in the signer's browser local storage and can be automatically reused to prefill signature fields in new forms for the signer when the value is set to `true`."
+ },
+ "reuseSignature": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to not reuse the signature in the second signature field and collect a new one."
+ },
+ "allowTypedSignature": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to disallow users to type their signature."
+ },
+ "values": {
+ "type": "object",
+ "required": false,
+ "description": "Pre-assigned values for form fields.",
+ "example": "{ 'First Name': 'Jon', 'Last Name': 'Doe' }"
+ },
+ "externalId": {
+ "type": "string",
+ "required": false,
+ "description": "Your application-specific unique string key to identify signer within your app."
+ },
+ "metadata": {
+ "type": "object",
+ "required": false,
+ "description": "Metadata object with additional signer information.",
+ "example": "{ customData: 'custom value' }"
+ },
+ "readonlyFields": {
+ "type": "array",
+ "required": false,
+ "description": "List of read-only fields.",
+ "example": "['First Name','Last Name']"
+ },
+ "customCss": {
+ "type": "string",
+ "required": false,
+ "description": "Custom CSS styles to be applied to the form.",
+ "example": "#submit_form_button { background-color: #d9d9d9; }"
+ }
+}
+```
+
+### Callback
+
+```json
+{
+ "onInit": {
+ "type": "event emitter",
+ "required": false,
+ "description": "Event emitted on initializing the form component.",
+ "example": "handleInit($event)"
+ },
+ "onLoad": {
+ "type": "event emitter",
+ "required": false,
+ "description": "Event emitted on loading the form data.",
+ "example": "handleLoad($event)"
+ },
+ "onComplete": {
+ "type": "event emitter",
+ "required": false,
+ "description": "Event emitted the form completion.",
+ "example": "handleComplete($event)"
+ },
+ "onDecline": {
+ "type": "event emitter",
+ "required": false,
+ "description": "Event emitted after the form decline.",
+ "example": "handleDecline($event)"
+ }
+}
+```
diff --git a/docs/embedding/signing-form-javascript.md b/docs/embedding/signing-form-javascript.md
new file mode 100644
index 00000000..935153b5
--- /dev/null
+++ b/docs/embedding/signing-form-javascript.md
@@ -0,0 +1,306 @@
+# JavaScript Signing Form
+
+### Example Code
+
+```javascript
+
+
+
+
+
+
+
+```
+
+### Attributes
+
+```json
+{
+ "data-src": {
+ "type": "string",
+ "required": true,
+ "description": "Public URL of the document signing form. There are two types of URLs: /d/{slug} - template form signing URL can be copied from the template page in the admin dashboard. Also template \"slug\" key can be obtained via the /templates API./s/{slug} - individual signer URL. Signer \"slug\" key can be obtained via the /submissions API which is used to initiate signature requests for a template form with recipients."
+ },
+ "data-email": {
+ "type": "string",
+ "required": false,
+ "description": "Email address of the signer. Additional email form step will be displayed if the email attribute is not specified."
+ },
+ "data-name": {
+ "type": "string",
+ "required": false,
+ "description": "Name of the signer."
+ },
+ "data-role": {
+ "type": "string",
+ "required": false,
+ "description": "The role name or title of the signer.",
+ "example": "First Party"
+ },
+ "data-token": {
+ "type": "string",
+ "doc_type": "object",
+ "description": "JSON Web Token (JWT HS256) with a payload signed using the API key. JWT can be generated only on the backend..",
+ "required": false,
+ "properties": {
+ "slug": {
+ "type": "string",
+ "required": true,
+ "description": "Template or Submitter slug. When Submitter slug is used no need to pass additional email param."
+ },
+ "email": {
+ "type": "string",
+ "required": false,
+ "description": "Email address of the signer. Additional email form step will be displayed if the email attribute is not specified with Template slug."
+ },
+ "external_id": {
+ "type": "string",
+ "required": false,
+ "description": "Your application-specific unique string key to identify signer within your app."
+ },
+ "preview": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Show form in preview mode without ability to submit it."
+ }
+ }
+ },
+ "data-preview": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Show form in preview mode without ability to submit it. Completed documents embedded in preview mode require `data-token` authentication."
+ },
+ "data-expand": {
+ "type": "boolean",
+ "required": false,
+ "description": "Expand form on open.",
+ "default": true
+ },
+ "data-minimize": {
+ "type": "boolean",
+ "required": false,
+ "description": "Set to `true` to always minimize form fields. Requires to click on the field to expand the form.",
+ "default": false
+ },
+ "data-order-as-on-page": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Order form fields based on their position on the pages."
+ },
+ "data-logo": {
+ "type": "string",
+ "required": false,
+ "description": "Public logo image URL to use in the signing form."
+ },
+ "data-language": {
+ "type": "string",
+ "required": false,
+ "description": "UI language: en, es, it, de, fr, nl, pl, uk, cs, pt, he, ar, kr, ja languages are available. Be default the form is displayed in the user browser language automatically."
+ },
+ "data-i18n": {
+ "type": "string",
+ "required": false,
+ "default": "{}",
+ "description": "JSON encoded string that contains i18n keys to replace the default UI text with custom values. See submission_form/i18n.js for available i18n keys."
+ },
+ "data-go-to-last": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Navigate to the last unfinished step."
+ },
+ "data-skip-fields": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Allow skipping form fields."
+ },
+ "data-autoscroll-fields": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to disable auto-scrolling to the next document field."
+ },
+ "data-send-copy-email": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to disable automatic email sending with signed documents to the signers. Emails with signed documents are sent to the signers by default."
+ },
+ "data-with-title": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to remove the document title from the form."
+ },
+ "data-with-decline": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Set `true` to display the decline button in the form."
+ },
+ "data-with-field-names": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to hide field name. Hidding field names can be useful for when they are not in the human readable format. Field names are displayed by default."
+ },
+ "data-with-field-placeholder": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Set `true` to display field name placeholders instead of the field type icons."
+ },
+ "data-with-download-button": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to remove the signed document download button from the completed form card."
+ },
+ "data-with-send-copy-button": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to remove the signed document send email button from the completed form card."
+ },
+ "data-with-complete-button": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Set `true` to display the complete button in the form header."
+ },
+ "data-allow-to-resubmit": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to disallow users to re-submit the form."
+ },
+ "data-allow-typed-signature": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to disallow users to type their signature."
+ },
+ "data-signature": {
+ "type": "string",
+ "required": false,
+ "description": "Allows pre-filling signature fields. The value can be a base64 encoded image string, a public URL to an image, or plain text that will be rendered as a typed signature using a standard font."
+ },
+ "data-remember-signature": {
+ "type": "boolean",
+ "required": false,
+ "description": "Allows to specify whether the signature should be remembered for future use. Remembered signatures are stored in the signer's browser local storage and can be automatically reused to prefill signature fields in new forms for the signer when the value is set to `true`."
+ },
+ "data-reuse-signature": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to not reuse the signature in the second signature field and collect a new one."
+ },
+ "data-background-color": {
+ "type": "string",
+ "required": false,
+ "description": "Form background color. Only HEX color codes are supported.",
+ "example": "#d9d9d9"
+ },
+ "data-values": {
+ "type": "object",
+ "required": false,
+ "description": "Pre-assigned values for form fields.",
+ "example": "{\"First Name\":\"Jon\",\"Last Name\":\"Doe\"}"
+ },
+ "data-external-id": {
+ "type": "string",
+ "required": false,
+ "description": "Your application-specific unique string key to identify signer within your app."
+ },
+ "data-metadata": {
+ "type": "object",
+ "required": false,
+ "description": "Signer metadata Object in JSON format. ",
+ "example": "{\"customData\":\"customValue\"}"
+ },
+ "data-readonly-fields": {
+ "type": "string",
+ "required": false,
+ "description": "Comma separated read-only field names",
+ "example": "First Name,Last Name"
+ },
+ "data-completed-redirect-url": {
+ "type": "string",
+ "required": false,
+ "description": "URL to redirect to after the submission completion.",
+ "example": "https://docuseal.com/success"
+ },
+ "data-completed-message-title": {
+ "type": "string",
+ "required": false,
+ "description": "Message title displayed after the form completion.",
+ "example": "Documents have been completed"
+ },
+ "data-completed-message-body": {
+ "type": "string",
+ "required": false,
+ "description": "Message body displayed after the form completion.",
+ "example": "If you have any questions, please contact us."
+ },
+ "data-completed-button-title": {
+ "type": "string",
+ "required": false,
+ "description": "Button title displayed after the form completion.",
+ "example": "Go Back"
+ },
+ "data-completed-button-url": {
+ "type": "string",
+ "required": false,
+ "description": "URL of the button displayed after the form completion.",
+ "example": "https://example.com"
+ },
+ "data-custom-css": {
+ "type": "string",
+ "required": false,
+ "description": "Custom CSS styles to be applied to the form.",
+ "example": "#submit_form_button { background-color: #d9d9d9; }"
+ }
+}
+```
+
+### Callback
+
+```json
+{
+ "init": {
+ "type": "event",
+ "required": false,
+ "description": "Custom event to be triggered on initializing the form component.",
+ "example": "document.querySelector('docuseal-form').addEventListener('init', () => console.log('init'))"
+ },
+ "load": {
+ "type": "event",
+ "required": false,
+ "description": "Custom event to be triggered on loading the form data.",
+ "example": "document.querySelector('docuseal-form').addEventListener('load', (e) => e.detail)"
+ },
+ "completed": {
+ "type": "event",
+ "required": false,
+ "description": "Custom event to be triggered after form completion.",
+ "example": "document.querySelector('docuseal-form').addEventListener('completed', (e) => e.detail)"
+ },
+ "declined": {
+ "type": "event",
+ "description": "Custom event to be triggered after form decline.",
+ "example": "document.querySelector('docuseal-form').addEventListener('declined', (e) => e.detail)"
+ }
+}
+```
diff --git a/docs/embedding/signing-form-react.md b/docs/embedding/signing-form-react.md
new file mode 100644
index 00000000..91039bbf
--- /dev/null
+++ b/docs/embedding/signing-form-react.md
@@ -0,0 +1,321 @@
+# React Signing Form
+
+### Example Code
+
+```react
+import React from "react"
+import { DocusealForm } from '@docuseal/react'
+
+export function App() {
+ return (
+
+ console.log(data)}
+ />
+
+ );
+}
+
+```
+
+### Attributes
+
+```json
+{
+ "src": {
+ "type": "string",
+ "required": true,
+ "description": "Public URL of the document signing form. There are two types of URLs: /d/{slug} - template form signing URL can be copied from the template page in the admin dashboard. Also template \"slug\" key can be obtained via the /templates API./s/{slug} - individual signer URL. Signer \"slug\" key can be obtained via the /submissions API which is used to initiate signature requests for a template form with recipients."
+ },
+ "email": {
+ "type": "string",
+ "required": false,
+ "description": "Email address of the signer. Additional email form step will be displayed if the email attribute is not specified."
+ },
+ "name": {
+ "type": "string",
+ "required": false,
+ "description": "Name of the signer."
+ },
+ "role": {
+ "type": "string",
+ "required": false,
+ "description": "The role name or title of the signer.",
+ "example": "First Party"
+ },
+ "token": {
+ "type": "string",
+ "doc_type": "object",
+ "description": "JSON Web Token (JWT HS256) with a payload signed using the API key. JWT can be generated only on the backend..",
+ "required": false,
+ "properties": {
+ "slug": {
+ "type": "string",
+ "required": true,
+ "description": "Template or Submitter slug. When Submitter slug is used no need to pass additional email param."
+ },
+ "email": {
+ "type": "string",
+ "required": false,
+ "description": "Email address of the signer. Additional email form step will be displayed if the email attribute is not specified with Template slug."
+ },
+ "external_id": {
+ "type": "string",
+ "required": false,
+ "description": "Your application-specific unique string key to identify signer within your app."
+ },
+ "preview": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Show form in preview mode without ability to submit it."
+ }
+ }
+ },
+ "preview": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Show form in preview mode without ability to submit it. Completed documents embedded in preview mode require `token` authentication."
+ },
+ "expand": {
+ "type": "boolean",
+ "required": false,
+ "description": "Expand form on open.",
+ "default": true
+ },
+ "minimize": {
+ "type": "boolean",
+ "required": false,
+ "description": "Set to `true` to always minimize form fields. Requires to click on the field to expand the form.",
+ "default": false
+ },
+ "orderAsOnPage": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Order form fields based on their position on the pages."
+ },
+ "logo": {
+ "type": "string",
+ "required": false,
+ "description": "Public logo image URL to use in the signing form."
+ },
+ "language": {
+ "type": "string",
+ "required": false,
+ "description": "UI language: en, es, it, de, fr, nl, pl, uk, cs, pt, he, ar, kr, ja languages are available. Be default the form is displayed in the user browser language automatically."
+ },
+ "i18n": {
+ "type": "object",
+ "required": false,
+ "default": "{}",
+ "description": "Object that contains i18n keys to replace the default UI text with custom values. See submission_form/i18n.js for available i18n keys."
+ },
+ "goToLast": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Navigate to the last unfinished step."
+ },
+ "withFieldNames": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to hide field name. Hidding field names can be useful for when they are not in the human readable format. Field names are displayed by default."
+ },
+ "withFieldPlaceholder": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Set `true` to display field name placeholders instead of the field type icons."
+ },
+ "skipFields": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Allow skipping form fields."
+ },
+ "autoscrollFields": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to disable auto-scrolling to the next document field."
+ },
+ "sendCopyEmail": {
+ "type": "boolean",
+ "required": false,
+ "description": "Set `false` to disable automatic email sending with signed documents to the signers. Emails with signed documents are sent to the signers by default."
+ },
+ "backgroundColor": {
+ "type": "string",
+ "required": false,
+ "description": "Form background color. Only HEX color codes are supported.",
+ "example": "#d9d9d9"
+ },
+ "completedRedirectUrl": {
+ "type": "string",
+ "required": false,
+ "description": "URL to redirect to after the submission completion.",
+ "example": "https://docuseal.com/success"
+ },
+ "completedMessage": {
+ "type": "object",
+ "required": false,
+ "description": "Message displayed after the form completion.",
+ "properties": {
+ "title": {
+ "type": "string",
+ "required": false,
+ "description": "Message title.",
+ "example": "Documents have been signed!"
+ },
+ "body": {
+ "type": "string",
+ "required": false,
+ "description": "Message content.",
+ "example": "If you have any questions, please contact us."
+ }
+ }
+ },
+ "completedButton": {
+ "type": "object",
+ "required": false,
+ "description": "Customizable button after form completion.",
+ "properties": {
+ "title": {
+ "type": "string",
+ "required": true,
+ "description": "Button label.",
+ "example": "Go Back"
+ },
+ "url": {
+ "type": "string",
+ "required": true,
+ "description": "Button link. Only absolute URLs are supported.",
+ "example": "https://example.com"
+ }
+ }
+ },
+ "withTitle": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to remove the document title from the form."
+ },
+ "withDecline": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Set `true` to display the decline button in the form."
+ },
+ "withDownloadButton": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to remove the signed document download button from the completed form card."
+ },
+ "withSendCopyButton": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to remove the signed document send email button from the completed form card."
+ },
+ "withCompleteButton": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Set `true` to display the complete button in the form header."
+ },
+ "allowToResubmit": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to disallow user to re-submit the form."
+ },
+ "allowTypedSignature": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to disallow users to type their signature."
+ },
+ "signature": {
+ "type": "string",
+ "required": false,
+ "description": "Allows pre-filling signature fields. The value can be a base64 encoded image string, a public URL to an image, or plain text that will be rendered as a typed signature using a standard font."
+ },
+ "rememberSignature": {
+ "type": "boolean",
+ "required": false,
+ "description": "Allows to specify whether the signature should be remembered for future use. Remembered signatures are stored in the signer's browser local storage and can be automatically reused to prefill signature fields in new forms for the signer when the value is set to `true`."
+ },
+ "reuseSignature": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to not reuse the signature in the second signature field and collect a new one."
+ },
+ "values": {
+ "type": "object",
+ "required": false,
+ "description": "Pre-assigned values for form fields.",
+ "example": "{ 'First Name': 'Jon', 'Last Name': 'Doe' }"
+ },
+ "externalId": {
+ "type": "string",
+ "required": false,
+ "description": "Your application-specific unique string key to identify signer within your app."
+ },
+ "metadata": {
+ "type": "object",
+ "required": false,
+ "description": "Metadata object with additional signer information.",
+ "example": "{ customData: 'custom value' }"
+ },
+ "readonlyFields": {
+ "type": "array",
+ "required": false,
+ "description": "List of read-only fields.",
+ "example": "['First Name','Last Name']"
+ },
+ "customCss": {
+ "type": "string",
+ "required": false,
+ "description": "Custom CSS styles to be applied to the form.",
+ "example": "#submit_form_button { background-color: #d9d9d9; }"
+ }
+}
+```
+
+### Callback
+
+```json
+{
+ "onInit": {
+ "type": "function",
+ "required": false,
+ "description": "Function to be called on initializing the form component.",
+ "example": "() => { console.log(\"Loaded\") }"
+ },
+ "onLoad": {
+ "type": "function",
+ "required": false,
+ "description": "Function to be called on loading the form data.",
+ "example": "(data) => { console.log(data) }"
+ },
+ "onComplete": {
+ "type": "function",
+ "required": false,
+ "description": "Function to be called after the form completion.",
+ "example": "(data) => { console.log(data) }"
+ },
+ "onDecline": {
+ "type": "function",
+ "required": false,
+ "description": "Function to be called after the form decline.",
+ "example": "(data) => { console.log(data) }"
+ }
+}
+```
diff --git a/docs/embedding/signing-form-vue.md b/docs/embedding/signing-form-vue.md
new file mode 100644
index 00000000..45e6a336
--- /dev/null
+++ b/docs/embedding/signing-form-vue.md
@@ -0,0 +1,331 @@
+# Vue Signing Form
+
+### Example Code
+
+```vue
+
+
+
+
+
+
+```
+
+### Attributes
+
+```json
+{
+ "src": {
+ "type": "string",
+ "required": true,
+ "description": "Public URL of the document signing form. There are two types of URLs: /d/{slug} - template form signing URL can be copied from the template page in the admin dashboard. Also template \"slug\" key can be obtained via the /templates API./s/{slug} - individual signer URL. Signer \"slug\" key can be obtained via the /submissions API which is used to initiate signature requests for a template form with recipients."
+ },
+ "email": {
+ "type": "string",
+ "required": false,
+ "description": "Email address of the signer. Additional email form step will be displayed if the email attribute is not specified."
+ },
+ "name": {
+ "type": "string",
+ "required": false,
+ "description": "Name of the signer."
+ },
+ "role": {
+ "type": "string",
+ "required": false,
+ "description": "The role name or title of the signer.",
+ "example": "First Party"
+ },
+ "token": {
+ "type": "string",
+ "doc_type": "object",
+ "description": "JSON Web Token (JWT HS256) with a payload signed using the API key. JWT can be generated only on the backend..",
+ "required": false,
+ "properties": {
+ "slug": {
+ "type": "string",
+ "required": true,
+ "description": "Template or Submitter slug. When Submitter slug is used no need to pass additional email param."
+ },
+ "email": {
+ "type": "string",
+ "required": false,
+ "description": "Email address of the signer. Additional email form step will be displayed if the email attribute is not specified with Template slug."
+ },
+ "external_id": {
+ "type": "string",
+ "required": false,
+ "description": "Your application-specific unique string key to identify signer within your app."
+ },
+ "preview": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Show form in preview mode without ability to submit it."
+ }
+ }
+ },
+ "preview": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Show form in preview mode without ability to submit it. Completed documents embedded in preview mode require `data-token` authentication."
+ },
+ "expand": {
+ "type": "boolean",
+ "required": false,
+ "description": "Expand form on open.",
+ "default": true
+ },
+ "minimize": {
+ "type": "boolean",
+ "required": false,
+ "description": "Set to `true` to always minimize form fields. Requires to click on the field to expand the form.",
+ "default": false
+ },
+ "order-as-on-page": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Order form fields based on their position on the pages."
+ },
+ "logo": {
+ "type": "string",
+ "required": false,
+ "description": "Public logo image URL to use in the signing form."
+ },
+ "language": {
+ "type": "string",
+ "required": false,
+ "description": "UI language: en, es, it, de, fr, nl, pl, uk, cs, pt, he, ar, kr, ja languages are available. Be default the form is displayed in the user browser language automatically."
+ },
+ "i18n": {
+ "type": "object",
+ "required": false,
+ "default": "{}",
+ "description": "Object that contains i18n keys to replace the default UI text with custom values. See submission_form/i18n.js for available i18n keys."
+ },
+ "go-to-last": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Navigate to the last unfinished step."
+ },
+ "skip-fields": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Allow skipping form fields."
+ },
+ "autoscroll-fields": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to disable auto-scrolling to the next document field."
+ },
+ "with-field-names": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to hide field name. Hidding field names can be useful for when they are not in the human readable format. Field names are displayed by default."
+ },
+ "with-field-placeholder": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Set `true` to display field name placeholders instead of the field type icons."
+ },
+ "send-copy-email": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to disable automatic email sending with signed documents to the signers. Emails with signed documents are sent to the signers by default."
+ },
+ "background-color": {
+ "type": "string",
+ "required": false,
+ "description": "Form background color. Only HEX color codes are supported.",
+ "example": "#d9d9d9"
+ },
+ "with-title": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to remove the document title from the form."
+ },
+ "with-decline": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Set `true` to display the decline button in the form."
+ },
+ "with-download-button": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to remove the signed document download button from the completed form card."
+ },
+ "with-send-copy-button": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to remove the signed document send email button from the completed form card."
+ },
+ "with-complete-button": {
+ "type": "boolean",
+ "required": false,
+ "default": false,
+ "description": "Set `true` to display the complete button in the form header."
+ },
+ "allow-to-resubmit": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to disallow user to re-submit the form."
+ },
+ "signature": {
+ "type": "string",
+ "required": false,
+ "description": "Allows pre-filling signature fields. The value can be a base64 encoded image string, a public URL to an image, or plain text that will be rendered as a typed signature using a standard font."
+ },
+ "remember-signature": {
+ "type": "boolean",
+ "required": false,
+ "description": "Allows to specify whether the signature should be remembered for future use. Remembered signatures are stored in the signer's browser local storage and can be automatically reused to prefill signature fields in new forms for the signer when the value is set to `true`."
+ },
+ "reuse-signature": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to not reuse the signature in the second signature field and collect a new one."
+ },
+ "allow-typed-signature": {
+ "type": "boolean",
+ "required": false,
+ "default": true,
+ "description": "Set `false` to disallow users to type their signature."
+ },
+ "completed-redirect-url": {
+ "type": "string",
+ "required": false,
+ "description": "URL to redirect to after the submission completion.",
+ "example": "https://docuseal.com/success"
+ },
+ "completed-message": {
+ "type": "object",
+ "required": false,
+ "description": "Message displayed after the form completion.",
+ "properties": {
+ "title": {
+ "type": "string",
+ "required": false,
+ "description": "Message title.",
+ "example": "Documents have been signed!"
+ },
+ "body": {
+ "type": "string",
+ "required": false,
+ "description": "Message content.",
+ "example": "If you have any questions, please contact us."
+ }
+ }
+ },
+ "completed-button": {
+ "type": "object",
+ "required": false,
+ "description": "Customizable button after form completion.",
+ "properties": {
+ "title": {
+ "type": "string",
+ "required": true,
+ "description": "Button label.",
+ "example": "Go Back"
+ },
+ "url": {
+ "type": "string",
+ "required": true,
+ "description": "Button link. Only absolute URLs are supported.",
+ "example": "https://example.com"
+ }
+ }
+ },
+ "values": {
+ "type": "object",
+ "required": false,
+ "description": "Pre-assigned values for form fields.",
+ "example": "{ 'First Name': 'Jon', 'Last Name': 'Doe' }"
+ },
+ "external-id": {
+ "type": "string",
+ "required": false,
+ "description": "Your application-specific unique string key to identify signer within your app."
+ },
+ "metadata": {
+ "type": "object",
+ "required": false,
+ "description": "Metadata object with additional signer information.",
+ "example": "{ customData: 'custom value' }"
+ },
+ "readonly-fields": {
+ "type": "array",
+ "required": false,
+ "description": "List of read-only fields.",
+ "example": "['First Name','Last Name']"
+ },
+ "custom-css": {
+ "type": "string",
+ "required": false,
+ "description": "Custom CSS styles to be applied to the form.",
+ "example": "#submit_form_button { background-color: #d9d9d9; }"
+ }
+}
+```
+
+### Callback
+
+```json
+{
+ "@init": {
+ "type": "function",
+ "required": false,
+ "description": "Function to be called on initializing the form component.",
+ "example": "onFormLoad"
+ },
+ "@load": {
+ "type": "function",
+ "required": false,
+ "description": "Function to be called on loading the form data.",
+ "example": "onFormLoad"
+ },
+ "@complete": {
+ "type": "function",
+ "required": false,
+ "description": "Function to be called after the form completion.",
+ "example": "onFormComplete"
+ },
+ "@decline": {
+ "type": "function",
+ "required": false,
+ "description": "Function to be called after the form decline.",
+ "example": "onFormDecline"
+ }
+}
+```
diff --git a/docs/openapi.json b/docs/openapi.json
new file mode 100644
index 00000000..84f95deb
--- /dev/null
+++ b/docs/openapi.json
@@ -0,0 +1,10462 @@
+{
+ "openapi": "3.0.0",
+ "servers": [
+ {
+ "url": "https://api.docuseal.com",
+ "description": "Global Server"
+ },
+ {
+ "url": "https://api.docuseal.eu",
+ "description": "EU Server"
+ }
+ ],
+ "info": {
+ "version": "1.0.0",
+ "title": "DocuSeal API",
+ "description": "DocuSeal API specs",
+ "contact": {
+ "name": "DocuSeal",
+ "email": "admin@docuseal.com",
+ "url": "https://www.docuseal.com"
+ }
+ },
+ "components": {
+ "securitySchemes": {
+ "AuthToken": {
+ "type": "apiKey",
+ "in": "header",
+ "name": "X-Auth-Token"
+ }
+ }
+ },
+ "tags": [
+ {
+ "name": "Submissions",
+ "description": "Signature requests can be initiated with Submissions API. Submissions can contain one submitter if signed by a single party or multiple submitters if the document template form contains signatures and fields to be collected and filled by multiple parties. Initiate new submissions to request signatures for specified submitters via email or phone number."
+ },
+ {
+ "name": "Submitters",
+ "description": "Submitters API allows you to load all details provided by the signer of the document."
+ },
+ {
+ "name": "Templates",
+ "description": "Templates represent reusable document signing forms with fields and signatures to be collected. It's possible to create unique template forms with fields and signatures using HTML or with tagged PDFs."
+ }
+ ],
+ "paths": {
+ "/templates": {
+ "get": {
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "List all templates",
+ "description": "The API endpoint provides the ability to retrieve a list of available document templates.",
+ "operationId": "getTemplates",
+ "parameters": [
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates based on the name partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates by unique slug.",
+ "example": "opaKWh8WWTAcVG"
+ },
+ {
+ "name": "external_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The unique applications-specific identifier provided for the template via API or Embedded template form builder. It allows you to receive only templates with your specified external id."
+ },
+ {
+ "name": "folder",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter templates by folder name."
+ },
+ {
+ "name": "archived",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ },
+ "description": "Get only archived templates instead of active ones."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of templates to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the template to start the list from. It allows you to receive only templates with id greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of templates."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the template to end the list with. It allows you to receive only templates with id less than the specified value."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "data",
+ "pagination"
+ ],
+ "properties": {
+ "data": {
+ "type": "array",
+ "description": "List of templates.",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "slug",
+ "name",
+ "preferences",
+ "schema",
+ "fields",
+ "submitters",
+ "author_id",
+ "created_at",
+ "updated_at",
+ "source",
+ "external_id",
+ "folder_id",
+ "folder_name",
+ "author",
+ "documents"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the document template."
+ },
+ "slug": {
+ "type": "string",
+ "description": "Unique slug of the document template."
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the template."
+ },
+ "preferences": {
+ "type": "object",
+ "description": "Template preferences."
+ },
+ "schema": {
+ "type": "array",
+ "description": "List of documents attached to the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "attachment_uuid",
+ "name"
+ ],
+ "properties": {
+ "attachment_uuid": {
+ "type": "string",
+ "description": "Unique indentifier of attached document to the template."
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the attached document to the template."
+ }
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "List of fields to be filled in the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "uuid",
+ "submitter_uuid",
+ "name",
+ "type",
+ "required",
+ "areas"
+ ],
+ "properties": {
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the field."
+ },
+ "submitter_uuid": {
+ "type": "string",
+ "description": "Unique identifier of the submitter that filled the field."
+ },
+ "name": {
+ "type": "string",
+ "description": "Field name."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels."
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value."
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value."
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value."
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value."
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value."
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types."
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields."
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields."
+ },
+ "mask": {
+ "type": "boolean",
+ "description": "Indicates if the field is masked on the document."
+ }
+ }
+ },
+ "areas": {
+ "type": "array",
+ "description": "List of areas where the field is located in the document.",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "attachment_uuid",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X coordinate of the area where the field is located in the document."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y coordinate of the area where the field is located in the document."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the area where the field is located in the document."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the area where the field is located in the document."
+ },
+ "attachment_uuid": {
+ "type": "string",
+ "description": "Unique identifier of the attached document where the field is located."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the attached document where the field is located."
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "uuid"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Submitter name."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the submitter."
+ }
+ }
+ }
+ },
+ "author_id": {
+ "type": "integer",
+ "description": "Unique identifier of the author of the template."
+ },
+ "archived_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "Date and time when the template was archived."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "Date and time when the template was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "Date and time when the template was updated."
+ },
+ "source": {
+ "type": "string",
+ "description": "Source of the template.",
+ "enum": [
+ "native",
+ "api",
+ "embed"
+ ]
+ },
+ "external_id": {
+ "type": "string",
+ "nullable": true,
+ "description": "Identifier of the template in the external system."
+ },
+ "folder_id": {
+ "type": "integer",
+ "description": "Unique identifier of the folder where the template is placed."
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "Folder name where the template is placed."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "Indicates if the template is accessible by link."
+ },
+ "author": {
+ "type": "object",
+ "required": [
+ "id",
+ "first_name",
+ "last_name",
+ "email"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the author."
+ },
+ "first_name": {
+ "type": "string",
+ "description": "First name of the author."
+ },
+ "last_name": {
+ "type": "string",
+ "description": "Last name of the author."
+ },
+ "email": {
+ "type": "string",
+ "description": "Author email."
+ }
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "List of documents attached to the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "uuid",
+ "url",
+ "preview_image_url",
+ "filename"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the document."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the document."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the document."
+ },
+ "preview_image_url": {
+ "type": "string",
+ "description": "Document preview image URL."
+ },
+ "filename": {
+ "type": "string",
+ "description": "Document filename."
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "pagination": {
+ "type": "object",
+ "required": [
+ "count",
+ "next",
+ "prev"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "description": "Templates count."
+ },
+ "next": {
+ "type": "integer",
+ "nullable": true,
+ "description": "The ID of the tempate after which the next page starts."
+ },
+ "prev": {
+ "type": "integer",
+ "nullable": true,
+ "description": "The ID of the tempate before which the previous page ends."
+ }
+ }
+ }
+ }
+ },
+ "example": {
+ "data": [
+ {
+ "id": 1,
+ "slug": "iRgjDX7WDK6BRo",
+ "name": "Example Template",
+ "preferences": {},
+ "schema": [
+ {
+ "attachment_uuid": "d94e615f-76e3-46d5-8f98-36bdacb8664a",
+ "name": "example-document"
+ }
+ ],
+ "fields": [
+ {
+ "uuid": "594bdf04-d941-4ca6-aa73-93e61d625c02",
+ "submitter_uuid": "0954d146-db8c-4772-aafe-2effc7c0e0c0",
+ "name": "Full Name",
+ "type": "text",
+ "required": true,
+ "preferences": {},
+ "areas": [
+ {
+ "x": 0.2638888888888889,
+ "y": 0.168958742632613,
+ "w": 0.325,
+ "h": 0.04616895874263263,
+ "attachment_uuid": "d94e615f-76e3-46d5-8f98-36bdacb8664a",
+ "page": 0
+ }
+ ]
+ }
+ ],
+ "submitters": [
+ {
+ "name": "First Party",
+ "uuid": "0954d146-db8c-4772-aafe-2effc7c0e0c0"
+ }
+ ],
+ "author_id": 1,
+ "archived_at": null,
+ "created_at": "2023-12-14T15:21:57.375Z",
+ "updated_at": "2023-12-14T15:22:55.094Z",
+ "source": "native",
+ "folder_id": 1,
+ "folder_name": "Default",
+ "external_id": "c248ffba-ef81-48b7-8e17-e3cecda1c1c5",
+ "shared_link": true,
+ "author": {
+ "id": 1,
+ "first_name": "John",
+ "last_name": "Doe",
+ "email": "john.doe@example.com"
+ },
+ "documents": [
+ {
+ "id": 5,
+ "uuid": "d94e615f-76e3-46d5-8f98-36bdacb8664a",
+ "url": "https://docuseal.com/file/hash/sample-document.pdf",
+ "preview_image_url": "https://docuseal.com/file/hash/0.jpg",
+ "filename": "example-document.pdf"
+ }
+ ]
+ }
+ ],
+ "pagination": {
+ "count": 1,
+ "next": 1,
+ "prev": 2
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/templates/{id}": {
+ "get": {
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Get a template",
+ "description": "The API endpoint provides the functionality to retrieve information about a document template.",
+ "operationId": "getTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "id",
+ "slug",
+ "name",
+ "preferences",
+ "schema",
+ "fields",
+ "submitters",
+ "author_id",
+ "archived_at",
+ "created_at",
+ "updated_at",
+ "source",
+ "external_id",
+ "folder_id",
+ "folder_name",
+ "author",
+ "documents"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the document template."
+ },
+ "slug": {
+ "type": "string",
+ "description": "Unique slug of the document template."
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the template."
+ },
+ "preferences": {
+ "type": "object",
+ "description": "Template preferences."
+ },
+ "schema": {
+ "type": "array",
+ "description": "List of documents attached to the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "attachment_uuid",
+ "name"
+ ],
+ "properties": {
+ "attachment_uuid": {
+ "type": "string",
+ "description": "Unique indentifier of attached document to the template."
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the attached document to the template."
+ }
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "List of fields to be filled in the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "uuid",
+ "submitter_uuid",
+ "name",
+ "type",
+ "required",
+ "areas"
+ ],
+ "properties": {
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the field."
+ },
+ "submitter_uuid": {
+ "type": "string",
+ "description": "Unique identifier of the submitter that filled the field."
+ },
+ "name": {
+ "type": "string",
+ "description": "Field name."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels."
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value."
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value."
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value."
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value."
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value."
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types."
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields."
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields."
+ },
+ "mask": {
+ "type": "boolean",
+ "description": "Indicates if the field is masked on the document."
+ }
+ }
+ },
+ "areas": {
+ "type": "array",
+ "description": "List of areas where the field is located in the document.",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "attachment_uuid",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X coordinate of the area where the field is located in the document."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y coordinate of the area where the field is located in the document."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the area where the field is located in the document."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the area where the field is located in the document."
+ },
+ "attachment_uuid": {
+ "type": "string",
+ "description": "Unique identifier of the attached document where the field is located."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the attached document where the field is located."
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "uuid"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Submitter name."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the submitter."
+ }
+ }
+ }
+ },
+ "author_id": {
+ "type": "integer",
+ "description": "Unique identifier of the author of the template."
+ },
+ "archived_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "Date and time when the template was archived."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "Date and time when the template was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "Date and time when the template was updated."
+ },
+ "source": {
+ "type": "string",
+ "description": "Source of the template.",
+ "enum": [
+ "native",
+ "api",
+ "embed"
+ ]
+ },
+ "external_id": {
+ "type": "string",
+ "nullable": true,
+ "description": "Identifier of the template in the external system."
+ },
+ "folder_id": {
+ "type": "integer",
+ "description": "Unique identifier of the folder where the template is placed."
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "Folder name where the template is placed."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "Indicates if the template is accessible by link."
+ },
+ "author": {
+ "type": "object",
+ "required": [
+ "id",
+ "first_name",
+ "last_name",
+ "email"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the author."
+ },
+ "first_name": {
+ "type": "string",
+ "description": "First name of the author."
+ },
+ "last_name": {
+ "type": "string",
+ "description": "Last name of the author."
+ },
+ "email": {
+ "type": "string",
+ "description": "Author email."
+ }
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "List of documents attached to the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "uuid",
+ "url",
+ "preview_image_url",
+ "filename"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the document."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the document."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the document."
+ },
+ "preview_image_url": {
+ "type": "string",
+ "description": "Document preview image URL."
+ },
+ "filename": {
+ "type": "string",
+ "description": "Document filename."
+ }
+ }
+ }
+ }
+ }
+ },
+ "example": {
+ "id": 1,
+ "slug": "iRgjDX7WDK6BRo",
+ "name": "Example Template",
+ "preferences": {},
+ "schema": [
+ {
+ "attachment_uuid": "d94e615f-76e3-46d5-8f98-36bdacb8664a",
+ "name": "example-document"
+ }
+ ],
+ "fields": [
+ {
+ "uuid": "594bdf04-d941-4ca6-aa73-93e61d625c02",
+ "submitter_uuid": "0954d146-db8c-4772-aafe-2effc7c0e0c0",
+ "name": "Full Name",
+ "type": "text",
+ "required": true,
+ "preferences": {},
+ "areas": [
+ {
+ "x": 0.2638888888888889,
+ "y": 0.168958742632613,
+ "w": 0.325,
+ "h": 0.04616895874263263,
+ "attachment_uuid": "d94e615f-76e3-46d5-8f98-36bdacb8664a",
+ "page": 0
+ }
+ ]
+ }
+ ],
+ "submitters": [
+ {
+ "name": "First Party",
+ "uuid": "0954d146-db8c-4772-aafe-2effc7c0e0c0"
+ }
+ ],
+ "author_id": 1,
+ "archived_at": null,
+ "created_at": "2023-12-14T15:21:57.375Z",
+ "updated_at": "2023-12-14T15:22:55.094Z",
+ "source": "native",
+ "folder_id": 1,
+ "folder_name": "Default",
+ "external_id": "c248ffba-ef81-48b7-8e17-e3cecda1c1c5",
+ "shared_link": true,
+ "author": {
+ "id": 1,
+ "first_name": "John",
+ "last_name": "Doe",
+ "email": "john.doe@example.com"
+ },
+ "documents": [
+ {
+ "id": 5,
+ "uuid": "d94e615f-76e3-46d5-8f98-36bdacb8664a",
+ "url": "https://docuseal.com/file/hash/sample-document.pdf",
+ "preview_image_url": "https://docuseal.com/file/hash/0.jpg",
+ "filename": "example-document.pdf"
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Archive a template",
+ "description": "The API endpoint allows you to archive a document template.",
+ "operationId": "archiveTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "id",
+ "archived_at"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Template unique ID number."
+ },
+ "archived_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "Date and time when the template was archived."
+ }
+ }
+ },
+ "example": {
+ "id": 1,
+ "archived_at": "2023-12-14T15:50:21.799Z"
+ }
+ }
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Update a template",
+ "description": "The API endpoint provides the functionality to move a document template to a different folder and update the name of the template.",
+ "operationId": "updateTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the document template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the template",
+ "example": "New Document Name"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be moved.",
+ "example": "New Folder"
+ },
+ "roles": {
+ "type": "array",
+ "description": "An array of submitter role names to update the template with.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Agent",
+ "Customer"
+ ]
+ },
+ "archived": {
+ "type": "boolean",
+ "description": "Set `false` to unarchive template."
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "id",
+ "updated_at"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Template unique ID number."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "Date and time when the template was last updated."
+ }
+ }
+ },
+ "example": {
+ "id": 1,
+ "updated_at": "2023-12-14T15:50:21.799Z"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/submissions": {
+ "get": {
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "List all submissions",
+ "description": "The API endpoint provides the ability to retrieve a list of available submissions.",
+ "operationId": "getSubmissions",
+ "parameters": [
+ {
+ "name": "template_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The template ID allows you to receive only the submissions created from that specific template."
+ },
+ {
+ "name": "status",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "enum": [
+ "pending",
+ "completed",
+ "declined",
+ "expired"
+ ]
+ },
+ "description": "Filter submissions by status."
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions based on submitters name, email or phone partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions by unique slug.",
+ "example": "NtLDQM7eJX2ZMd"
+ },
+ {
+ "name": "template_folder",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submissions by template folder name."
+ },
+ {
+ "name": "archived",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ },
+ "description": "Returns only archived submissions when `true` and only active submissions when `false`."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of submissions to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission to start the list from. It allows you to receive only submissions with an ID greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of submissions."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission that marks the end of the list. It allows you to receive only submissions with an ID less than the specified value."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "data",
+ "pagination"
+ ],
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "source",
+ "slug",
+ "status",
+ "submitters_order",
+ "audit_log_url",
+ "completed_at",
+ "created_at",
+ "updated_at",
+ "submitters",
+ "created_by_user"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Submission unique ID number."
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission",
+ "example": "Test Submission Document"
+ },
+ "source": {
+ "type": "string",
+ "description": "The source of the submission.",
+ "enum": [
+ "invite",
+ "bulk",
+ "api",
+ "embed",
+ "link"
+ ]
+ },
+ "slug": {
+ "type": "string",
+ "description": "Unique slug of the submission."
+ },
+ "status": {
+ "type": "string",
+ "description": "The status of the submission.",
+ "enum": [
+ "completed",
+ "declined",
+ "expired",
+ "pending"
+ ]
+ },
+ "submitters_order": {
+ "type": "string",
+ "description": "The order of submitters.",
+ "enum": [
+ "random",
+ "preserved"
+ ]
+ },
+ "audit_log_url": {
+ "type": "string",
+ "nullable": true,
+ "description": "Audit log file URL."
+ },
+ "combined_document_url": {
+ "type": "string",
+ "nullable": true,
+ "description": "Combined PDF file URL with documents and Audit Log."
+ },
+ "completed_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submission was completed."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The date and time when the submission was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "The date and time when the submission was last updated."
+ },
+ "archived_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submission was archived."
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters.",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "submission_id",
+ "uuid",
+ "email",
+ "slug",
+ "sent_at",
+ "opened_at",
+ "completed_at",
+ "declined_at",
+ "created_at",
+ "updated_at",
+ "name",
+ "phone",
+ "status",
+ "role",
+ "metadata",
+ "preferences"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Submission unique ID number."
+ },
+ "submission_id": {
+ "type": "integer",
+ "description": "Submission ID number."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Submitter UUID."
+ },
+ "email": {
+ "type": "string",
+ "nullable": true,
+ "description": "The email address of the submitter."
+ },
+ "slug": {
+ "type": "string",
+ "description": "Unique key to be used in the form signing link and embedded form."
+ },
+ "sent_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the signing request was sent to the submitter."
+ },
+ "opened_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter opened the signing form."
+ },
+ "completed_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter completed the signing form."
+ },
+ "declined_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter declined to complete the signing form."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The date and time when the submitter was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "The date and time when the submitter was last updated."
+ },
+ "name": {
+ "type": "string",
+ "nullable": true,
+ "description": "Submitter name."
+ },
+ "phone": {
+ "type": "string",
+ "nullable": true,
+ "description": "Submitter phone number."
+ },
+ "external_id": {
+ "type": "string",
+ "nullable": true,
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "status": {
+ "type": "string",
+ "description": "The status of signing request for the submitter.",
+ "enum": [
+ "completed",
+ "declined",
+ "opened",
+ "sent",
+ "awaiting"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "The role of the submitter."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information."
+ },
+ "preferences": {
+ "type": "object",
+ "description": "Object with submitter preferences."
+ }
+ }
+ }
+ },
+ "template": {
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "external_id",
+ "folder_name",
+ "created_at",
+ "updated_at"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Template unique ID number."
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the submission template."
+ },
+ "external_id": {
+ "type": "string",
+ "nullable": true,
+ "description": "Your application-specific unique string key to identify this template within your app."
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "Folder name where the template is located."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The date and time when the submission template was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "The date and time when the submission template was last updated."
+ }
+ }
+ },
+ "created_by_user": {
+ "type": "object",
+ "nullable": true,
+ "required": [
+ "id",
+ "first_name",
+ "last_name",
+ "email"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the user who created the submission."
+ },
+ "first_name": {
+ "type": "string",
+ "description": "The first name of the user who created the submission."
+ },
+ "last_name": {
+ "type": "string",
+ "description": "The last name of the user who created the submission."
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the user who created the submission."
+ }
+ }
+ }
+ }
+ }
+ },
+ "pagination": {
+ "type": "object",
+ "required": [
+ "count",
+ "next",
+ "prev"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "description": "Submissions count."
+ },
+ "next": {
+ "type": "integer",
+ "nullable": true,
+ "description": "The ID of the submission after which the next page starts."
+ },
+ "prev": {
+ "type": "integer",
+ "nullable": true,
+ "description": "The ID of the submission before which the previous page ends."
+ }
+ }
+ }
+ }
+ },
+ "example": {
+ "data": [
+ {
+ "id": 1,
+ "name": null,
+ "source": "link",
+ "submitters_order": "random",
+ "slug": "VyL4szTwYoSvXq",
+ "status": "completed",
+ "audit_log_url": "https://docuseal.com/file/hash/example.pdf",
+ "combined_document_url": null,
+ "expire_at": null,
+ "completed_at": "2023-12-10T15:49:21.895Z",
+ "created_at": "2023-12-10T15:48:17.166Z",
+ "updated_at": "2023-12-10T15:49:21.895Z",
+ "archived_at": null,
+ "submitters": [
+ {
+ "id": 1,
+ "submission_id": 1,
+ "uuid": "0954d146-db8c-4772-aafe-2effc7c0e0c0",
+ "email": "submitter@example.com",
+ "slug": "dsEeWrhRD8yDXT",
+ "sent_at": "2023-12-14T15:45:49.011Z",
+ "opened_at": "2023-12-14T15:48:23.011Z",
+ "completed_at": "2023-12-14T15:49:21.701Z",
+ "declined_at": null,
+ "created_at": "2023-12-10T15:48:17.173Z",
+ "updated_at": "2023-12-14T15:50:21.799Z",
+ "name": "John Doe",
+ "phone": "+1234567890",
+ "status": "completed",
+ "role": "First Party",
+ "metadata": {},
+ "preferences": {}
+ }
+ ],
+ "template": {
+ "id": 1,
+ "name": "Example Template",
+ "external_id": "Temp123",
+ "folder_name": "Default",
+ "created_at": "2023-12-14T15:50:21.799Z",
+ "updated_at": "2023-12-14T15:50:21.799Z"
+ },
+ "created_by_user": {
+ "id": 1,
+ "first_name": "Bob",
+ "last_name": "Smith",
+ "email": "bob.smith@example.com"
+ }
+ }
+ ],
+ "pagination": {
+ "count": 1,
+ "next": 1,
+ "prev": 1
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission",
+ "description": "This API endpoint allows you to create signature requests (submissions) for a document template and send them to the specified submitters (signers). Related Guides Send documents for signature via API Pre-fill PDF document form fields with API",
+ "operationId": "createSubmission",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_id",
+ "submitters"
+ ],
+ "properties": {
+ "template_id": {
+ "type": "integer",
+ "description": "The unique identifier of the template. Document template forms can be created via the Web UI, PDF and DOCX API, or HTML API.",
+ "example": 1000001
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject for the submitter."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body for the submitter. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for template document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document template field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "submission_id",
+ "uuid",
+ "email",
+ "slug",
+ "status",
+ "values",
+ "metadata",
+ "sent_at",
+ "opened_at",
+ "completed_at",
+ "declined_at",
+ "created_at",
+ "updated_at",
+ "name",
+ "phone",
+ "external_id",
+ "preferences",
+ "role",
+ "embed_src"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Submitter unique ID number."
+ },
+ "submission_id": {
+ "type": "integer",
+ "description": "Submission UUID."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Submitter UUID."
+ },
+ "email": {
+ "type": "string",
+ "nullable": true,
+ "description": "The email address of the submitter."
+ },
+ "slug": {
+ "type": "string",
+ "description": "Unique key to be used in the signing form URL."
+ },
+ "status": {
+ "type": "string",
+ "description": "The status of signing request for the submitter.",
+ "enum": [
+ "completed",
+ "declined",
+ "opened",
+ "sent",
+ "awaiting"
+ ]
+ },
+ "values": {
+ "type": "array",
+ "description": "An array of pre-filled values for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "field",
+ "value"
+ ],
+ "properties": {
+ "field": {
+ "type": "string",
+ "description": "Document template field name."
+ },
+ "value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Pre-filled value of the field."
+ }
+ }
+ }
+ },
+ "metadata": {
+ "type": "object"
+ },
+ "sent_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the signing request was sent to the submitter."
+ },
+ "opened_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter opened the signing form."
+ },
+ "completed_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter completed the signing form."
+ },
+ "declined_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter declined the signing form."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The date and time when the submitter was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "The date and time when the submitter was last updated."
+ },
+ "name": {
+ "type": "string",
+ "nullable": true,
+ "description": "The name of the submitter."
+ },
+ "phone": {
+ "type": "string",
+ "nullable": true,
+ "description": "The phone number of the submitter."
+ },
+ "external_id": {
+ "type": "string",
+ "nullable": true,
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "send_email": {
+ "type": "boolean",
+ "description": "Indicates whether the signature request email should be sent."
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Indicates whether the signature request should be sent via SMS."
+ }
+ }
+ },
+ "role": {
+ "type": "string",
+ "description": "The role of the submitter in the signing process."
+ },
+ "embed_src": {
+ "type": "string",
+ "description": "The `src` URL value to embed the signing form or sign via a link."
+ }
+ }
+ }
+ },
+ "example": [
+ {
+ "id": 1,
+ "submission_id": 1,
+ "uuid": "884d545b-3396-49f1-8c07-05b8b2a78755",
+ "email": "john.doe@example.com",
+ "slug": "pAMimKcyrLjqVt",
+ "sent_at": "2023-12-13T23:04:04.252Z",
+ "opened_at": null,
+ "completed_at": null,
+ "declined_at": null,
+ "created_at": "2023-12-14T15:50:21.799Z",
+ "updated_at": "2023-12-14T15:50:21.799Z",
+ "name": "string",
+ "phone": "+1234567890",
+ "external_id": "2321",
+ "metadata": {
+ "customData": "custom value"
+ },
+ "status": "sent",
+ "values": [
+ {
+ "field": "Full Name",
+ "value": "John Doe"
+ }
+ ],
+ "preferences": {
+ "send_email": true,
+ "send_sms": false
+ },
+ "role": "First Party",
+ "embed_src": "https://docuseal.com/s/pAMimKcyrLjqVt"
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ },
+ "/submissions/{id}": {
+ "get": {
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Get a submission",
+ "description": "The API endpoint provides the functionality to retrieve information about a submission.",
+ "operationId": "getSubmission",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "id",
+ "slug",
+ "source",
+ "submitters_order",
+ "audit_log_url",
+ "combined_document_url",
+ "created_at",
+ "updated_at",
+ "archived_at",
+ "submitters",
+ "created_by_user",
+ "submission_events",
+ "documents",
+ "status",
+ "metadata",
+ "completed_at"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Submission unique ID number."
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission",
+ "example": "Test Submission Document"
+ },
+ "slug": {
+ "type": "string",
+ "description": "Unique slug of the submission."
+ },
+ "source": {
+ "type": "string",
+ "description": "The source of the submission.",
+ "enum": [
+ "invite",
+ "bulk",
+ "api",
+ "embed",
+ "link"
+ ]
+ },
+ "submitters_order": {
+ "type": "string",
+ "description": "The order of submitters.",
+ "enum": [
+ "random",
+ "preserved"
+ ]
+ },
+ "audit_log_url": {
+ "type": "string",
+ "nullable": true,
+ "description": "Audit log file URL."
+ },
+ "combined_document_url": {
+ "type": "string",
+ "nullable": true,
+ "description": "Combined PDF file URL with documents and Audit Log."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The date and time when the submission was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "The date and time when the submission was last updated."
+ },
+ "archived_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submission was archived."
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters.",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "submission_id",
+ "uuid",
+ "email",
+ "slug",
+ "sent_at",
+ "opened_at",
+ "completed_at",
+ "declined_at",
+ "created_at",
+ "updated_at",
+ "name",
+ "phone",
+ "external_id",
+ "status",
+ "values",
+ "documents",
+ "role"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Submitter unique ID number."
+ },
+ "submission_id": {
+ "type": "integer",
+ "description": "Submission unique ID number."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Submitter UUID."
+ },
+ "email": {
+ "type": "string",
+ "nullable": true,
+ "description": "The email address of the submitter."
+ },
+ "slug": {
+ "type": "string",
+ "description": "Unique key to be used in the form signing link and embedded form."
+ },
+ "sent_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the signing request was sent to the submitter."
+ },
+ "opened_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter opened the signing form."
+ },
+ "completed_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter completed the signing form."
+ },
+ "declined_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter declined the signing form."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The date and time when the submitter was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "The date and time when the submitter was last updated."
+ },
+ "name": {
+ "type": "string",
+ "nullable": true,
+ "description": "Submitter name."
+ },
+ "phone": {
+ "type": "string",
+ "nullable": true,
+ "description": "Submitter phone number."
+ },
+ "external_id": {
+ "type": "string",
+ "nullable": true,
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "status": {
+ "type": "string",
+ "description": "The status of signing request for the submitter.",
+ "enum": [
+ "completed",
+ "declined",
+ "opened",
+ "sent",
+ "awaiting"
+ ]
+ },
+ "values": {
+ "type": "array",
+ "description": "An array of field values for the submitter.",
+ "items": {
+ "type": "object",
+ "required": [
+ "field",
+ "value"
+ ],
+ "properties": {
+ "field": {
+ "type": "string",
+ "description": "Document template field name."
+ },
+ "value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Pre-filled value of the field."
+ }
+ }
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "An array of completed or signed documents by the submitter.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "url"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name."
+ },
+ "url": {
+ "type": "string",
+ "description": "Document URL."
+ }
+ }
+ }
+ },
+ "role": {
+ "type": "string",
+ "description": "The role of the submitter in the signing process."
+ }
+ }
+ }
+ },
+ "template": {
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "external_id",
+ "folder_name",
+ "created_at",
+ "updated_at"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Template unique ID number."
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the submission template."
+ },
+ "external_id": {
+ "type": "string",
+ "nullable": true,
+ "description": "Your application-specific unique string key to identify this template within your app."
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "Folder name where the template is located."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The date and time when the submission template was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "The date and time when the submission template was last updated."
+ }
+ }
+ },
+ "created_by_user": {
+ "type": "object",
+ "nullable": true,
+ "required": [
+ "id",
+ "first_name",
+ "last_name",
+ "email"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the user who created the submission."
+ },
+ "first_name": {
+ "type": "string",
+ "description": "The first name of the user who created the submission."
+ },
+ "last_name": {
+ "type": "string",
+ "description": "The last name of the user who created the submission."
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the user who created the submission."
+ }
+ }
+ },
+ "submission_events": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "submitter_id",
+ "event_type",
+ "event_timestamp"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Submission event unique ID number."
+ },
+ "submitter_id": {
+ "type": "integer",
+ "description": "Unique identifier of the submitter that triggered the event."
+ },
+ "event_type": {
+ "type": "string",
+ "description": "Event type.",
+ "enum": [
+ "send_email",
+ "bounce_email",
+ "complaint_email",
+ "send_reminder_email",
+ "send_sms",
+ "send_2fa_sms",
+ "open_email",
+ "click_email",
+ "click_sms",
+ "phone_verified",
+ "start_form",
+ "start_verification",
+ "complete_verification",
+ "view_form",
+ "invite_party",
+ "complete_form",
+ "decline_form",
+ "api_complete_form"
+ ]
+ },
+ "event_timestamp": {
+ "type": "string",
+ "description": "Date and time when the event was triggered."
+ }
+ }
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "An array of completed or signed documents of the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "url"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name."
+ },
+ "url": {
+ "type": "string",
+ "description": "Document URL."
+ }
+ }
+ }
+ },
+ "status": {
+ "type": "string",
+ "description": "The status of the submission.",
+ "enum": [
+ "completed",
+ "declined",
+ "expired",
+ "pending"
+ ]
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Object with custom metadata."
+ },
+ "completed_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submission was fully completed."
+ }
+ }
+ },
+ "example": {
+ "id": 1,
+ "name": null,
+ "source": "link",
+ "submitters_order": "random",
+ "slug": "VyL4szTwYoSvXq",
+ "audit_log_url": "https://docuseal.com/blobs/proxy/hash/example.pdf",
+ "combined_document_url": null,
+ "completed_at": "2023-12-14T15:49:21.701Z",
+ "expire_at": null,
+ "created_at": "2023-12-10T15:48:17.166Z",
+ "updated_at": "2023-12-10T15:49:21.895Z",
+ "archived_at": null,
+ "submitters": [
+ {
+ "id": 1,
+ "submission_id": 1,
+ "uuid": "0954d146-db8c-4772-aafe-2effc7c0e0c0",
+ "email": "submitter@example.com",
+ "slug": "dsEeWrhRD8yDXT",
+ "sent_at": "2023-12-14T15:45:49.011Z",
+ "opened_at": "2023-12-14T15:48:23.011Z",
+ "completed_at": "2023-12-14T15:49:21.701Z",
+ "declined_at": null,
+ "created_at": "2023-12-14T15:48:17.173Z",
+ "updated_at": "2023-12-14T15:50:21.799Z",
+ "name": "John Doe",
+ "phone": "+1234567890",
+ "external_id": null,
+ "status": "completed",
+ "metadata": {},
+ "values": [
+ {
+ "field": "Full Name",
+ "value": "John Doe"
+ }
+ ],
+ "documents": [
+ {
+ "name": "example",
+ "url": "https://docuseal.com/blobs/proxy/hash/example.pdf"
+ }
+ ],
+ "role": "First Party"
+ }
+ ],
+ "template": {
+ "id": 1,
+ "name": "Example Template",
+ "external_id": "Temp123",
+ "folder_name": "Default",
+ "created_at": "2023-12-14T15:50:21.799Z",
+ "updated_at": "2023-12-14T15:50:21.799Z"
+ },
+ "created_by_user": {
+ "id": 1,
+ "first_name": "Bob",
+ "last_name": "Smith",
+ "email": "bob.smith@example.com"
+ },
+ "submission_events": [
+ {
+ "id": 1,
+ "submitter_id": 2,
+ "event_type": "view_form",
+ "event_timestamp": "2023-12-14T15:47:24.566Z"
+ }
+ ],
+ "documents": [
+ {
+ "name": "example",
+ "url": "https://docuseal.com/file/hash/example.pdf"
+ }
+ ],
+ "status": "completed"
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Archive a submission",
+ "description": "The API endpoint allows you to archive a submission.",
+ "operationId": "archiveSubmission",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "id",
+ "archived_at"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Submission unique ID number."
+ },
+ "archived_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "Date and time when the submission was archived."
+ }
+ }
+ },
+ "example": {
+ "id": 1,
+ "archived_at": "2023-12-14T15:50:21.799Z"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/submissions/{id}/documents": {
+ "get": {
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Get submission documents",
+ "description": "This endpoint returns a list of partially filled documents for a submission. If the submission has been completed, the final signed documents are returned.",
+ "operationId": "getSubmissionDocuments",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submission.",
+ "example": 1001
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "id",
+ "documents"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Submission unique ID number."
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "url"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name."
+ },
+ "url": {
+ "type": "string",
+ "description": "Document URL."
+ }
+ }
+ }
+ }
+ }
+ },
+ "example": {
+ "id": 1,
+ "documents": [
+ {
+ "name": "example",
+ "url": "https://docuseal.com/file/hash/example.pdf"
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/submissions/emails": {
+ "post": {
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create submissions from emails",
+ "description": "This API endpoint allows you to create submissions for a document template and send them to the specified email addresses. This is a simplified version of the POST /submissions API to be used with Zapier or other automation tools.",
+ "operationId": "createSubmissionsFromEmails",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_id",
+ "emails"
+ ],
+ "properties": {
+ "template_id": {
+ "type": "integer",
+ "description": "The unique identifier of the template.",
+ "example": 1000001
+ },
+ "emails": {
+ "type": "string",
+ "description": "A comma-separated list of email addresses to send the submission to.",
+ "example": "{{emails}}"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "submission_id",
+ "uuid",
+ "email",
+ "slug",
+ "status",
+ "values",
+ "metadata",
+ "sent_at",
+ "opened_at",
+ "completed_at",
+ "declined_at",
+ "created_at",
+ "updated_at",
+ "name",
+ "phone",
+ "external_id",
+ "preferences",
+ "role",
+ "embed_src"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Submitter unique ID number."
+ },
+ "submission_id": {
+ "type": "integer",
+ "description": "Submission UUID."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Submitter UUID."
+ },
+ "email": {
+ "type": "string",
+ "nullable": true,
+ "description": "The email address of the submitter."
+ },
+ "slug": {
+ "type": "string",
+ "description": "Unique key to be used in the signing form URL."
+ },
+ "status": {
+ "type": "string",
+ "description": "The status of signing request for the submitter.",
+ "enum": [
+ "completed",
+ "declined",
+ "opened",
+ "sent",
+ "awaiting"
+ ]
+ },
+ "values": {
+ "type": "array",
+ "description": "An array of pre-filled values for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "field",
+ "value"
+ ],
+ "properties": {
+ "field": {
+ "type": "string",
+ "description": "Document template field name."
+ },
+ "value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Pre-filled value of the field."
+ }
+ }
+ }
+ },
+ "metadata": {
+ "type": "object"
+ },
+ "sent_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the signing request was sent to the submitter."
+ },
+ "opened_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter opened the signing form."
+ },
+ "completed_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter completed the signing form."
+ },
+ "declined_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter declined the signing form."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The date and time when the submitter was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "The date and time when the submitter was last updated."
+ },
+ "name": {
+ "type": "string",
+ "nullable": true,
+ "description": "The name of the submitter."
+ },
+ "phone": {
+ "type": "string",
+ "nullable": true,
+ "description": "The phone number of the submitter."
+ },
+ "external_id": {
+ "type": "string",
+ "nullable": true,
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "send_email": {
+ "type": "boolean",
+ "description": "Indicates whether the signature request email should be sent."
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Indicates whether the signature request should be sent via SMS."
+ }
+ }
+ },
+ "role": {
+ "type": "string",
+ "description": "The role of the submitter in the signing process."
+ },
+ "embed_src": {
+ "type": "string",
+ "description": "The `src` URL value to embed the signing form or sign via a link."
+ }
+ }
+ }
+ },
+ "example": [
+ {
+ "id": 1,
+ "submission_id": 1,
+ "uuid": "884d545b-3396-49f1-8c07-05b8b2a78755",
+ "email": "john.doe@example.com",
+ "slug": "pAMimKcyrLjqVt",
+ "sent_at": "2023-12-13T23:04:04.252Z",
+ "opened_at": null,
+ "completed_at": null,
+ "declined_at": null,
+ "created_at": "2023-12-14T15:50:21.799Z",
+ "updated_at": "2023-12-14T15:50:21.799Z",
+ "name": "string",
+ "phone": "+1234567890",
+ "external_id": "2321",
+ "metadata": {
+ "customData": "custom value"
+ },
+ "status": "sent",
+ "values": [
+ {
+ "field": "Full Name",
+ "value": "John Doe"
+ }
+ ],
+ "preferences": {
+ "send_email": true,
+ "send_sms": false
+ },
+ "role": "First Party",
+ "embed_src": "https://docuseal.com/s/pAMimKcyrLjqVt"
+ },
+ {
+ "id": 2,
+ "submission_id": 1,
+ "uuid": "884d545b-3396-49f1-8c07-05b8b2a78755",
+ "email": "alan.smith@example.com",
+ "slug": "SEwc65vHNDH3QS",
+ "sent_at": "2023-12-13T23:04:04.252Z",
+ "opened_at": null,
+ "completed_at": null,
+ "declined_at": null,
+ "created_at": "2023-12-14T15:50:21.799Z",
+ "updated_at": "2023-12-14T15:50:21.799Z",
+ "name": "string",
+ "phone": "+1234567890",
+ "external_id": "2321",
+ "metadata": {
+ "customData": "custom value"
+ },
+ "status": "sent",
+ "values": [
+ {
+ "field": "Full Name",
+ "value": "Roe Moe"
+ }
+ ],
+ "preferences": {
+ "send_email": true,
+ "send_sms": false
+ },
+ "role": "First Party",
+ "embed_src": "SEwc65vHNDH3QS"
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ },
+ "/submissions/pdf": {
+ "post": {
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from PDF",
+ "description": "The API endpoint provides the functionality to create one-off submission request from a PDF. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form\n",
+ "operationId": "createSubmissionFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission.",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ }
+ }
+ }
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the documents.",
+ "default": false
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "id",
+ "submitters",
+ "source",
+ "submitters_order",
+ "status",
+ "documents",
+ "expire_at",
+ "created_at"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Submission unique ID number."
+ },
+ "name": {
+ "type": "string",
+ "description": "Submission name."
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters.",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "submission_id",
+ "uuid",
+ "email",
+ "slug",
+ "sent_at",
+ "opened_at",
+ "completed_at",
+ "declined_at",
+ "created_at",
+ "updated_at",
+ "name",
+ "phone",
+ "status",
+ "role",
+ "metadata",
+ "preferences"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Submission unique ID number."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Submitter UUID."
+ },
+ "email": {
+ "type": "string",
+ "nullable": true,
+ "description": "The email address of the submitter."
+ },
+ "slug": {
+ "type": "string",
+ "description": "Unique key to be used in the form signing link and embedded form."
+ },
+ "sent_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the signing request was sent to the submitter."
+ },
+ "opened_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter opened the signing form."
+ },
+ "completed_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter completed the signing form."
+ },
+ "declined_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter declined to complete the signing form."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The date and time when the submitter was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "The date and time when the submitter was last updated."
+ },
+ "name": {
+ "type": "string",
+ "nullable": true,
+ "description": "Submitter name."
+ },
+ "phone": {
+ "type": "string",
+ "nullable": true,
+ "description": "Submitter phone number."
+ },
+ "external_id": {
+ "type": "string",
+ "nullable": true,
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "status": {
+ "type": "string",
+ "description": "The status of signing request for the submitter.",
+ "enum": [
+ "completed",
+ "declined",
+ "opened",
+ "sent",
+ "awaiting"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "The role of the submitter."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information."
+ },
+ "preferences": {
+ "type": "object",
+ "description": "Object with submitter preferences."
+ },
+ "embed_src": {
+ "type": "string",
+ "description": "The `src` URL value to embed the signing form or sign via a link."
+ }
+ }
+ }
+ },
+ "source": {
+ "type": "string",
+ "description": "The source of the submission.",
+ "enum": [
+ "invite",
+ "bulk",
+ "api",
+ "embed",
+ "link"
+ ]
+ },
+ "submitters_order": {
+ "type": "string",
+ "description": "The order of submitters.",
+ "enum": [
+ "random",
+ "preserved"
+ ]
+ },
+ "status": {
+ "type": "string",
+ "description": "The status of the submission.",
+ "enum": [
+ "completed",
+ "declined",
+ "expired",
+ "pending"
+ ]
+ },
+ "schema": {
+ "type": "array",
+ "description": "The one-off submission document files.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "attachment_uuid": {
+ "type": "string",
+ "description": "The attachment UUID."
+ },
+ "name": {
+ "type": "string",
+ "description": "The attachment name."
+ }
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "List of fields to be filled in the one-off submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "uuid",
+ "submitter_uuid",
+ "name",
+ "type",
+ "required",
+ "areas"
+ ],
+ "properties": {
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the field."
+ },
+ "submitter_uuid": {
+ "type": "string",
+ "description": "Unique identifier of the submitter that filled the field."
+ },
+ "name": {
+ "type": "string",
+ "description": "Field name."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels."
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value."
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value."
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value."
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value."
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value."
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types."
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields."
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields."
+ },
+ "mask": {
+ "type": "boolean",
+ "description": "Indicates if the field is masked on the document."
+ }
+ }
+ },
+ "areas": {
+ "type": "array",
+ "description": "List of areas where the field is located in the document.",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "attachment_uuid",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X coordinate of the area where the field is located in the document."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y coordinate of the area where the field is located in the document."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the area where the field is located in the document."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the area where the field is located in the document."
+ },
+ "attachment_uuid": {
+ "type": "string",
+ "description": "Unique identifier of the attached document where the field is located."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the attached document where the field is located."
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "List of documents attached to the one-off submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "attachment_uuid",
+ "name"
+ ],
+ "properties": {
+ "attachment_uuid": {
+ "type": "string",
+ "description": "Unique indentifier of attached document to the one-off submission."
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the attached document to the one-off submission."
+ }
+ }
+ }
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The date and time when the submission was created."
+ }
+ }
+ },
+ "example": {
+ "id": 5,
+ "name": "Test Submission",
+ "submitters": [
+ {
+ "id": 1,
+ "uuid": "884d545b-3396-49f1-8c07-05b8b2a78755",
+ "email": "john.doe@example.com",
+ "slug": "pAMimKcyrLjqVt",
+ "sent_at": "2025-06-02T15:55:51.310Z",
+ "opened_at": null,
+ "completed_at": null,
+ "declined_at": null,
+ "created_at": "2025-06-02T15:55:50.320Z",
+ "updated_at": "2025-06-02T15:55:50.320Z",
+ "name": "string",
+ "phone": "+1234567890",
+ "external_id": "2321",
+ "metadata": {
+ "customData": "custom value"
+ },
+ "status": "sent",
+ "values": [
+ {
+ "field": "Full Name",
+ "value": "John Doe"
+ }
+ ],
+ "preferences": {
+ "send_email": true,
+ "send_sms": false,
+ "reply_to": "reply@example.com",
+ "completed_redirect_url": "https://example.com/"
+ },
+ "role": "First Party",
+ "embed_src": "https://docuseal.com/s/pAMimKcyrLjqVt"
+ }
+ ],
+ "source": "api",
+ "submitters_order": "preserved",
+ "status": "pending",
+ "schema": [
+ {
+ "name": "Demo PDF",
+ "attachment_uuid": "48d2998f-266b-47e4-beb2-250ab7ccebdf"
+ }
+ ],
+ "fields": [
+ {
+ "name": "Name",
+ "type": "text",
+ "required": true,
+ "uuid": "d0bf3c0c-1928-40c8-80f9-d9f3c6ad4eff",
+ "submitter_uuid": "0b0bff58-bc9a-475d-b4a9-2f3e5323faf7",
+ "areas": [
+ {
+ "page": 1,
+ "attachment_uuid": "48d2998f-266b-47e4-beb2-250ab7ccebdf",
+ "x": 0.403158189124654,
+ "y": 0.04211750189825361,
+ "w": 0.100684625476058,
+ "h": 0.01423690205011389
+ }
+ ]
+ }
+ ],
+ "expire_at": null,
+ "created_at": "2025-06-02T15:55:50.270Z"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/submissions/docx": {
+ "post": {
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from DOCX",
+ "description": "The API endpoint provides functionality to create a one-off submission request from a DOCX file with dynamic content variables. Use [[variable_name]] text tags to define dynamic content variables in the document. See https://www.docuseal.com/examples/demo_template.docx for the specific text variable syntax, including dynamic content tables and list. You can also use the {{signature}} fillable field syntax to define fillable fields, as in a PDF. Related Guides Use embedded text field tags to create a fillable form",
+ "operationId": "createSubmissionFromDocx",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission.",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "variables": {
+ "type": "object",
+ "description": "Dynamic content variables object",
+ "example": {
+ "variable_name": "value"
+ }
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF or DOCX file or downloadable file URL."
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "id",
+ "submitters",
+ "source",
+ "submitters_order",
+ "status",
+ "documents",
+ "expire_at",
+ "created_at"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Submission unique ID number."
+ },
+ "name": {
+ "type": "string",
+ "description": "Submission name."
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters.",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "submission_id",
+ "uuid",
+ "email",
+ "slug",
+ "sent_at",
+ "opened_at",
+ "completed_at",
+ "declined_at",
+ "created_at",
+ "updated_at",
+ "name",
+ "phone",
+ "status",
+ "role",
+ "metadata",
+ "preferences"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Submission unique ID number."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Submitter UUID."
+ },
+ "email": {
+ "type": "string",
+ "nullable": true,
+ "description": "The email address of the submitter."
+ },
+ "slug": {
+ "type": "string",
+ "description": "Unique key to be used in the form signing link and embedded form."
+ },
+ "sent_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the signing request was sent to the submitter."
+ },
+ "opened_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter opened the signing form."
+ },
+ "completed_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter completed the signing form."
+ },
+ "declined_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter declined to complete the signing form."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The date and time when the submitter was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "The date and time when the submitter was last updated."
+ },
+ "name": {
+ "type": "string",
+ "nullable": true,
+ "description": "Submitter name."
+ },
+ "phone": {
+ "type": "string",
+ "nullable": true,
+ "description": "Submitter phone number."
+ },
+ "external_id": {
+ "type": "string",
+ "nullable": true,
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "status": {
+ "type": "string",
+ "description": "The status of signing request for the submitter.",
+ "enum": [
+ "completed",
+ "declined",
+ "opened",
+ "sent",
+ "awaiting"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "The role of the submitter."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information."
+ },
+ "preferences": {
+ "type": "object",
+ "description": "Object with submitter preferences."
+ },
+ "embed_src": {
+ "type": "string",
+ "description": "The `src` URL value to embed the signing form or sign via a link."
+ }
+ }
+ }
+ },
+ "source": {
+ "type": "string",
+ "description": "The source of the submission.",
+ "enum": [
+ "invite",
+ "bulk",
+ "api",
+ "embed",
+ "link"
+ ]
+ },
+ "submitters_order": {
+ "type": "string",
+ "description": "The order of submitters.",
+ "enum": [
+ "random",
+ "preserved"
+ ]
+ },
+ "status": {
+ "type": "string",
+ "description": "The status of the submission.",
+ "enum": [
+ "completed",
+ "declined",
+ "expired",
+ "pending"
+ ]
+ },
+ "schema": {
+ "type": "array",
+ "description": "The one-off submission document files.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "attachment_uuid": {
+ "type": "string",
+ "description": "The attachment UUID."
+ },
+ "name": {
+ "type": "string",
+ "description": "The attachment name."
+ }
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "List of fields to be filled in the one-off submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "uuid",
+ "submitter_uuid",
+ "name",
+ "type",
+ "required",
+ "areas"
+ ],
+ "properties": {
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the field."
+ },
+ "submitter_uuid": {
+ "type": "string",
+ "description": "Unique identifier of the submitter that filled the field."
+ },
+ "name": {
+ "type": "string",
+ "description": "Field name."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels."
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value."
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value."
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value."
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value."
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value."
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types."
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields."
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields."
+ },
+ "mask": {
+ "type": "boolean",
+ "description": "Indicates if the field is masked on the document."
+ }
+ }
+ },
+ "areas": {
+ "type": "array",
+ "description": "List of areas where the field is located in the document.",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "attachment_uuid",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X coordinate of the area where the field is located in the document."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y coordinate of the area where the field is located in the document."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the area where the field is located in the document."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the area where the field is located in the document."
+ },
+ "attachment_uuid": {
+ "type": "string",
+ "description": "Unique identifier of the attached document where the field is located."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the attached document where the field is located."
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "List of documents attached to the one-off submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "attachment_uuid",
+ "name"
+ ],
+ "properties": {
+ "attachment_uuid": {
+ "type": "string",
+ "description": "Unique indentifier of attached document to the one-off submission."
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the attached document to the one-off submission."
+ }
+ }
+ }
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The date and time when the submission was created."
+ }
+ }
+ },
+ "example": {
+ "id": 5,
+ "name": "Test Submission",
+ "submitters": [
+ {
+ "id": 1,
+ "uuid": "884d545b-3396-49f1-8c07-05b8b2a78755",
+ "email": "john.doe@example.com",
+ "slug": "pAMimKcyrLjqVt",
+ "sent_at": "2025-06-02T15:55:51.310Z",
+ "opened_at": null,
+ "completed_at": null,
+ "declined_at": null,
+ "created_at": "2025-06-02T15:55:50.320Z",
+ "updated_at": "2025-06-02T15:55:50.320Z",
+ "name": "string",
+ "phone": "+1234567890",
+ "external_id": "2321",
+ "metadata": {
+ "customData": "custom value"
+ },
+ "status": "sent",
+ "values": [
+ {
+ "field": "Full Name",
+ "value": "John Doe"
+ }
+ ],
+ "preferences": {
+ "send_email": true,
+ "send_sms": false,
+ "reply_to": "reply@example.com",
+ "completed_redirect_url": "https://example.com/"
+ },
+ "role": "First Party",
+ "embed_src": "https://docuseal.com/s/pAMimKcyrLjqVt"
+ }
+ ],
+ "source": "api",
+ "submitters_order": "preserved",
+ "status": "pending",
+ "schema": [
+ {
+ "name": "Demo PDF",
+ "attachment_uuid": "48d2998f-266b-47e4-beb2-250ab7ccebdf"
+ }
+ ],
+ "fields": [
+ {
+ "name": "Name",
+ "type": "text",
+ "required": true,
+ "uuid": "d0bf3c0c-1928-40c8-80f9-d9f3c6ad4eff",
+ "submitter_uuid": "0b0bff58-bc9a-475d-b4a9-2f3e5323faf7",
+ "areas": [
+ {
+ "page": 1,
+ "attachment_uuid": "48d2998f-266b-47e4-beb2-250ab7ccebdf",
+ "x": 0.403158189124654,
+ "y": 0.04211750189825361,
+ "w": 0.100684625476058,
+ "h": 0.01423690205011389
+ }
+ ]
+ }
+ ],
+ "expire_at": null,
+ "created_at": "2025-06-02T15:55:50.270Z"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/submissions/html": {
+ "post": {
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submissions"
+ ],
+ "summary": "Create a submission from HTML",
+ "description": "This API endpoint allows you to create a one-off submission request document using the provided HTML content, with special field tags rendered as a fillable and signable form. Related Guides Create PDF document fillable form with HTML",
+ "operationId": "createSubmissionFromHtml",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents",
+ "submitters"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document submission",
+ "example": "Test Submission Document"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "order": {
+ "type": "string",
+ "description": "Pass 'random' to send signature request emails to all parties right away. The order is 'preserved' by default so the second party will receive a signature request email only after the document is signed by the first party.",
+ "default": "preserved",
+ "enum": [
+ "preserved",
+ "random"
+ ]
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Specify URL to redirect to after the submission completion."
+ },
+ "bcc_completed": {
+ "type": "string",
+ "description": "Specify BCC address to send signed documents to after the completion."
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "template_ids": {
+ "type": "array",
+ "description": "An optional array of template IDs to use in the submission along with the provided documents. This can be used to create multi-document submissions when some of the required documents exist within templates.",
+ "items": {
+ "type": "integer",
+ "description": "The ID of the template to use for the submission."
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "The list of documents built from HTML. Can be used to create a submission with multiple documents.",
+ "items": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Document"
+ },
+ "html": {
+ "type": "string",
+ "description": "HTML document content with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "html_header": {
+ "type": "string",
+ "description": "HTML document content of the header to be displayed on every page."
+ },
+ "html_footer": {
+ "type": "string",
+ "description": "HTML document content of the footer to be displayed on every page."
+ },
+ "size": {
+ "type": "string",
+ "default": "Letter",
+ "description": "Page size. Letter 8.5 x 11 will be assigned when not specified.",
+ "enum": [
+ "Letter",
+ "Legal",
+ "Tabloid",
+ "Ledger",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6"
+ ],
+ "example": "A4"
+ },
+ "position": {
+ "type": "integer",
+ "description": "Document position in the submission. If not specified, the document will be added in the order it appears in the documents array."
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `false` to disable signature request emails sending only for this submitter.",
+ "default": true
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to send signature request via phone number and SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails for this submitter."
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "order": {
+ "type": "integer",
+ "description": "The order of the submitter in the workflow (e.g., 0 for the first signer, 1 for the second, etc.). Use the same order number to create order groups. By default, submitters are ordered as in the submitters array."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "roles": {
+ "type": "array",
+ "description": "A list of roles for the submitter. Use this param to merge multiple roles into one submitter.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{submission.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "merge_documents": {
+ "type": "boolean",
+ "description": "Set `true` to merge the documents into a single PDF file.",
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "id",
+ "submitters",
+ "source",
+ "submitters_order",
+ "status",
+ "documents",
+ "expire_at",
+ "created_at"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Submission unique ID number."
+ },
+ "name": {
+ "type": "string",
+ "description": "Submission name."
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters.",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "submission_id",
+ "uuid",
+ "email",
+ "slug",
+ "sent_at",
+ "opened_at",
+ "completed_at",
+ "declined_at",
+ "created_at",
+ "updated_at",
+ "name",
+ "phone",
+ "status",
+ "role",
+ "metadata",
+ "preferences"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Submission unique ID number."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Submitter UUID."
+ },
+ "email": {
+ "type": "string",
+ "nullable": true,
+ "description": "The email address of the submitter."
+ },
+ "slug": {
+ "type": "string",
+ "description": "Unique key to be used in the form signing link and embedded form."
+ },
+ "sent_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the signing request was sent to the submitter."
+ },
+ "opened_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter opened the signing form."
+ },
+ "completed_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter completed the signing form."
+ },
+ "declined_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter declined to complete the signing form."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The date and time when the submitter was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "The date and time when the submitter was last updated."
+ },
+ "name": {
+ "type": "string",
+ "nullable": true,
+ "description": "Submitter name."
+ },
+ "phone": {
+ "type": "string",
+ "nullable": true,
+ "description": "Submitter phone number."
+ },
+ "external_id": {
+ "type": "string",
+ "nullable": true,
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "status": {
+ "type": "string",
+ "description": "The status of signing request for the submitter.",
+ "enum": [
+ "completed",
+ "declined",
+ "opened",
+ "sent",
+ "awaiting"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "The role of the submitter."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information."
+ },
+ "preferences": {
+ "type": "object",
+ "description": "Object with submitter preferences."
+ },
+ "embed_src": {
+ "type": "string",
+ "description": "The `src` URL value to embed the signing form or sign via a link."
+ }
+ }
+ }
+ },
+ "source": {
+ "type": "string",
+ "description": "The source of the submission.",
+ "enum": [
+ "invite",
+ "bulk",
+ "api",
+ "embed",
+ "link"
+ ]
+ },
+ "submitters_order": {
+ "type": "string",
+ "description": "The order of submitters.",
+ "enum": [
+ "random",
+ "preserved"
+ ]
+ },
+ "status": {
+ "type": "string",
+ "description": "The status of the submission.",
+ "enum": [
+ "completed",
+ "declined",
+ "expired",
+ "pending"
+ ]
+ },
+ "schema": {
+ "type": "array",
+ "description": "The one-off submission document files.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "attachment_uuid": {
+ "type": "string",
+ "description": "The attachment UUID."
+ },
+ "name": {
+ "type": "string",
+ "description": "The attachment name."
+ }
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "List of fields to be filled in the one-off submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "uuid",
+ "submitter_uuid",
+ "name",
+ "type",
+ "required",
+ "areas"
+ ],
+ "properties": {
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the field."
+ },
+ "submitter_uuid": {
+ "type": "string",
+ "description": "Unique identifier of the submitter that filled the field."
+ },
+ "name": {
+ "type": "string",
+ "description": "Field name."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels."
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value."
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value."
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value."
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value."
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value."
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types."
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields."
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields."
+ },
+ "mask": {
+ "type": "boolean",
+ "description": "Indicates if the field is masked on the document."
+ }
+ }
+ },
+ "areas": {
+ "type": "array",
+ "description": "List of areas where the field is located in the document.",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "attachment_uuid",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X coordinate of the area where the field is located in the document."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y coordinate of the area where the field is located in the document."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the area where the field is located in the document."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the area where the field is located in the document."
+ },
+ "attachment_uuid": {
+ "type": "string",
+ "description": "Unique identifier of the attached document where the field is located."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the attached document where the field is located."
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "List of documents attached to the one-off submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "attachment_uuid",
+ "name"
+ ],
+ "properties": {
+ "attachment_uuid": {
+ "type": "string",
+ "description": "Unique indentifier of attached document to the one-off submission."
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the attached document to the one-off submission."
+ }
+ }
+ }
+ },
+ "expire_at": {
+ "type": "string",
+ "description": "Specify the expiration date and time after which the submission becomes unavailable for signature.",
+ "example": "2024-09-01 12:00:00 UTC"
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The date and time when the submission was created."
+ }
+ }
+ },
+ "example": {
+ "id": 5,
+ "name": "Test Submission",
+ "submitters": [
+ {
+ "id": 1,
+ "uuid": "884d545b-3396-49f1-8c07-05b8b2a78755",
+ "email": "john.doe@example.com",
+ "slug": "pAMimKcyrLjqVt",
+ "sent_at": "2025-06-02T15:55:51.310Z",
+ "opened_at": null,
+ "completed_at": null,
+ "declined_at": null,
+ "created_at": "2025-06-02T15:55:50.320Z",
+ "updated_at": "2025-06-02T15:55:50.320Z",
+ "name": "string",
+ "phone": "+1234567890",
+ "external_id": "2321",
+ "metadata": {
+ "customData": "custom value"
+ },
+ "status": "sent",
+ "values": [
+ {
+ "field": "Full Name",
+ "value": "John Doe"
+ }
+ ],
+ "preferences": {
+ "send_email": true,
+ "send_sms": false,
+ "reply_to": "reply@example.com",
+ "completed_redirect_url": "https://example.com/"
+ },
+ "role": "First Party",
+ "embed_src": "https://docuseal.com/s/pAMimKcyrLjqVt"
+ }
+ ],
+ "source": "api",
+ "submitters_order": "preserved",
+ "status": "pending",
+ "schema": [
+ {
+ "name": "Demo PDF",
+ "attachment_uuid": "48d2998f-266b-47e4-beb2-250ab7ccebdf"
+ }
+ ],
+ "fields": [
+ {
+ "name": "Name",
+ "type": "text",
+ "required": true,
+ "uuid": "d0bf3c0c-1928-40c8-80f9-d9f3c6ad4eff",
+ "submitter_uuid": "0b0bff58-bc9a-475d-b4a9-2f3e5323faf7",
+ "areas": [
+ {
+ "page": 1,
+ "attachment_uuid": "48d2998f-266b-47e4-beb2-250ab7ccebdf",
+ "x": 0.403158189124654,
+ "y": 0.04211750189825361,
+ "w": 0.100684625476058,
+ "h": 0.01423690205011389
+ }
+ ]
+ }
+ ],
+ "expire_at": null,
+ "created_at": "2025-06-02T15:55:50.270Z"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/submitters/{id}": {
+ "get": {
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "Get a submitter",
+ "description": "The API endpoint provides functionality to retrieve information about a submitter, along with the submitter documents and field values.",
+ "operationId": "getSubmitter",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter.",
+ "example": 500001
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "id",
+ "submission_id",
+ "uuid",
+ "email",
+ "slug",
+ "sent_at",
+ "opened_at",
+ "completed_at",
+ "declined_at",
+ "created_at",
+ "updated_at",
+ "name",
+ "phone",
+ "status",
+ "external_id",
+ "metadata",
+ "preferences",
+ "template",
+ "submission_events",
+ "values",
+ "documents",
+ "role"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Submitter unique ID number."
+ },
+ "submission_id": {
+ "type": "integer",
+ "description": "Submission unique ID number."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Submitter UUID."
+ },
+ "email": {
+ "type": "string",
+ "nullable": true,
+ "description": "The email address of the submitter."
+ },
+ "slug": {
+ "type": "string",
+ "description": "Unique key to be used in the form signing link and embedded form."
+ },
+ "sent_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the signing request was sent to the submitter."
+ },
+ "opened_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter opened the signing form."
+ },
+ "completed_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter completed the signing form."
+ },
+ "declined_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter declined the signing form."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The date and time when the submitter was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "The date and time when the submitter was last updated."
+ },
+ "name": {
+ "type": "string",
+ "nullable": true,
+ "description": "Submitter name."
+ },
+ "phone": {
+ "type": "string",
+ "nullable": true,
+ "description": "Submitter phone number."
+ },
+ "status": {
+ "type": "string",
+ "description": "Submitter's submission status.",
+ "enum": [
+ "completed",
+ "declined",
+ "opened",
+ "sent",
+ "awaiting"
+ ]
+ },
+ "external_id": {
+ "type": "string",
+ "nullable": true,
+ "description": "The unique applications-specific identifier"
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information."
+ },
+ "preferences": {
+ "type": "object",
+ "description": "Submitter preferences."
+ },
+ "template": {
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "created_at",
+ "updated_at"
+ ],
+ "description": "Base template details.",
+ "properties": {
+ "id": {
+ "type": "number",
+ "description": "The template's unique identifier."
+ },
+ "name": {
+ "type": "string",
+ "description": "The template's name."
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
+ "submission_events": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "submitter_id",
+ "event_type",
+ "event_timestamp"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Submission event unique ID number."
+ },
+ "submitter_id": {
+ "type": "integer",
+ "description": "Unique identifier of the submitter that triggered the event."
+ },
+ "event_type": {
+ "type": "string",
+ "description": "Event type.",
+ "enum": [
+ "send_email",
+ "bounce_email",
+ "complaint_email",
+ "send_reminder_email",
+ "send_sms",
+ "send_2fa_sms",
+ "open_email",
+ "click_email",
+ "click_sms",
+ "phone_verified",
+ "start_form",
+ "start_verification",
+ "complete_verification",
+ "view_form",
+ "invite_party",
+ "complete_form",
+ "decline_form",
+ "api_complete_form"
+ ]
+ },
+ "event_timestamp": {
+ "type": "string",
+ "description": "Date and time when the event was triggered."
+ }
+ }
+ }
+ },
+ "values": {
+ "type": "array",
+ "description": "An array of pre-filled values for the submitter.",
+ "items": {
+ "type": "object",
+ "required": [
+ "field",
+ "value"
+ ],
+ "properties": {
+ "field": {
+ "type": "string",
+ "description": "Document template field name."
+ },
+ "value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Pre-filled value of the field."
+ }
+ }
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "An array of completed or signed documents by the submitter.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "url"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name."
+ },
+ "url": {
+ "type": "string",
+ "description": "Document URL."
+ }
+ }
+ }
+ },
+ "role": {
+ "type": "string",
+ "description": "The role of the submitter in the signing process."
+ }
+ }
+ },
+ "example": {
+ "id": 7,
+ "submission_id": 3,
+ "uuid": "0954d146-db8c-4772-aafe-2effc7c0e0c0",
+ "email": "submitter@example.com",
+ "slug": "dsEeWrhRD8yDXT",
+ "sent_at": "2023-12-14T15:45:49.011Z",
+ "opened_at": "2023-12-14T15:48:23.011Z",
+ "completed_at": "2023-12-10T15:49:21.701Z",
+ "declined_at": null,
+ "created_at": "2023-12-14T15:48:17.173Z",
+ "updated_at": "2023-12-14T15:50:21.799Z",
+ "name": "John Doe",
+ "phone": "+1234567890",
+ "status": "completed",
+ "external_id": null,
+ "metadata": {},
+ "preferences": {},
+ "template": {
+ "id": 2,
+ "name": "Example Template",
+ "created_at": "2023-12-14T15:50:21.799Z",
+ "updated_at": "2023-12-14T15:50:21.799Z"
+ },
+ "submission_events": [
+ {
+ "id": 12,
+ "submitter_id": 7,
+ "event_type": "view_form",
+ "event_timestamp": "2023-12-14T15:47:17.351Z"
+ }
+ ],
+ "values": [
+ {
+ "field": "Full Name",
+ "value": "John Doe"
+ }
+ ],
+ "documents": [
+ {
+ "name": "sample-document",
+ "url": "https://docuseal.com/file/hash/sample-document.pdf"
+ }
+ ],
+ "role": "First Party"
+ }
+ }
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "Update a submitter",
+ "description": "The API endpoint allows you to update submitter details, pre-fill or update field values and re-send emails. Related Guides Automatically sign documents via API",
+ "operationId": "updateSubmitter",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter.",
+ "example": 500001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "send_email": {
+ "type": "boolean",
+ "description": "Set `true` to re-send signature request emails."
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "Set `true` to re-send signature request via phone number SMS.",
+ "default": false
+ },
+ "reply_to": {
+ "type": "string",
+ "description": "Specify Reply-To address to use in the notification emails."
+ },
+ "completed": {
+ "type": "boolean",
+ "description": "Pass `true` to mark submitter as completed and auto-signed via API."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ \"customField\": \"value\" }"
+ },
+ "completed_redirect_url": {
+ "type": "string",
+ "description": "Submitter specific URL to redirect to after the submission completion."
+ },
+ "require_phone_2fa": {
+ "type": "boolean",
+ "description": "Set to `true` to require phone 2FA verification via a one-time code sent to the phone number in order to access the documents.",
+ "default": false
+ },
+ "message": {
+ "type": "object",
+ "properties": {
+ "subject": {
+ "type": "string",
+ "description": "Custom signature request email subject."
+ },
+ "body": {
+ "type": "string",
+ "description": "Custom signature request email body. Can include the following variables: {{template.name}}, {{submitter.link}}, {{account.name}}."
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "A list of configurations for template document form fields.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document template field name.",
+ "example": "First Name"
+ },
+ "default_value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Default value of the field. Use base64 encoded file or a public URL to the image file to set default signature or image fields.",
+ "example": "Acme"
+ },
+ "readonly": {
+ "type": "boolean",
+ "description": "Set `true` to make it impossible for the submitter to edit predefined field value.",
+ "default": false
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Set `true` to make the field required."
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "id",
+ "submission_id",
+ "uuid",
+ "email",
+ "slug",
+ "sent_at",
+ "opened_at",
+ "completed_at",
+ "declined_at",
+ "created_at",
+ "updated_at",
+ "name",
+ "phone",
+ "status",
+ "external_id",
+ "metadata",
+ "preferences",
+ "values",
+ "documents",
+ "role",
+ "embed_src"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Submitter unique ID number."
+ },
+ "submission_id": {
+ "type": "integer",
+ "description": "Submission unique ID number."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Submitter UUID."
+ },
+ "email": {
+ "type": "string",
+ "nullable": true,
+ "description": "The email address of the submitter."
+ },
+ "slug": {
+ "type": "string",
+ "description": "Unique key to be used in the form signing link and embedded form."
+ },
+ "sent_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the signing request was sent to the submitter."
+ },
+ "opened_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter opened the signing form."
+ },
+ "completed_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter completed the signing form."
+ },
+ "declined_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter declined the signing form."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The date and time when the submitter was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "The date and time when the submitter was last updated."
+ },
+ "name": {
+ "type": "string",
+ "nullable": true,
+ "description": "Submitter name."
+ },
+ "phone": {
+ "type": "string",
+ "nullable": true,
+ "description": "Submitter phone number."
+ },
+ "status": {
+ "type": "string",
+ "description": "Submitter's submission status.",
+ "enum": [
+ "completed",
+ "declined",
+ "opened",
+ "sent",
+ "awaiting"
+ ]
+ },
+ "external_id": {
+ "type": "string",
+ "nullable": true,
+ "description": "The unique applications-specific identifier"
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information."
+ },
+ "preferences": {
+ "type": "object",
+ "description": "Submitter preferences."
+ },
+ "values": {
+ "type": "array",
+ "description": "An array of pre-filled values for the submitter.",
+ "items": {
+ "type": "object",
+ "required": [
+ "field",
+ "value"
+ ],
+ "properties": {
+ "field": {
+ "type": "string",
+ "description": "Document template field name."
+ },
+ "value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Pre-filled value of the field."
+ }
+ }
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "An array of completed or signed documents by the submitter.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "url"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name."
+ },
+ "url": {
+ "type": "string",
+ "description": "Document URL."
+ }
+ }
+ }
+ },
+ "role": {
+ "type": "string",
+ "description": "The role of the submitter in the signing process."
+ },
+ "embed_src": {
+ "type": "string",
+ "description": "The `src` URL value to embed the signing form or sign via a link."
+ }
+ }
+ },
+ "example": {
+ "id": 1,
+ "submission_id": 12,
+ "uuid": "0954d146-db8c-4772-aafe-2effc7c0e0c0",
+ "email": "submitter@example.com",
+ "slug": "dsEeWrhRD8yDXT",
+ "sent_at": "2023-12-14T15:45:49.011Z",
+ "opened_at": "2023-12-14T15:48:23.011Z",
+ "completed_at": "2023-12-10T15:49:21.701Z",
+ "declined_at": null,
+ "created_at": "2023-12-14T15:48:17.173Z",
+ "updated_at": "2023-12-14T15:50:21.799Z",
+ "name": "John Doe",
+ "phone": "+1234567890",
+ "status": "completed",
+ "external_id": null,
+ "metadata": {},
+ "preferences": {},
+ "values": [
+ {
+ "field": "Full Name",
+ "value": "John Doe"
+ }
+ ],
+ "documents": [],
+ "role": "First Party",
+ "embed_src": "https://docuseal.com/s/pAMimKcyrLjqVt"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/submitters": {
+ "get": {
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Submitters"
+ ],
+ "summary": "List all submitters",
+ "description": "The API endpoint provides the ability to retrieve a list of submitters.",
+ "operationId": "getSubmitters",
+ "parameters": [
+ {
+ "name": "submission_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The submission ID allows you to receive only the submitters related to that specific submission."
+ },
+ {
+ "name": "q",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submitters on name, email or phone partial match."
+ },
+ {
+ "name": "slug",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "Filter submitters by unique slug.",
+ "example": "zAyL9fH36Havvm"
+ },
+ {
+ "name": "completed_after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "example": "2024-03-05 9:32:20",
+ "description": "The date and time string value to filter submitters that completed the submission after the specified date and time."
+ },
+ {
+ "name": "completed_before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "example": "2024-03-06 19:32:20",
+ "description": "The date and time string value to filter submitters that completed the submission before the specified date and time."
+ },
+ {
+ "name": "external_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string"
+ },
+ "description": "The unique applications-specific identifier provided for a submitter when initializing a signature request. It allows you to receive only submitters with a specified external id."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The number of submitters to return. Default value is 10. Maximum value is 100."
+ },
+ {
+ "name": "after",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter to start the list from. It allows you to receive only submitters with id greater than the specified value. Pass ID value from the `pagination.next` response to load the next batch of submitters."
+ },
+ {
+ "name": "before",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the submitter to end the list with. It allows you to receive only submitters with id less than the specified value."
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "submission_id",
+ "uuid",
+ "email",
+ "slug",
+ "sent_at",
+ "opened_at",
+ "completed_at",
+ "declined_at",
+ "created_at",
+ "updated_at",
+ "name",
+ "phone",
+ "status",
+ "external_id",
+ "preferences",
+ "metadata",
+ "submission_events",
+ "values",
+ "documents",
+ "role"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Submitter unique ID number."
+ },
+ "submission_id": {
+ "type": "integer",
+ "description": "Submission unique ID number."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Submitter UUID."
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter."
+ },
+ "slug": {
+ "type": "string",
+ "description": "Unique slug of the submitter form."
+ },
+ "sent_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the signing request was sent to the submitter."
+ },
+ "opened_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter opened the signing form."
+ },
+ "completed_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter completed the signing form."
+ },
+ "declined_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "The date and time when the submitter declined the signing form."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The date and time when the submitter was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "The date and time when the submitter was last updated."
+ },
+ "name": {
+ "type": "string",
+ "nullable": true,
+ "description": "Submitter name."
+ },
+ "phone": {
+ "type": "string",
+ "nullable": true,
+ "description": "Submitter phone number."
+ },
+ "status": {
+ "type": "string",
+ "description": "Submitter's submission status.",
+ "enum": [
+ "completed",
+ "declined",
+ "opened",
+ "sent",
+ "awaiting"
+ ]
+ },
+ "external_id": {
+ "type": "string",
+ "nullable": true,
+ "description": "The unique applications-specific identifier"
+ },
+ "preferences": {
+ "type": "object",
+ "description": "Submitter preferences."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information."
+ },
+ "submission_events": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "submitter_id",
+ "event_type",
+ "event_timestamp"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the submission event."
+ },
+ "submitter_id": {
+ "type": "integer",
+ "description": "Unique identifier of the submitter that triggered the event."
+ },
+ "event_type": {
+ "type": "string",
+ "description": "Event type.",
+ "enum": [
+ "send_email",
+ "bounce_email",
+ "complaint_email",
+ "send_reminder_email",
+ "send_sms",
+ "send_2fa_sms",
+ "open_email",
+ "click_email",
+ "click_sms",
+ "phone_verified",
+ "start_form",
+ "start_verification",
+ "complete_verification",
+ "view_form",
+ "invite_party",
+ "complete_form",
+ "decline_form",
+ "api_complete_form"
+ ]
+ },
+ "event_timestamp": {
+ "type": "string",
+ "description": "Date and time when the event was triggered."
+ }
+ }
+ }
+ },
+ "values": {
+ "type": "array",
+ "description": "An array of pre-filled values for the submission.",
+ "items": {
+ "type": "object",
+ "required": [
+ "field",
+ "value"
+ ],
+ "properties": {
+ "field": {
+ "type": "string",
+ "description": "Document template field name."
+ },
+ "value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ }
+ }
+ ],
+ "description": "Pre-filled value of the field."
+ }
+ }
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "An array of completed or signed documents by the submitter.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "url"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name."
+ },
+ "url": {
+ "type": "string",
+ "description": "Document URL."
+ }
+ }
+ }
+ },
+ "role": {
+ "type": "string",
+ "description": "The role of the submitter in the signing process."
+ }
+ }
+ }
+ },
+ "pagination": {
+ "type": "object",
+ "required": [
+ "count",
+ "next",
+ "prev"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "description": "Submitters count."
+ },
+ "next": {
+ "type": "integer",
+ "nullable": true,
+ "description": "The ID of the submitter after which the next page starts."
+ },
+ "prev": {
+ "type": "integer",
+ "nullable": true,
+ "description": "The ID of the submitter before which the previous page ends."
+ }
+ }
+ }
+ }
+ },
+ "example": {
+ "data": [
+ {
+ "id": 7,
+ "submission_id": 3,
+ "uuid": "0954d146-db8c-4772-aafe-2effc7c0e0c0",
+ "email": "submitter@example.com",
+ "slug": "dsEeWrhRD8yDXT",
+ "sent_at": "2023-12-14T15:45:49.011Z",
+ "opened_at": "2023-12-14T15:48:23.011Z",
+ "completed_at": "2023-12-14T15:49:21.701Z",
+ "declined_at": null,
+ "created_at": "2023-12-14T15:48:17.173Z",
+ "updated_at": "2023-12-14T15:50:21.799Z",
+ "name": "John Doe",
+ "phone": "+1234567890",
+ "status": "completed",
+ "external_id": null,
+ "preferences": {},
+ "metadata": {},
+ "template": {
+ "id": 2,
+ "name": "Example Template",
+ "created_at": "2023-12-14T15:50:21.799Z",
+ "updated_at": "2023-12-14T15:50:21.799Z"
+ },
+ "submission_events": [
+ {
+ "id": 12,
+ "submitter_id": 7,
+ "event_type": "view_form",
+ "event_timestamp": "2023-12-14T15:48:17.351Z"
+ }
+ ],
+ "values": [
+ {
+ "field": "Full Name",
+ "value": "John Doe"
+ }
+ ],
+ "documents": [
+ {
+ "name": "sample-document",
+ "url": "https://docuseal.com/file/eyJfcmFpbHMiOnsiIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--f9758362acced0f3c86cdffad02800e/sample-document.pdf"
+ }
+ ],
+ "role": "First Party"
+ }
+ ],
+ "pagination": {
+ "count": 1,
+ "next": 1,
+ "prev": 1
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/templates/{id}/documents": {
+ "put": {
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Update template documents",
+ "description": "The API endpoint allows you to add, remove or replace documents in the template with provided PDF/DOCX file or HTML content.",
+ "operationId": "addDocumentToTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the documents template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "documents": {
+ "type": "array",
+ "description": "The list of documents to add or replace in the template.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Template"
+ },
+ "file": {
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF or DOCX file or downloadable file URL. Leave it empty if you create a new document using HTML param."
+ },
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags. Leave it empty if you add a document via PDF or DOCX base64 encoded file param or URL."
+ },
+ "position": {
+ "type": "integer",
+ "description": "Position of the document. By default will be added as the last document in the template.",
+ "example": 0
+ },
+ "replace": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to replace existing document with a new file at `position`. Existing document fields will be transferred to the new document if it doesn't contain any fields."
+ },
+ "remove": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to remove existing document at given `position` or with given `name`."
+ }
+ }
+ }
+ },
+ "merge": {
+ "type": "boolean",
+ "default": false,
+ "description": "Set to `true` to merge all existing and new documents into a single PDF document in the template."
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "id",
+ "slug",
+ "name",
+ "preferences",
+ "schema",
+ "fields",
+ "submitters",
+ "author_id",
+ "archived_at",
+ "created_at",
+ "updated_at",
+ "source",
+ "external_id",
+ "folder_id",
+ "folder_name",
+ "author",
+ "documents"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the document template."
+ },
+ "slug": {
+ "type": "string",
+ "description": "Unique slug of the document template."
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the template."
+ },
+ "preferences": {
+ "type": "object",
+ "description": "Template preferences."
+ },
+ "schema": {
+ "type": "array",
+ "description": "List of documents attached to the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "attachment_uuid",
+ "name"
+ ],
+ "properties": {
+ "attachment_uuid": {
+ "type": "string",
+ "description": "Unique indentifier of attached document to the template."
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the attached document to the template."
+ }
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "List of fields to be filled in the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "uuid",
+ "submitter_uuid",
+ "name",
+ "type",
+ "required",
+ "areas"
+ ],
+ "properties": {
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the field."
+ },
+ "submitter_uuid": {
+ "type": "string",
+ "description": "Unique identifier of the submitter that filled the field."
+ },
+ "name": {
+ "type": "string",
+ "description": "Field name."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels."
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value."
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value."
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value."
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value."
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value."
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types."
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields."
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields."
+ },
+ "mask": {
+ "type": "boolean",
+ "description": "Indicates if the field is masked on the document."
+ }
+ }
+ },
+ "areas": {
+ "type": "array",
+ "description": "List of areas where the field is located in the document.",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "attachment_uuid",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X coordinate of the area where the field is located in the document."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y coordinate of the area where the field is located in the document."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the area where the field is located in the document."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the area where the field is located in the document."
+ },
+ "attachment_uuid": {
+ "type": "string",
+ "description": "Unique identifier of the attached document where the field is located."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the attached document where the field is located."
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "uuid"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Submitter name."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the submitter."
+ }
+ }
+ }
+ },
+ "author_id": {
+ "type": "integer",
+ "description": "Unique identifier of the author of the template."
+ },
+ "archived_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "Date and time when the template was archived."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "Date and time when the template was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "Date and time when the template was updated."
+ },
+ "source": {
+ "type": "string",
+ "description": "Source of the template.",
+ "enum": [
+ "native",
+ "api",
+ "embed"
+ ]
+ },
+ "external_id": {
+ "type": "string",
+ "nullable": true,
+ "description": "Identifier of the template in the external system."
+ },
+ "folder_id": {
+ "type": "integer",
+ "description": "Unique identifier of the folder where the template is placed."
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "Folder name where the template is placed."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "Indicates if the template is accessible by link."
+ },
+ "author": {
+ "type": "object",
+ "required": [
+ "id",
+ "first_name",
+ "last_name",
+ "email"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the author."
+ },
+ "first_name": {
+ "type": "string",
+ "description": "First name of the author."
+ },
+ "last_name": {
+ "type": "string",
+ "description": "Last name of the author."
+ },
+ "email": {
+ "type": "string",
+ "description": "Author email."
+ }
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "List of documents attached to the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "uuid",
+ "url",
+ "preview_image_url",
+ "filename"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the document."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the document."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the document."
+ },
+ "preview_image_url": {
+ "type": "string",
+ "description": "Document preview image URL."
+ },
+ "filename": {
+ "type": "string",
+ "description": "Document filename."
+ }
+ }
+ }
+ }
+ }
+ },
+ "example": {
+ "id": 3,
+ "slug": "ZQpF222rFBv71q",
+ "name": "Demo Template",
+ "schema": [
+ {
+ "name": "Demo Template",
+ "attachment_uuid": "09a8bc73-a7a9-4fd9-8173-95752bdf0af5"
+ }
+ ],
+ "fields": [
+ {
+ "name": "Name",
+ "required": false,
+ "type": "text",
+ "uuid": "a06c49f6-4b20-4442-ac7f-c1040d2cf1ac",
+ "submitter_uuid": "93ba628c-5913-4456-a1e9-1a81ad7444b3",
+ "areas": [
+ {
+ "page": 0,
+ "attachment_uuid": "09a8bc73-a7a9-4fd9-8173-95752bdf0af5",
+ "x": 0.403158189124654,
+ "y": 0.04211750189825361,
+ "w": 0.100684625476058,
+ "h": 0.01423690205011389
+ }
+ ]
+ }
+ ],
+ "submitters": [
+ {
+ "name": "Submitter",
+ "uuid": "93ba628c-5913-4456-a1e9-1a81ad7444b3"
+ }
+ ],
+ "author_id": 1,
+ "archived_at": null,
+ "created_at": "2023-12-14T15:50:21.799Z",
+ "updated_at": "2023-12-14T15:50:21.799Z",
+ "source": "api",
+ "folder_id": 1,
+ "folder_name": "Default",
+ "external_id": "f0b4714f-e44b-4993-905b-68b4451eef8c",
+ "author": {
+ "id": 1,
+ "first_name": "John",
+ "last_name": "Doe",
+ "email": "john.doe@example.com"
+ },
+ "documents": [
+ {
+ "id": 3,
+ "uuid": "09a8bc73-a7a9-4fd9-8173-95752bdf0af5",
+ "url": "https://docuseal.com/file/hash/Test%20Template.pdf"
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/templates/{id}/clone": {
+ "post": {
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Clone a template",
+ "description": "The API endpoint allows you to clone existing template into a new template.",
+ "operationId": "cloneTemplate",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "description": "The unique identifier of the documents template.",
+ "example": 1000001
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Template name. Existing name with (Clone) suffix will be used if not specified.",
+ "example": "Cloned Template"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be cloned."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app."
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "id",
+ "slug",
+ "name",
+ "preferences",
+ "schema",
+ "fields",
+ "submitters",
+ "author_id",
+ "archived_at",
+ "created_at",
+ "updated_at",
+ "source",
+ "external_id",
+ "folder_id",
+ "folder_name",
+ "author",
+ "documents"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the document template."
+ },
+ "slug": {
+ "type": "string",
+ "description": "Unique slug of the document template."
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the template."
+ },
+ "preferences": {
+ "type": "object",
+ "description": "Template preferences."
+ },
+ "schema": {
+ "type": "array",
+ "description": "List of documents attached to the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "attachment_uuid",
+ "name"
+ ],
+ "properties": {
+ "attachment_uuid": {
+ "type": "string",
+ "description": "Unique indentifier of attached document to the template."
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the attached document to the template."
+ }
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "List of fields to be filled in the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "uuid",
+ "submitter_uuid",
+ "name",
+ "type",
+ "required",
+ "areas"
+ ],
+ "properties": {
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the field."
+ },
+ "submitter_uuid": {
+ "type": "string",
+ "description": "Unique identifier of the submitter that filled the field."
+ },
+ "name": {
+ "type": "string",
+ "description": "Field name."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels."
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value."
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value."
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value."
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value."
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value."
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types."
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields."
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields."
+ },
+ "mask": {
+ "type": "boolean",
+ "description": "Indicates if the field is masked on the document."
+ }
+ }
+ },
+ "areas": {
+ "type": "array",
+ "description": "List of areas where the field is located in the document.",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "attachment_uuid",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X coordinate of the area where the field is located in the document."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y coordinate of the area where the field is located in the document."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the area where the field is located in the document."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the area where the field is located in the document."
+ },
+ "attachment_uuid": {
+ "type": "string",
+ "description": "Unique identifier of the attached document where the field is located."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the attached document where the field is located."
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "uuid"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Submitter name."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the submitter."
+ }
+ }
+ }
+ },
+ "author_id": {
+ "type": "integer",
+ "description": "Unique identifier of the author of the template."
+ },
+ "archived_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "Date and time when the template was archived."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "Date and time when the template was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "Date and time when the template was updated."
+ },
+ "source": {
+ "type": "string",
+ "description": "Source of the template.",
+ "enum": [
+ "native",
+ "api",
+ "embed"
+ ]
+ },
+ "external_id": {
+ "type": "string",
+ "nullable": true,
+ "description": "Identifier of the template in the external system."
+ },
+ "folder_id": {
+ "type": "integer",
+ "description": "Unique identifier of the folder where the template is placed."
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "Folder name where the template is placed."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "Indicates if the template is accessible by link."
+ },
+ "author": {
+ "type": "object",
+ "required": [
+ "id",
+ "first_name",
+ "last_name",
+ "email"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the author."
+ },
+ "first_name": {
+ "type": "string",
+ "description": "First name of the author."
+ },
+ "last_name": {
+ "type": "string",
+ "description": "Last name of the author."
+ },
+ "email": {
+ "type": "string",
+ "description": "Author email."
+ }
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "List of documents attached to the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "uuid",
+ "url",
+ "preview_image_url",
+ "filename"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the document."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the document."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the document."
+ },
+ "preview_image_url": {
+ "type": "string",
+ "description": "Document preview image URL."
+ },
+ "filename": {
+ "type": "string",
+ "description": "Document filename."
+ }
+ }
+ }
+ }
+ }
+ },
+ "example": {
+ "id": 6,
+ "slug": "Xc7opTqwwV9P7x",
+ "name": "Cloned Template",
+ "schema": [
+ {
+ "attachment_uuid": "68aa0716-61f0-4535-9ba4-6c00f835b080",
+ "name": "sample-document"
+ }
+ ],
+ "fields": [
+ {
+ "uuid": "93c7065b-1b19-4551-b67b-9946bf1c11c9",
+ "submitter_uuid": "ad128012-756d-4d17-b728-6f6b1d482bb5",
+ "name": "Name",
+ "type": "text",
+ "required": true,
+ "areas": [
+ {
+ "page": 0,
+ "attachment_uuid": "09a8bc73-a7a9-4fd9-8173-95752bdf0af5",
+ "x": 0.403158189124654,
+ "y": 0.04211750189825361,
+ "w": 0.100684625476058,
+ "h": 0.01423690205011389
+ }
+ ]
+ }
+ ],
+ "submitters": [
+ {
+ "name": "First Party",
+ "uuid": "ad128012-756d-4d17-b728-6f6b1d482bb5"
+ }
+ ],
+ "author_id": 1,
+ "archived_at": null,
+ "created_at": "2023-12-14T15:50:21.799Z",
+ "updated_at": "2023-12-14T15:50:21.799Z",
+ "source": "api",
+ "folder_id": 2,
+ "folder_name": "Default",
+ "external_id": null,
+ "shared_link": true,
+ "author": {
+ "id": 1,
+ "first_name": "John",
+ "last_name": "Doe",
+ "email": "john.doe@example.com"
+ },
+ "documents": [
+ {
+ "id": 9,
+ "uuid": "ded62277-9705-4fac-b5dc-58325d4102eb",
+ "url": "https://docuseal.com/file/hash/sample-document.pdf",
+ "filename": "sample-document.pdf"
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/templates/html": {
+ "post": {
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from HTML",
+ "description": "The API endpoint provides the functionality to seamlessly generate a PDF document template by utilizing the provided HTML content while incorporating pre-defined fields. Related Guides Create PDF document fillable form with HTML",
+ "operationId": "createTemplateFromHtml",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "html_header": {
+ "type": "string",
+ "description": "HTML template of the header to be displayed on every page."
+ },
+ "html_footer": {
+ "type": "string",
+ "description": "HTML template of the footer to be displayed on every page."
+ },
+ "name": {
+ "type": "string",
+ "description": "Template name. Random uuid will be assigned when not specified.",
+ "example": "Test Template"
+ },
+ "size": {
+ "type": "string",
+ "default": "Letter",
+ "description": "Page size. Letter 8.5 x 11 will be assigned when not specified.",
+ "enum": [
+ "Letter",
+ "Legal",
+ "Tabloid",
+ "Ledger",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6"
+ ],
+ "example": "A4"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new HTML.",
+ "example": "714d974e-83d8-11ee-b962-0242ac120002"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "description": "The list of documents built from HTML. Can be used to create a template with multiple documents. Leave `documents` param empty when using a top-level `html` param for a template with a single document.",
+ "items": {
+ "type": "object",
+ "required": [
+ "html"
+ ],
+ "properties": {
+ "html": {
+ "type": "string",
+ "description": "HTML template with field tags.",
+ "example": "Lorem Ipsum is simply dummy text of the\n\n\nand typesetting industry \n"
+ },
+ "name": {
+ "type": "string",
+ "description": "Document name. Random uuid will be assigned when not specified.",
+ "example": "Test Document"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "id",
+ "slug",
+ "name",
+ "preferences",
+ "schema",
+ "fields",
+ "submitters",
+ "author_id",
+ "archived_at",
+ "created_at",
+ "updated_at",
+ "source",
+ "external_id",
+ "folder_id",
+ "folder_name",
+ "author",
+ "documents"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the document template."
+ },
+ "slug": {
+ "type": "string",
+ "description": "Unique slug of the document template."
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the template."
+ },
+ "preferences": {
+ "type": "object",
+ "description": "Template preferences."
+ },
+ "schema": {
+ "type": "array",
+ "description": "List of documents attached to the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "attachment_uuid",
+ "name"
+ ],
+ "properties": {
+ "attachment_uuid": {
+ "type": "string",
+ "description": "Unique indentifier of attached document to the template."
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the attached document to the template."
+ }
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "List of fields to be filled in the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "uuid",
+ "submitter_uuid",
+ "name",
+ "type",
+ "required",
+ "areas"
+ ],
+ "properties": {
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the field."
+ },
+ "submitter_uuid": {
+ "type": "string",
+ "description": "Unique identifier of the submitter that filled the field."
+ },
+ "name": {
+ "type": "string",
+ "description": "Field name."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels."
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value."
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value."
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value."
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value."
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value."
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types."
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields."
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields."
+ },
+ "mask": {
+ "type": "boolean",
+ "description": "Indicates if the field is masked on the document."
+ }
+ }
+ },
+ "areas": {
+ "type": "array",
+ "description": "List of areas where the field is located in the document.",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "attachment_uuid",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X coordinate of the area where the field is located in the document."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y coordinate of the area where the field is located in the document."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the area where the field is located in the document."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the area where the field is located in the document."
+ },
+ "attachment_uuid": {
+ "type": "string",
+ "description": "Unique identifier of the attached document where the field is located."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the attached document where the field is located."
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "uuid"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Submitter name."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the submitter."
+ }
+ }
+ }
+ },
+ "author_id": {
+ "type": "integer",
+ "description": "Unique identifier of the author of the template."
+ },
+ "archived_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "Date and time when the template was archived."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "Date and time when the template was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "Date and time when the template was updated."
+ },
+ "source": {
+ "type": "string",
+ "description": "Source of the template.",
+ "enum": [
+ "native",
+ "api",
+ "embed"
+ ]
+ },
+ "external_id": {
+ "type": "string",
+ "nullable": true,
+ "description": "Identifier of the template in the external system."
+ },
+ "folder_id": {
+ "type": "integer",
+ "description": "Unique identifier of the folder where the template is placed."
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "Folder name where the template is placed."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "Indicates if the template is accessible by link."
+ },
+ "author": {
+ "type": "object",
+ "required": [
+ "id",
+ "first_name",
+ "last_name",
+ "email"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the author."
+ },
+ "first_name": {
+ "type": "string",
+ "description": "First name of the author."
+ },
+ "last_name": {
+ "type": "string",
+ "description": "Last name of the author."
+ },
+ "email": {
+ "type": "string",
+ "description": "Author email."
+ }
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "List of documents attached to the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "uuid",
+ "url",
+ "preview_image_url",
+ "filename"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the document."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the document."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the document."
+ },
+ "preview_image_url": {
+ "type": "string",
+ "description": "Document preview image URL."
+ },
+ "filename": {
+ "type": "string",
+ "description": "Document filename."
+ }
+ }
+ }
+ }
+ }
+ },
+ "example": {
+ "id": 3,
+ "slug": "ZQpF222rFBv71q",
+ "name": "Demo Template",
+ "schema": [
+ {
+ "name": "Demo Template",
+ "attachment_uuid": "09a8bc73-a7a9-4fd9-8173-95752bdf0af5"
+ }
+ ],
+ "fields": [
+ {
+ "name": "Name",
+ "required": false,
+ "type": "text",
+ "uuid": "a06c49f6-4b20-4442-ac7f-c1040d2cf1ac",
+ "submitter_uuid": "93ba628c-5913-4456-a1e9-1a81ad7444b3",
+ "areas": [
+ {
+ "page": 0,
+ "attachment_uuid": "09a8bc73-a7a9-4fd9-8173-95752bdf0af5",
+ "x": 0.403158189124654,
+ "y": 0.04211750189825361,
+ "w": 0.100684625476058,
+ "h": 0.01423690205011389
+ }
+ ]
+ }
+ ],
+ "submitters": [
+ {
+ "name": "Submitter",
+ "uuid": "93ba628c-5913-4456-a1e9-1a81ad7444b3"
+ }
+ ],
+ "author_id": 1,
+ "archived_at": null,
+ "created_at": "2023-12-14T15:50:21.799Z",
+ "updated_at": "2023-12-14T15:50:21.799Z",
+ "source": "api",
+ "folder_id": 1,
+ "folder_name": "Default",
+ "external_id": "f0b4714f-e44b-4993-905b-68b4451eef8c",
+ "shared_link": true,
+ "author": {
+ "id": 1,
+ "first_name": "John",
+ "last_name": "Doe",
+ "email": "john.doe@example.com"
+ },
+ "documents": [
+ {
+ "id": 3,
+ "uuid": "09a8bc73-a7a9-4fd9-8173-95752bdf0af5",
+ "url": "https://docuseal.com/file/hash/Test%20Template.pdf"
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/templates/docx": {
+ "post": {
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from Word DOCX",
+ "description": "The API endpoint provides the functionality to create a fillable document template for existing Microsoft Word document. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.docx for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form\n",
+ "operationId": "createTemplateFromDocx",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test DOCX"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new document.",
+ "example": "unique-key"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "type": "string",
+ "example": "base64",
+ "format": "base64",
+ "description": "Base64-encoded content of the DOCX file or downloadable file URL"
+ },
+ "fields": {
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1."
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "id",
+ "slug",
+ "name",
+ "preferences",
+ "schema",
+ "fields",
+ "submitters",
+ "author_id",
+ "archived_at",
+ "created_at",
+ "updated_at",
+ "source",
+ "external_id",
+ "folder_id",
+ "folder_name",
+ "author",
+ "documents"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the document template."
+ },
+ "slug": {
+ "type": "string",
+ "description": "Unique slug of the document template."
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the template."
+ },
+ "preferences": {
+ "type": "object",
+ "description": "Template preferences."
+ },
+ "schema": {
+ "type": "array",
+ "description": "List of documents attached to the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "attachment_uuid",
+ "name"
+ ],
+ "properties": {
+ "attachment_uuid": {
+ "type": "string",
+ "description": "Unique indentifier of attached document to the template."
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the attached document to the template."
+ }
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "List of fields to be filled in the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "uuid",
+ "submitter_uuid",
+ "name",
+ "type",
+ "required",
+ "areas"
+ ],
+ "properties": {
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the field."
+ },
+ "submitter_uuid": {
+ "type": "string",
+ "description": "Unique identifier of the submitter that filled the field."
+ },
+ "name": {
+ "type": "string",
+ "description": "Field name."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels."
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value."
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value."
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value."
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value."
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value."
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types."
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields."
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields."
+ },
+ "mask": {
+ "type": "boolean",
+ "description": "Indicates if the field is masked on the document."
+ }
+ }
+ },
+ "areas": {
+ "type": "array",
+ "description": "List of areas where the field is located in the document.",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "attachment_uuid",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X coordinate of the area where the field is located in the document."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y coordinate of the area where the field is located in the document."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the area where the field is located in the document."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the area where the field is located in the document."
+ },
+ "attachment_uuid": {
+ "type": "string",
+ "description": "Unique identifier of the attached document where the field is located."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the attached document where the field is located."
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "uuid"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Submitter name."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the submitter."
+ }
+ }
+ }
+ },
+ "author_id": {
+ "type": "integer",
+ "description": "Unique identifier of the author of the template."
+ },
+ "archived_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "Date and time when the template was archived."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "Date and time when the template was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "Date and time when the template was updated."
+ },
+ "source": {
+ "type": "string",
+ "description": "Source of the template.",
+ "enum": [
+ "native",
+ "api",
+ "embed"
+ ]
+ },
+ "external_id": {
+ "type": "string",
+ "nullable": true,
+ "description": "Identifier of the template in the external system."
+ },
+ "folder_id": {
+ "type": "integer",
+ "description": "Unique identifier of the folder where the template is placed."
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "Folder name where the template is placed."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "Indicates if the template is accessible by link."
+ },
+ "author": {
+ "type": "object",
+ "required": [
+ "id",
+ "first_name",
+ "last_name",
+ "email"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the author."
+ },
+ "first_name": {
+ "type": "string",
+ "description": "First name of the author."
+ },
+ "last_name": {
+ "type": "string",
+ "description": "Last name of the author."
+ },
+ "email": {
+ "type": "string",
+ "description": "Author email."
+ }
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "List of documents attached to the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "uuid",
+ "url",
+ "preview_image_url",
+ "filename"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the document."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the document."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the document."
+ },
+ "preview_image_url": {
+ "type": "string",
+ "description": "Document preview image URL."
+ },
+ "filename": {
+ "type": "string",
+ "description": "Document filename."
+ }
+ }
+ }
+ }
+ }
+ },
+ "example": {
+ "id": 5,
+ "slug": "s3ff992CoPjvaX",
+ "name": "Demo PDF",
+ "schema": [
+ {
+ "name": "Demo PDF",
+ "attachment_uuid": "48d2998f-266b-47e4-beb2-250ab7ccebdf"
+ }
+ ],
+ "fields": [
+ {
+ "name": "Name",
+ "type": "text",
+ "required": true,
+ "uuid": "d0bf3c0c-1928-40c8-80f9-d9f3c6ad4eff",
+ "submitter_uuid": "0b0bff58-bc9a-475d-b4a9-2f3e5323faf7",
+ "areas": [
+ {
+ "page": 1,
+ "attachment_uuid": "48d2998f-266b-47e4-beb2-250ab7ccebdf",
+ "x": 0.403158189124654,
+ "y": 0.04211750189825361,
+ "w": 0.100684625476058,
+ "h": 0.01423690205011389
+ }
+ ]
+ }
+ ],
+ "submitters": [
+ {
+ "name": "Submitter",
+ "uuid": "0b0bff58-bc9a-475d-b4a9-2f3e5323faf7"
+ }
+ ],
+ "author_id": 1,
+ "archived_at": null,
+ "created_at": "2023-12-14T15:50:21.799Z",
+ "updated_at": "2023-12-14T15:50:21.799Z",
+ "source": "api",
+ "folder_id": 1,
+ "folder_name": "Default",
+ "external_id": "c248ffba-ef81-48b7-8e17-e3cecda1c1c5",
+ "shared_link": true,
+ "author": {
+ "id": 1,
+ "first_name": "John",
+ "last_name": "Doe",
+ "email": "john.doe@example.com"
+ },
+ "documents": [
+ {
+ "id": 7,
+ "uuid": "48d2998f-266b-47e4-beb2-250ab7ccebdf",
+ "url": "https://docuseal.com/hash/DemoPDF.pdf"
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/templates/pdf": {
+ "post": {
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Create a template from PDF",
+ "description": "The API endpoint provides the functionality to create a fillable document template for a PDF file. Use {{Field Name;role=Signer1;type=date}} text tags to define fillable fields in the document. See https://www.docuseal.com/examples/fieldtags.pdf for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. Related Guides Use embedded text field tags to create a fillable form\n",
+ "operationId": "createTemplateFromPdf",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "documents"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the template",
+ "example": "Test PDF"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder's name to which the template should be created."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app. Existing template with specified `external_id` will be updated with a new PDF.",
+ "example": "unique-key"
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "file"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the document."
+ },
+ "file": {
+ "example": "base64",
+ "type": "string",
+ "format": "base64",
+ "description": "Base64-encoded content of the PDF file or downloadable file URL."
+ },
+ "fields": {
+ "type": "array",
+ "description": "Fields are optional if you use {{...}} text tags to define fields in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the field."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "Role name of the signer."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "title": {
+ "type": "string",
+ "description": "Field title displayed to the user instead of the name, shown on the signing form. Supports Markdown."
+ },
+ "description": {
+ "type": "string",
+ "description": "Field description displayed on the signing form. Supports Markdown."
+ },
+ "areas": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X-coordinate of the field area."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y-coordinate of the field area."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the field area."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the field area."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the field area. Starts from 1.",
+ "example": 1
+ },
+ "option": {
+ "type": "string",
+ "description": "Option string value for 'radio' and 'multiple' select field types."
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "description": "An array of option values for 'select' field type.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Option A",
+ "Option B"
+ ]
+ },
+ "validation": {
+ "type": "object",
+ "properties": {
+ "pattern": {
+ "type": "string",
+ "description": "HTML field validation pattern string based on https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern specification.",
+ "example": "[A-Z]{4}"
+ },
+ "message": {
+ "type": "string",
+ "description": "A custom error message to display on validation failure."
+ },
+ "min": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Minimum allowed number value or date depending on field type."
+ },
+ "max": {
+ "oneOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Maximum allowed number value or date depending on field type."
+ },
+ "step": {
+ "type": "number",
+ "description": "Increment step for number field. Pass 1 to accept only integers, or 0.01 to accept decimal currency."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels.",
+ "example": 12
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value.",
+ "enum": [
+ "bold",
+ "italic",
+ "bold_italic"
+ ]
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value.",
+ "enum": [
+ "Times",
+ "Helvetica",
+ "Courier"
+ ]
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value.",
+ "enum": [
+ "black",
+ "white",
+ "blue"
+ ],
+ "default": "black"
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value.",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ],
+ "default": "left"
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value.",
+ "enum": [
+ "top",
+ "center",
+ "bottom"
+ ],
+ "default": "center"
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types. - Date field: accepts formats such as DD/MM/YYYY (default: MM/DD/YYYY). - Signature field: accepts drawn, typed, drawn_or_typed (default), or upload. - Number field: accepts currency formats such as usd, eur, gbp.",
+ "example": "DD/MM/YYYY"
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields.",
+ "example": 99.99
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields.",
+ "enum": [
+ "USD",
+ "EUR",
+ "GBP",
+ "CAD",
+ "AUD"
+ ],
+ "default": "USD"
+ },
+ "mask": {
+ "description": "Set `true` to make sensitive data masked on the document.",
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "default": false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "flatten": {
+ "type": "boolean",
+ "description": "Remove PDF form fields from the documents.",
+ "default": false
+ },
+ "remove_tags": {
+ "type": "boolean",
+ "description": "Pass `false` to disable the removal of {{text}} tags from the PDF. This can be used along with transparent text tags for faster and more robust PDF processing.",
+ "default": true
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "id",
+ "slug",
+ "name",
+ "preferences",
+ "schema",
+ "fields",
+ "submitters",
+ "author_id",
+ "archived_at",
+ "created_at",
+ "updated_at",
+ "source",
+ "external_id",
+ "folder_id",
+ "folder_name",
+ "author",
+ "documents"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the document template."
+ },
+ "slug": {
+ "type": "string",
+ "description": "Unique slug of the document template."
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the template."
+ },
+ "preferences": {
+ "type": "object",
+ "description": "Template preferences."
+ },
+ "schema": {
+ "type": "array",
+ "description": "List of documents attached to the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "attachment_uuid",
+ "name"
+ ],
+ "properties": {
+ "attachment_uuid": {
+ "type": "string",
+ "description": "Unique indentifier of attached document to the template."
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the attached document to the template."
+ }
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "List of fields to be filled in the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "uuid",
+ "submitter_uuid",
+ "name",
+ "type",
+ "required",
+ "areas"
+ ],
+ "properties": {
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the field."
+ },
+ "submitter_uuid": {
+ "type": "string",
+ "description": "Unique identifier of the submitter that filled the field."
+ },
+ "name": {
+ "type": "string",
+ "description": "Field name."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels."
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value."
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value."
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value."
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value."
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value."
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types."
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields."
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields."
+ },
+ "mask": {
+ "type": "boolean",
+ "description": "Indicates if the field is masked on the document."
+ }
+ }
+ },
+ "areas": {
+ "type": "array",
+ "description": "List of areas where the field is located in the document.",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "attachment_uuid",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X coordinate of the area where the field is located in the document."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y coordinate of the area where the field is located in the document."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the area where the field is located in the document."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the area where the field is located in the document."
+ },
+ "attachment_uuid": {
+ "type": "string",
+ "description": "Unique identifier of the attached document where the field is located."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the attached document where the field is located."
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "uuid"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Submitter name."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the submitter."
+ }
+ }
+ }
+ },
+ "author_id": {
+ "type": "integer",
+ "description": "Unique identifier of the author of the template."
+ },
+ "archived_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "Date and time when the template was archived."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "Date and time when the template was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "Date and time when the template was updated."
+ },
+ "source": {
+ "type": "string",
+ "description": "Source of the template.",
+ "enum": [
+ "native",
+ "api",
+ "embed"
+ ]
+ },
+ "external_id": {
+ "type": "string",
+ "nullable": true,
+ "description": "Identifier of the template in the external system."
+ },
+ "folder_id": {
+ "type": "integer",
+ "description": "Unique identifier of the folder where the template is placed."
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "Folder name where the template is placed."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "Indicates if the template is accessible by link."
+ },
+ "author": {
+ "type": "object",
+ "required": [
+ "id",
+ "first_name",
+ "last_name",
+ "email"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the author."
+ },
+ "first_name": {
+ "type": "string",
+ "description": "First name of the author."
+ },
+ "last_name": {
+ "type": "string",
+ "description": "Last name of the author."
+ },
+ "email": {
+ "type": "string",
+ "description": "Author email."
+ }
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "List of documents attached to the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "uuid",
+ "url",
+ "preview_image_url",
+ "filename"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the document."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the document."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the document."
+ },
+ "preview_image_url": {
+ "type": "string",
+ "description": "Document preview image URL."
+ },
+ "filename": {
+ "type": "string",
+ "description": "Document filename."
+ }
+ }
+ }
+ }
+ }
+ },
+ "example": {
+ "id": 5,
+ "slug": "s3ff992CoPjvaX",
+ "name": "Demo PDF",
+ "schema": [
+ {
+ "name": "Demo PDF",
+ "attachment_uuid": "48d2998f-266b-47e4-beb2-250ab7ccebdf"
+ }
+ ],
+ "fields": [
+ {
+ "name": "Name",
+ "type": "text",
+ "required": true,
+ "uuid": "d0bf3c0c-1928-40c8-80f9-d9f3c6ad4eff",
+ "submitter_uuid": "0b0bff58-bc9a-475d-b4a9-2f3e5323faf7",
+ "areas": [
+ {
+ "page": 1,
+ "attachment_uuid": "48d2998f-266b-47e4-beb2-250ab7ccebdf",
+ "x": 0.403158189124654,
+ "y": 0.04211750189825361,
+ "w": 0.100684625476058,
+ "h": 0.01423690205011389
+ }
+ ]
+ }
+ ],
+ "submitters": [
+ {
+ "name": "Submitter",
+ "uuid": "0b0bff58-bc9a-475d-b4a9-2f3e5323faf7"
+ }
+ ],
+ "author_id": 1,
+ "archived_at": null,
+ "created_at": "2023-12-14T15:50:21.799Z",
+ "updated_at": "2023-12-14T15:50:21.799Z",
+ "source": "api",
+ "folder_id": 1,
+ "folder_name": "Default",
+ "external_id": "c248ffba-ef81-48b7-8e17-e3cecda1c1c5",
+ "shared_link": true,
+ "author": {
+ "id": 1,
+ "first_name": "John",
+ "last_name": "Doe",
+ "email": "john.doe@example.com"
+ },
+ "documents": [
+ {
+ "id": 7,
+ "uuid": "48d2998f-266b-47e4-beb2-250ab7ccebdf",
+ "url": "https://docuseal.com/file/hash/Demo%20PDF.pdf"
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/templates/merge": {
+ "post": {
+ "security": [
+ {
+ "AuthToken": []
+ }
+ ],
+ "tags": [
+ "Templates"
+ ],
+ "summary": "Merge templates",
+ "description": "The API endpoint allows you to merge multiple templates with documents and fields into a new combined template.",
+ "operationId": "mergeTemplate",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "template_ids"
+ ],
+ "properties": {
+ "template_ids": {
+ "type": "array",
+ "description": "An array of template ids to merge into a new template.",
+ "items": {
+ "type": "integer"
+ },
+ "example": [
+ 321,
+ 432
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "Template name. Existing name with (Merged) suffix will be used if not specified.",
+ "example": "Merged Template"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The name of the folder in which the merged template should be placed."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this template within your app."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "set to `true` to make the template available via a shared link. This will allow anyone with the link to create a submission from this template.",
+ "default": true
+ },
+ "roles": {
+ "type": "array",
+ "description": "An array of submitter role names to be used in the merged template.",
+ "items": {
+ "type": "string"
+ },
+ "example": [
+ "Agent",
+ "Customer"
+ ]
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "id",
+ "slug",
+ "name",
+ "preferences",
+ "schema",
+ "fields",
+ "submitters",
+ "author_id",
+ "archived_at",
+ "created_at",
+ "updated_at",
+ "source",
+ "external_id",
+ "folder_id",
+ "folder_name",
+ "author",
+ "documents"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the document template."
+ },
+ "slug": {
+ "type": "string",
+ "description": "Unique slug of the document template."
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the template."
+ },
+ "preferences": {
+ "type": "object",
+ "description": "Template preferences."
+ },
+ "schema": {
+ "type": "array",
+ "description": "List of documents attached to the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "attachment_uuid",
+ "name"
+ ],
+ "properties": {
+ "attachment_uuid": {
+ "type": "string",
+ "description": "Unique indentifier of attached document to the template."
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the attached document to the template."
+ }
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "List of fields to be filled in the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "uuid",
+ "submitter_uuid",
+ "name",
+ "type",
+ "required",
+ "areas"
+ ],
+ "properties": {
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the field."
+ },
+ "submitter_uuid": {
+ "type": "string",
+ "description": "Unique identifier of the submitter that filled the field."
+ },
+ "name": {
+ "type": "string",
+ "description": "Field name."
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the field (e.g., text, signature, date, initials).",
+ "enum": [
+ "heading",
+ "text",
+ "signature",
+ "initials",
+ "date",
+ "number",
+ "image",
+ "checkbox",
+ "multiple",
+ "file",
+ "radio",
+ "select",
+ "cells",
+ "stamp",
+ "payment",
+ "phone",
+ "verification"
+ ]
+ },
+ "required": {
+ "type": "boolean",
+ "description": "Indicates if the field is required."
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "font_size": {
+ "type": "integer",
+ "description": "Font size of the field value in pixels."
+ },
+ "font_type": {
+ "type": "string",
+ "description": "Font type of the field value."
+ },
+ "font": {
+ "type": "string",
+ "description": "Font family of the field value."
+ },
+ "color": {
+ "type": "string",
+ "description": "Font color of the field value."
+ },
+ "align": {
+ "type": "string",
+ "description": "Horizontal alignment of the field text value."
+ },
+ "valign": {
+ "type": "string",
+ "description": "Vertical alignment of the field text value."
+ },
+ "format": {
+ "type": "string",
+ "description": "The data format for different field types."
+ },
+ "price": {
+ "type": "number",
+ "description": "Price value of the payment field. Only for payment fields."
+ },
+ "currency": {
+ "type": "string",
+ "description": "Currency value of the payment field. Only for payment fields."
+ },
+ "mask": {
+ "type": "boolean",
+ "description": "Indicates if the field is masked on the document."
+ }
+ }
+ },
+ "areas": {
+ "type": "array",
+ "description": "List of areas where the field is located in the document.",
+ "items": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "w",
+ "h",
+ "attachment_uuid",
+ "page"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X coordinate of the area where the field is located in the document."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y coordinate of the area where the field is located in the document."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the area where the field is located in the document."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the area where the field is located in the document."
+ },
+ "attachment_uuid": {
+ "type": "string",
+ "description": "Unique identifier of the attached document where the field is located."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the attached document where the field is located."
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "uuid"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Submitter name."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the submitter."
+ }
+ }
+ }
+ },
+ "author_id": {
+ "type": "integer",
+ "description": "Unique identifier of the author of the template."
+ },
+ "archived_at": {
+ "type": "string",
+ "nullable": true,
+ "description": "Date and time when the template was archived."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "Date and time when the template was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "Date and time when the template was updated."
+ },
+ "source": {
+ "type": "string",
+ "description": "Source of the template.",
+ "enum": [
+ "native",
+ "api",
+ "embed"
+ ]
+ },
+ "external_id": {
+ "type": "string",
+ "nullable": true,
+ "description": "Identifier of the template in the external system."
+ },
+ "folder_id": {
+ "type": "integer",
+ "description": "Unique identifier of the folder where the template is placed."
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "Folder name where the template is placed."
+ },
+ "shared_link": {
+ "type": "boolean",
+ "description": "Indicates if the template is accessible by link."
+ },
+ "author": {
+ "type": "object",
+ "required": [
+ "id",
+ "first_name",
+ "last_name",
+ "email"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the author."
+ },
+ "first_name": {
+ "type": "string",
+ "description": "First name of the author."
+ },
+ "last_name": {
+ "type": "string",
+ "description": "Last name of the author."
+ },
+ "email": {
+ "type": "string",
+ "description": "Author email."
+ }
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "List of documents attached to the template.",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "uuid",
+ "url",
+ "preview_image_url",
+ "filename"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the document."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the document."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the document."
+ },
+ "preview_image_url": {
+ "type": "string",
+ "description": "Document preview image URL."
+ },
+ "filename": {
+ "type": "string",
+ "description": "Document filename."
+ }
+ }
+ }
+ }
+ }
+ },
+ "example": {
+ "id": 6,
+ "slug": "Xc7opTqwwV9P7x",
+ "name": "Merged Template",
+ "schema": [
+ {
+ "attachment_uuid": "68aa0716-61f0-4535-9ba4-6c00f835b080",
+ "name": "sample-document"
+ }
+ ],
+ "fields": [
+ {
+ "uuid": "93c7065b-1b19-4551-b67b-9946bf1c11c9",
+ "submitter_uuid": "ad128012-756d-4d17-b728-6f6b1d482bb5",
+ "name": "Name",
+ "type": "text",
+ "required": true,
+ "areas": [
+ {
+ "page": 0,
+ "attachment_uuid": "09a8bc73-a7a9-4fd9-8173-95752bdf0af5",
+ "x": 0.403158189124654,
+ "y": 0.04211750189825361,
+ "w": 0.100684625476058,
+ "h": 0.01423690205011389
+ }
+ ]
+ }
+ ],
+ "submitters": [
+ {
+ "name": "First Party",
+ "uuid": "ad128012-756d-4d17-b728-6f6b1d482bb5"
+ }
+ ],
+ "author_id": 1,
+ "archived_at": null,
+ "created_at": "2023-12-14T15:50:21.799Z",
+ "updated_at": "2023-12-14T15:50:21.799Z",
+ "source": "api",
+ "folder_id": 2,
+ "folder_name": "Default",
+ "external_id": null,
+ "shared_link": true,
+ "author": {
+ "id": 1,
+ "first_name": "John",
+ "last_name": "Doe",
+ "email": "john.doe@example.com"
+ },
+ "documents": [
+ {
+ "id": 9,
+ "uuid": "ded62277-9705-4fac-b5dc-58325d4102eb",
+ "url": "https://docuseal.com/file/hash/sample-document.pdf",
+ "filename": "sample-document.pdf"
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/webhooks/form-webhook.md b/docs/webhooks/form-webhook.md
new file mode 100644
index 00000000..32c0eb19
--- /dev/null
+++ b/docs/webhooks/form-webhook.md
@@ -0,0 +1,251 @@
+# Form Webhook
+
+During the form filling and signing process, 3 types of events may occur and are dispatched at different stages:
+
+- **'form.viewed'** event is triggered when the submitter first opens the form.
+- **'form.started'** event is triggered when the submitter initiates filling out the form.
+- **'form.completed'** event is triggered upon successful form completion and signing by one of the parties.
+- **'form.declined'** event is triggered when a signer declines the submission.
+
+ It's important to note that each of these events contain information available at the time of dispatch, so some data may be missing or incomplete depending on the specific event. Failed webhook requests (4xx, 5xx) are automatically retried multiple times within 48 hours (every 2^attempt minutes) for all production accounts.
+**Related Guides**
+[Download Signed Documents](https://www.docuseal.com/guides/download-signed-documents)
+
+```json
+{
+ "event_type": {
+ "type": "string",
+ "description": "The event type.",
+ "enum": [
+ "form.viewed",
+ "form.started",
+ "form.completed"
+ ]
+ },
+ "timestamp": {
+ "type": "string",
+ "description": "The event timestamp.",
+ "example": "2023-09-24T11:20:42Z",
+ "format": "date-time"
+ },
+ "data": {
+ "type": "object",
+ "description": "Submitted data object.",
+ "properties": {
+ "id": {
+ "type": "number",
+ "description": "The submitter's unique identifier."
+ },
+ "submission_id": {
+ "type": "number",
+ "description": "The unique submission identifier."
+ },
+ "email": {
+ "type": "string",
+ "description": "The submitter's email address",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "ua": {
+ "type": "string",
+ "description": "The user agent string that provides information about the submitter's web browser.",
+ "example": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"
+ },
+ "ip": {
+ "type": "string",
+ "description": "The submitter's IP address."
+ },
+ "name": {
+ "type": "string",
+ "description": "The submitter's name."
+ },
+ "phone": {
+ "type": "string",
+ "description": "The submitter's phone number, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "role": {
+ "type": "string",
+ "description": "The submitter's role name or title.",
+ "example": "First Party"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify submitter within your app."
+ },
+ "application_key": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify submitter within your app. Backward compatibility with the previous version of the API. Use external_id instead."
+ },
+ "decline_reason": {
+ "type": "string",
+ "description": "Submitter provided decline message."
+ },
+ "sent_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "status": {
+ "type": "string",
+ "description": "The submitter status.",
+ "enum": [
+ "completed",
+ "declined",
+ "opened",
+ "sent",
+ "awaiting"
+ ]
+ },
+ "opened_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "completed_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "declined_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "submission": {
+ "type": "object",
+ "description": "The submission details.",
+ "properties": {
+ "id": {
+ "type": "number",
+ "description": "The submission's unique identifier."
+ },
+ "audit_log_url": {
+ "type": "string",
+ "description": "The audit log PDF URL. Available only if the submission was completed by all submitters."
+ },
+ "combined_document_url": {
+ "type": "string",
+ "description": "The URL of the combined documents with audit log. Combined documents can be enabled via /settings/accounts."
+ },
+ "status": {
+ "type": "string",
+ "description": "The submission status.",
+ "enum": [
+ "completed",
+ "declined",
+ "expired",
+ "pending"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "description": "The submission URL."
+ },
+ "variables": {
+ "type": "object",
+ "description": "Dynamic content variables object."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The submission creation date.",
+ "format": "date-time"
+ }
+ }
+ },
+ "template": {
+ "type": "object",
+ "description": "Base template details.",
+ "properties": {
+ "id": {
+ "type": "number",
+ "description": "The template's unique identifier."
+ },
+ "name": {
+ "type": "string",
+ "description": "The template's name."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify template within your app."
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "Template folder name."
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "properties": {
+ "send_email": {
+ "type": "boolean",
+ "description": "The flag indicating whether the submitter has opted to receive an email."
+ },
+ "send_sms": {
+ "type": "boolean",
+ "description": "The flag indicating whether the submitter has opted to receive an SMS."
+ }
+ }
+ },
+ "values": {
+ "type": "array",
+ "description": "List of the filled values passed by the submitter.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "field": {
+ "type": "string",
+ "description": "The field name."
+ },
+ "values": {
+ "type": "string",
+ "description": "The field value."
+ }
+ }
+ }
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information."
+ },
+ "audit_log_url": {
+ "type": "string",
+ "description": "The audit log PDF URL. Available only if the submission was completed by all submitters."
+ },
+ "submission_url": {
+ "type": "string",
+ "description": "The submission URL."
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The document file name."
+ },
+ "url": {
+ "type": "string",
+ "description": "The document file URL."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/docs/webhooks/submission-webhook.md b/docs/webhooks/submission-webhook.md
new file mode 100644
index 00000000..15e1bcbd
--- /dev/null
+++ b/docs/webhooks/submission-webhook.md
@@ -0,0 +1,321 @@
+# Submission Webhook
+
+Get submission creation, completion, expiration, and archiving notifications using these events:
+
+- **'submission.created'** event is triggered when the submission is created.
+- **'submission.completed'** event is triggered when the submission is completed by all signing parties.
+- **'submission.expired'** event is triggered when the submission expires.
+- **'submission.archived'** event is triggered when the submission is archived.
+
+
+
+```json
+{
+ "event_type": {
+ "type": "string",
+ "description": "The event type.",
+ "enum": [
+ "submission.created",
+ "submission.archived"
+ ]
+ },
+ "timestamp": {
+ "type": "string",
+ "description": "The event timestamp.",
+ "example": "2023-09-24T11:20:42Z",
+ "format": "date-time"
+ },
+ "data": {
+ "type": "object",
+ "description": "Submitted data object.",
+ "properties": {
+ "id": {
+ "type": "number",
+ "description": "The submission's unique identifier."
+ },
+ "archived_at": {
+ "type": "string",
+ "description": "The submission archive date."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The submission creation date."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "The submission update date."
+ },
+ "source": {
+ "type": "string",
+ "description": "The submission source.",
+ "enum": [
+ "invite",
+ "bulk",
+ "api",
+ "embed",
+ "link"
+ ]
+ },
+ "submitters_order": {
+ "type": "string",
+ "description": "The submitters order.",
+ "enum": [
+ "random",
+ "preserved"
+ ]
+ },
+ "audit_log_url": {
+ "type": "string",
+ "description": "Audit log file URL."
+ },
+ "submitters": {
+ "type": "array",
+ "description": "The list of submitters for the submission.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "number",
+ "description": "The submitter's unique identifier."
+ },
+ "submission_id": {
+ "type": "number",
+ "description": "The unique submission identifier."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "The submitter UUID."
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the submitter.",
+ "format": "email",
+ "example": "john.doe@example.com"
+ },
+ "slug": {
+ "type": "string",
+ "description": "The unique slug of the document template."
+ },
+ "sent_at": {
+ "type": "string",
+ "description": "The date and time when the signing request was sent to the submitter."
+ },
+ "opened_at": {
+ "type": "string",
+ "description": "The date and time when the submitter opened the signing form."
+ },
+ "completed_at": {
+ "type": "string",
+ "description": "The date and time when the submitter completed the signing form."
+ },
+ "declined_at": {
+ "type": "string",
+ "description": "The date and time when the submitter declined the signing form."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The date and time when the submitter was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "The date and time when the submitter was last updated."
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the submitter."
+ },
+ "phone": {
+ "type": "string",
+ "description": "The phone number of the submitter, formatted according to the E.164 standard.",
+ "example": "+1234567890"
+ },
+ "role": {
+ "type": "string",
+ "description": "The role name or title of the submitter.",
+ "example": "First Party"
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Metadata object with additional submitter information.",
+ "example": "{ 'customField': 'value' }"
+ },
+ "status": {
+ "type": "string",
+ "description": "The submitter status.",
+ "enum": [
+ "completed",
+ "declined",
+ "opened",
+ "sent",
+ "awaiting"
+ ]
+ },
+ "application_key": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify this submitter within your app."
+ },
+ "values": {
+ "type": "object",
+ "description": "An object with pre-filled values for the submission. Use field names for keys of the object. For more configurations see `fields` param."
+ },
+ "documents": {
+ "type": "array",
+ "description": "The list of documents for the submission.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The document file name."
+ },
+ "url": {
+ "type": "string",
+ "description": "The document file URL."
+ }
+ }
+ }
+ },
+ "preferences": {
+ "type": "object",
+ "description": "The submitter preferences."
+ }
+ }
+ }
+ },
+ "template": {
+ "type": "object",
+ "description": "Base template details.",
+ "properties": {
+ "id": {
+ "type": "number",
+ "description": "The template's unique identifier."
+ },
+ "name": {
+ "type": "string",
+ "description": "The template's name."
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify template within your app."
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "The folder name."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The date and time when the template was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "The date and time when the template was last updated."
+ }
+ }
+ },
+ "variables": {
+ "type": "object",
+ "description": "Dynamic content variables object."
+ },
+ "created_by_user": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the user who created the submission."
+ },
+ "first_name": {
+ "type": "string",
+ "description": "The first name of the user who created the submission."
+ },
+ "last_name": {
+ "type": "string",
+ "description": "The last name of the user who created the submission."
+ },
+ "email": {
+ "type": "string",
+ "description": "The email address of the user who created the submission."
+ }
+ }
+ },
+ "submission_events": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Submission event unique ID number."
+ },
+ "submitter_id": {
+ "type": "integer",
+ "description": "Unique identifier of the submitter that triggered the event."
+ },
+ "event_type": {
+ "type": "string",
+ "description": "Event type.",
+ "enum": [
+ "send_email",
+ "bounce_email",
+ "complaint_email",
+ "send_reminder_email",
+ "send_sms",
+ "send_2fa_sms",
+ "open_email",
+ "click_email",
+ "click_sms",
+ "phone_verified",
+ "start_form",
+ "start_verification",
+ "complete_verification",
+ "view_form",
+ "invite_party",
+ "complete_form",
+ "decline_form",
+ "api_complete_form"
+ ]
+ },
+ "event_timestamp": {
+ "type": "string",
+ "description": "Date and time when the event was triggered."
+ }
+ }
+ }
+ },
+ "documents": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Document name."
+ },
+ "url": {
+ "type": "string",
+ "description": "Document URL."
+ }
+ }
+ }
+ },
+ "status": {
+ "type": "string",
+ "description": "The status of the submission.",
+ "enum": [
+ "completed",
+ "declined",
+ "expired",
+ "pending"
+ ]
+ },
+ "completed_at": {
+ "type": "string",
+ "description": "The date and time when the submission was fully completed."
+ }
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/docs/webhooks/template-webhook.md b/docs/webhooks/template-webhook.md
new file mode 100644
index 00000000..b843a0ed
--- /dev/null
+++ b/docs/webhooks/template-webhook.md
@@ -0,0 +1,235 @@
+# Template Webhook
+
+Get template creation and update notifications using these events:
+
+- **'template.created'** is triggered when the template is created.
+- **'tempate.updated'** is triggered when the template is updated.
+
+
+
+```json
+{
+ "event_type": {
+ "type": "string",
+ "description": "The event type.",
+ "enum": [
+ "template.created",
+ "template.updated"
+ ]
+ },
+ "timestamp": {
+ "type": "string",
+ "description": "The event timestamp.",
+ "example": "2023-09-24T11:20:42Z",
+ "format": "date-time"
+ },
+ "data": {
+ "type": "object",
+ "description": "Submitted data object.",
+ "properties": {
+ "id": {
+ "type": "number",
+ "description": "The template's unique identifier."
+ },
+ "slug": {
+ "type": "string",
+ "description": "The template's unique slug."
+ },
+ "name": {
+ "type": "string",
+ "description": "The template's name."
+ },
+ "schema": {
+ "type": "array",
+ "description": "The template document files.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "attachment_uuid": {
+ "type": "string",
+ "description": "The attachment UUID."
+ },
+ "name": {
+ "type": "string",
+ "description": "The attachment name."
+ }
+ }
+ }
+ },
+ "fields": {
+ "type": "array",
+ "description": "The template fields.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "uuid": {
+ "type": "string",
+ "description": "The field UUID."
+ },
+ "submitter_uuid": {
+ "type": "string",
+ "description": "The submitter role UUID."
+ },
+ "name": {
+ "type": "string",
+ "description": "The field name."
+ },
+ "required": {
+ "type": "boolean",
+ "description": "The flag indicating whether the field is required."
+ },
+ "preferences": {
+ "type": "object",
+ "description": "The field preferences."
+ },
+ "areas": {
+ "type": "array",
+ "description": "List of areas where the field is located in the document.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X coordinate of the area where the field is located in the document."
+ },
+ "y": {
+ "type": "number",
+ "description": "Y coordinate of the area where the field is located in the document."
+ },
+ "w": {
+ "type": "number",
+ "description": "Width of the area where the field is located in the document."
+ },
+ "h": {
+ "type": "number",
+ "description": "Height of the area where the field is located in the document."
+ },
+ "attachment_uuid": {
+ "type": "string",
+ "description": "Unique identifier of the attached document where the field is located."
+ },
+ "page": {
+ "type": "integer",
+ "description": "Page number of the attached document where the field is located."
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "submitters": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Submitter name."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the submitter."
+ }
+ }
+ }
+ },
+ "author_id": {
+ "type": "integer",
+ "description": "Unique identifier of the author of the template."
+ },
+ "account_id": {
+ "type": "integer",
+ "description": "Unique identifier of the account of the template."
+ },
+ "archived_at": {
+ "type": "string",
+ "description": "Date and time when the template was archived."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "Date and time when the template was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "Date and time when the template was updated."
+ },
+ "source": {
+ "type": "string",
+ "description": "Source of the template.",
+ "enum": [
+ "native",
+ "api",
+ "embed"
+ ]
+ },
+ "external_id": {
+ "type": "string",
+ "description": "Identifier of the template in the external system."
+ },
+ "folder_id": {
+ "type": "integer",
+ "description": "Unique identifier of the folder where the template is placed."
+ },
+ "folder_name": {
+ "type": "string",
+ "description": "Folder name where the template is placed."
+ },
+ "application_key": {
+ "type": "string",
+ "description": "Your application-specific unique string key to identify tempate_id within your app."
+ },
+ "author": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the author."
+ },
+ "first_name": {
+ "type": "string",
+ "description": "First name of the author."
+ },
+ "last_name": {
+ "type": "string",
+ "description": "Last name of the author."
+ },
+ "email": {
+ "type": "string",
+ "description": "Author email."
+ }
+ }
+ },
+ "documents": {
+ "type": "array",
+ "description": "List of documents attached to the template.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "Unique identifier of the document."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "Unique identifier of the document."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the document."
+ },
+ "preview_image_url": {
+ "type": "string",
+ "description": "Document preview image URL."
+ },
+ "filename": {
+ "type": "string",
+ "description": "Document filename."
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/lib/abilities/template_conditions.rb b/lib/abilities/template_conditions.rb
index 4a7ebf04..dede24ce 100644
--- a/lib/abilities/template_conditions.rb
+++ b/lib/abilities/template_conditions.rb
@@ -5,26 +5,26 @@ module Abilities
module_function
def collection(user, ability: nil)
- template_ids = Template.where(account_id: user.account_id).select(:id)
+ templates = Template.where(account_id: user.account_id)
+
+ return templates unless user.account.testing?
shared_ids =
- TemplateSharing.where({ ability:,
- account_id: [user.account_id, TemplateSharing::ALL_ID] }.compact)
+ TemplateSharing.where({ ability:, account_id: [user.account_id, TemplateSharing::ALL_ID] }.compact)
.select(:template_id)
- join_query = Template.arel_table
- .join(Arel::Nodes::TableAlias.new(template_ids.arel.union(shared_ids.arel), 'union_ids'))
- .on(Template.arel_table[:id].eq(Arel::Table.new(:union_ids)[:id]))
-
- Template.joins(join_query.join_sources.first)
+ Template.where(Template.arel_table[:id].in(templates.select(:id).arel.union(:all, shared_ids.arel)))
end
def entity(template, user:, ability: nil)
+ return true if template.account_id.blank?
return true if template.account_id == user.account_id
+ return false unless user.account.linked_account_account
+ return false if template.template_sharings.to_a.blank?
account_ids = [user.account_id, TemplateSharing::ALL_ID]
- template.template_sharings.any? do |e|
+ template.template_sharings.to_a.any? do |e|
e.account_id.in?(account_ids) && (ability.nil? || e.ability == 'manage' || e.ability == ability)
end
end
diff --git a/lib/ability.rb b/lib/ability.rb
index 960a8beb..a721e089 100644
--- a/lib/ability.rb
+++ b/lib/ability.rb
@@ -4,13 +4,11 @@ class Ability
include CanCan::Ability
def initialize(user)
- can :manage, Template, account_id: user.account_id
-
- can %i[read update create], Template,
- Abilities::TemplateConditions.collection(user) do |template|
+ can %i[read create update], Template, Abilities::TemplateConditions.collection(user) do |template|
Abilities::TemplateConditions.entity(template, user:, ability: 'manage')
end
+ can :destroy, Template, account_id: user.account_id
can :manage, TemplateFolder, account_id: user.account_id
can :manage, TemplateSharing, template: { account_id: user.account_id }
can :manage, Submission, account_id: user.account_id
diff --git a/lib/account_configs.rb b/lib/account_configs.rb
index 5f884657..06fec78f 100644
--- a/lib/account_configs.rb
+++ b/lib/account_configs.rb
@@ -9,9 +9,15 @@ module AccountConfigs
'twelve_hours' => '12 hours',
'twenty_four_hours' => '24 hours',
'two_days' => '2 days',
+ 'three_days' => '3 days',
'four_days' => '4 days',
+ 'five_days' => '5 days',
+ 'six_days' => '6 days',
+ 'seven_days' => '7 days',
'eight_days' => '8 days',
- 'fifteen_days' => '15 days'
+ 'fifteen_days' => '15 days',
+ 'twenty_one_days' => '21 days',
+ 'thirty_days' => '30 days'
}.freeze
module_function
diff --git a/lib/accounts.rb b/lib/accounts.rb
index f3dd639b..5127d2c7 100644
--- a/lib/accounts.rb
+++ b/lib/accounts.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
module Accounts
+ LINK_EXPIRES_AT = 40.minutes
+
module_function
def create_duplicate(account)
@@ -53,8 +55,11 @@ module Accounts
ApplicationRecord.transaction do
account.testing_accounts << testing_account
+ original_email = account.users.order(:id).first.email
+ test_email = generate_unique_test_email(original_email)
+
testing_account.users.create!(
- email: account.users.order(:id).first.email.sub('@', '+test@'),
+ email: test_email,
first_name: 'Testing',
last_name: 'Environment',
password: SecureRandom.hex,
@@ -63,6 +68,22 @@ module Accounts
end
end
+ def generate_unique_test_email(original_email)
+ base_email = original_email.sub('@', '+test@')
+
+ return base_email unless User.exists?(email: base_email)
+
+ (1..3).each do |i|
+ test_email = original_email.sub('@', "+test#{i}@")
+
+ return test_email unless User.exists?(email: test_email)
+ end
+
+ timestamp = Time.current.to_i
+
+ original_email.sub('@', "+test#{timestamp}@")
+ end
+
def create_default_template(account)
template = Template.find(1)
@@ -73,6 +94,8 @@ module Accounts
new_template.save!
+ SearchEntries.enqueue_reindex(new_template)
+
Templates::CloneAttachments.call(template: new_template, original_template: template)
new_template
@@ -164,4 +187,11 @@ module Accounts
rescue TZInfo::InvalidTimezoneIdentifier
'UTC'
end
+
+ def link_expires_at(account)
+ return if AccountConfig.find_or_initialize_by(account: account,
+ key: AccountConfig::DOWNLOAD_LINKS_EXPIRE_KEY).value == false
+
+ LINK_EXPIRES_AT.from_now
+ end
end
diff --git a/lib/action_mailer_configs_interceptor.rb b/lib/action_mailer_configs_interceptor.rb
index f823fc3d..b81cb45d 100644
--- a/lib/action_mailer_configs_interceptor.rb
+++ b/lib/action_mailer_configs_interceptor.rb
@@ -28,7 +28,7 @@ module ActionMailerConfigsInterceptor
end
unless Docuseal.multitenant?
- email_configs = EncryptedConfig.find_by(key: EncryptedConfig::EMAIL_SMTP_KEY)
+ email_configs = EncryptedConfig.order(:account_id).find_by(key: EncryptedConfig::EMAIL_SMTP_KEY)
if email_configs
message.delivery_method(:smtp, build_smtp_configs_hash(email_configs))
diff --git a/lib/api_path_consider_json_middleware.rb b/lib/api_path_consider_json_middleware.rb
index 48bb1b0a..013c2ee4 100644
--- a/lib/api_path_consider_json_middleware.rb
+++ b/lib/api_path_consider_json_middleware.rb
@@ -8,7 +8,9 @@ class ApiPathConsiderJsonMiddleware
def call(env)
if env['PATH_INFO'].starts_with?('/api') &&
(!env['PATH_INFO'].ends_with?('/documents') || env['REQUEST_METHOD'] != 'POST') &&
- !env['PATH_INFO'].ends_with?('/attachments')
+ !env['PATH_INFO'].ends_with?('/attachments') &&
+ !env['PATH_INFO'].ends_with?('/submitter_sms_clicks') &&
+ !env['PATH_INFO'].ends_with?('/submitter_email_clicks')
env['CONTENT_TYPE'] = 'application/json'
end
diff --git a/lib/detect_browser_device.rb b/lib/detect_browser_device.rb
new file mode 100644
index 00000000..0240d278
--- /dev/null
+++ b/lib/detect_browser_device.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+module DetectBrowserDevice
+ module_function
+
+ MOBILE_USER_AGENT_REGEXP = /
+ iPhone |
+ iPod |
+ Android.*Mobile|
+ Opera\ Mini |
+ Opera\ Mobi |
+ webOS |
+ IEMobile |
+ Windows\ Phone |
+ BlackBerry |
+ BB10 |
+ Mobile
+ /ix
+
+ TABLET_USER_AGENT_REGEXP = /
+ iPad |
+ Android(?!.*Mobile)|
+ Tablet |
+ Kindle |
+ PlayBook |
+ Silk
+ /ix
+
+ def call(user_agent)
+ return if user_agent.blank?
+
+ return 'mobile' if MOBILE_USER_AGENT_REGEXP.match?(user_agent)
+ return 'tablet' if TABLET_USER_AGENT_REGEXP.match?(user_agent)
+
+ 'desktop'
+ end
+end
diff --git a/lib/docuseal.rb b/lib/docuseal.rb
index f74b99d1..578d1fcc 100644
--- a/lib/docuseal.rb
+++ b/lib/docuseal.rb
@@ -12,7 +12,7 @@ module Docuseal
DISCORD_URL = 'https://discord.gg/qygYCDGck9'
TWITTER_URL = 'https://twitter.com/docusealco'
TWITTER_HANDLE = '@docusealco'
- CHATGPT_URL = 'https://chatgpt.com/g/g-9hg8AAw0r-docuseal'
+ CHATGPT_URL = "#{PRODUCT_URL}/chat".freeze
SUPPORT_EMAIL = 'support@docuseal.com'
HOST = ENV.fetch('HOST', 'localhost')
AATL_CERT_NAME = 'docuseal_aatl'
@@ -55,6 +55,10 @@ module Docuseal
ENV['MULTITENANT'] == 'true'
end
+ def advanced_formats?
+ multitenant?
+ end
+
def demo?
ENV['DEMO'] == 'true'
end
@@ -69,10 +73,25 @@ module Docuseal
@default_pkcs ||= GenerateCertificate.load_pkcs(Docuseal::CERTS)
end
+ def fulltext_search?
+ return @fulltext_search unless @fulltext_search.nil?
+
+ @fulltext_search =
+ if SearchEntry.table_exists?
+ Docuseal.multitenant? || AccountConfig.exists?(key: :fulltext_search, value: true)
+ else
+ false
+ end
+ end
+
def enable_pwa?
true
end
+ def pdf_format
+ @pdf_format ||= ENV['PDF_FORMAT'].to_s.downcase
+ end
+
def trusted_certs
@trusted_certs ||=
ENV['TRUSTED_CERTS'].to_s.gsub('\\n', "\n").split("\n\n").map do |base64|
diff --git a/lib/email_verification_codes.rb b/lib/email_verification_codes.rb
new file mode 100644
index 00000000..a65da175
--- /dev/null
+++ b/lib/email_verification_codes.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module EmailVerificationCodes
+ DRIFT_BEHIND = 5.minutes
+
+ module_function
+
+ def generate(value)
+ totp = ROTP::TOTP.new(build_totp_secret(value))
+
+ totp.at(Time.current)
+ end
+
+ def verify(code, value)
+ totp = ROTP::TOTP.new(build_totp_secret(value))
+
+ totp.verify(code, drift_behind: DRIFT_BEHIND)
+ end
+
+ def build_totp_secret(value)
+ ROTP::Base32.encode(
+ Digest::SHA1.digest(
+ [Rails.application.secret_key_base, value].join(':')
+ )
+ )
+ end
+end
diff --git a/lib/highlight_code.rb b/lib/highlight_code.rb
new file mode 100644
index 00000000..ed6dfcca
--- /dev/null
+++ b/lib/highlight_code.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module HighlightCode
+ module_function
+
+ def call(code, lexer, theme: 'base16.light')
+ require 'rouge/themes/base16' unless Rouge::Theme.registry[theme]
+
+ formatter = Rouge::Formatters::HTMLInline.new(theme)
+ lexer = Rouge::Lexers.const_get(lexer.to_sym).new
+ formatted_code = formatter.format(lexer.lex(code))
+ formatted_code = formatted_code.gsub('background-color: #181818', '') if theme == 'base16.dark'
+ formatted_code
+ end
+end
diff --git a/lib/image_utils.rb b/lib/image_utils.rb
new file mode 100644
index 00000000..8e7aa094
--- /dev/null
+++ b/lib/image_utils.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module ImageUtils
+ module_function
+
+ def blank?(image)
+ stats = image.stats
+
+ min = (0...image.bands).map { |i| stats.getpoint(0, i)[0] }
+ max = (0...image.bands).map { |i| stats.getpoint(1, i)[0] }
+
+ return true if min.all?(255) && max.all?(255)
+ return true if min.all?(0) && max.all?(0)
+
+ false
+ end
+
+ def error?(image)
+ image = image.crop(0, 0, image.width / 4, 2)
+
+ row1, row2 = image.to_a
+
+ row1[3..] == row2[..-4] && row1.each_cons(2).none? { |a, b| a == b }
+ end
+end
diff --git a/lib/load_bmp.rb b/lib/load_bmp.rb
new file mode 100644
index 00000000..2dc3269e
--- /dev/null
+++ b/lib/load_bmp.rb
@@ -0,0 +1,187 @@
+# frozen_string_literal: true
+
+module LoadBmp
+ module_function
+
+ # rubocop:disable Metrics
+ def call(bmp_bytes)
+ bmp_bytes = bmp_bytes.b
+
+ header_data = parse_bmp_headers(bmp_bytes)
+
+ raw_pixel_data_from_file = extract_raw_pixel_data_blob(
+ bmp_bytes,
+ header_data[:pixel_data_offset],
+ header_data[:bmp_stride],
+ header_data[:height]
+ )
+
+ final_pixel_data = prepare_unpadded_pixel_data_string(
+ raw_pixel_data_from_file,
+ header_data[:bpp],
+ header_data[:width],
+ header_data[:height],
+ header_data[:bmp_stride]
+ )
+
+ bands = header_data[:bpp] / 8
+
+ unless header_data[:bpp] == 24 || header_data[:bpp] == 32
+ raise ArgumentError, "Conversion for #{header_data[:bpp]}-bpp BMP not implemented."
+ end
+
+ image = Vips::Image.new_from_memory(final_pixel_data, header_data[:width], header_data[:height], bands, :uchar)
+
+ image = image.flip(:vertical) if header_data[:orientation] == -1
+
+ image_rgb =
+ if bands == 3
+ image.recomb(band3_recomb)
+ elsif bands == 4
+ image.recomb(band4_recomb)
+ end
+
+ image_rgb = image_rgb.copy(interpretation: :srgb) if image_rgb.interpretation != :srgb
+
+ image_rgb
+ end
+
+ def parse_bmp_headers(bmp_bytes)
+ raise ArgumentError, 'BMP data too short for file header (14 bytes).' if bmp_bytes.bytesize < 14
+
+ signature, pixel_data_offset = bmp_bytes.unpack('a2@10L<')
+
+ raise ArgumentError, "Not a valid BMP file (invalid signature 'BM')." if signature != 'BM'
+
+ raise ArgumentError, 'BMP data too short for info header size field (4 bytes).' if bmp_bytes.bytesize < (14 + 4)
+
+ info_header_size = bmp_bytes.unpack1('@14L<')
+
+ min_expected_info_header_size = 40
+
+ if info_header_size < min_expected_info_header_size
+ raise ArgumentError,
+ "Unsupported BMP info header size: #{info_header_size}. Expected at least #{min_expected_info_header_size}."
+ end
+
+ header_and_info_header_min_bytes = 14 + min_expected_info_header_size
+
+ if bmp_bytes.bytesize < header_and_info_header_min_bytes
+ raise ArgumentError,
+ 'BMP data too short for essential BITMAPINFOHEADER fields ' \
+ "(requires #{header_and_info_header_min_bytes} bytes total)."
+ end
+
+ _header_size_check, width, raw_height_from_header, planes, bpp, compression =
+ bmp_bytes.unpack('@14L bmp_bytes.bytesize
+ actual_available = bmp_bytes.bytesize - pixel_data_offset
+ actual_available = 0 if actual_available.negative?
+ raise ArgumentError,
+ "Pixel data segment (offset #{pixel_data_offset}, expected size #{expected_pixel_data_size}) " \
+ "exceeds BMP file size (#{bmp_bytes.bytesize}). " \
+ "Only #{actual_available} bytes available after offset."
+ end
+
+ raw_pixel_data_from_file = bmp_bytes.byteslice(pixel_data_offset, expected_pixel_data_size)
+
+ if raw_pixel_data_from_file.nil? || raw_pixel_data_from_file.bytesize < expected_pixel_data_size
+ raise ArgumentError,
+ "Extracted pixel data is smaller (#{raw_pixel_data_from_file&.bytesize || 0} bytes) " \
+ "than expected (#{expected_pixel_data_size} bytes based on stride and height)."
+ end
+
+ raw_pixel_data_from_file
+ end
+
+ def prepare_unpadded_pixel_data_string(raw_pixel_data_from_file, bpp, width, height, bmp_stride)
+ bytes_per_pixel = bpp / 8
+ actual_row_width_bytes = width * bytes_per_pixel
+
+ unpadded_rows = Array.new(height)
+ current_offset_in_blob = 0
+
+ height.times do |i|
+ if current_offset_in_blob + actual_row_width_bytes > raw_pixel_data_from_file.bytesize
+ raise ArgumentError,
+ "Not enough data in pixel blob for row #{i}. Offset #{current_offset_in_blob}, " \
+ "row width #{actual_row_width_bytes}, blob size #{raw_pixel_data_from_file.bytesize}"
+ end
+
+ unpadded_row_slice = raw_pixel_data_from_file.byteslice(current_offset_in_blob, actual_row_width_bytes)
+
+ if unpadded_row_slice.nil? || unpadded_row_slice.bytesize < actual_row_width_bytes
+ raise ArgumentError, "Failed to slice a full unpadded row from pixel data blob for row #{i}."
+ end
+
+ unpadded_rows[i] = unpadded_row_slice
+ current_offset_in_blob += bmp_stride
+ end
+
+ unpadded_rows.join
+ end
+
+ def band3_recomb
+ @band3_recomb ||=
+ Vips::Image.new_from_array(
+ [
+ [0, 0, 1],
+ [0, 1, 0],
+ [1, 0, 0]
+ ]
+ )
+ end
+
+ def band4_recomb
+ @band4_recomb ||= Vips::Image.new_from_array(
+ [
+ [0, 0, 1, 0],
+ [0, 1, 0, 0],
+ [1, 0, 0, 0]
+ ]
+ )
+ end
+ # rubocop:enable Metrics
+end
diff --git a/lib/load_ico.rb b/lib/load_ico.rb
new file mode 100644
index 00000000..2c48d766
--- /dev/null
+++ b/lib/load_ico.rb
@@ -0,0 +1,209 @@
+# frozen_string_literal: true
+
+module LoadIco
+ BI_RGB = 0
+
+ module_function
+
+ # rubocop:disable Metrics
+ def call(ico_bytes)
+ io = StringIO.new(ico_bytes)
+ _reserved, type, count = io.read(6)&.unpack('S= 40
+
+ dib_params_bytes = dib_io.read(36)
+ return nil unless dib_params_bytes && dib_params_bytes.bytesize == 36
+
+ dib_width, dib_actual_height_field, dib_planes, dib_bpp,
+ dib_compression, _dib_image_size, _xpels, _ypels,
+ dib_clr_used, _dib_clr_important = dib_params_bytes.unpack('l= min_xor_bytes_needed
+
+ and_mask_bits_for_row = []
+ if has_and_mask
+ dib_io.seek(and_mask_data_offset + (y_dib_row * and_scanline_stride))
+ and_mask_scanline_bytes = dib_io.read(and_scanline_stride)
+ min_and_bytes_needed = ((dib_width * 1) + 7) / 8
+ return nil unless and_mask_scanline_bytes && and_mask_scanline_bytes.bytesize >= min_and_bytes_needed
+
+ (0...dib_width).each do |x_pixel|
+ byte_index = x_pixel / 8
+ bit_index_in_byte = 7 - (x_pixel % 8)
+ byte_val = and_mask_scanline_bytes.getbyte(byte_index)
+ and_mask_bits_for_row << ((byte_val >> bit_index_in_byte) & 1)
+ end
+ end
+
+ (0...dib_width).each do |x_pixel|
+ r = 0
+ g = 0
+ b = 0
+ a = 255
+
+ case dib_bpp
+ when 32
+ offset = x_pixel * 4
+ blue = xor_scanline_bytes.getbyte(offset)
+ green = xor_scanline_bytes.getbyte(offset + 1)
+ red = xor_scanline_bytes.getbyte(offset + 2)
+ alpha_val = xor_scanline_bytes.getbyte(offset + 3)
+ r = red
+ g = green
+ b = blue
+ a = alpha_val
+ when 24
+ offset = x_pixel * 3
+ blue = xor_scanline_bytes.getbyte(offset)
+ green = xor_scanline_bytes.getbyte(offset + 1)
+ red = xor_scanline_bytes.getbyte(offset + 2)
+ r = red
+ g = green
+ b = blue
+ when 8
+ idx = xor_scanline_bytes.getbyte(x_pixel)
+ r_p, g_p, b_p, a_p = palette[idx] || [0, 0, 0, 0]
+ r = r_p
+ g = g_p
+ b = b_p
+ a = a_p
+ when 4
+ byte_val = xor_scanline_bytes.getbyte(x_pixel / 2)
+ idx = (x_pixel.even? ? (byte_val >> 4) : (byte_val & 0x0F))
+ r_p, g_p, b_p, a_p = palette[idx] || [0, 0, 0, 0]
+ r = r_p
+ g = g_p
+ b = b_p
+ a = a_p
+ when 1
+ byte_val = xor_scanline_bytes.getbyte(x_pixel / 8)
+ idx = (byte_val >> (7 - (x_pixel % 8))) & 1
+ r_p, g_p, b_p, a_p = palette[idx] || [0, 0, 0, 0]
+ r = r_p
+ g = g_p
+ b = b_p
+ a = a_p
+ end
+
+ if has_and_mask && !and_mask_bits_for_row.empty?
+ a = and_mask_bits_for_row[x_pixel] == 1 ? 0 : 255
+ end
+ flat_rgba_pixels.push(r, g, b, a)
+ end
+ end
+
+ pixel_data_string = flat_rgba_pixels.pack('C*')
+
+ expected_bytes = dib_width * image_pixel_height * 4
+
+ return nil unless pixel_data_string.bytesize == expected_bytes && expected_bytes.positive?
+
+ Vips::Image.new_from_memory(
+ pixel_data_string,
+ dib_width,
+ image_pixel_height,
+ 4,
+ :uchar
+ )
+ end
+ # rubocop:enable Metrics
+end
diff --git a/lib/markdown_to_html.rb b/lib/markdown_to_html.rb
index c66b88b1..e9d04f75 100644
--- a/lib/markdown_to_html.rb
+++ b/lib/markdown_to_html.rb
@@ -2,11 +2,12 @@
module MarkdownToHtml
LINK_REGEXP = %r{\[([^\]]+)\]\((https?://[^)]+)\)}
- LINK_REPLACE = '\1'
module_function
def call(text)
- text.gsub(LINK_REGEXP, LINK_REPLACE)
+ text.gsub(LINK_REGEXP) do
+ ApplicationController.helpers.link_to(Regexp.last_match(1), Regexp.last_match(2))
+ end
end
end
diff --git a/lib/params/base_validator.rb b/lib/params/base_validator.rb
index 8a5abcf1..cd0005f6 100644
--- a/lib/params/base_validator.rb
+++ b/lib/params/base_validator.rb
@@ -72,8 +72,8 @@ module Params
return if params[key].blank?
return if params[key].to_s.include?('<')
- if params[key].to_s.strip.split(/\s*[;,]\s*/).compact_blank
- .all? { |email| EmailTypo::DotCom.call(email).match?(EMAIL_REGEXP) }
+ if params[key].to_s.strip.split(%r{\s*[;,/]\s*}).compact_blank
+ .all? { |email| EmailTypo::DotCom.call(email).match?(EMAIL_REGEXP) || email.include?('--') }
return
end
diff --git a/lib/params/submission_create_validator.rb b/lib/params/submission_create_validator.rb
index 5737e1dd..8ce3becf 100644
--- a/lib/params/submission_create_validator.rb
+++ b/lib/params/submission_create_validator.rb
@@ -76,6 +76,7 @@ module Params
type(submitter_params, :name, String)
type(submitter_params, :reply_to, String)
type(submitter_params, :email, String)
+ type(submitter_params, :order, Integer)
email_format(submitter_params, :email, message: 'email is invalid')
email_format(submitter_params, :reply_to, message: 'reply_to email is invalid')
type(submitter_params, :phone, String)
diff --git a/lib/pdf_utils.rb b/lib/pdf_utils.rb
index e4c22400..083ec47d 100644
--- a/lib/pdf_utils.rb
+++ b/lib/pdf_utils.rb
@@ -1,6 +1,9 @@
# frozen_string_literal: true
module PdfUtils
+ DEFAULT_DPI = 72
+ US_LETTER_W = DEFAULT_DPI * 8.5
+
module_function
def encrypted?(data, password: nil)
@@ -36,7 +39,8 @@ module PdfUtils
end
merged_content = StringIO.new
- merged_pdf.write(merged_content)
+ merged_pdf.validate(auto_correct: true)
+ merged_pdf.write(merged_content, validate: false)
merged_content.rewind
merged_content
diff --git a/lib/pdfium.rb b/lib/pdfium.rb
new file mode 100644
index 00000000..464f95e2
--- /dev/null
+++ b/lib/pdfium.rb
@@ -0,0 +1,608 @@
+# frozen_string_literal: true
+
+class Pdfium
+ extend FFI::Library
+
+ LIB_NAME = 'pdfium'
+
+ begin
+ ffi_lib case FFI::Platform::OS
+ when 'darwin'
+ [
+ "lib#{LIB_NAME}.dylib",
+ '/Applications/LibreOffice.app/Contents/Frameworks/libpdfiumlo.dylib'
+ ]
+ else
+ "lib#{LIB_NAME}.so"
+ end
+ rescue LoadError => e
+ raise "Could not load libpdfium library. Make sure it's installed and in your library path. Error: #{e.message}"
+ end
+
+ typedef :pointer, :FPDF_STRING
+ typedef :pointer, :FPDF_DOCUMENT
+ typedef :pointer, :FPDF_PAGE
+ typedef :pointer, :FPDF_BITMAP
+ typedef :pointer, :FPDF_FORMHANDLE
+ typedef :pointer, :FPDF_TEXTPAGE
+ typedef :pointer, :FPDF_PAGEOBJECT
+ typedef :pointer, :FPDF_PATHSEGMENT
+
+ MAX_SIZE = 32_767
+
+ FPDF_ANNOT = 0x01
+ FPDF_LCD_TEXT = 0x02
+ FPDF_NO_NATIVETEXT = 0x04
+ FPDF_GRAYSCALE = 0x08
+ FPDF_REVERSE_BYTE_ORDER = 0x10
+ FPDF_RENDER_LIMITEDIMAGECACHE = 0x200
+ FPDF_RENDER_FORCEHALFTONE = 0x400
+ FPDF_PRINTING = 0x800
+
+ TextNode = Struct.new(:content, :x, :y, :w, :h, keyword_init: true)
+ LineNode = Struct.new(:x, :y, :w, :h, :tilt, keyword_init: true)
+
+ # rubocop:disable Naming/ClassAndModuleCamelCase
+ class FPDF_LIBRARY_CONFIG < FFI::Struct
+ layout :version, :int,
+ :m_pUserFontPaths, :pointer,
+ :m_pIsolate, :pointer,
+ :m_v8EmbedderSlot, :uint,
+ :m_pPlatform, :pointer,
+ :m_RendererType, :int
+ end
+ # rubocop:enable Naming/ClassAndModuleCamelCase
+
+ attach_function :FPDF_InitLibraryWithConfig, [:pointer], :void
+ attach_function :FPDF_DestroyLibrary, [], :void
+
+ attach_function :FPDF_LoadDocument, %i[string FPDF_STRING], :FPDF_DOCUMENT
+ attach_function :FPDF_LoadMemDocument, %i[pointer int FPDF_STRING], :FPDF_DOCUMENT
+ attach_function :FPDF_CloseDocument, [:FPDF_DOCUMENT], :void
+ attach_function :FPDF_GetPageCount, [:FPDF_DOCUMENT], :int
+ attach_function :FPDF_GetLastError, [], :ulong
+
+ attach_function :FPDF_LoadPage, %i[FPDF_DOCUMENT int], :FPDF_PAGE
+ attach_function :FPDF_ClosePage, [:FPDF_PAGE], :void
+ attach_function :FPDF_GetPageWidthF, [:FPDF_PAGE], :float
+ attach_function :FPDF_GetPageHeightF, [:FPDF_PAGE], :float
+
+ attach_function :FPDFBitmap_Create, %i[int int int], :FPDF_BITMAP
+ attach_function :FPDFBitmap_CreateEx, %i[int int int pointer int], :FPDF_BITMAP
+ attach_function :FPDFBitmap_Destroy, [:FPDF_BITMAP], :void
+ attach_function :FPDFBitmap_GetBuffer, [:FPDF_BITMAP], :pointer
+ attach_function :FPDFBitmap_GetWidth, [:FPDF_BITMAP], :int
+ attach_function :FPDFBitmap_GetHeight, [:FPDF_BITMAP], :int
+ attach_function :FPDFBitmap_GetStride, [:FPDF_BITMAP], :int
+ attach_function :FPDFBitmap_FillRect, %i[FPDF_BITMAP int int int int ulong], :void
+
+ attach_function :FPDF_RenderPageBitmap, %i[FPDF_BITMAP FPDF_PAGE int int int int int int], :void
+
+ attach_function :FPDFText_LoadPage, [:FPDF_PAGE], :FPDF_TEXTPAGE
+ attach_function :FPDFText_ClosePage, [:FPDF_TEXTPAGE], :void
+ attach_function :FPDFText_CountChars, [:FPDF_TEXTPAGE], :int
+ attach_function :FPDFText_GetText, %i[FPDF_TEXTPAGE int int pointer], :int
+ attach_function :FPDFText_GetUnicode, %i[FPDF_TEXTPAGE int], :uint
+ attach_function :FPDFText_GetCharBox, %i[FPDF_TEXTPAGE int pointer pointer pointer pointer], :int
+ attach_function :FPDFText_GetCharOrigin, %i[FPDF_TEXTPAGE int pointer pointer], :int
+ attach_function :FPDFText_GetCharIndexAtPos, %i[FPDF_TEXTPAGE double double double double], :int
+ attach_function :FPDFText_CountRects, %i[FPDF_TEXTPAGE int int], :int
+ attach_function :FPDFText_GetRect, %i[FPDF_TEXTPAGE int pointer pointer pointer pointer], :int
+ attach_function :FPDFText_GetFontSize, %i[FPDF_TEXTPAGE int], :double
+
+ # Page object functions for extracting paths/lines
+ attach_function :FPDFPage_CountObjects, [:FPDF_PAGE], :int
+ attach_function :FPDFPage_GetObject, %i[FPDF_PAGE int], :FPDF_PAGEOBJECT
+ attach_function :FPDFPageObj_GetType, [:FPDF_PAGEOBJECT], :int
+ attach_function :FPDFPageObj_GetBounds, %i[FPDF_PAGEOBJECT pointer pointer pointer pointer], :int
+ attach_function :FPDFPath_CountSegments, [:FPDF_PAGEOBJECT], :int
+ attach_function :FPDFPath_GetPathSegment, %i[FPDF_PAGEOBJECT int], :FPDF_PATHSEGMENT
+ attach_function :FPDFPathSegment_GetType, [:FPDF_PATHSEGMENT], :int
+ attach_function :FPDFPathSegment_GetPoint, %i[FPDF_PATHSEGMENT pointer pointer], :int
+
+ # Page object types
+ FPDF_PAGEOBJ_UNKNOWN = 0
+ FPDF_PAGEOBJ_TEXT = 1
+ FPDF_PAGEOBJ_PATH = 2
+ FPDF_PAGEOBJ_IMAGE = 3
+ FPDF_PAGEOBJ_SHADING = 4
+ FPDF_PAGEOBJ_FORM = 5
+
+ # Path segment types
+ FPDF_SEGMENT_UNKNOWN = -1
+ FPDF_SEGMENT_LINETO = 0
+ FPDF_SEGMENT_BEZIERTO = 1
+ FPDF_SEGMENT_MOVETO = 2
+
+ typedef :int, :FPDF_BOOL
+ typedef :pointer, :IPDF_JSPLATFORM
+
+ # rubocop:disable Naming/ClassAndModuleCamelCase
+ class FPDF_FORMFILLINFO_V2 < FFI::Struct
+ layout :version, :int,
+ :Release, :pointer,
+ :FFI_Invalidate, :pointer,
+ :FFI_OutputSelectedRect, :pointer,
+ :FFI_SetCursor, :pointer,
+ :FFI_SetTimer, :pointer,
+ :FFI_KillTimer, :pointer,
+ :FFI_GetLocalTime, :pointer,
+ :FFI_OnChange, :pointer,
+ :FFI_GetPage, :pointer,
+ :FFI_GetCurrentPage, :pointer,
+ :FFI_GetRotation, :pointer,
+ :FFI_ExecuteNamedAction, :pointer,
+ :FFI_SetTextFieldFocus, :pointer,
+ :FFI_DoURIAction, :pointer,
+ :FFI_DoGoToAction, :pointer,
+ :m_pJsPlatform, :IPDF_JSPLATFORM,
+ :xfa_disabled, :FPDF_BOOL,
+ :FFI_DisplayCaret, :pointer,
+ :FFI_GetCurrentPageIndex, :pointer,
+ :FFI_SetCurrentPage, :pointer,
+ :FFI_GotoURL, :pointer,
+ :FFI_GetPageViewRect, :pointer,
+ :FFI_PageEvent, :pointer,
+ :FFI_PopupMenu, :pointer,
+ :FFI_OpenFile, :pointer,
+ :FFI_EmailTo, :pointer,
+ :FFI_UploadTo, :pointer,
+ :FFI_GetPlatform, :pointer,
+ :FFI_GetLanguage, :pointer,
+ :FFI_DownloadFromURL, :pointer,
+ :FFI_PostRequestURL, :pointer,
+ :FFI_PutRequestURL, :pointer,
+ :FFI_OnFocusChange, :pointer,
+ :FFI_DoURIActionWithKeyboardModifier, :pointer
+ end
+ # rubocop:enable Naming/ClassAndModuleCamelCase
+
+ attach_function :FPDFDOC_InitFormFillEnvironment, %i[FPDF_DOCUMENT pointer], :FPDF_FORMHANDLE
+ attach_function :FPDFDOC_ExitFormFillEnvironment, [:FPDF_FORMHANDLE], :void
+ attach_function :FPDF_FFLDraw, %i[FPDF_FORMHANDLE FPDF_BITMAP FPDF_PAGE int int int int int int], :void
+
+ FPDF_ERR_SUCCESS = 0
+ FPDF_ERR_UNKNOWN = 1
+ FPDF_ERR_FILE = 2
+ FPDF_ERR_FORMAT = 3
+ FPDF_ERR_PASSWORD = 4
+ FPDF_ERR_SECURITY = 5
+ FPDF_ERR_PAGE = 6
+
+ PDFIUM_ERRORS = {
+ FPDF_ERR_SUCCESS => 'Success',
+ FPDF_ERR_UNKNOWN => 'Unknown error',
+ FPDF_ERR_FILE => 'Error open file',
+ FPDF_ERR_FORMAT => 'Invalid format',
+ FPDF_ERR_PASSWORD => 'Incorrect password',
+ FPDF_ERR_SECURITY => 'Security scheme error',
+ FPDF_ERR_PAGE => 'Page not found'
+ }.freeze
+
+ class PdfiumError < StandardError; end
+
+ def self.error_message(code)
+ PDFIUM_ERRORS[code] || "Unknown error code: #{code}"
+ end
+
+ def self.check_last_error(context_message = 'PDFium operation failed')
+ error_code = FPDF_GetLastError()
+
+ return if error_code == FPDF_ERR_SUCCESS
+
+ raise PdfiumError, "#{context_message}: #{error_message(error_code)} (Code: #{error_code})"
+ end
+
+ # rubocop:disable Metrics
+ class Document
+ attr_reader :document_ptr, :form_handle
+
+ def initialize(document_ptr, source_buffer = nil)
+ raise ArgumentError, 'document_ptr cannot be nil' if document_ptr.nil? || document_ptr.null?
+
+ @document_ptr = document_ptr
+
+ @pages = {}
+ @closed = false
+ @source_buffer = source_buffer
+ @form_handle = FFI::Pointer::NULL
+ @form_fill_info_mem = FFI::Pointer::NULL
+
+ init_form_fill_environment
+ end
+
+ def init_form_fill_environment
+ return if @document_ptr.null?
+
+ @form_fill_info_mem = FFI::MemoryPointer.new(FPDF_FORMFILLINFO_V2.size)
+
+ form_fill_info_struct = FPDF_FORMFILLINFO_V2.new(@form_fill_info_mem)
+ form_fill_info_struct[:version] = 2
+
+ @form_handle = Pdfium.FPDFDOC_InitFormFillEnvironment(@document_ptr, @form_fill_info_mem)
+ end
+
+ def page_count
+ @page_count ||= Pdfium.FPDF_GetPageCount(@document_ptr)
+ end
+
+ def self.open_file(file_path, password = nil)
+ doc_ptr = Pdfium.FPDF_LoadDocument(file_path, password)
+
+ if doc_ptr.null?
+ Pdfium.check_last_error("Failed to load document from file '#{file_path}'")
+
+ raise PdfiumError, "Failed to load document from file '#{file_path}', pointer is NULL."
+ end
+
+ doc = new(doc_ptr)
+
+ return doc unless block_given?
+
+ begin
+ yield doc
+ ensure
+ doc.close
+ end
+ end
+
+ def self.open_bytes(bytes, password = nil)
+ buffer = FFI::MemoryPointer.new(:char, bytes.bytesize)
+ buffer.put_bytes(0, bytes)
+
+ doc_ptr = Pdfium.FPDF_LoadMemDocument(buffer, bytes.bytesize, password)
+
+ if doc_ptr.null?
+ Pdfium.check_last_error('Failed to load document from memory')
+
+ raise PdfiumError, 'Failed to load document from memory, pointer is NULL.'
+ end
+
+ doc = new(doc_ptr, buffer)
+
+ return doc unless block_given?
+
+ begin
+ yield doc
+ ensure
+ doc.close
+ end
+ end
+
+ def closed?
+ @closed
+ end
+
+ def ensure_not_closed!
+ raise PdfiumError, 'Document is closed.' if closed?
+ end
+
+ def get_page(page_index)
+ ensure_not_closed!
+
+ unless page_index.is_a?(Integer) && page_index >= 0 && page_index < page_count
+ raise PdfiumError, "Page index #{page_index} out of range (0..#{page_count - 1})"
+ end
+
+ @pages[page_index] ||= Page.new(self, page_index)
+ end
+
+ def close
+ return if closed?
+
+ @pages.each_value { |page| page.close unless page.closed? }
+ @pages.clear
+
+ unless @form_handle.null?
+ Pdfium.FPDFDOC_ExitFormFillEnvironment(@form_handle)
+
+ @form_handle = FFI::Pointer::NULL
+ end
+
+ if @form_fill_info_mem && !@form_fill_info_mem.null?
+ @form_fill_info_mem.free
+ @form_fill_info_mem = FFI::Pointer::NULL
+ end
+
+ Pdfium.FPDF_CloseDocument(@document_ptr) unless @document_ptr.null?
+
+ @document_ptr = FFI::Pointer::NULL
+ @source_buffer = nil
+
+ @closed = true
+ end
+ end
+
+ class Page
+ attr_reader :document, :page_index, :page_ptr
+
+ def initialize(document, page_index)
+ raise ArgumentError, 'Document object is required' unless document.is_a?(Pdfium::Document)
+
+ @document = document
+ @document.ensure_not_closed!
+
+ @page_index = page_index
+
+ @page_ptr = Pdfium.FPDF_LoadPage(document.document_ptr, page_index)
+
+ if @page_ptr.null?
+ Pdfium.check_last_error("Failed to load page #{page_index}")
+
+ raise PdfiumError, "Failed to load page #{page_index}, pointer is NULL."
+ end
+
+ @closed = false
+ end
+
+ def width
+ @width ||= Pdfium.FPDF_GetPageWidthF(@page_ptr)
+ end
+
+ def height
+ @height ||= Pdfium.FPDF_GetPageHeightF(@page_ptr)
+ end
+
+ def closed?
+ @closed
+ end
+
+ def form_handle
+ @document.form_handle
+ end
+
+ def ensure_not_closed!
+ raise PdfiumError, 'Page is closed.' if closed?
+
+ @document.ensure_not_closed!
+ end
+
+ def render_to_bitmap(width: nil, height: nil, scale: nil, background_color: 0xFFFFFFFF,
+ flags: FPDF_ANNOT | FPDF_LCD_TEXT | FPDF_NO_NATIVETEXT | FPDF_REVERSE_BYTE_ORDER)
+ ensure_not_closed!
+
+ render_width, render_height = calculate_render_dimensions(width, height, scale)
+
+ bitmap_ptr = Pdfium.FPDFBitmap_Create(render_width, render_height, 1)
+
+ if bitmap_ptr.null?
+ Pdfium.check_last_error('Failed to create bitmap (potential pre-existing error)')
+
+ raise PdfiumError, 'Failed to create bitmap (FPDFBitmap_Create returned NULL)'
+ end
+
+ Pdfium.FPDFBitmap_FillRect(bitmap_ptr, 0, 0, render_width, render_height, background_color)
+
+ Pdfium.FPDF_RenderPageBitmap(bitmap_ptr, page_ptr, 0, 0, render_width, render_height, 0, flags)
+
+ unless form_handle.null?
+ Pdfium.FPDF_FFLDraw(form_handle, bitmap_ptr, page_ptr, 0, 0, render_width, render_height, 0, flags)
+ end
+
+ buffer_ptr = Pdfium.FPDFBitmap_GetBuffer(bitmap_ptr)
+ stride = Pdfium.FPDFBitmap_GetStride(bitmap_ptr)
+
+ bitmap_data = buffer_ptr.read_bytes(stride * render_height)
+
+ [bitmap_data, render_width, render_height]
+ ensure
+ Pdfium.FPDFBitmap_Destroy(bitmap_ptr) if bitmap_ptr && !bitmap_ptr.null?
+ end
+
+ def text
+ return @text if @text
+
+ ensure_not_closed!
+
+ text_page = Pdfium.FPDFText_LoadPage(page_ptr)
+
+ if text_page.null?
+ Pdfium.check_last_error("Failed to load text page #{page_index}")
+
+ raise PdfiumError, "Failed to load text page #{page_index}, pointer is NULL."
+ end
+
+ char_count = Pdfium.FPDFText_CountChars(text_page)
+
+ return @text = '' if char_count.zero?
+
+ buffer_char_capacity = char_count + 1
+
+ buffer = FFI::MemoryPointer.new(:uint16, buffer_char_capacity)
+
+ chars_written = Pdfium.FPDFText_GetText(text_page, 0, buffer_char_capacity, buffer)
+
+ if chars_written <= 0
+ Pdfium.check_last_error("Failed to extract text from page #{page_index}")
+
+ return @text = ''
+ end
+
+ @text = buffer.read_bytes((chars_written * 2) - 2).force_encoding('UTF-16LE').encode('UTF-8')
+ ensure
+ Pdfium.FPDFText_ClosePage(text_page) if text_page && !text_page.null?
+ end
+
+ def text_nodes
+ return @text_nodes if @text_nodes
+
+ text_page = Pdfium.FPDFText_LoadPage(page_ptr)
+ char_count = Pdfium.FPDFText_CountChars(text_page)
+
+ @text_nodes = []
+
+ return @text_nodes if char_count.zero?
+
+ char_count.times do |i|
+ unicode = Pdfium.FPDFText_GetUnicode(text_page, i)
+
+ char = [unicode].pack('U*')
+
+ left_ptr = FFI::MemoryPointer.new(:double)
+ right_ptr = FFI::MemoryPointer.new(:double)
+ bottom_ptr = FFI::MemoryPointer.new(:double)
+ top_ptr = FFI::MemoryPointer.new(:double)
+
+ result = Pdfium.FPDFText_GetCharBox(text_page, i, left_ptr, right_ptr, bottom_ptr, top_ptr)
+
+ next if result.zero?
+
+ left = left_ptr.read_double
+ right = right_ptr.read_double
+
+ origin_x_ptr = FFI::MemoryPointer.new(:double)
+ origin_y_ptr = FFI::MemoryPointer.new(:double)
+
+ Pdfium.FPDFText_GetCharOrigin(text_page, i, origin_x_ptr, origin_y_ptr)
+
+ origin_y = origin_y_ptr.read_double
+
+ font_size = Pdfium.FPDFText_GetFontSize(text_page, i)
+ font_size = 8 if font_size == 1
+
+ abs_x = left
+ abs_y = height - origin_y - (font_size * 0.8)
+ abs_width = right - left
+ abs_height = font_size
+
+ x = abs_x / width
+ y = abs_y / height
+ node_width = abs_width / width
+ node_height = abs_height / height
+
+ @text_nodes << TextNode.new(content: char, x: x, y: y, w: node_width, h: node_height)
+ end
+
+ @text_nodes = @text_nodes.sort { |a, b| a.y == b.y ? a.x <=> b.x : a.y <=> b.y }
+ ensure
+ Pdfium.FPDFText_ClosePage(text_page) if text_page && !text_page.null?
+ end
+
+ def line_nodes
+ return @line_nodes if @line_nodes
+
+ ensure_not_closed!
+
+ @line_nodes = []
+
+ object_count = Pdfium.FPDFPage_CountObjects(page_ptr)
+
+ return @line_nodes if object_count.zero?
+
+ object_count.times do |i|
+ page_object = Pdfium.FPDFPage_GetObject(page_ptr, i)
+
+ next if page_object.null?
+
+ obj_type = Pdfium.FPDFPageObj_GetType(page_object)
+
+ next unless obj_type == Pdfium::FPDF_PAGEOBJ_PATH
+
+ left_ptr = FFI::MemoryPointer.new(:float)
+ bottom_ptr = FFI::MemoryPointer.new(:float)
+ right_ptr = FFI::MemoryPointer.new(:float)
+ top_ptr = FFI::MemoryPointer.new(:float)
+
+ Pdfium.FPDFPageObj_GetBounds(page_object, left_ptr, bottom_ptr, right_ptr, top_ptr)
+
+ obj_left = left_ptr.read_float
+ obj_bottom = bottom_ptr.read_float
+ obj_right = right_ptr.read_float
+ obj_top = top_ptr.read_float
+
+ obj_width = obj_right - obj_left
+ obj_height = obj_top - obj_bottom
+
+ next if obj_width < 1 && obj_height < 1
+
+ segment_count = Pdfium.FPDFPath_CountSegments(page_object)
+
+ next if segment_count < 2
+
+ next unless segment_count <= 10 && (obj_height < 10 || obj_width < 10)
+
+ if obj_width > obj_height && obj_height < 10
+ tilt = 0
+ elsif obj_height > obj_width && obj_width < 10
+ tilt = 90
+ else
+ next
+ end
+
+ x = obj_left
+ y = obj_bottom
+ w = obj_width
+ h = obj_height
+
+ norm_x = x / width
+ norm_y = (height - y - h) / height
+ norm_w = w / width
+ norm_h = h / height
+
+ @line_nodes << LineNode.new(x: norm_x, y: norm_y, w: norm_w, h: norm_h, tilt: tilt)
+ end
+
+ @line_nodes = @line_nodes.sort { |a, b| a.y == b.y ? a.x <=> b.x : a.y <=> b.y }
+ end
+
+ def close
+ return if closed?
+
+ Pdfium.FPDF_ClosePage(@page_ptr) unless @page_ptr.null?
+
+ @page_ptr = FFI::Pointer::NULL
+
+ @closed = true
+ end
+
+ private
+
+ def calculate_render_dimensions(width_param, height_param, scale_param)
+ if scale_param
+ render_width = (width * scale_param).round
+ render_height = (height * scale_param).round
+ elsif width_param || height_param
+ if width_param && height_param
+ render_width = width_param
+ render_height = height_param
+ elsif width_param
+ scale_factor = width_param.to_f / width
+ render_width = width_param
+ render_height = (height * scale_factor).round
+ else
+ scale_factor = height_param.to_f / height
+ render_width = (width * scale_factor).round
+ render_height = height_param
+ end
+ else
+ render_width = width.to_i
+ render_height = height.to_i
+ end
+
+ [render_width.clamp(1, MAX_SIZE), render_height.clamp(1, MAX_SIZE)]
+ end
+ end
+
+ def self.initialize_library
+ config_mem = FFI::MemoryPointer.new(FPDF_LIBRARY_CONFIG.size)
+
+ config_struct = FPDF_LIBRARY_CONFIG.new(config_mem)
+ config_struct[:version] = 2
+ config_struct[:m_pUserFontPaths] = FFI::Pointer::NULL
+ config_struct[:m_pIsolate] = FFI::Pointer::NULL
+ config_struct[:m_v8EmbedderSlot] = 0
+
+ FPDF_InitLibraryWithConfig(config_mem)
+ end
+
+ def self.cleanup_library
+ FPDF_DestroyLibrary()
+ end
+
+ initialize_library
+
+ at_exit do
+ cleanup_library
+ end
+ # rubocop:enable Metrics
+end
diff --git a/lib/phone_codes.rb b/lib/phone_codes.rb
new file mode 100644
index 00000000..43f8ea14
--- /dev/null
+++ b/lib/phone_codes.rb
@@ -0,0 +1,228 @@
+# frozen_string_literal: true
+
+module PhoneCodes
+ ALL = [
+ '+1',
+ '+93',
+ '+358',
+ '+355',
+ '+213',
+ '+1684',
+ '+376',
+ '+244',
+ '+1264',
+ '+1268',
+ '+54',
+ '+374',
+ '+297',
+ '+61',
+ '+43',
+ '+994',
+ '+1242',
+ '+973',
+ '+880',
+ '+1246',
+ '+32',
+ '+501',
+ '+229',
+ '+1441',
+ '+975',
+ '+591',
+ '+387',
+ '+267',
+ '+55',
+ '+246',
+ '+673',
+ '+359',
+ '+226',
+ '+257',
+ '+855',
+ '+237',
+ '+1',
+ '+238',
+ '+1345',
+ '+235',
+ '+56',
+ '+86',
+ '+61',
+ '+61',
+ '+57',
+ '+269',
+ '+243',
+ '+682',
+ '+506',
+ '+225',
+ '+385',
+ '+357',
+ '+420',
+ '+45',
+ '+253',
+ '+1767',
+ '+1849',
+ '+593',
+ '+20',
+ '+503',
+ '+240',
+ '+291',
+ '+372',
+ '+251',
+ '+500',
+ '+298',
+ '+679',
+ '+358',
+ '+33',
+ '+594',
+ '+689',
+ '+241',
+ '+220',
+ '+995',
+ '+49',
+ '+233',
+ '+350',
+ '+30',
+ '+299',
+ '+1473',
+ '+590',
+ '+1671',
+ '+502',
+ '+224',
+ '+245',
+ '+592',
+ '+509',
+ '+504',
+ '+852',
+ '+36',
+ '+354',
+ '+91',
+ '+62',
+ '+964',
+ '+353',
+ '+44',
+ '+972',
+ '+39',
+ '+1876',
+ '+81',
+ '+44',
+ '+962',
+ '+7',
+ '+254',
+ '+686',
+ '+82',
+ '+965',
+ '+996',
+ '+856',
+ '+371',
+ '+961',
+ '+266',
+ '+231',
+ '+423',
+ '+370',
+ '+352',
+ '+853',
+ '+389',
+ '+261',
+ '+265',
+ '+60',
+ '+960',
+ '+223',
+ '+356',
+ '+692',
+ '+596',
+ '+222',
+ '+230',
+ '+262',
+ '+52',
+ '+691',
+ '+373',
+ '+377',
+ '+976',
+ '+382',
+ '+1664',
+ '+212',
+ '+258',
+ '+264',
+ '+674',
+ '+977',
+ '+31',
+ '+687',
+ '+64',
+ '+227',
+ '+234',
+ '+683',
+ '+672',
+ '+1670',
+ '+47',
+ '+968',
+ '+92',
+ '+680',
+ '+507',
+ '+675',
+ '+595',
+ '+51',
+ '+63',
+ '+872',
+ '+48',
+ '+351',
+ '+1939',
+ '+974',
+ '+40',
+ '+250',
+ '+262',
+ '+590',
+ '+290',
+ '+1869',
+ '+1758',
+ '+590',
+ '+508',
+ '+1784',
+ '+685',
+ '+378',
+ '+239',
+ '+966',
+ '+221',
+ '+381',
+ '+248',
+ '+232',
+ '+65',
+ '+421',
+ '+386',
+ '+677',
+ '+27',
+ '+34',
+ '+94',
+ '+597',
+ '+47',
+ '+268',
+ '+46',
+ '+41',
+ '+886',
+ '+992',
+ '+255',
+ '+66',
+ '+670',
+ '+228',
+ '+690',
+ '+676',
+ '+1868',
+ '+216',
+ '+90',
+ '+993',
+ '+1649',
+ '+688',
+ '+256',
+ '+380',
+ '+971',
+ '+44',
+ '+598',
+ '+998',
+ '+678',
+ '+84',
+ '+1284',
+ '+1340',
+ '+681',
+ '+967',
+ '+260'
+ ].freeze
+
+ REGEXP = /\A#{Regexp.union(ALL).source}/i
+end
diff --git a/lib/puma/plugin/sidekiq_embed.rb b/lib/puma/plugin/sidekiq_embed.rb
index c7b9db01..97c4e3be 100644
--- a/lib/puma/plugin/sidekiq_embed.rb
+++ b/lib/puma/plugin/sidekiq_embed.rb
@@ -39,6 +39,7 @@ Puma::Plugin.create do
configs = Sidekiq.configure_embed do |config|
config.logger.level = Logger::INFO
sidekiq_config = YAML.load_file('config/sidekiq.yml')
+ sidekiq_config['queues'] << 'fields' if ENV['DEMO'] == 'true'
config.queues = sidekiq_config['queues']
config.concurrency = ENV.fetch('SIDEKIQ_THREADS', 5).to_i
config.merge!(sidekiq_config)
diff --git a/lib/replace_email_variables.rb b/lib/replace_email_variables.rb
index a78cedf9..4222e676 100644
--- a/lib/replace_email_variables.rb
+++ b/lib/replace_email_variables.rb
@@ -2,6 +2,7 @@
module ReplaceEmailVariables
TEMPLATE_NAME = /\{+template\.name\}+/i
+ SUBMISSION_NAME = /\{+submission\.name\}+/i
TEMPLATE_ID = /\{+template\.id\}+/i
SUBMITTER_LINK = /\{+submitter\.link\}+/i
ACCOUNT_NAME = /\{+account\.name\}+/i
@@ -13,12 +14,15 @@ module ReplaceEmailVariables
SUBMITTER_FIRST_NAME = /\{+submitter\.first_name\}+/i
SUBMITTER_ID = /\{+submitter\.id\}+/i
SUBMITTER_SLUG = /\{+submitter\.slug\}+/i
+ SUBMITTER_FIELD_VALUE = /\{+submitter\.(?[^}]+)\}+/i
SUBMISSION_LINK = /\{+submission\.link\}+/i
SUBMISSION_ID = /\{+submission\.id\}+/i
+ SUBMISSION_EXPIRE_AT = /\{+submission\.expire_at\}+/i
SUBMITTERS = /\{+(?:submission\.)?submitters\}+/i
SUBMITTERS_N_EMAIL = /\{+submitters\[(?\d+)\]\.email\}+/i
SUBMITTERS_N_NAME = /\{+submitters\[(?\d+)\]\.name\}+/i
SUBMITTERS_N_FIRST_NAME = /\{+submitters\[(?\d+)\]\.first_name\}+/i
+ SUBMITTERS_N_FIELD_VALUE = /\{+submitters\[(?\d+)\]\.(?[^}]+)\}+/i
DOCUMENTS_LINKS = /\{+documents\.links\}+/i
DOCUMENTS_LINK = /\{+documents\.link\}+/i
@@ -28,7 +32,10 @@ module ReplaceEmailVariables
# rubocop:disable Metrics
def call(text, submitter:, tracking_event_type: 'click_email', html_escape: false, sig: nil)
- text = replace(text, TEMPLATE_NAME, html_escape:) { (submitter.template || submitter.submission.template).name }
+ text = replace(text, TEMPLATE_NAME, html_escape:) do
+ (submitter.template || submitter.submission.template || submitter.submission).name
+ end
+ text = replace(text, SUBMISSION_NAME, html_escape:) { submitter.submission.name }
text = replace(text, TEMPLATE_ID, html_escape:) { submitter.template.id }
text = replace(text, SUBMITTER_ID, html_escape:) { submitter.id }
text = replace(text, SUBMITTER_SLUG, html_escape:) { submitter.slug }
@@ -47,6 +54,13 @@ module ReplaceEmailVariables
text = replace(text, SENDER_NAME, html_escape:) { submitter.submission.created_by_user&.full_name }
text = replace(text, SENDER_FIRST_NAME, html_escape:) { submitter.submission.created_by_user&.first_name }
+ text = replace(text, SUBMISSION_EXPIRE_AT, html_escape:) do
+ if submitter.submission.expire_at
+ I18n.l(submitter.submission.expire_at.in_time_zone(submitter.submission.account.timezone),
+ format: :short, locale: submitter.submission.account.locale)
+ end
+ end
+
text = replace(text, SUBMITTERS_N_NAME, html_escape:) do |match|
build_submitters_n_field(submitter.submission, match[:index].to_i - 1, :name)
end
@@ -59,6 +73,17 @@ module ReplaceEmailVariables
build_submitters_n_field(submitter.submission, match[:index].to_i - 1, :first_name)
end
+ text = replace(text, SUBMITTERS_N_FIELD_VALUE, html_escape:) do |match|
+ build_submitters_n_field(submitter.submission, match[:index].to_i - 1, :values, match[:field_name].to_s.strip)
+ end
+
+ text = replace(text, SUBMITTER_FIELD_VALUE, html_escape:) do |match|
+ submitters = submitter.submission.template_submitters || submitter.submission.template.submitters
+ index = submitters.find_index { |e| e['uuid'] == submitter.uuid }
+
+ build_submitters_n_field(submitter.submission, index, :values, match[:field_name].to_s.strip)
+ end
+
replace(text, SENDER_EMAIL, html_escape:) { submitter.submission.created_by_user&.email.to_s.sub(/\+\w+@/, '@') }
end
# rubocop:enable Metrics
@@ -69,10 +94,38 @@ module ReplaceEmailVariables
)
end
- def build_submitters_n_field(submission, index, field_name)
+ def build_submitters_n_field(submission, index, field_name, value_name = nil)
uuid = (submission.template_submitters || submission.template.submitters).dig(index, 'uuid')
- submission.submitters.find { |s| s.uuid == uuid }.try(field_name)
+ submitter = submission.submitters.find { |s| s.uuid == uuid }
+
+ return unless submitter
+
+ value = submitter.try(field_name)
+ expires_at = nil
+
+ if value_name
+ field = (submission.template_fields || submission.template.fields).find { |e| e['name'] == value_name }
+
+ return unless field
+
+ value =
+ if field['type'].in?(%w[image signature initials stamp payment file])
+ attachment_uuid = Array.wrap(value[field['uuid']]).first
+
+ attachment = submitter.attachments.find { |e| e.uuid == attachment_uuid }
+
+ if attachment
+ expires_at ||= Accounts.link_expires_at(Account.new(id: submission.account_id))
+
+ ActiveStorage::Blob.proxy_url(attachment.blob, expires_at:)
+ end
+ else
+ value[field&.dig('uuid')]
+ end
+ end
+
+ value
end
def replace(text, var, html_escape: false)
diff --git a/lib/search_entries.rb b/lib/search_entries.rb
new file mode 100644
index 00000000..ba17e254
--- /dev/null
+++ b/lib/search_entries.rb
@@ -0,0 +1,256 @@
+# frozen_string_literal: true
+
+module SearchEntries
+ MAX_VALUE_LENGTH = 100
+
+ UUID_REGEXP = /\A[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\z/i
+
+ module_function
+
+ def reindex_all
+ Submitter.find_each { |submitter| index_submitter(submitter) }
+ Submission.find_each { |submission| index_submission(submission) }
+ Template.find_each { |template| index_template(template) }
+ end
+
+ def enqueue_reindex(records)
+ return unless SearchEntry.table_exists?
+
+ args = Array.wrap(records).map { |e| [{ 'record_type' => e.class.name, 'record_id' => e.id }] }
+
+ ReindexSearchEntryJob.perform_bulk(args)
+ end
+
+ def reindex_record(record)
+ case record
+ when Submitter
+ index_submitter(record)
+ when Template
+ index_template(record)
+ when Submission
+ index_submission(record)
+
+ record.submitters.each do |submitter|
+ index_submitter(submitter)
+ end
+ else
+ raise ArgumentError, 'Invalid Record'
+ end
+ end
+
+ def build_tsquery(keyword, with_or_vector: false)
+ keyword = keyword.delete("\0")
+
+ if keyword.match?(/\d/) && !keyword.match?(/\p{L}/)
+ number = keyword.gsub(/\D/, '')
+
+ sql =
+ if number.length <= 2
+ <<~SQL.squish
+ ngram @@ (quote_literal(?)::tsquery || quote_literal(?)::tsquery) OR tsvector @@ plainto_tsquery(?)
+ SQL
+ else
+ <<~SQL.squish
+ tsvector @@ ((quote_literal(?) || ':*')::tsquery || (quote_literal(?) || ':*')::tsquery || plainto_tsquery(?))
+ SQL
+ end
+
+ [sql, number, number.length > 1 ? number.delete_prefix('0') : number, keyword]
+ elsif keyword.match?(/[^\p{L}\d&@.-]/) || keyword.match?(/\A['"].*['"]\z/) || keyword.match?(/[.-]{2,}/)
+ ['tsvector @@ plainto_tsquery(?)', TextUtils.transliterate(keyword.downcase)]
+ else
+ keyword = TextUtils.transliterate(keyword.downcase).squish
+
+ sql =
+ if keyword.length <= 2
+ arel = Arel.sql('ngram @@ quote_literal(:keyword)::tsquery')
+
+ arel = Arel::Nodes::Or.new([arel, Arel.sql('tsvector @@ plainto_tsquery(:keyword)')]).to_sql if with_or_vector
+
+ arel
+ else
+ "tsvector @@ (quote_literal(coalesce((ts_lexize('english_stem', :keyword))[1], :keyword)) || ':*')::tsquery"
+ end
+
+ [sql, { keyword: }]
+ end
+ end
+
+ def build_weights_tsquery(terms, weight)
+ last_query =
+ if terms.last.length <= 2
+ Arel.sql("ngram @@ (quote_literal(:term#{terms.size - 1}) || ':' || :weight)::tsquery")
+ else
+ Arel.sql(<<~SQL.squish)
+ (quote_literal(coalesce((ts_lexize('english_stem', :term#{terms.size - 1}))[1], :term#{terms.size - 1})) || ':*' || :weight)::tsquery
+ SQL
+ end
+
+ query = terms[..-2].reduce(nil) do |acc, term|
+ index = terms.index(term)
+
+ arel = Arel.sql(<<~SQL.squish)
+ (quote_literal(coalesce((ts_lexize('english_stem', :term#{index}))[1], :term#{index})) || ':' || :weight)::tsquery
+ SQL
+
+ acc ? Arel::Nodes::InfixOperation.new('&&', arel, acc) : arel
+ end
+
+ query =
+ if terms.last.length <= 2
+ query = Arel::Nodes::InfixOperation.new('@@', Arel.sql('tsvector'), Arel::Nodes::Grouping.new(query))
+
+ Arel::Nodes::And.new([query, last_query])
+ else
+ Arel::Nodes::InfixOperation.new(
+ '@@', Arel.sql('tsvector'),
+ Arel::Nodes::Grouping.new(Arel::Nodes::InfixOperation.new('&&', query, last_query))
+ )
+ end
+
+ [query.to_sql, terms.index_by.with_index { |_, index| :"term#{index}" }.merge(weight:)]
+ end
+
+ def build_weights_wildcard_tsquery(keyword, weight)
+ keyword = TextUtils.transliterate(keyword.downcase).squish
+
+ sql =
+ if keyword.length <= 2
+ <<~SQL.squish
+ ngram @@ (quote_literal(:keyword) || ':' || :weight)::tsquery
+ SQL
+ else
+ <<~SQL.squish
+ tsvector @@ (quote_literal(coalesce((ts_lexize('english_stem', :keyword))[1], :keyword)) || ':*' || :weight)::tsquery
+ SQL
+ end
+
+ [sql, { keyword:, weight: }]
+ end
+
+ def index_submitter(submitter)
+ return if submitter.email.blank? && submitter.phone.blank? && submitter.name.blank?
+
+ email_phone_name = [
+ submitter.email.to_s.then { |e| [e, e.split('@').last] }.join(' ').delete("\0"),
+ submitter.phone.to_s.then { |e| [e.gsub(/\D/, ''), e.gsub(PhoneCodes::REGEXP, '').gsub(/\D/, '')] }
+ .uniq.join(' ').delete("\0"),
+ TextUtils.transliterate(submitter.name).delete("\0")
+ ]
+
+ values_string = build_submitter_values_string(submitter)
+
+ sql = SearchEntry.sanitize_sql_array(
+ [
+ "SELECT setweight(to_tsvector(?), 'A') || setweight(to_tsvector(?), 'B') ||
+ setweight(to_tsvector(?), 'C') || setweight(to_tsvector(?), 'D') as tsvector,
+ setweight(to_tsvector('simple', ?), 'A') ||
+ setweight(to_tsvector('simple', ?), 'B') ||
+ setweight(to_tsvector('simple', ?), 'C') as ngram".squish,
+ *email_phone_name, values_string, *email_phone_name
+ ]
+ )
+
+ entry = submitter.search_entry || submitter.build_search_entry
+
+ entry.account_id = submitter.account_id
+ entry.tsvector, ngram = SearchEntry.connection.select_rows(sql).first
+
+ add_hyphens(entry, values_string)
+
+ entry.ngram = build_ngram(ngram)
+
+ return if entry.tsvector.blank?
+
+ entry.save!
+
+ entry
+ rescue ActiveRecord::RecordNotUnique
+ submitter.reload
+
+ retry
+ end
+
+ def build_submitter_values_string(submitter)
+ values =
+ submitter.values.values.flatten.filter_map do |v|
+ next if !v.is_a?(String) || v.length > MAX_VALUE_LENGTH || UUID_REGEXP.match?(v)
+
+ TextUtils.transliterate(v)
+ end
+
+ values.uniq.join(' ').downcase.delete("\0")
+ end
+
+ def index_template(template)
+ text = TextUtils.transliterate(template.name.to_s.downcase.squish).delete("\0")
+
+ sql = SearchEntry.sanitize_sql_array(["SELECT to_tsvector(:text), to_tsvector('simple', :text)", { text: }])
+
+ entry = template.search_entry || template.build_search_entry
+
+ entry.account_id = template.account_id
+ entry.tsvector, ngram = SearchEntry.connection.select_rows(sql).first
+
+ add_hyphens(entry, text)
+
+ entry.ngram = build_ngram(ngram)
+
+ return if entry.tsvector.blank?
+
+ entry.save!
+
+ entry
+ rescue ActiveRecord::RecordNotUnique
+ template.reload
+
+ retry
+ end
+
+ def index_submission(submission)
+ return if submission.name.blank?
+
+ text = TextUtils.transliterate(submission.name.to_s.downcase.squish).delete("\0")
+
+ sql = SearchEntry.sanitize_sql_array(["SELECT to_tsvector(:text), to_tsvector('simple', :text)", { text: }])
+
+ entry = submission.search_entry || submission.build_search_entry
+
+ entry.account_id = submission.account_id
+ entry.tsvector, ngram = SearchEntry.connection.select_rows(sql).first
+
+ add_hyphens(entry, text)
+
+ entry.ngram = build_ngram(ngram)
+
+ return if entry.tsvector.blank?
+
+ entry.save!
+
+ entry
+ rescue ActiveRecord::RecordNotUnique
+ submission.reload
+
+ retry
+ end
+
+ def add_hyphens(entry, text)
+ hyphens = text.scan(/\b[^\s]*?\d-[^\s]+?\b/) + text.scan(/\b[^\s]+-\d[^\s]*?\b/)
+
+ hyphens.uniq.each_with_index do |item, index|
+ entry.tsvector += " '#{item.delete("'")}':#{index + 1}" unless entry.tsvector.include?(item)
+ end
+
+ entry
+ end
+
+ def build_ngram(ngram)
+ ngrams =
+ ngram.split(/\s(?=')/).each_with_object([]) do |item, acc|
+ acc << item.sub(/'(.*?)':/) { "'#{Regexp.last_match(1).first(2)}':" }
+ acc << item.sub(/'(.*?)':/) { "'#{Regexp.last_match(1).first(1)}':" }
+ end
+
+ ngrams.uniq { |e| e.sub(/':[\d,]/, "':1") }.join(' ')
+ end
+end
diff --git a/lib/send_webhook_request.rb b/lib/send_webhook_request.rb
index 96442441..f9845e16 100644
--- a/lib/send_webhook_request.rb
+++ b/lib/send_webhook_request.rb
@@ -5,12 +5,16 @@ module SendWebhookRequest
LOCALHOSTS = %w[0.0.0.0 127.0.0.1 localhost].freeze
+ MANUAL_ATTEMPT = 99_999
+ AUTOMATED_RETRY_RANGE = 1..(MANUAL_ATTEMPT - 1)
+
HttpsError = Class.new(StandardError)
LocalhostError = Class.new(StandardError)
module_function
- def call(webhook_url, event_type:, data:)
+ # rubocop:disable Metrics/AbcSize
+ def call(webhook_url, event_uuid:, event_type:, record:, data:, attempt: 0)
uri = begin
URI(webhook_url.url)
rescue URI::Error
@@ -24,21 +28,81 @@ module SendWebhookRequest
raise LocalhostError, "Can't send to localhost." if uri.host.in?(LOCALHOSTS)
end
- Faraday.post(uri) do |req|
+ webhook_event = create_webhook_event(webhook_url, event_uuid:, event_type:, record:)
+
+ return if AUTOMATED_RETRY_RANGE.cover?(attempt.to_i) && webhook_event&.status == 'success'
+
+ response = Faraday.post(uri) do |req|
req.headers['Content-Type'] = 'application/json'
req.headers['User-Agent'] = USER_AGENT
req.headers.merge!(webhook_url.secret.to_h) if webhook_url.secret.present?
req.body = {
event_type: event_type,
- timestamp: Time.current,
+ timestamp: webhook_event&.created_at || Time.current,
data: data
}.to_json
req.options.read_timeout = 8
req.options.open_timeout = 8
end
- rescue Faraday::Error
+
+ handle_response(webhook_event, response:, attempt:)
+ rescue Faraday::SSLError, Faraday::TimeoutError, Faraday::ConnectionFailed => e
+ handle_error(webhook_event, attempt:, error_message: e.class.name.split('::').last)
+ rescue Faraday::Error => e
+ handle_error(webhook_event, attempt:, error_message: e.message&.truncate(100))
+ end
+ # rubocop:enable Metrics/AbcSize
+
+ def create_webhook_event(webhook_url, event_uuid:, event_type:, record:)
+ return if event_uuid.blank?
+
+ WebhookEvent.create_with(
+ event_type:,
+ record:,
+ account_id: webhook_url.account_id,
+ status: 'pending'
+ ).find_or_create_by!(webhook_url:, uuid: event_uuid)
+ end
+
+ def handle_response(webhook_event, response:, attempt:)
+ return response unless webhook_event
+
+ is_error = response.status.to_i >= 400
+
+ WebhookAttempt.create!(
+ webhook_event:,
+ response_body: is_error ? response.body&.truncate(100) : nil,
+ response_status_code: response.status,
+ attempt:
+ )
+
+ webhook_event.update!(status: is_error ? 'error' : 'success')
+
+ response
+ rescue StandardError
+ raise if Rails.env.local?
+
+ nil
+ end
+
+ def handle_error(webhook_event, error_message:, attempt:)
+ return unless webhook_event
+
+ WebhookAttempt.create!(
+ webhook_event:,
+ response_body: error_message,
+ response_status_code: 0,
+ attempt:
+ )
+
+ webhook_event.update!(status: 'error')
+
+ nil
+ rescue StandardError
+ raise if Rails.env.local?
+
nil
end
end
diff --git a/lib/submissions.rb b/lib/submissions.rb
index 9843fd0f..c76d284d 100644
--- a/lib/submissions.rb
+++ b/lib/submissions.rb
@@ -7,7 +7,15 @@ module Submissions
module_function
- def search(submissions, keyword, search_values: false, search_template: false)
+ def search(current_user, submissions, keyword, search_values: false, search_template: false)
+ if Docuseal.fulltext_search?
+ fulltext_search(current_user, submissions, keyword, search_template:)
+ else
+ plain_search(submissions, keyword, search_values:, search_template:)
+ end
+ end
+
+ def plain_search(submissions, keyword, search_values: false, search_template: false)
return submissions if keyword.blank?
term = "%#{keyword.downcase}%"
@@ -21,7 +29,7 @@ module Submissions
arel = arel.or(Arel::Table.new(:submitters)[:values].matches(term)) if search_values
if search_template
- submissions = submissions.joins(:template)
+ submissions = submissions.left_joins(:template)
arel = arel.or(Template.arel_table[:name].lower.matches("%#{keyword.downcase}%"))
end
@@ -29,8 +37,40 @@ module Submissions
submissions.joins(:submitters).where(arel).group(:id)
end
+ def fulltext_search(current_user, submissions, keyword, search_template: false)
+ return submissions if keyword.blank?
+
+ arel = SearchEntry.where(record_type: 'Submission')
+ .where(account_id: current_user.account_id)
+ .where(*SearchEntries.build_tsquery(keyword))
+ .select(:record_id).arel
+
+ if search_template
+ arel = Arel::Nodes::Union.new(
+ arel,
+ Submission.where(
+ template_id: SearchEntry.where(record_type: 'Template')
+ .where(account_id: [current_user.account_id,
+ current_user.account.linked_account_account&.account_id].compact)
+ .where(*SearchEntries.build_tsquery(keyword))
+ .select(:record_id)
+ ).select(:id).arel
+ )
+ end
+
+ arel = Arel::Nodes::Union.new(
+ arel, Submitter.joins(:search_entry)
+ .where(search_entry: { account_id: current_user.account_id })
+ .where(*SearchEntries.build_tsquery(keyword, with_or_vector: true))
+ .select(:submission_id).arel
+ )
+
+ submissions.where(Submission.arel_table[:id].in(arel))
+ end
+
def update_template_fields!(submission)
submission.template_fields = submission.template.fields
+ submission.variables_schema = submission.template.variables_schema
submission.template_schema = submission.template.schema
submission.template_submitters = submission.template.submitters if submission.template_submitters.blank?
@@ -40,15 +80,17 @@ module Submissions
def preload_with_pages(submission)
ActiveRecord::Associations::Preloader.new(
records: [submission],
- associations: [:template, { template_schema_documents: :blob }]
+ associations: [
+ submission.template_id? ? { template_schema_documents: :blob } : { documents_attachments: :blob }
+ ]
).call
total_pages =
- submission.template_schema_documents.sum { |e| e.metadata.dig('pdf', 'number_of_pages').to_i }
+ submission.schema_documents.sum { |e| e.metadata.dig('pdf', 'number_of_pages').to_i }
if total_pages < PRELOAD_ALL_PAGES_AMOUNT
ActiveRecord::Associations::Preloader.new(
- records: submission.template_schema_documents,
+ records: submission.schema_documents,
associations: [:blob, { preview_images_attachments: :blob }]
).call
end
@@ -59,10 +101,13 @@ module Submissions
def create_from_emails(template:, user:, emails:, source:, mark_as_sent: false, params: {})
preferences = Submitters.normalize_preferences(user.account, user, params)
+ expire_at = params[:expire_at].presence || Templates.build_default_expire_at(template)
+
parse_emails(emails, user).uniq.map do |email|
submission = template.submissions.new(created_by_user: user,
account_id: user.account_id,
source:,
+ expire_at:,
template_submitters: template.submitters)
submission.submitters.new(email: normalize_email(email),
@@ -71,7 +116,13 @@ module Submissions
preferences:,
sent_at: mark_as_sent ? Time.current : nil)
- submission.tap(&:save!)
+ submission.save!
+
+ if submission.expire_at?
+ ProcessSubmissionExpiredJob.perform_at(submission.expire_at, 'submission_id' => submission.id)
+ end
+
+ submission
end
end
@@ -81,10 +132,10 @@ module Submissions
emails
end
- def create_from_submitters(template:, user:, submissions_attrs:, source:,
+ def create_from_submitters(template:, user:, submissions_attrs:, source:, with_template: true,
submitters_order: DEFAULT_SUBMITTERS_ORDER, params: {})
Submissions::CreateFromSubmitters.call(
- template:, user:, submissions_attrs:, source:, submitters_order:, params:
+ template:, user:, submissions_attrs:, source:, submitters_order:, params:, with_template:
)
end
@@ -92,15 +143,23 @@ module Submissions
submissions.each_with_index do |submission, index|
delay_seconds = (delay + index).seconds if delay
- submitters = submission.submitters.reject(&:completed_at?)
+ template_submitters = submission.template_submitters
+ submitters_index = submission.submitters.reject(&:completed_at?).index_by(&:uuid)
- if submission.submitters_order_preserved?
- first_submitter =
- submission.template_submitters.filter_map { |s| submitters.find { |e| e.uuid == s['uuid'] } }.first
+ if template_submitters.any? { |s| s['order'] }
+ min_order = template_submitters.map.with_index { |s, i| s['order'] || i }.min
+
+ first_submitters = template_submitters.filter_map do |s|
+ submitters_index[s['uuid']] if s['order'] == min_order
+ end
+
+ Submitters.send_signature_requests(first_submitters, delay_seconds:)
+ elsif submission.submitters_order_preserved?
+ first_submitter = template_submitters.filter_map { |s| submitters_index[s['uuid']] }.first
Submitters.send_signature_requests([first_submitter], delay_seconds:) if first_submitter
else
- Submitters.send_signature_requests(submitters, delay_seconds:)
+ Submitters.send_signature_requests(submitters_index.values, delay_seconds:)
end
end
end
@@ -109,18 +168,23 @@ module Submissions
return if email.blank?
return if email.is_a?(Numeric)
- return email.downcase if email.to_s.include?(',') ||
- email.to_s.match?(/\.(?:gob|om|mm|cm|et|mo|nz|za|ie)\z/) ||
- email.to_s.exclude?('.')
+ email = email.to_s.tr('/', ',')
+
+ return email.downcase.sub(/@gmail?\z/i, '@gmail.com') if email.match?(/@gmail?\z/i)
+
+ return email.downcase if email.include?(',') ||
+ email.match?(/\.(?:gob|om|mm|cm|et|mo|nz|za|ie)\z/) ||
+ email.exclude?('.')
fixed_email = EmailTypo.call(email.delete_prefix('<'))
return fixed_email if fixed_email == email
- domain = email.to_s.split('@').last.to_s.downcase
+ domain = email.split('@').last.to_s.downcase
fixed_domain = fixed_email.to_s.split('@').last
return email.downcase if domain == fixed_domain
+ return email.downcase if fixed_domain.match?(/\Agmail\.(?!com\z)/i)
if DidYouMean::Levenshtein.distance(domain, fixed_domain) > 3
Rails.logger.info("Skipped email fix #{domain}")
@@ -134,16 +198,11 @@ module Submissions
end
def filtered_conditions_schema(submission, values: nil, include_submitter_uuid: nil)
- fields_uuid_index = nil
-
(submission.template_schema || submission.template.schema).filter_map do |item|
if item['conditions'].present?
- fields_uuid_index ||=
- (submission.template_fields || submission.template.fields).index_by { |f| f['uuid'] }
-
values ||= submission.submitters.reduce({}) { |acc, sub| acc.merge(sub.values) }
- next unless check_item_conditions(item, values, fields_uuid_index, include_submitter_uuid:)
+ next unless check_item_conditions(item, values, submission.fields_uuid_index, include_submitter_uuid:)
end
item
@@ -151,21 +210,21 @@ module Submissions
end
def filtered_conditions_fields(submitter, only_submitter_fields: true)
- fields = submitter.submission.template_fields || submitter.submission.template.fields
+ submission = submitter.submission
+
+ fields = submission.template_fields || submission.template.fields
- fields_uuid_index = nil
values = nil
fields.filter_map do |field|
next if field['submitter_uuid'] != submitter.uuid && only_submitter_fields
if field['conditions'].present?
- fields_uuid_index ||= fields.index_by { |f| f['uuid'] }
- values ||= submitter.submission.submitters.reduce({}) { |acc, sub| acc.merge(sub.values) }
+ values ||= submission.submitters.reduce({}) { |acc, sub| acc.merge(sub.values) }
submitter_conditions = []
- next unless check_item_conditions(field, values, fields_uuid_index,
+ next unless check_item_conditions(field, values, submission.fields_uuid_index,
include_submitter_uuid: submitter.uuid,
submitter_conditions_acc: submitter_conditions)
@@ -181,7 +240,7 @@ module Submissions
item['conditions'].each_with_object([]) do |condition, acc|
result =
- if fields_index[condition['field_uuid']]['submitter_uuid'] == include_submitter_uuid
+ if fields_index.dig(condition['field_uuid'], 'submitter_uuid') == include_submitter_uuid
submitter_conditions_acc << condition if submitter_conditions_acc
true
@@ -196,4 +255,20 @@ module Submissions
end
end.exclude?(false)
end
+
+ def regenerate_documents(submission)
+ submitters = submission.submitters.where.not(completed_at: nil).preload(:documents_attachments)
+
+ submitters.each { |submitter| submitter.documents.each(&:destroy!) }
+
+ submission.submitters.where.not(completed_at: nil).order(:completed_at).each do |submitter|
+ GenerateResultAttachments.call(submitter)
+ end
+
+ return if submission.combined_document_attachment.blank?
+
+ submission.combined_document_attachment.destroy!
+
+ Submissions::GenerateCombinedAttachment.call(submission.submitters.completed.order(:completed_at).last)
+ end
end
diff --git a/lib/submissions/create_from_submitters.rb b/lib/submissions/create_from_submitters.rb
index 083c3573..0ae3b09b 100644
--- a/lib/submissions/create_from_submitters.rb
+++ b/lib/submissions/create_from_submitters.rb
@@ -6,53 +6,101 @@ module Submissions
module_function
- # rubocop:disable Metrics/BlockLength
- def call(template:, user:, submissions_attrs:, source:, submitters_order:, params: {})
+ # rubocop:disable Metrics
+ def call(template:, user:, submissions_attrs:, source:, submitters_order:, params: {}, with_template: true)
preferences = Submitters.normalize_preferences(user.account, user, params)
- Array.wrap(submissions_attrs).filter_map do |attrs|
+ submissions = Array.wrap(submissions_attrs).filter_map do |attrs|
submission_preferences = Submitters.normalize_preferences(user.account, user, attrs)
submission_preferences = preferences.merge(submission_preferences)
set_submission_preferences = submission_preferences.slice('send_email', 'bcc_completed')
set_submission_preferences['send_email'] = true if params['send_completed_email']
+ expire_at = attrs[:expire_at] || Templates.build_default_expire_at(template)
- submission = template.submissions.new(created_by_user: user, source:,
- account_id: user.account_id,
- preferences: set_submission_preferences,
- expire_at: attrs[:expire_at],
- template_submitters: [], submitters_order:)
+ submission = template.submissions.new(
+ created_by_user: user, source:,
+ account_id: user.account_id,
+ preferences: set_submission_preferences,
+ name: with_template ? attrs[:name] : (attrs[:name].presence || template.name),
+ variables: attrs[:variables] || {},
+ expire_at:,
+ template_submitters: [], submitters_order:
+ )
- maybe_set_template_fields(submission, attrs[:submitters])
+ template_submitters = template.submitters.deep_dup
attrs[:submitters].each_with_index do |submitter_attrs, index|
- uuid = find_submitter_uuid(template, submitter_attrs, index)
+ if submitter_attrs[:roles].present? && submitter_attrs[:roles].size > 1
+ template_submitter, template_submitters, submission.template_fields =
+ merge_submitters_and_fields(submitter_attrs, template_submitters,
+ submission.template_fields || submission.template.fields)
+
+ submission.template_schema = submission.template.schema if submission.template_schema.blank?
+
+ uuid = template_submitter['uuid']
+ else
+ if submitter_attrs[:roles].present? && submitter_attrs[:roles].size == 1
+ submitter_attrs[:role] = submitter_attrs[:roles].first
+ end
+
+ uuid = find_submitter_uuid(template_submitters, submitter_attrs, index)
- next if uuid.blank?
- next if submitter_attrs.slice('email', 'phone', 'name').compact_blank.blank?
+ next if uuid.blank?
+ next if submitter_attrs.slice('email', 'phone', 'name').compact_blank.blank?
- template_submitter = template.submitters.find { |e| e['uuid'] == uuid }
- submission.template_submitters << template_submitter.except('optional_invite_by_uuid', 'invite_by_uuid')
+ submission.template_fields = submission.template.fields if submitter_attrs[:completed].present? &&
+ submission.template_fields.blank?
- is_order_sent = submitters_order == 'random' || index.zero?
+ template_submitter = template_submitters.find { |e| e['uuid'] == uuid }
+ end
+
+ template_submitter = template_submitter.except('optional_invite_by_uuid', 'invite_by_uuid')
+ template_submitter['order'] = submitter_attrs['order'] if submitter_attrs['order'].present?
+
+ submission.template_submitters << template_submitter
+
+ is_order_sent = submitters_order == 'random' || (template_submitter['order'] || index).zero?
build_submitter(submission:, attrs: submitter_attrs,
uuid:, is_order_sent:, user:, params:,
preferences: preferences.merge(submission_preferences))
end
+ maybe_set_template_fields(submission, attrs[:submitters], with_template:)
+
if submission.submitters.size > template.submitters.size
raise BaseError, 'Defined more signing parties than in template'
end
+ if template.preferences['validate_unique_submitters'] == true
+ submission_emails = submission.submitters.filter_map(&:email)
+
+ raise BaseError, 'Recipient emails should differ' if submission_emails.uniq.size != submission_emails.size
+ end
+
next if submission.submitters.blank?
maybe_add_invite_submitters(submission, template)
+ submission.template = nil unless with_template
+
submission.tap(&:save!)
end
+
+ maybe_enqueue_expire_at(submissions)
+
+ submissions
+ end
+ # rubocop:enable Metrics
+
+ def maybe_enqueue_expire_at(submissions)
+ submissions.each do |submission|
+ next unless submission.expire_at?
+
+ ProcessSubmissionExpiredJob.perform_at(submission.expire_at, 'submission_id' => submission.id)
+ end
end
- # rubocop:enable Metrics/BlockLength
def maybe_add_invite_submitters(submission, template)
template.submitters.each_with_index do |item, index|
@@ -79,11 +127,13 @@ module Submissions
}.compact_blank
end
- def maybe_set_template_fields(submission, submitters_attrs, default_submitter_uuid: nil)
+ def maybe_set_template_fields(submission, submitters_attrs, default_submitter_uuid: nil, with_template: true)
template_fields = (submission.template_fields || submission.template.fields).deep_dup
+ submitters = submission.template_submitters || submission.template.submitters
+
submitters_attrs.each_with_index do |submitter_attrs, index|
- submitter_uuid = default_submitter_uuid || find_submitter_uuid(submission.template, submitter_attrs, index)
+ submitter_uuid = default_submitter_uuid || find_submitter_uuid(submitters, submitter_attrs, index)
process_readonly_fields_param(submitter_attrs[:readonly_fields], template_fields, submitter_uuid)
process_field_values_param(submitter_attrs[:values], template_fields, submitter_uuid)
@@ -92,14 +142,77 @@ module Submissions
end
if template_fields != (submission.template_fields || submission.template.fields) ||
- submitters_attrs.any? { |e| e[:completed].present? }
+ submitters_attrs.any? { |e| e[:completed].present? } || !with_template || submission.variables.present?
submission.template_fields = template_fields
submission.template_schema = submission.template.schema if submission.template_schema.blank?
+ submission.variables_schema = submission.template.variables_schema if submission.template &&
+ submission.variables_schema.blank?
end
submission
end
+ def merge_submitters_and_fields(submitter_attrs, template_submitters, template_fields)
+ selected_submitters = submitter_attrs[:roles].map do |role|
+ template_submitters.find { |e| e['name'].to_s.casecmp(role).zero? } ||
+ raise(BaseError, "#{role} role doesn't exist")
+ end
+
+ merge_role_uuids = selected_submitters.pluck('uuid')
+ old_role_uuids = template_submitters.pluck('uuid')
+ name = submitter_attrs[:role].presence || selected_submitters.pluck('name').join(' / ')
+
+ merged_submitter, template_submitters =
+ build_merged_submitter(template_submitters, role_uuids: merge_role_uuids, name:)
+
+ field_names_index = {}
+
+ sorted_fields = template_fields.sort_by { |e| old_role_uuids.index(e['submitter_uuid']) }
+
+ sorted_fields.each do |field|
+ next unless merge_role_uuids.include?(field['submitter_uuid'])
+
+ if (existing_field = field_names_index[field['name']])
+ existing_field['areas'] ||= []
+ existing_field['areas'].push(*field['areas'])
+ template_fields.delete(field)
+ else
+ field['submitter_uuid'] = merged_submitter['uuid']
+ field_names_index[field['name']] = field if field['name'].present?
+ end
+ end
+
+ [merged_submitter, template_submitters, template_fields]
+ end
+
+ def build_merged_submitter(submitters, role_uuids:, name:)
+ new_uuid = Digest::UUID.uuid_v5(Digest::UUID::OID_NAMESPACE, role_uuids.sort.join(':'))
+
+ merged_submitter = nil
+
+ submitters =
+ submitters.filter_map do |submitter|
+ submitter['optional_invite_by_uuid'] = new_uuid if role_uuids.include?(submitter['optional_invite_by_uuid'])
+ submitter['invite_by_uuid'] = new_uuid if role_uuids.include?(submitter['invite_by_uuid'])
+ submitter['linked_to_uuid'] = new_uuid if role_uuids.include?(submitter['linked_to_uuid'])
+
+ if role_uuids.include?(submitter['uuid'])
+ next if merged_submitter
+
+ merged_submitter = submitter.deep_dup
+ merged_submitter['uuid'] = new_uuid
+ merged_submitter['name'] = name
+ merged_submitter.delete('linked_to_uuid')
+
+ next merged_submitter
+ end
+
+ submitter
+ end
+
+ [merged_submitter, submitters]
+ end
+
def process_readonly_fields_param(readonly_fields, template_fields, submitter_uuid)
return if readonly_fields.blank?
@@ -167,6 +280,7 @@ module Submissions
end
field['preferences'] = (field['preferences'] || {}).merge(attrs['preferences']) if attrs['preferences'].present?
+ field['validation'] = (field['validation'] || {}).merge(attrs['validation']) if attrs['validation'].present?
return field if attrs['validation_pattern'].blank?
@@ -178,11 +292,11 @@ module Submissions
field
end
- def find_submitter_uuid(template, attrs, index)
+ def find_submitter_uuid(submitters, attrs, index)
uuid = attrs[:uuid].presence
- uuid ||= template.submitters.find { |e| e['name'].to_s.casecmp(attrs[:role].to_s).zero? }&.dig('uuid')
+ uuid ||= submitters.find { |e| e['name'].to_s.casecmp(attrs[:role].to_s).zero? }&.dig('uuid')
- uuid || template.submitters[index]&.dig('uuid')
+ uuid || submitters[index]&.dig('uuid')
end
def build_submitter(submission:, attrs:, uuid:, is_order_sent:, user:, preferences:, params:)
@@ -223,8 +337,8 @@ module Submissions
end
end
- def assign_completed_attributes(submitter)
- submitter.values = Submitters::SubmitValues.merge_default_values(submitter)
+ def assign_completed_attributes(submitter, with_verification: true)
+ submitter.values = Submitters::SubmitValues.merge_default_values(submitter, with_verification:)
submitter.values = Submitters::SubmitValues.maybe_remove_condition_values(submitter)
formula_values = Submitters::SubmitValues.build_formula_values(submitter)
diff --git a/lib/submissions/ensure_audit_generated.rb b/lib/submissions/ensure_audit_generated.rb
new file mode 100644
index 00000000..19e1b186
--- /dev/null
+++ b/lib/submissions/ensure_audit_generated.rb
@@ -0,0 +1,74 @@
+# frozen_string_literal: true
+
+module Submissions
+ module EnsureAuditGenerated
+ WAIT_FOR_RETRY = 2.seconds
+ CHECK_EVENT_INTERVAL = 1.second
+ CHECK_COMPLETE_TIMEOUT = 90.seconds
+ KEY_PREFIX = 'audit_trail'
+
+ WaitForCompleteTimeout = Class.new(StandardError)
+ NotCompletedYet = Class.new(StandardError)
+
+ module_function
+
+ def call(submission)
+ return nil unless submission
+
+ raise NotCompletedYet unless submission.submitters.all?(&:completed_at?)
+
+ key = [KEY_PREFIX, submission.id].join(':')
+
+ if ApplicationRecord.uncached { LockEvent.exists?(key:, event_name: :complete) }
+ return submission.audit_trail_attachment
+ end
+
+ events = ApplicationRecord.uncached { LockEvent.where(key:).order(:id).to_a }
+
+ if events.present? && events.last.event_name.in?(%w[start retry])
+ wait_for_complete_or_fail(submission)
+ else
+ LockEvent.create!(key:, event_name: events.present? ? :retry : :start)
+
+ result = Submissions::GenerateAuditTrail.call(submission)
+
+ LockEvent.create!(key:, event_name: :complete)
+
+ result
+ end
+ rescue ActiveRecord::RecordNotUnique
+ sleep WAIT_FOR_RETRY
+
+ retry
+ rescue StandardError => e
+ Rollbar.error(e) if defined?(Rollbar)
+ Rails.logger.error(e)
+
+ LockEvent.create!(key:, event_name: :fail)
+
+ raise
+ end
+
+ def wait_for_complete_or_fail(submission)
+ total_wait_time = 0
+
+ loop do
+ sleep CHECK_EVENT_INTERVAL
+ total_wait_time += CHECK_EVENT_INTERVAL
+
+ last_event =
+ ApplicationRecord.uncached do
+ LockEvent.where(key: [KEY_PREFIX, submission.id].join(':')).order(:id).last
+ end
+
+ if last_event.event_name.in?(%w[complete fail])
+ break ApplicationRecord.uncached do
+ ActiveStorage::Attachment.find_by(record: submission, name: 'audit_trail')
+ end
+ end
+
+ raise WaitForCompleteTimeout if total_wait_time > CHECK_COMPLETE_TIMEOUT
+ end
+ end
+ end
+end
diff --git a/lib/submissions/ensure_combined_generated.rb b/lib/submissions/ensure_combined_generated.rb
new file mode 100644
index 00000000..d5c04853
--- /dev/null
+++ b/lib/submissions/ensure_combined_generated.rb
@@ -0,0 +1,74 @@
+# frozen_string_literal: true
+
+module Submissions
+ module EnsureCombinedGenerated
+ WAIT_FOR_RETRY = 2.seconds
+ CHECK_EVENT_INTERVAL = 1.second
+ CHECK_COMPLETE_TIMEOUT = 90.seconds
+ KEY_PREFIX = 'combined_document'
+
+ WaitForCompleteTimeout = Class.new(StandardError)
+ NotCompletedYet = Class.new(StandardError)
+
+ module_function
+
+ def call(submitter)
+ return nil unless submitter
+
+ raise NotCompletedYet unless submitter.completed_at?
+
+ key = [KEY_PREFIX, submitter.id].join(':')
+
+ if ApplicationRecord.uncached { LockEvent.exists?(key:, event_name: :complete) }
+ return submitter.submission.combined_document_attachment
+ end
+
+ events = ApplicationRecord.uncached { LockEvent.where(key:).order(:id).to_a }
+
+ if events.present? && events.last.event_name.in?(%w[start retry])
+ wait_for_complete_or_fail(submitter)
+ else
+ LockEvent.create!(key:, event_name: events.present? ? :retry : :start)
+
+ result = Submissions::GenerateCombinedAttachment.call(submitter)
+
+ LockEvent.create!(key:, event_name: :complete)
+
+ result
+ end
+ rescue ActiveRecord::RecordNotUnique
+ sleep WAIT_FOR_RETRY
+
+ retry
+ rescue StandardError => e
+ Rollbar.error(e) if defined?(Rollbar)
+ Rails.logger.error(e)
+
+ LockEvent.create!(key:, event_name: :fail)
+
+ raise
+ end
+
+ def wait_for_complete_or_fail(submitter)
+ total_wait_time = 0
+
+ loop do
+ sleep CHECK_EVENT_INTERVAL
+ total_wait_time += CHECK_EVENT_INTERVAL
+
+ last_event =
+ ApplicationRecord.uncached do
+ LockEvent.where(key: [KEY_PREFIX, submitter.id].join(':')).order(:id).last
+ end
+
+ if last_event.event_name.in?(%w[complete fail])
+ break ApplicationRecord.uncached do
+ ActiveStorage::Attachment.find_by(record: submitter.submission, name: 'combined_document')
+ end
+ end
+
+ raise WaitForCompleteTimeout if total_wait_time > CHECK_COMPLETE_TIMEOUT
+ end
+ end
+ end
+end
diff --git a/lib/submissions/ensure_result_generated.rb b/lib/submissions/ensure_result_generated.rb
index dbbe5679..29563d49 100644
--- a/lib/submissions/ensure_result_generated.rb
+++ b/lib/submissions/ensure_result_generated.rb
@@ -7,26 +7,29 @@ module Submissions
CHECK_COMPLETE_TIMEOUT = 90.seconds
WaitForCompleteTimeout = Class.new(StandardError)
+ NotCompletedYet = Class.new(StandardError)
module_function
def call(submitter)
return [] unless submitter
- return submitter.documents if ApplicationRecord.uncached { submitter.document_generation_events.complete.exists? }
- events =
- ApplicationRecord.uncached do
- DocumentGenerationEvent.where(submitter:).order(:created_at).to_a
- end
+ raise NotCompletedYet unless submitter.completed_at?
+
+ key = ['result_attachments', submitter.id].join(':')
+
+ return submitter.documents if ApplicationRecord.uncached { LockEvent.exists?(key:, event_name: :complete) }
+
+ events = ApplicationRecord.uncached { LockEvent.where(key:).order(:id).to_a }
if events.present? && events.last.event_name.in?(%w[start retry])
wait_for_complete_or_fail(submitter)
else
- submitter.document_generation_events.create!(event_name: events.present? ? :retry : :start)
+ LockEvent.create!(key:, event_name: events.present? ? :retry : :start)
documents = GenerateResultAttachments.call(submitter)
- submitter.document_generation_events.create!(event_name: :complete)
+ LockEvent.create!(key:, event_name: :complete)
documents
end
@@ -38,7 +41,7 @@ module Submissions
Rollbar.error(e) if defined?(Rollbar)
Rails.logger.error(e)
- submitter.document_generation_events.create!(event_name: :fail)
+ LockEvent.create!(key:, event_name: :fail)
raise
end
@@ -52,7 +55,7 @@ module Submissions
last_event =
ApplicationRecord.uncached do
- DocumentGenerationEvent.where(submitter:).order(:created_at).last
+ LockEvent.where(key: ['result_attachments', submitter.id].join(':')).order(:id).last
end
break submitter.documents.reload if last_event.event_name.in?(%w[complete fail])
diff --git a/lib/submissions/filter.rb b/lib/submissions/filter.rb
index 27a1c375..a6677bf4 100644
--- a/lib/submissions/filter.rb
+++ b/lib/submissions/filter.rb
@@ -5,6 +5,7 @@ module Submissions
ALLOWED_PARAMS = %w[
author
status
+ folder
completed_at_from
completed_at_to
created_at_from
@@ -24,6 +25,7 @@ module Submissions
filters = normalize_filter_params(params, current_user)
submissions = filter_by_author(submissions, filters, current_user)
+ submissions = filter_by_folder(submissions, filters, current_user)
submissions = filter_by_status(submissions, filters)
submissions = filter_by_created_at(submissions, filters)
@@ -34,6 +36,7 @@ module Submissions
return submissions if filters[:author].blank?
user = current_user.account.users.find_by(email: filters[:author])
+
submissions.where(created_by_user_id: user&.id || -1)
end
@@ -87,6 +90,17 @@ module Submissions
submissions
end
+ def filter_by_folder(submissions, filters, current_user)
+ return submissions if filters[:folder].blank?
+
+ folders =
+ TemplateFolders.filter_by_full_name(current_user.account.template_folders, filters[:folder])
+
+ folders += folders.preload(:subfolders).flat_map(&:subfolders)
+
+ submissions.joins(:template).where(templates: { folder_id: folders.map(&:id) })
+ end
+
def filter_by_completed_at(submissions, filters)
return submissions unless filters[:completed_at_from].present? || filters[:completed_at_to].present?
diff --git a/lib/submissions/generate_audit_trail.rb b/lib/submissions/generate_audit_trail.rb
index 3bc461a6..2619c949 100644
--- a/lib/submissions/generate_audit_trail.rb
+++ b/lib/submissions/generate_audit_trail.rb
@@ -23,6 +23,8 @@ module Submissions
RTL_REGEXP = TextUtils::RTL_REGEXP
MAX_IMAGE_HEIGHT = 100
+ CHECKSUM_LIMIT = 30
+
US_TIMEZONES = TimeUtils::US_TIMEZONES
module_function
@@ -31,7 +33,9 @@ module Submissions
def call(submission)
account = submission.account
- I18n.with_locale(account.locale) do
+ last_submitter = submission.submitters.select(&:completed_at).max_by(&:completed_at)
+
+ I18n.with_locale(last_submitter.metadata.fetch('lang', account.locale)) do
document = build_audit_trail(submission)
pkcs = Accounts.load_signing_pkcs(account)
@@ -41,8 +45,6 @@ module Submissions
document.trailer.info[:Creator] = "#{Docuseal.product_name} (#{Docuseal::PRODUCT_URL})"
- last_submitter = submission.submitters.select(&:completed_at).max_by(&:completed_at)
-
if pkcs
sign_params = {
reason: sign_reason,
@@ -50,15 +52,16 @@ module Submissions
}
document.sign(io, **sign_params)
+
+ Submissions::GenerateResultAttachments.maybe_enable_ltv(io, sign_params)
else
document.write(io)
end
- Submissions::GenerateResultAttachments.maybe_enable_ltv(io, sign_params)
-
ActiveStorage::Attachment.create!(
blob: ActiveStorage::Blob.create_and_upload!(
- io: io.tap(&:rewind), filename: "#{I18n.t('audit_log')} - #{submission.template.name}.pdf"
+ io: io.tap(&:rewind), filename: "#{I18n.t('audit_log')} - " \
+ "#{submission.name || submission.template.name}.pdf"
),
name: 'audit_trail',
record: submission
@@ -80,7 +83,12 @@ module Submissions
end
composer = HexaPDF::Composer.new(skip_page_creation: true)
- composer.document.task(:pdfa) if FONT_NAME == 'GoNotoKurrent'
+
+ if Docuseal.pdf_format == 'pdf/a-3b'
+ composer.document.task(:pdfa, level: '3b')
+ elsif FONT_NAME == 'GoNotoKurrent'
+ composer.document.task(:pdfa)
+ end
composer.document.config['font.map'] = {
'Helvetica' => {
@@ -106,10 +114,19 @@ module Submissions
)
configs = submission.account.account_configs.where(key: [AccountConfig::WITH_AUDIT_VALUES_KEY,
- AccountConfig::WITH_SIGNATURE_ID])
+ AccountConfig::WITH_SIGNATURE_ID,
+ AccountConfig::WITH_FILE_LINKS_KEY,
+ AccountConfig::WITH_SUBMITTER_TIMEZONE_KEY])
+
+ last_submitter = submission.submitters.select(&:completed_at).max_by(&:completed_at)
with_signature_id = configs.find { |c| c.key == AccountConfig::WITH_SIGNATURE_ID }&.value == true
+ with_file_links = configs.find { |c| c.key == AccountConfig::WITH_FILE_LINKS_KEY }&.value == true
with_audit_values = configs.find { |c| c.key == AccountConfig::WITH_AUDIT_VALUES_KEY }&.value != false
+ with_submitter_timezone = configs.find { |c| c.key == AccountConfig::WITH_SUBMITTER_TIMEZONE_KEY }&.value == true
+
+ timezone = account.timezone
+ timezone = last_submitter.timezone || account.timezone if with_submitter_timezone
composer.page_style(:default, page_size:) do |canvas, style|
box = canvas.context.box(:media)
@@ -183,10 +200,8 @@ module Submissions
composer.draw_box(divider)
- last_submitter = submission.submitters.select(&:completed_at).max_by(&:completed_at)
-
- documents_data = Submitters.select_attachments_for_download(last_submitter).map do |document|
- original_documents = submission.template.documents.select do |e|
+ documents_data = select_attachments(last_submitter).map do |document|
+ original_documents = submission.schema_documents.select do |e|
e.uuid == (document.metadata['original_uuid'] || document.uuid)
end.presence
@@ -203,14 +218,14 @@ module Submissions
composer.document.layout.formatted_text_box(
[
{ text: "#{I18n.t('original_sha256')}:\n", font: [FONT_NAME, { variant: :bold }] },
- original_documents.map { |d| d.metadata['sha256'] || d.checksum }.join("\n"),
+ original_documents.map { |d| d.metadata['sha256'] || d.checksum }.first(CHECKSUM_LIMIT).join("\n"),
"\n",
{ text: "#{I18n.t('result_sha256')}:\n", font: [FONT_NAME, { variant: :bold }] },
document.metadata['sha256'] || document.checksum,
"\n",
{ text: "#{I18n.t('generated_at')}: ", font: [FONT_NAME, { variant: :bold }] },
- "#{I18n.l(document.created_at.in_time_zone(account.timezone), format: :long, locale: account.locale)} " \
- "#{TimeUtils.timezone_abbr(account.timezone, document.created_at)}"
+ "#{I18n.l(document.created_at.in_time_zone(timezone), format: :long, locale: account.locale)} " \
+ "#{TimeUtils.timezone_abbr(timezone, document.created_at)}"
], line_spacing: 1.3
)
]
@@ -233,18 +248,23 @@ module Submissions
click_email_event =
submission.submission_events.find { |e| e.submitter_id == submitter.id && e.click_email? }
+
+ verify_email_event =
+ submission.submission_events.find { |e| e.submitter_id == submitter.id && e.phone_verified? }
+
is_phone_verified =
submission.template_fields.any? do |e|
e['type'] == 'phone' && e['submitter_uuid'] == submitter.uuid && submitter.values[e['uuid']].present?
end
+ verify_phone_event =
+ submission.submission_events.find { |e| e.submitter_id == submitter.id && e.phone_verified? }
+
is_id_verified =
submission.template_fields.any? do |e|
e['type'] == 'verification' && e['submitter_uuid'] == submitter.uuid && submitter.values[e['uuid']].present?
end
- submitter_field_counters = Hash.new { 0 }
-
info_rows = [
[
composer.document.layout.formatted_text_box(
@@ -259,10 +279,10 @@ module Submissions
[
composer.document.layout.formatted_text_box(
[
- submitter.email && click_email_event && {
+ submitter.email && (click_email_event || verify_email_event) && {
text: "#{I18n.t('email_verification')}: #{I18n.t('verified')}\n"
},
- submitter.phone && is_phone_verified && {
+ submitter.phone && (is_phone_verified || verify_phone_event) && {
text: "#{I18n.t('phone_verification')}: #{I18n.t('verified')}\n"
},
is_id_verified && {
@@ -271,6 +291,7 @@ module Submissions
completed_event.data['ip'] && { text: "IP: #{completed_event.data['ip']}\n" },
completed_event.data['sid'] && { text: "#{I18n.t('session_id')}: #{completed_event.data['sid']}\n" },
completed_event.data['ua'] && { text: "User agent: #{completed_event.data['ua']}\n" },
+ submitter.timezone && { text: "Time zone: #{submitter.timezone.to_s.sub('Kiev', 'Kyiv')}\n" },
"\n"
].compact_blank, line_spacing: 1.3, padding: [10, 20, 20, 0]
)
@@ -279,37 +300,66 @@ module Submissions
composer.table(info_rows, cell_style: { padding: [0, 0, 0, 0], border: { width: 0 } })
- submission.template_fields.filter_map do |field|
+ submitter_field_counters = Hash.new { 0 }
+ grouped_value_field_names = {}
+ skip_grouped_field_uuids = {}
+
+ submission.template_fields.each do |field|
+ next unless field['type'].in?(%w[signature initials])
+
+ submitter_field_counters[field['type']] += 1
+
next if field['submitter_uuid'] != submitter.uuid
- next if field['type'] == 'heading'
- next if !with_audit_values && !field['type'].in?(%w[signature initials])
+ value = submitter.values[field['uuid']]
+
+ field_name = field['title'].presence || field['name'].presence ||
+ "#{I18n.t("#{field['type']}_field")} #{submitter_field_counters[field['type']]}"
+
+ if grouped_value_field_names[value]
+ skip_grouped_field_uuids[field['uuid']] = true
+
+ grouped_value_field_names[value] += ", #{field_name}"
+ else
+ grouped_value_field_names[value] = field_name
+ end
+ end
+
+ submitter_field_counters = Hash.new { 0 }
+
+ submission.template_fields.filter_map do |field|
submitter_field_counters[field['type']] += 1
+ next if field['submitter_uuid'] != submitter.uuid
+ next if field['type'] == 'heading' || field['type'] == 'strikethrough'
+ next if !with_audit_values && !field['type'].in?(%w[signature initials])
+ next if skip_grouped_field_uuids[field['uuid']]
+
value = submitter.values[field['uuid']]
next if Array.wrap(value).compact_blank.blank?
- field_name = field['title'].presence || field['name'].to_s
+ field_name = grouped_value_field_names[value].presence || field['title'].presence || field['name'].to_s
[
composer.formatted_text_box(
[
{
text: TextUtils.maybe_rtl_reverse(field_name).upcase.presence ||
- "#{I18n.t("#{field['type']}_field")} #{submitter_field_counters[field['type']]}\n".upcase,
+ "#{I18n.t("#{field['type']}_field")} #{submitter_field_counters[field['type']]}".upcase,
font_size: 6
}
].compact_blank,
text_align: field_name.to_s.match?(RTL_REGEXP) ? :right : :left,
line_spacing: 1.3, padding: [0, 0, 2, 0]
),
- if field['type'].in?(%w[image signature initials stamp])
- attachment = submitter.attachments.find { |a| a.uuid == value }
+ if field['type'].in?(%w[image signature initials stamp]) &&
+ (attachment = submitter.attachments.find { |a| a.uuid == value }) &&
+ attachment.image?
image =
begin
- Vips::Image.new_from_buffer(attachment.download, '').autorot
+ Submissions::GenerateResultAttachments.load_vips_image(attachment).autorot
rescue Vips::Error
next unless attachment.content_type.starts_with?('image/')
next if attachment.byte_size.zero?
@@ -322,7 +372,7 @@ module Submissions
resized_image = image.resize([scale, 1].min)
io = StringIO.new(resized_image.write_to_buffer('.png'))
- width = field['type'] == 'initials' ? 100 : 200
+ width = field['type'] == 'initials' ? 50 : 200
height = resized_image.height * (width.to_f / resized_image.width)
if height > MAX_IMAGE_HEIGHT
@@ -332,7 +382,7 @@ module Submissions
composer.image(io, width:, height:, margin: [5, 0, 10, 0])
composer.formatted_text_box([{ text: '' }])
- elsif field['type'].in?(%w[file payment])
+ elsif field['type'].in?(%w[file payment image])
if field['type'] == 'payment'
unit = CURRENCY_SYMBOLS[field['preferences']['currency']] || field['preferences']['currency']
@@ -345,8 +395,13 @@ module Submissions
composer.formatted_text_box(
Array.wrap(value).map do |uuid|
attachment = submitter.attachments.find { |a| a.uuid == uuid }
+
link =
- ActiveStorage::Blob.proxy_url(attachment.blob)
+ if with_file_links
+ ActiveStorage::Blob.proxy_url(attachment.blob)
+ else
+ r.submissions_preview_url(submission.slug, **Docuseal.default_url_options)
+ end
{ link:, text: "#{attachment.filename}\n", style: :link }
end,
@@ -379,7 +434,9 @@ module Submissions
composer.text(I18n.t('event_log'), font_size: 12, padding: [10, 0, 20, 0])
- events_data = submission.submission_events.sort_by(&:event_timestamp).map do |event|
+ events_data = submission.submission_events.sort_by(&:event_timestamp).filter_map do |event|
+ next if event.event_type.in?(%w[bounce_email complaint_email])
+
submitter = submission.submitters.find { |e| e.id == event.submitter_id }
submitter_name =
if event.event_type.include?('sms') || event.event_type.include?('phone')
@@ -408,8 +465,8 @@ module Submissions
bold_text, normal_text = text.match(%r{(.*?)(.*)}).captures
[
- "#{I18n.l(event.event_timestamp.in_time_zone(account.timezone), format: :long, locale: account.locale)} " \
- "#{TimeUtils.timezone_abbr(account.timezone, event.event_timestamp)}",
+ "#{I18n.l(event.event_timestamp.in_time_zone(timezone), format: :long, locale: account.locale)} " \
+ "#{TimeUtils.timezone_abbr(timezone, event.event_timestamp)}",
composer.document.layout.formatted_text_box([{ text: bold_text, font: [FONT_NAME, { variant: :bold }] },
normal_text])
]
@@ -424,6 +481,16 @@ module Submissions
'Signed with DocuSeal.com'
end
+ def select_attachments(submitter)
+ original_documents = submitter.submission.schema_documents.preload(:blob)
+ is_more_than_two_images = original_documents.many?(&:image?)
+
+ submitter.documents.preload(:blob).reject do |attachment|
+ is_more_than_two_images &&
+ original_documents.find { |a| a.uuid == (attachment.metadata['original_uuid'] || attachment.uuid) }&.image?
+ end
+ end
+
def maybe_add_background(_canvas, _submission, _page_size); end
def show_verify?(submission)
@@ -441,6 +508,10 @@ module Submissions
padding: [5, 0, 0, 8],
position: :float, text_align: :left)
end
+
+ def r
+ Rails.application.routes.url_helpers
+ end
# rubocop:enable Metrics
end
end
diff --git a/lib/submissions/generate_combined_attachment.rb b/lib/submissions/generate_combined_attachment.rb
index 4e996634..faf55471 100644
--- a/lib/submissions/generate_combined_attachment.rb
+++ b/lib/submissions/generate_combined_attachment.rb
@@ -17,34 +17,47 @@ module Submissions
pdf.trailer.info[:Creator] = "#{Docuseal.product_name} (#{Docuseal::PRODUCT_URL})"
+ if Docuseal.pdf_format == 'pdf/a-3b'
+ pdf.task(:pdfa, level: '3b')
+ pdf.config['font.map'] = GenerateResultAttachments::PDFA_FONT_MAP
+ end
+
if pkcs
sign_params = {
reason: Submissions::GenerateResultAttachments.single_sign_reason(submitter),
**Submissions::GenerateResultAttachments.build_signing_params(submitter, pkcs, tsa_url)
}
- begin
- pdf.sign(io, **sign_params)
- rescue HexaPDF::MalformedPDFError => e
- Rollbar.error(e) if defined?(Rollbar)
+ sign_pdf(io, pdf, sign_params)
- pdf.sign(io, write_options: { incremental: false }, **sign_params)
- end
+ Submissions::GenerateResultAttachments.maybe_enable_ltv(io, sign_params)
else
- pdf.write(io, incremental: true, validate: false)
+ pdf.write(io, incremental: true, validate: true)
end
- Submissions::GenerateResultAttachments.maybe_enable_ltv(io, sign_params)
-
ActiveStorage::Attachment.create!(
blob: ActiveStorage::Blob.create_and_upload!(
- io: io.tap(&:rewind), filename: "#{submission.template.name}.pdf"
+ io: io.tap(&:rewind), filename: "#{submission.name || submission.template.name}.pdf"
),
name: 'combined_document',
record: submission
)
end
+ def sign_pdf(io, pdf, sign_params)
+ pdf.sign(io, **sign_params)
+ rescue HexaPDF::MalformedPDFError, NoMethodError => e
+ Rollbar.error(e) if defined?(Rollbar)
+
+ pdf.sign(io, write_options: { incremental: false }, **sign_params)
+ rescue HexaPDF::Error => e
+ Rollbar.error(e) if defined?(Rollbar)
+
+ pdf.validate(auto_correct: true)
+
+ pdf.sign(io, write_options: { validate: false }, **sign_params)
+ end
+
def build_combined_pdf(submitter)
pdfs_index = Submissions::GenerateResultAttachments.generate_pdfs(submitter)
diff --git a/lib/submissions/generate_export_files.rb b/lib/submissions/generate_export_files.rb
index 506ee1ba..b2b8f076 100644
--- a/lib/submissions/generate_export_files.rb
+++ b/lib/submissions/generate_export_files.rb
@@ -6,8 +6,8 @@ module Submissions
module_function
- def call(submissions, format: :csv)
- rows = build_table_rows(submissions)
+ def call(submissions, format: :csv, expires_at: nil)
+ rows = build_table_rows(submissions, expires_at:)
if format.to_sym == :csv
rows_to_csv(rows)
@@ -40,7 +40,7 @@ module Submissions
def rows_to_csv(rows)
headers = build_headers(rows)
- CSV.generate do |csv|
+ CSVSafe.generate do |csv|
csv << headers
rows.each do |row|
@@ -57,8 +57,9 @@ module Submissions
headers.map { |key| row.find { |e| e[:name] == key }&.dig(:value) }
end
- def build_table_rows(submissions)
- submissions.map do |submission|
+ def build_table_rows(submissions, expires_at: nil)
+ submissions.preload(submitters: [attachments_attachments: :blob, documents_attachments: :blob])
+ .find_each.map do |submission|
submission_data = []
submitters_count = submission.submitters.size
@@ -68,7 +69,7 @@ module Submissions
submission_data += build_submission_data(submitter, submitter_name, submitters_count)
- submission_data += submitter_formatted_fields(submitter).map do |field|
+ submission_data += submitter_formatted_fields(submitter, expires_at:).map do |field|
{
name: column_name(field[:name], submitter_name, submitters_count),
value: field[:value]
@@ -80,7 +81,7 @@ module Submissions
submission_data += submitter.documents.map.with_index(1) do |attachment, index|
{
name: "#{I18n.t('document')} #{index}",
- value: ActiveStorage::Blob.proxy_url(attachment.blob)
+ value: ActiveStorage::Blob.proxy_url(attachment.blob, expires_at:)
}
end
end
@@ -122,7 +123,7 @@ module Submissions
submitters_count > 1 ? "#{submitter_name} - #{name}" : name
end
- def submitter_formatted_fields(submitter)
+ def submitter_formatted_fields(submitter, expires_at: nil)
fields = submitter.submission.template_fields || submitter.submission.template.fields
template_fields = fields.select { |f| f['submitter_uuid'] == submitter.uuid }
@@ -141,11 +142,13 @@ module Submissions
value =
if template_field_type.in?(%w[image signature])
attachment = attachments_index[submitter_value]
- ActiveStorage::Blob.proxy_url(attachment.blob) if attachment
+
+ ActiveStorage::Blob.proxy_url(attachment.blob, expires_at:) if attachment
elsif template_field_type == 'file'
Array.wrap(submitter_value).compact_blank.filter_map do |e|
attachment = attachments_index[e]
- ActiveStorage::Blob.proxy_url(attachment.blob) if attachment
+
+ ActiveStorage::Blob.proxy_url(attachment.blob, expires_at:) if attachment
end
else
submitter_value
diff --git a/lib/submissions/generate_preview_attachments.rb b/lib/submissions/generate_preview_attachments.rb
index 742f96f4..b57b80a1 100644
--- a/lib/submissions/generate_preview_attachments.rb
+++ b/lib/submissions/generate_preview_attachments.rb
@@ -13,10 +13,17 @@ module Submissions
end
configs = submission.account.account_configs.where(key: [AccountConfig::FLATTEN_RESULT_PDF_KEY,
- AccountConfig::WITH_SIGNATURE_ID])
+ AccountConfig::WITH_SIGNATURE_ID,
+ AccountConfig::WITH_SUBMITTER_TIMEZONE_KEY,
+ AccountConfig::WITH_FILE_LINKS_KEY,
+ AccountConfig::WITH_SIGNATURE_ID_REASON_KEY])
with_signature_id = configs.find { |c| c.key == AccountConfig::WITH_SIGNATURE_ID }&.value == true
+ with_file_links = configs.find { |c| c.key == AccountConfig::WITH_FILE_LINKS_KEY }&.value == true
is_flatten = configs.find { |c| c.key == AccountConfig::FLATTEN_RESULT_PDF_KEY }&.value != false
+ with_submitter_timezone = configs.find { |c| c.key == AccountConfig::WITH_SUBMITTER_TIMEZONE_KEY }&.value == true
+ with_signature_id_reason =
+ configs.find { |c| c.key == AccountConfig::WITH_SIGNATURE_ID_REASON_KEY }&.value != false
pdfs_index = GenerateResultAttachments.build_pdfs_index(submission, flatten: is_flatten)
@@ -28,13 +35,15 @@ module Submissions
submitters.preload(attachments_attachments: :blob).each_with_index do |s, index|
GenerateResultAttachments.fill_submitter_fields(s, submission.account, pdfs_index,
- with_signature_id:, is_flatten:, with_headings: index.zero?)
+ with_signature_id:, is_flatten:, with_headings: index.zero?,
+ with_submitter_timezone:, with_file_links:,
+ with_signature_id_reason:)
end
template = submission.template
image_pdfs = []
- original_documents = template.documents.preload(:blob)
+ original_documents = submission.schema_documents.preload(:blob)
result_attachments =
(submission.template_schema || template.schema).filter_map do |item|
@@ -70,7 +79,7 @@ module Submissions
submitter:,
uuid: GenerateResultAttachments.images_pdf_uuid(original_documents.select(&:image?)),
values_hash:,
- name: template.name
+ name: submission.name || template.name
)
ApplicationRecord.no_touching do
diff --git a/lib/submissions/generate_result_attachments.rb b/lib/submissions/generate_result_attachments.rb
index 2fe766c0..e347d2ac 100644
--- a/lib/submissions/generate_result_attachments.rb
+++ b/lib/submissions/generate_result_attachments.rb
@@ -11,6 +11,9 @@ module Submissions
'Helvetica'
end
+ ICO_REGEXP = %r{\Aimage/(?:x-icon|vnd\.microsoft\.icon)\z}
+ BMP_REGEXP = %r{\Aimage/(?:bmp|x-bmp|x-ms-bmp)\z}
+
FONT_BOLD_NAME = if File.exist?(FONT_BOLD_PATH)
FONT_BOLD_PATH
else
@@ -27,24 +30,38 @@ module Submissions
bold_italic: FONT_BOLD_ITALIC_NAME
}.freeze
+ PDFA_FONT_VARIANS = {
+ none: FONT_NAME,
+ bold: FONT_BOLD_NAME,
+ italic: FONT_NAME,
+ bold_italic: FONT_BOLD_NAME
+ }.freeze
+
SIGN_REASON = 'Signed by %s with DocuSeal.com'
RTL_REGEXP = TextUtils::RTL_REGEXP
TEXT_LEFT_MARGIN = 1
TEXT_TOP_MARGIN = 1
- MAX_PAGE_ROTATE = 20
+ MAX_PAGE_ROTATE = 50
A4_SIZE = [595, 842].freeze
TESTING_FOOTER = 'Testing Document - NOT LEGALLY BINDING'
DEFAULT_FONTS = %w[Times Helvetica Courier].freeze
FONTS_LINE_HEIGHT = {
- 'Times' => 1.4,
- 'Helvetica' => 1.4,
+ 'Times' => 1.5,
+ 'Helvetica' => 1.5,
'Courier' => 1.6
}.freeze
+ PDFA_FONT_MAP = {
+ FONT_NAME => PDFA_FONT_VARIANS,
+ 'Helvetica' => PDFA_FONT_VARIANS,
+ 'Times' => PDFA_FONT_VARIANS,
+ 'Courier' => PDFA_FONT_VARIANS
+ }.freeze
+
MISSING_GLYPH_REPLACE = {
'▪' => '-',
'✔️' => 'V',
@@ -69,17 +86,17 @@ module Submissions
pdfs_index = generate_pdfs(submitter)
- template = submitter.submission.template
account = submitter.account
+ submission = submitter.submission
pkcs = Accounts.load_signing_pkcs(account)
tsa_url = Accounts.load_timeserver_url(account)
image_pdfs = []
- original_documents = template.documents.preload(:blob)
+ original_documents = submission.schema_documents.preload(:blob)
result_attachments =
- submitter.submission.template_schema.filter_map do |item|
+ submission.template_schema.filter_map do |item|
pdf = pdfs_index[item['attachment_uuid']]
next if pdf.nil?
@@ -111,7 +128,7 @@ module Submissions
tsa_url:,
pkcs:,
uuid: images_pdf_uuid(original_documents.select(&:image?)),
- name: template.name
+ name: submission.name || submission.template.name
)
ApplicationRecord.no_touching do
@@ -121,10 +138,17 @@ module Submissions
def generate_pdfs(submitter)
configs = submitter.account.account_configs.where(key: [AccountConfig::FLATTEN_RESULT_PDF_KEY,
- AccountConfig::WITH_SIGNATURE_ID])
+ AccountConfig::WITH_SIGNATURE_ID,
+ AccountConfig::WITH_FILE_LINKS_KEY,
+ AccountConfig::WITH_SUBMITTER_TIMEZONE_KEY,
+ AccountConfig::WITH_SIGNATURE_ID_REASON_KEY])
with_signature_id = configs.find { |c| c.key == AccountConfig::WITH_SIGNATURE_ID }&.value == true
is_flatten = configs.find { |c| c.key == AccountConfig::FLATTEN_RESULT_PDF_KEY }&.value != false
+ with_submitter_timezone = configs.find { |c| c.key == AccountConfig::WITH_SUBMITTER_TIMEZONE_KEY }&.value == true
+ with_file_links = configs.find { |c| c.key == AccountConfig::WITH_FILE_LINKS_KEY }&.value == true
+ with_signature_id_reason =
+ configs.find { |c| c.key == AccountConfig::WITH_SIGNATURE_ID_REASON_KEY }&.value != false
pdfs_index = build_pdfs_index(submitter.submission, submitter:, flatten: is_flatten)
@@ -149,7 +173,8 @@ module Submissions
TESTING_FOOTER
end
else
- "#{I18n.t('document_id', locale: submitter.account.locale)}: #{document_id}"
+ "#{I18n.t('document_id',
+ locale: submitter.metadata.fetch('lang', submitter.account.locale))}: #{document_id}"
end
text = HexaPDF::Layout::TextFragment.create(
@@ -167,21 +192,30 @@ module Submissions
end
end
- fill_submitter_fields(submitter, submitter.account, pdfs_index, with_signature_id:, is_flatten:)
+ fill_submitter_fields(submitter, submitter.account, pdfs_index, with_signature_id:, is_flatten:,
+ with_submitter_timezone:,
+ with_file_links:,
+ with_signature_id_reason:)
end
- def fill_submitter_fields(submitter, account, pdfs_index, with_signature_id:, is_flatten:, with_headings: nil)
+ def fill_submitter_fields(submitter, account, pdfs_index, with_signature_id:, is_flatten:, with_headings: nil,
+ with_submitter_timezone: false, with_signature_id_reason: true, with_file_links: nil)
cell_layouter = HexaPDF::Layout::TextLayouter.new(text_valign: :center, text_align: :center)
attachments_data_cache = {}
- return pdfs_index if submitter.submission.template_fields.blank?
+ submission = submitter.submission
+
+ with_headings = find_last_submitter(submission, submitter:).blank? if with_headings.nil?
+
+ locale = submitter.metadata.fetch('lang', account.locale)
- with_headings = find_last_submitter(submitter.submission, submitter:).blank? if with_headings.nil?
+ (submission.template_fields || submission.template.fields).each do |field|
+ next if !with_headings &&
+ (field['type'] == 'heading' || (field['type'] == 'strikethrough' && field['conditions'].blank?))
- submitter.submission.template_fields.each do |field|
- next if field['type'] == 'heading' && !with_headings
- next if field['submitter_uuid'] != submitter.uuid && field['type'] != 'heading'
+ next if field['submitter_uuid'] != submitter.uuid && field['type'] != 'heading' &&
+ (field['type'] != 'strikethrough' || field['conditions'].present?)
field.fetch('areas', []).each do |area|
pdf = pdfs_index[area['attachment_uuid']]
@@ -196,7 +230,7 @@ module Submissions
page[:Annots] ||= []
page[:Annots] = page[:Annots].try(:reject) do |e|
- next if e.is_a?(Integer)
+ next if e.is_a?(Integer) || e.is_a?(Symbol)
e.present? && e[:A] && e[:A][:URI].to_s.starts_with?('file:///docuseal_field')
end || page[:Annots]
@@ -209,7 +243,8 @@ module Submissions
font_size = preferences_font_size
font_size ||= (([page.box.width, page.box.height].min / A4_SIZE[0].to_f) * FONT_SIZE).to_i
- fill_color = field.dig('preferences', 'color').presence
+ fill_color = field.dig('preferences', 'color').to_s.delete_prefix('#').presence
+ bg_color = field.dig('preferences', 'background').to_s.delete_prefix('#').presence
font_name = field.dig('preferences', 'font')
font_variant = (field.dig('preferences', 'font_type').presence || 'none').to_sym
@@ -217,20 +252,22 @@ module Submissions
font_name = FONT_NAME unless font_name.in?(DEFAULT_FONTS)
if font_variant != :none && font_name == FONT_NAME
- font_name = FONT_VARIANS[font_variant]
+ font_name = FONT_VARIANS[font_variant] if FONT_VARIANS[font_variant]
font_variant = nil unless font_name.in?(DEFAULT_FONTS)
end
- font = pdf.fonts.add(font_name, variant: font_variant)
+ font = pdf.fonts.add(font_name, variant: font_variant, custom_encoding: font_name.in?(DEFAULT_FONTS))
value = submitter.values[field['uuid']]
value = field['default_value'] if field['type'] == 'heading'
+ value = field['default_value'] if field['type'] == 'strikethrough' && value.nil? && field['conditions'].blank?
text_align = field.dig('preferences', 'align').to_s.to_sym.presence ||
(value.to_s.match?(RTL_REGEXP) ? :right : :left)
- layouter = HexaPDF::Layout::TextLayouter.new(text_valign: :center, text_align:,
- font:, font_size:)
+ text_valign = (field.dig('preferences', 'valign').to_s.presence || 'center').to_sym
+
+ layouter = HexaPDF::Layout::TextLayouter.new(text_valign:, text_align:, font:, font_size:)
next if Array.wrap(value).compact_blank.blank?
@@ -245,81 +282,164 @@ module Submissions
canvas = page.canvas(type: :overlay)
canvas.font(FONT_NAME, size: font_size)
- case field['type']
+ field_type = field['type']
+ field_type = 'file' if field_type == 'image' &&
+ !submitter.attachments.find { |a| a.uuid == value }.image?
+
+ if field_type == 'signature' && field.dig('preferences', 'with_signature_id').in?([true, false])
+ with_signature_id = field['preferences']['with_signature_id']
+ end
+
+ if bg_color.present?
+ canvas.fill_color(bg_color)
+ .rectangle(area['x'] * width, height - (area['y'] * height) - (area['h'] * height),
+ area['w'] * width, area['h'] * height)
+ .fill
+ end
+
+ case field_type
when ->(type) { type == 'signature' && (with_signature_id || field.dig('preferences', 'reason_field_uuid')) }
attachment = submitter.attachments.find { |a| a.uuid == value }
- attachments_data_cache[attachment.uuid] ||= attachment.download
+ image =
+ begin
+ load_vips_image(attachment, attachments_data_cache).autorot
+ rescue Vips::Error
+ next unless attachment.content_type.starts_with?('image/')
+ next if attachment.byte_size.zero?
+
+ raise
+ end
+
+ reason_value = submitter.values[field.dig('preferences', 'reason_field_uuid')].presence
+
+ reason_string =
+ I18n.with_locale(locale) do
+ timezone = submitter.account.timezone
+ timezone = submitter.timezone || submitter.account.timezone if with_submitter_timezone
+
+ if with_signature_id_reason
+ "#{"#{I18n.t('reason')}: " if reason_value}#{reason_value || I18n.t('digitally_signed_by')} " \
+ "#{submitter.name}#{" <#{submitter.email}>" if submitter.email.present?}\n" \
+ "#{I18n.l(attachment.created_at.in_time_zone(timezone), format: :long)} " \
+ "#{TimeUtils.timezone_abbr(timezone, attachment.created_at)}"
+ else
+ "#{I18n.l(attachment.created_at.in_time_zone(timezone), format: :long)} " \
+ "#{TimeUtils.timezone_abbr(timezone, attachment.created_at)}"
+ end
+ end
+
+ base_font_size = (font_size / 1.8).to_i
- image = Vips::Image.new_from_buffer(attachments_data_cache[attachment.uuid], '').autorot
+ result = nil
- id_string = "ID: #{attachment.uuid}".upcase
+ if area['h']&.positive? && (area['w'].to_f / area['h']) > 6
+ area_x = area['x'] * width
+ area_y = area['y'] * height
+ area_w = area['w'] * width
+ area_h = area['h'] * height
- while true
- text = HexaPDF::Layout::TextFragment.create(id_string,
- font:,
- font_size: (font_size / 1.8).to_i)
+ half_width = area_w / 2.0
+ scale = [half_width / image.width, area_h / image.height].min
+ image_width = image.width * scale
+ image_height = image.height * scale
+ image_x = area_x + ((half_width - image_width) / 2.0)
+ image_y = height - area_y - image_height
- result = layouter.fit([text], area['w'] * width, (font_size / 1.8) / 0.65)
+ io = StringIO.new(image.resize([scale * 4, 1].select(&:positive?).min).write_to_buffer('.png'))
- break if result.status == :success
+ canvas.image(io, at: [image_x, image_y], width: image_width, height: image_height)
- id_string = "#{id_string.delete_suffix('...')[0..-2]}..."
+ id_string = "ID: #{attachment.uuid}".upcase
- break if id_string.length < 8
- end
+ loop do
+ text = HexaPDF::Layout::TextFragment.create(id_string, font:, font_size: base_font_size)
- reason_value = submitter.values[field.dig('preferences', 'reason_field_uuid')].presence
+ result = layouter.fit([text], half_width, base_font_size / 0.65)
- reason_string =
- I18n.with_locale(submitter.account.locale) do
- "#{reason_value ? "#{I18n.t('reason')}: " : ''}#{reason_value || I18n.t('digitally_signed_by')} " \
- "#{submitter.name}#{submitter.email.present? ? " <#{submitter.email}>" : ''}\n" \
- "#{I18n.l(attachment.created_at.in_time_zone(submitter.account.timezone), format: :long)} " \
- "#{TimeUtils.timezone_abbr(submitter.account.timezone, attachment.created_at)}"
+ break if result.status == :success
+
+ id_string = "#{id_string.delete_suffix('...')[0..-2]}..."
+
+ break if id_string.length < 8
end
- reason_text = HexaPDF::Layout::TextFragment.create(reason_string,
- font:,
- font_size: (font_size / 1.8).to_i)
+ string = [id_string, reason_string].join("\n")
- reason_result = layouter.fit([reason_text], area['w'] * width, height)
+ loop do
+ text = HexaPDF::Layout::TextFragment.create(string, font:, font_size: base_font_size)
- text_height = result.lines.sum(&:height) + reason_result.lines.sum(&:height)
+ result = layouter.fit([text], half_width, area_h)
- image_height = (area['h'] * height) - text_height
- image_height = (area['h'] * height) / 2 if image_height < (area['h'] * height) / 2
+ break if result.status == :success
- scale = [(area['w'] * width) / image.width, image_height / image.height].min
+ base_font_size *= 0.9
- io = StringIO.new(image.resize([scale * 4, 1].select(&:positive?).min).write_to_buffer('.png'))
+ break if base_font_size < 2
+ end
- layouter.fit([text], area['w'] * width, (font_size / 1.8) / 0.65)
- .draw(canvas, (area['x'] * width) + TEXT_LEFT_MARGIN,
- height - (area['y'] * height) - TEXT_TOP_MARGIN - image_height)
+ text = HexaPDF::Layout::TextFragment.create(string, font:, font_size: base_font_size)
- layouter.fit([reason_text], area['w'] * width, reason_result.lines.sum(&:height))
- .draw(canvas, (area['x'] * width) + TEXT_LEFT_MARGIN,
- height - (area['y'] * height) - TEXT_TOP_MARGIN -
- result.lines.sum(&:height) - image_height)
+ text_x = area_x + half_width
+ text_y = height - area_y
- canvas.image(
- io,
- at: [
- (area['x'] * width) + (area['w'] * width / 2) - ((image.width * scale) / 2),
- height - (area['y'] * height) - (image.height * scale / 2) - (image_height / 2)
- ],
- width: image.width * scale,
- height: image.height * scale
- )
+ layouter.fit([text], half_width, area_h).draw(canvas, text_x + TEXT_LEFT_MARGIN, text_y)
+ else
+ reason_text = HexaPDF::Layout::TextFragment.create(reason_string,
+ font:,
+ font_size: base_font_size)
+
+ id_string = "ID: #{attachment.uuid}".upcase
+
+ loop do
+ text = HexaPDF::Layout::TextFragment.create(id_string,
+ font:,
+ font_size: base_font_size)
+
+ result = layouter.fit([text], area['w'] * width, base_font_size / 0.65)
+
+ break if result.status == :success
+
+ id_string = "#{id_string.delete_suffix('...')[0..-2]}..."
+
+ break if id_string.length < 8
+ end
+
+ reason_result = layouter.fit([reason_text], area['w'] * width, height)
+ text_height = result.lines.sum(&:height) + reason_result.lines.sum(&:height)
+
+ image_height = (area['h'] * height) - text_height
+ image_height = (area['h'] * height) / 2 if image_height < (area['h'] * height) / 2
+
+ scale = [(area['w'] * width) / image.width, image_height / image.height].min
+
+ io = StringIO.new(image.resize([scale * 4, 1].select(&:positive?).min).write_to_buffer('.png'))
+
+ layouter.fit([text], area['w'] * width, base_font_size / 0.65)
+ .draw(canvas, (area['x'] * width) + TEXT_LEFT_MARGIN,
+ height - (area['y'] * height) - TEXT_TOP_MARGIN - image_height)
+
+ layouter.fit([reason_text], area['w'] * width, reason_result.lines.sum(&:height))
+ .draw(canvas, (area['x'] * width) + TEXT_LEFT_MARGIN,
+ height - (area['y'] * height) - TEXT_TOP_MARGIN -
+ result.lines.sum(&:height) - image_height)
+
+ canvas.image(
+ io,
+ at: [
+ (area['x'] * width) + (area['w'] * width / 2) - ((image.width * scale) / 2),
+ height - (area['y'] * height) - (image.height * scale / 2) - (image_height / 2)
+ ],
+ width: image.width * scale,
+ height: image.height * scale
+ )
+ end
when 'image', 'signature', 'initials', 'stamp'
attachment = submitter.attachments.find { |a| a.uuid == value }
- attachments_data_cache[attachment.uuid] ||= attachment.download
-
image =
begin
- Vips::Image.new_from_buffer(attachments_data_cache[attachment.uuid], '').autorot
+ load_vips_image(attachment, attachments_data_cache).autorot
rescue Vips::Error
next unless attachment.content_type.starts_with?('image/')
next if attachment.byte_size.zero?
@@ -350,8 +470,7 @@ module Submissions
cv.image(PdfIcons.paperclip_io, at: [0, 0], width: box.content_width)
end
- acc << HexaPDF::Layout::TextFragment.create("#{attachment.filename}\n", font:,
- font_size:)
+ acc << HexaPDF::Layout::TextFragment.create("#{attachment.filename}\n", font:, font_size:)
end
lines = layouter.fit(items, area['w'] * width, height).lines
@@ -371,6 +490,13 @@ module Submissions
diff = ((area['h'] * height) / 2) - (lines.sum(&:height) / 2)
+ url =
+ if with_file_links
+ ActiveStorage::Blob.proxy_url(attachment.blob)
+ else
+ r.submissions_preview_url(submission.slug, **Docuseal.default_url_options)
+ end
+
page[:Annots] << pdf.add(
{
Type: :Annot, Subtype: :Link,
@@ -382,8 +508,7 @@ module Submissions
height - (area['y'] * height) - lines[..next_index].sum(&:height) +
height_diff - (height_diff.zero? ? diff : 0)
],
- A: { Type: :Action, S: :URI,
- URI: ActiveStorage::Blob.proxy_url(attachment.blob) }
+ A: { Type: :Action, S: :URI, URI: url }
}
)
@@ -398,7 +523,7 @@ module Submissions
option = field['options']&.find { |o| o['uuid'] == area['option_uuid'] }
option_name = option['value'].presence
- option_name ||= "#{I18n.t('option', locale: account.locale)} #{field['options'].index(option) + 1}"
+ option_name ||= "#{I18n.t('option', locale: locale)} #{field['options'].index(option) + 1}"
value = Array.wrap(value).include?(option_name)
end
@@ -463,9 +588,46 @@ module Submissions
cell_layouter.fit([text], cell_width, [line_height, area['h'] * height].max)
.draw(canvas, x, height - (area['y'] * height))
end
+ when 'strikethrough'
+ scale = 1000.0 / width
+
+ line_width = 6.0 / scale
+ area_height = area['h'] * height
+
+ if area_height * scale < 40.0
+ canvas.tap do |c|
+ c.stroke_color(field.dig('preferences', 'color').presence || 'red')
+ c.line_width(line_width)
+ c.line(width * area['x'],
+ height - (height * area['y']) - (area_height / 2),
+ (width * area['x']) + (width * area['w']),
+ height - (height * area['y']) - (area_height / 2))
+ c.stroke
+ end
+ else
+ canvas.tap do |c|
+ c.stroke_color(field.dig('preferences', 'color').presence || 'red')
+ c.line_width(line_width)
+ c.line((width * area['x']) + (line_width / 2),
+ height - (height * area['y']) - (line_width / 2),
+ (width * area['x']) + (width * area['w']) - (line_width / 2),
+ height - (height * area['y']) - area_height + (line_width / 2))
+ c.stroke
+ end
+
+ canvas.tap do |c|
+ c.stroke_color(field.dig('preferences', 'color').presence || 'red')
+ c.line_width(line_width)
+ c.line((width * area['x']) + (line_width / 2),
+ height - (height * area['y']) - area_height + (line_width / 2),
+ (width * area['x']) + (width * area['w']) - (line_width / 2),
+ height - (height * area['y']) - (line_width / 2))
+ c.stroke
+ end
+ end
else
if field['type'] == 'date'
- value = TimeUtils.format_date_string(value, field.dig('preferences', 'format'), account.locale)
+ value = TimeUtils.format_date_string(value, field.dig('preferences', 'format'), locale)
end
value = NumberUtils.format_number(value, field.dig('preferences', 'format')) if field['type'] == 'number'
@@ -515,10 +677,19 @@ module Submissions
0
end
+ align_y_diff =
+ if text_valign == :top
+ 0
+ elsif text_valign == :bottom
+ height_diff + TEXT_TOP_MARGIN
+ else
+ height_diff / 2
+ end
+
layouter.fit([text], field['type'].in?(%w[date number]) ? width : area['w'] * width,
height_diff.positive? ? box_height : area['h'] * height)
.draw(canvas, (area['x'] * width) - right_align_x_adjustment + TEXT_LEFT_MARGIN,
- height - (area['y'] * height) + height_diff - TEXT_TOP_MARGIN)
+ height - (area['y'] * height) + align_y_diff - TEXT_TOP_MARGIN)
end
end
end
@@ -531,6 +702,11 @@ module Submissions
pdf.trailer.info[:Creator] = info_creator
+ if Docuseal.pdf_format == 'pdf/a-3b'
+ pdf.task(:pdfa, level: '3b')
+ pdf.config['font.map'] = PDFA_FONT_MAP
+ end
+
sign_reason = fetch_sign_reason(submitter)
if sign_reason && pkcs
@@ -543,20 +719,30 @@ module Submissions
begin
pdf.sign(io, write_options: { validate: false }, **sign_params)
- rescue HexaPDF::MalformedPDFError => e
+ rescue HexaPDF::Error, NoMethodError => e
Rollbar.error(e) if defined?(Rollbar)
- pdf.sign(io, write_options: { validate: false, incremental: false }, **sign_params)
+ begin
+ pdf.sign(io, write_options: { validate: false, incremental: false }, **sign_params)
+ rescue HexaPDF::Error
+ pdf.validate(auto_correct: true)
+ pdf.sign(io, write_options: { validate: false, incremental: false }, **sign_params)
+ end
end
maybe_enable_ltv(io, sign_params)
else
begin
pdf.write(io, incremental: true, validate: false)
- rescue HexaPDF::MalformedPDFError => e
+ rescue HexaPDF::Error, NoMethodError => e
Rollbar.error(e) if defined?(Rollbar)
- pdf.write(io, incremental: false, validate: false)
+ begin
+ pdf.write(io, incremental: false, validate: false)
+ rescue HexaPDF::Error
+ pdf.validate(auto_correct: true)
+ pdf.write(io, incremental: false, validate: false)
+ end
end
end
@@ -600,14 +786,14 @@ module Submissions
Submissions::EnsureResultGenerated.call(latest_submitter) if latest_submitter
documents = latest_submitter&.documents&.preload(:blob).to_a.presence
- documents ||= submission.template_schema_documents.preload(:blob)
+ documents ||= submission.schema_documents.preload(:blob)
attachment_uuids = Submissions.filtered_conditions_schema(submission).pluck('attachment_uuid')
attachments_index = documents.index_by { |a| a.metadata['original_uuid'] || a.uuid }
attachment_uuids.each_with_object({}) do |uuid, acc|
attachment = attachments_index[uuid]
- attachment ||= submission.template_schema_documents.preload(:blob).find { |a| a.uuid == uuid }
+ attachment ||= submission.schema_documents.preload(:blob).find { |a| a.uuid == uuid }
next unless attachment
@@ -640,11 +826,15 @@ module Submissions
def maybe_rotate_pdf(pdf)
return pdf if pdf.pages.size > MAX_PAGE_ROTATE
+ is_pages_rotated = pdf.pages.root[:Rotate].present? && pdf.pages.root[:Rotate] != 0
+
+ pdf.pages.root[:Rotate] = 0 if is_pages_rotated
+
is_rotated = pdf.pages.filter_map do |page|
page.rotate(0, flatten: true) if page[:Rotate] != 0
end.present?
- return pdf unless is_rotated
+ return pdf if !is_rotated && !is_pages_rotated
io = StringIO.new
@@ -673,7 +863,7 @@ module Submissions
def find_last_submitter(submission, submitter: nil)
submission.submitters
.select(&:completed_at?)
- .select { |e| submitter.nil? ? true : e.id != submitter.id && e.completed_at <= submitter.completed_at }
+ .select { |e| submitter.nil? || (e.id != submitter.id && e.completed_at <= submitter.completed_at) }
.max_by(&:completed_at)
end
@@ -682,14 +872,16 @@ module Submissions
page = pdf.pages.add
- scale = [A4_SIZE.first / attachment.metadata['width'].to_f,
- A4_SIZE.last / attachment.metadata['height'].to_f].min
+ image = attachment.preview_images.first
+
+ scale = [A4_SIZE.first / image.metadata['width'].to_f,
+ A4_SIZE.last / image.metadata['height'].to_f].min
- page.box.width = attachment.metadata['width'] * scale
- page.box.height = attachment.metadata['height'] * scale
+ page.box.width = image.metadata['width'] * scale
+ page.box.height = image.metadata['height'] * scale
page.canvas.image(
- StringIO.new(attachment.preview_images.first.download),
+ StringIO.new(image.download),
at: [0, 0],
width: page.box.width,
height: page.box.height
@@ -750,7 +942,21 @@ module Submissions
[]
end
- def h
+ def load_vips_image(attachment, cache = {})
+ cache[attachment.uuid] ||= attachment.download
+
+ data = cache[attachment.uuid]
+
+ if ICO_REGEXP.match?(attachment.content_type)
+ LoadIco.call(data)
+ elsif BMP_REGEXP.match?(attachment.content_type)
+ LoadBmp.call(data)
+ else
+ Vips::Image.new_from_buffer(data, '')
+ end
+ end
+
+ def r
Rails.application.routes.url_helpers
end
end
diff --git a/lib/submissions/normalize_param_utils.rb b/lib/submissions/normalize_param_utils.rb
index 07ded95c..6ad4da23 100644
--- a/lib/submissions/normalize_param_utils.rb
+++ b/lib/submissions/normalize_param_utils.rb
@@ -19,7 +19,9 @@ module Submissions
end
def normalize_submitter_params!(submitter_params, template, index = nil, for_submitter: nil)
- default_values = submitter_params[:values] || {}
+ with_values = submitter_params[:values].present?
+
+ default_values = with_values ? submitter_params[:values] : {}
submitter_params[:fields]&.each do |f|
default_values[f[:name].presence || f[:uuid]] = f[:default_value] if f.key?(:default_value)
@@ -33,8 +35,9 @@ module Submissions
default_values,
submitter_name: submitter_params[:role] ||
template.submitters.dig(index, 'name'),
+ role_names: submitter_params[:roles],
for_submitter:,
- throw_errors: true)
+ throw_errors: !with_values)
submitter_params[:values] = values
diff --git a/lib/submissions/serialize_for_api.rb b/lib/submissions/serialize_for_api.rb
index e32d7b48..0366ebc5 100644
--- a/lib/submissions/serialize_for_api.rb
+++ b/lib/submissions/serialize_for_api.rb
@@ -3,8 +3,7 @@
module Submissions
module SerializeForApi
SERIALIZE_PARAMS = {
- only: %i[id slug source submitters_order expire_at created_at updated_at archived_at],
- methods: %i[audit_log_url combined_document_url],
+ only: %i[id name slug source submitters_order expire_at created_at updated_at archived_at],
include: {
submitters: { only: %i[id] },
template: { only: %i[id name external_id created_at updated_at],
@@ -15,39 +14,46 @@ module Submissions
module_function
- def call(submission, submitters = nil, params = {}, with_events: true, with_documents: true, with_values: true)
+ def call(submission, submitters = nil, params = {}, with_events: true, with_documents: true, with_values: true,
+ expires_at: Accounts.link_expires_at(Account.new(id: submission.account_id)))
submitters ||= submission.submitters.preload(documents_attachments: :blob, attachments_attachments: :blob)
serialized_submitters = submitters.map do |submitter|
- Submitters::SerializeForApi.call(submitter, with_documents:, with_events: false, with_values:, params:)
+ Submitters::SerializeForApi.call(submitter, with_documents:, with_events: false, with_values:, params:,
+ expires_at:)
end
json = submission.as_json(SERIALIZE_PARAMS)
+ json['variables'] = (submission.variables || {}).as_json
json['created_by_user'] ||= nil
if with_events
json['submission_events'] = Submitters::SerializeForApi.serialize_events(submission.submission_events)
end
- json['combined_document_url'] ||= maybe_build_combined_url(submitters, submission, params)
-
if submitters.all?(&:completed_at?)
last_submitter = submitters.max_by(&:completed_at)
if with_documents
- json[:documents] = serialized_submitters.find { |e| e['id'] == last_submitter.id }['documents']
+ json['documents'] = serialized_submitters.find { |e| e['id'] == last_submitter.id }['documents']
end
- json[:status] = 'completed'
- json[:completed_at] = last_submitter.completed_at
+ json['audit_log_url'] = submission.audit_log_url(expires_at:)
+ json['combined_document_url'] = submission.combined_document_url(expires_at:)
+ json['combined_document_url'] ||= maybe_build_combined_url(submitters, submission, params, expires_at:)
+
+ json['status'] = 'completed'
+ json['completed_at'] = last_submitter.completed_at.as_json
else
- json[:documents] = [] if with_documents
- json[:status] = build_status(submission, submitters)
- json[:completed_at] = nil
+ json['documents'] = [] if with_documents
+ json['audit_log_url'] = nil
+ json['combined_document_url'] = nil
+ json['status'] = build_status(submission, submitters)
+ json['completed_at'] = nil
end
- json[:submitters] = serialized_submitters
+ json['submitters'] = serialized_submitters
json
end
@@ -60,7 +66,7 @@ module Submissions
end
end
- def maybe_build_combined_url(submitters, submission, params)
+ def maybe_build_combined_url(submitters, submission, params, expires_at: nil)
return unless submitters.all?(&:completed_at?)
attachment = submission.combined_document_attachment
@@ -68,10 +74,10 @@ module Submissions
if !attachment && params[:include].to_s.include?('combined_document_url')
submitter = submitters.max_by(&:completed_at)
- attachment = Submissions::GenerateCombinedAttachment.call(submitter)
+ attachment = Submissions::EnsureCombinedGenerated.call(submitter)
end
- ActiveStorage::Blob.proxy_url(attachment.blob) if attachment
+ ActiveStorage::Blob.proxy_url(attachment.blob, expires_at:) if attachment
end
end
end
diff --git a/lib/submissions/timestamp_handler.rb b/lib/submissions/timestamp_handler.rb
index 03b45d43..a152a97f 100644
--- a/lib/submissions/timestamp_handler.rb
+++ b/lib/submissions/timestamp_handler.rb
@@ -2,7 +2,7 @@
module Submissions
class TimestampHandler
- HASH_ALGORITHM = 'SHA512'
+ HASH_ALGORITHM = 'SHA256'
TimestampError = Class.new(StandardError)
@@ -20,6 +20,7 @@ module Submissions
signature[:SubFilter] = :'ETSI.RFC3161'
end
+ # rubocop:disable Metrics
def sign(io, byte_range)
digest = OpenSSL::Digest.new(HASH_ALGORITHM)
@@ -34,7 +35,7 @@ module Submissions
c.basic_auth(uri.user, uri.password) if uri.password.present?
end
- response = conn.post(uri.path, build_payload(digest.digest),
+ response = conn.post(uri.request_uri, build_payload(digest.digest),
'content-type' => 'application/timestamp-query')
if response.status != 200 || response.body.blank?
@@ -49,7 +50,13 @@ module Submissions
end
OpenSSL::Timestamp::Response.new(response.body).token.to_der
+ rescue StandardError => e
+ Rollbar.error(e) if defined?(Rollbar)
+ Rails.logger.error(e)
+
+ OpenSSL::ASN1::GeneralizedTime.new(Time.now.utc).to_der
end
+ # rubocop:enable Metrics
def build_payload(digest)
req = OpenSSL::Timestamp::Request.new
diff --git a/lib/submitters.rb b/lib/submitters.rb
index bcead9f2..2738f773 100644
--- a/lib/submitters.rb
+++ b/lib/submitters.rb
@@ -4,9 +4,91 @@ module Submitters
TRUE_VALUES = ['1', 'true', true].freeze
PRELOAD_ALL_PAGES_AMOUNT = 200
+ FIELD_NAME_WEIGHTS = {
+ 'email' => 'A',
+ 'phone' => 'B',
+ 'name' => 'C',
+ 'values' => 'D'
+ }.freeze
+
+ UnableToSendCode = Class.new(StandardError)
+ InvalidOtp = Class.new(StandardError)
+ MaliciousFileExtension = Class.new(StandardError)
+
+ DANGEROUS_EXTENSIONS = Set.new(%w[
+ exe com bat cmd scr pif vbs vbe js jse wsf wsh msi msp
+ hta cpl jar app deb rpm dmg pkg mpkg dll so dylib sys
+ inf reg ps1 psm1 psd1 ps1xml psc1 pssc bat cmd vb vba
+ sh bash zsh fish run out bin elf gadget workflow lnk scf
+ url desktop application action workflow apk ipa xap appx
+ appxbundle msix msixbundle diagcab diagpkg cpl msc ocx
+ drv scr ins isp mst paf prf shb shs slk ws wsc inf1 inf2
+ ].freeze)
+
module_function
- def search(submitters, keyword)
+ def search(current_user, submitters, keyword)
+ if Docuseal.fulltext_search?
+ fulltext_search(current_user, submitters, keyword)
+ else
+ plain_search(submitters, keyword)
+ end
+ end
+
+ def fulltext_search(current_user, submitters, keyword)
+ return submitters if keyword.blank?
+
+ submitters.where(
+ id: SearchEntry.where(record_type: 'Submitter')
+ .where(account_id: current_user.account_id)
+ .where(*SearchEntries.build_tsquery(keyword))
+ .select(:record_id)
+ )
+ end
+
+ def fulltext_search_field(current_user, submitters, keyword, field_name)
+ keyword = keyword.delete("\0")
+
+ return submitters.none if keyword.blank?
+
+ weight = FIELD_NAME_WEIGHTS[field_name]
+
+ return submitters.none if weight.blank?
+
+ query =
+ if keyword.match?(/\d/) && !keyword.match?(/\p{L}/)
+ number = keyword.gsub(/\D/, '')
+
+ sql =
+ if number.length <= 2
+ "ngram @@ ((quote_literal(?) || ':' || ?)::tsquery || (quote_literal(?) || ':' || ?)::tsquery)"
+ else
+ "tsvector @@ ((quote_literal(?) || ':*' || ?)::tsquery || (quote_literal(?) || ':*' || ?)::tsquery)"
+ end
+
+ [sql, number, weight, number.length > 1 ? number.delete_prefix('0') : number, weight]
+ elsif keyword.match?(/[^\p{L}\d&@.-]/) || keyword.match?(/[.-]{2,}/)
+ terms = TextUtils.transliterate(keyword.downcase).split(/\b/).map(&:squish).compact_blank.uniq
+
+ if terms.size > 1
+ SearchEntries.build_weights_tsquery(terms, weight)
+ else
+ SearchEntries.build_weights_wildcard_tsquery(keyword, weight)
+ end
+ else
+ SearchEntries.build_weights_wildcard_tsquery(keyword, weight)
+ end
+
+ submitter_ids = SearchEntry.where(record_type: 'Submitter')
+ .where(account_id: current_user.account_id)
+ .where(*query)
+ .limit(500)
+ .pluck(:record_id)
+
+ submitters.where(id: submitter_ids.first(100))
+ end
+
+ def plain_search(submitters, keyword)
return submitters if keyword.blank?
term = "%#{keyword.downcase}%"
@@ -23,12 +105,13 @@ module Submitters
def select_attachments_for_download(submitter)
if AccountConfig.exists?(account_id: submitter.submission.account_id,
key: AccountConfig::COMBINE_PDF_RESULT_KEY,
- value: true) && submitter.submission.combined_document_attachment
- return [submitter.submission.combined_document_attachment]
+ value: true) &&
+ submitter.submission.submitters.all?(&:completed_at?)
+ return [submitter.submission.combined_document_attachment || Submissions::EnsureCombinedGenerated.call(submitter)]
end
- original_documents = submitter.submission.template_schema_documents.preload(:blob)
- is_more_than_two_images = original_documents.count(&:image?) > 1
+ original_documents = submitter.submission.schema_documents.preload(:blob)
+ is_more_than_two_images = original_documents.many?(&:image?)
submitter.documents.preload(:blob).reject do |attachment|
is_more_than_two_images &&
@@ -36,28 +119,15 @@ module Submitters
end
end
- def preload_with_pages(submitter)
- ActiveRecord::Associations::Preloader.new(
- records: [submitter],
- associations: [submission: [:template, { template_schema_documents: :blob }]]
- ).call
-
- total_pages =
- submitter.submission.template_schema_documents.sum { |e| e.metadata.dig('pdf', 'number_of_pages').to_i }
-
- if total_pages < PRELOAD_ALL_PAGES_AMOUNT
- ActiveRecord::Associations::Preloader.new(
- records: submitter.submission.template_schema_documents,
- associations: [:blob, { preview_images_attachments: :blob }]
- ).call
- end
-
- submitter
- end
-
def create_attachment!(submitter, params)
blob =
if (file = params[:file])
+ extension = File.extname(file.original_filename).delete_prefix('.').downcase
+
+ if DANGEROUS_EXTENSIONS.include?(extension)
+ raise MaliciousFileExtension, "File type '.#{extension}' is not allowed."
+ end
+
ActiveStorage::Blob.create_and_upload!(io: file.open,
filename: file.original_filename,
content_type: file.content_type)
@@ -86,6 +156,7 @@ module Submitters
preferences['email_message_uuid'] = email_message.uuid if email_message
preferences['send_email'] = params['send_email'].in?(TRUE_VALUES) if params.key?('send_email')
preferences['send_sms'] = params['send_sms'].in?(TRUE_VALUES) if params.key?('send_sms')
+ preferences['require_phone_2fa'] = params['require_phone_2fa'].in?(TRUE_VALUES) if params.key?('require_phone_2fa')
preferences['bcc_completed'] = params['bcc_completed'] if params.key?('bcc_completed')
preferences['reply_to'] = params['reply_to'] if params.key?('reply_to')
preferences['go_to_last'] = params['go_to_last'] if params.key?('go_to_last')
@@ -97,6 +168,7 @@ module Submitters
def send_signature_requests(submitters, delay_seconds: nil)
submitters.each_with_index do |submitter, index|
next if submitter.email.blank?
+ next if submitter.declined_at?
next if submitter.preferences['send_email'] == false
if delay_seconds
@@ -108,12 +180,25 @@ module Submitters
end
def current_submitter_order?(submitter)
- submitter_items = submitter.submission.template_submitters || submitter.submission.template.submitters
+ submission = submitter.submission
+
+ submitter_items = submission.template_submitters || submission.template.submitters
+
+ before_items =
+ if submitter_items.any? { |s| s['order'] }
+ submitter_groups = submitter_items.group_by.with_index { |s, index| s['order'] || index }.sort_by(&:first)
+
+ current_group_index = submitter_groups.find_index { |_, group| group.any? { |s| s['uuid'] == submitter.uuid } }
+
+ submitter_groups.first(current_group_index).flat_map(&:last)
+ else
+ submitter_items.first(submitter_items.find_index { |e| e['uuid'] == submitter.uuid })
+ end
- before_items = submitter_items[0...(submitter_items.find_index { |e| e['uuid'] == submitter.uuid })]
+ before_items.all? do |item|
+ submitter = submission.submitters.find { |e| e.uuid == item['uuid'] }
- before_items.reduce(true) do |acc, item|
- acc && submitter.submission.submitters.find { |e| e.uuid == item['uuid'] }&.completed_at?
+ submitter.nil? || submitter.completed_at?
end
end
@@ -143,4 +228,27 @@ module Submitters
"#{filename}.#{blob.filename.extension}"
end
+
+ def send_shared_link_email_verification_code(submitter, request:)
+ RateLimit.call("send-otp-code-#{request.remote_ip}", limit: 2, ttl: 45.seconds, enabled: true)
+
+ TemplateMailer.otp_verification_email(submitter.submission.template, email: submitter.email).deliver_later!
+ rescue RateLimit::LimitApproached
+ Rollbar.warning("Limit verification code for template: #{submitter.submission.template.id}") if defined?(Rollbar)
+
+ raise UnableToSendCode, I18n.t('too_many_attempts')
+ end
+
+ def verify_link_otp!(otp, submitter)
+ return false if otp.blank?
+
+ RateLimit.call("verify-2fa-code-#{Digest::MD5.base64digest(submitter.email)}",
+ limit: 2, ttl: 45.seconds, enabled: true)
+
+ link_2fa_key = [submitter.email.downcase.squish, submitter.submission.template.slug].join(':')
+
+ raise InvalidOtp, I18n.t(:invalid_code) unless EmailVerificationCodes.verify(otp, link_2fa_key)
+
+ true
+ end
end
diff --git a/lib/submitters/create_stamp_attachment.rb b/lib/submitters/create_stamp_attachment.rb
index 5b5f1d64..b08e2363 100644
--- a/lib/submitters/create_stamp_attachment.rb
+++ b/lib/submitters/create_stamp_attachment.rb
@@ -67,25 +67,16 @@ module Submitters
end
def build_text_image(submitter)
- time = I18n.l(submitter.completed_at.in_time_zone(submitter.submission.account.timezone),
- format: :long,
- locale: submitter.submission.account.locale)
+ if submitter.completed_at
+ time = I18n.l(submitter.completed_at.in_time_zone(submitter.submission.account.timezone),
+ format: :long,
+ locale: submitter.submission.account.locale)
- timezone = TimeUtils.timezone_abbr(submitter.submission.account.timezone, submitter.completed_at)
+ timezone = TimeUtils.timezone_abbr(submitter.submission.account.timezone, submitter.completed_at)
+ end
- name = if submitter.name.present? && submitter.email.present?
- "#{submitter.name} #{submitter.email}"
- else
- submitter.name || submitter.email || submitter.phone
- end
-
- role = if submitter.submission.template_submitters.size > 1
- item = submitter.submission.template_submitters.find { |e| e['uuid'] == submitter.uuid }
-
- "#{I18n.t(:role, locale: submitter.account.locale)}: #{item['name']}\n"
- else
- ''
- end
+ name = build_name(submitter)
+ role = build_role(submitter)
digitally_signed_by = I18n.t(:digitally_signed_by, locale: submitter.submission.account.locale)
@@ -97,6 +88,24 @@ module Submitters
Vips::Image.text(text, width: WIDTH, height: HEIGHT, wrap: :'word-char')
end
+ def build_name(submitter)
+ if submitter.name.present? && submitter.email.present?
+ "#{submitter.name} #{submitter.email}"
+ else
+ submitter.name || submitter.email || submitter.phone
+ end
+ end
+
+ def build_role(submitter)
+ if submitter.submission.template_submitters.size > 1
+ item = submitter.submission.template_submitters.find { |e| e['uuid'] == submitter.uuid }
+
+ "#{I18n.t(:role, locale: submitter.account.locale)}: #{item['name']}\n"
+ else
+ ''
+ end
+ end
+
def load_logo(_submitter)
PdfIcons.stamp_logo_io
end
diff --git a/lib/submitters/form_configs.rb b/lib/submitters/form_configs.rb
index 7b41afdf..84c5fc65 100644
--- a/lib/submitters/form_configs.rb
+++ b/lib/submitters/form_configs.rb
@@ -8,9 +8,13 @@ module Submitters
AccountConfig::FORM_PREFILL_SIGNATURE_KEY,
AccountConfig::WITH_SIGNATURE_ID,
AccountConfig::ALLOW_TO_DECLINE_KEY,
+ AccountConfig::ENFORCE_SIGNING_ORDER_KEY,
AccountConfig::REQUIRE_SIGNING_REASON_KEY,
AccountConfig::REUSE_SIGNATURE_KEY,
+ AccountConfig::ALLOW_TO_PARTIAL_DOWNLOAD_KEY,
AccountConfig::ALLOW_TYPED_SIGNATURE,
+ AccountConfig::WITH_SUBMITTER_TIMEZONE_KEY,
+ AccountConfig::WITH_SIGNATURE_ID_REASON_KEY,
*(Docuseal.multitenant? ? [] : [AccountConfig::POLICY_LINKS_KEY])].freeze
module_function
@@ -25,22 +29,19 @@ module Submitters
prefill_signature = find_safe_value(configs, AccountConfig::FORM_PREFILL_SIGNATURE_KEY) != false
reuse_signature = find_safe_value(configs, AccountConfig::REUSE_SIGNATURE_KEY) != false
with_decline = find_safe_value(configs, AccountConfig::ALLOW_TO_DECLINE_KEY) != false
+ with_partial_download = find_safe_value(configs, AccountConfig::ALLOW_TO_PARTIAL_DOWNLOAD_KEY) != false
with_signature_id = find_safe_value(configs, AccountConfig::WITH_SIGNATURE_ID) == true
require_signing_reason = find_safe_value(configs, AccountConfig::REQUIRE_SIGNING_REASON_KEY) == true
+ enforce_signing_order = find_safe_value(configs, AccountConfig::ENFORCE_SIGNING_ORDER_KEY) == true
+ with_submitter_timezone = find_safe_value(configs, AccountConfig::WITH_SUBMITTER_TIMEZONE_KEY) == true
+ with_signature_id_reason = find_safe_value(configs, AccountConfig::WITH_SIGNATURE_ID_REASON_KEY) != false
policy_links = find_safe_value(configs, AccountConfig::POLICY_LINKS_KEY)
- attrs = {
- completed_button:,
- with_typed_signature:,
- with_confetti:,
- reuse_signature:,
- with_decline:,
- policy_links:,
- completed_message:,
- require_signing_reason:,
- prefill_signature:,
- with_signature_id:
- }
+ attrs = { completed_button:, with_typed_signature:, with_confetti:,
+ reuse_signature:, with_decline:, with_partial_download:,
+ policy_links:, enforce_signing_order:, completed_message:,
+ require_signing_reason:, prefill_signature:, with_submitter_timezone:,
+ with_signature_id_reason:, with_signature_id: }
keys.each do |key|
attrs[key.to_sym] = configs.find { |e| e.key == key.to_s }&.value
diff --git a/lib/submitters/generate_font_image.rb b/lib/submitters/generate_font_image.rb
index b64580fc..b70d7450 100644
--- a/lib/submitters/generate_font_image.rb
+++ b/lib/submitters/generate_font_image.rb
@@ -20,6 +20,8 @@ module Submitters
def call(text, font: nil)
font = FONT_ALIASES[font] || font
+ text = ERB::Util.html_escape(text)
+
text_image = Vips::Image.text(text, font:, fontfile: FONTS[font],
width: WIDTH, height: HEIGHT, wrap: :none)
diff --git a/lib/submitters/maybe_assign_default_browser_signature.rb b/lib/submitters/maybe_assign_default_browser_signature.rb
index 98b23131..88431f91 100644
--- a/lib/submitters/maybe_assign_default_browser_signature.rb
+++ b/lib/submitters/maybe_assign_default_browser_signature.rb
@@ -7,6 +7,8 @@ module Submitters
module_function
def call(submitter, params, cookies = nil, attachments = [])
+ attachments = attachments.select { |e| e.record_id == submitter.id && e.record_type == 'Submitter' }
+
if (value = params[:signature_src].presence || params[:signature].presence)
find_or_create_signature_from_value(submitter, value, attachments)
elsif params[:signed_signature_uuids].present?
diff --git a/lib/submitters/normalize_values.rb b/lib/submitters/normalize_values.rb
index 82e3eed6..0c2ee8f2 100644
--- a/lib/submitters/normalize_values.rb
+++ b/lib/submitters/normalize_values.rb
@@ -17,38 +17,47 @@ module Submitters
module_function
- def call(template, values, submitter_name: nil, for_submitter: nil, throw_errors: false)
- fields = fetch_fields(template, submitter_name:, for_submitter:)
+ def call(template, values, submitter_name: nil, role_names: nil, for_submitter: nil, throw_errors: false)
+ fields =
+ if role_names.present?
+ fetch_roles_fields(template, roles: role_names)
+ else
+ fetch_fields(template, submitter_name:, for_submitter:)
+ end
fields_uuid_index = fields.index_by { |e| e['uuid'] }
fields_name_index = build_fields_index(fields)
attachments = []
- normalized_values = values.to_h.filter_map do |key, value|
- if fields_uuid_index[key].blank?
- original_key = key
+ normalized_values = values.to_h.each_with_object({}) do |(key, value), acc|
+ next if key.blank?
- key = fields_name_index[key]&.dig('uuid') || fields_name_index[key.to_s.downcase]&.dig('uuid')
+ uuid_field = fields_uuid_index[key]
- raise(UnknownFieldName, "Unknown field: #{original_key}") if key.blank? && throw_errors
- end
+ value_fields = [uuid_field] if uuid_field
- next if key.blank?
+ if value_fields.blank?
+ value_fields = fields_name_index[key].presence || fields_name_index[key.to_s.downcase]
- field = fields_uuid_index[key]
+ raise(UnknownFieldName, "Unknown field: #{key}") if value_fields.blank? && throw_errors
+ end
- if field['type'].in?(%w[initials signature image file stamp]) && value.present?
- new_value, new_attachments =
- normalize_attachment_value(value, field, template.account, attachments, for_submitter)
+ next if value_fields.blank?
- attachments.push(*new_attachments)
+ value_fields.each do |field|
+ if field['type'].in?(%w[initials signature image file stamp]) && value.present?
+ new_value, new_attachments =
+ normalize_attachment_value(value, field, template.account, attachments, for_submitter)
- value = new_value
- end
+ attachments.push(*new_attachments)
- [key, normalize_value(field, value)]
- end.to_h
+ acc[field['uuid']] = normalize_value(field, new_value)
+ else
+ acc[field['uuid']] = normalize_value(field, value)
+ end
+ end
+ end
[normalized_values, attachments]
end
@@ -85,7 +94,7 @@ module Submitters
end
def fetch_fields(template, submitter_name: nil, for_submitter: nil)
- if submitter_name
+ if submitter_name && !for_submitter
submitter =
template.submitters.find { |e| e['name'] == submitter_name } ||
raise(UnknownSubmitterName,
@@ -103,10 +112,24 @@ module Submitters
end
end
+ def fetch_roles_fields(template, roles:)
+ submitters = roles.map do |submitter_name|
+ template.submitters.find { |e| e['name'] == submitter_name } ||
+ raise(UnknownSubmitterName,
+ "Unknown submitter role: #{submitter_name}. Template defines #{template.submitters.pluck('name')}")
+ end
+
+ role_uuids = submitters.pluck('uuid')
+
+ template.fields.select do |e|
+ role_uuids.include?(e['submitter_uuid'])
+ end
+ end
+
def build_fields_index(fields)
- fields.index_by { |e| e['name'] }
- .merge(fields.index_by { |e| e['name'].to_s.parameterize.underscore })
- .merge(fields.index_by { |e| e['name'].to_s.downcase })
+ fields.group_by { |e| e['name'] }
+ .merge(fields.group_by { |e| e['name'].to_s.parameterize.underscore })
+ .merge(fields.group_by { |e| e['name'].to_s.downcase })
end
def normalize_attachment_value(value, field, account, attachments, for_submitter = nil)
diff --git a/lib/submitters/serialize_for_api.rb b/lib/submitters/serialize_for_api.rb
index ef17189e..96a85c73 100644
--- a/lib/submitters/serialize_for_api.rb
+++ b/lib/submitters/serialize_for_api.rb
@@ -11,7 +11,7 @@ module Submitters
module_function
def call(submitter, with_template: false, with_events: false, with_documents: true, with_urls: false,
- with_values: true, params: {})
+ with_values: true, params: {}, expires_at: Accounts.link_expires_at(Account.new(id: submitter.account_id)))
ActiveRecord::Associations::Preloader.new(
records: [submitter],
associations: if with_documents
@@ -24,11 +24,19 @@ module Submitters
additional_attrs = {}
if params[:include].to_s.include?('fields')
- additional_attrs['fields'] = SerializeForWebhook.build_fields_array(submitter)
+ additional_attrs['fields'] = SerializeForWebhook.build_fields_array(submitter, expires_at:)
+ end
+
+ if with_template
+ additional_attrs['template'] = submitter.submission.template.as_json(only: %i[id name created_at updated_at])
+ end
+
+ additional_attrs['values'] = SerializeForWebhook.build_values_array(submitter, expires_at:) if with_values
+
+ if with_documents
+ additional_attrs['documents'] = SerializeForWebhook.build_documents_array(submitter, expires_at:)
end
- additional_attrs['values'] = SerializeForWebhook.build_values_array(submitter) if with_values
- additional_attrs['documents'] = SerializeForWebhook.build_documents_array(submitter) if with_documents
additional_attrs['preferences'] = submitter.preferences.except('default_values')
additional_attrs['submission_events'] = serialize_events(submitter.submission_events) if with_events
@@ -41,15 +49,13 @@ module Submitters
Rails.application.routes.url_helpers.submit_form_url(slug: submitter.slug, **Docuseal.default_url_options)
end
- include_params = {}
- include_params[:template] = { only: %i[id name created_at updated_at] } if with_template
-
- submitter.as_json(SERIALIZE_PARAMS.merge(include: include_params)).merge(additional_attrs)
+ submitter.as_json(SERIALIZE_PARAMS).merge(additional_attrs)
end
def serialize_events(events)
events.map do |event|
- event.as_json(only: %i[id submitter_id event_type event_timestamp]).merge('data' => event.data.slice('reason'))
+ event.as_json(only: %i[id submitter_id event_type event_timestamp])
+ .merge('data' => event.data.slice('reason', 'firstname', 'lastname', 'method', 'country'))
end
end
end
diff --git a/lib/submitters/serialize_for_webhook.rb b/lib/submitters/serialize_for_webhook.rb
index f856a086..3d987d5a 100644
--- a/lib/submitters/serialize_for_webhook.rb
+++ b/lib/submitters/serialize_for_webhook.rb
@@ -10,17 +10,18 @@ module Submitters
module_function
- def call(submitter)
+ def call(submitter, expires_at: Accounts.link_expires_at(Account.new(id: submitter.account_id)))
ActiveRecord::Associations::Preloader.new(
- records: [submitter],
- associations: [documents_attachments: :blob, attachments_attachments: :blob]
+ records: [submitter], associations: [documents_attachments: :blob, attachments_attachments: :blob]
).call
- values = build_values_array(submitter)
- documents = build_documents_array(submitter)
+ values = build_values_array(submitter, expires_at:)
+ documents = build_documents_array(submitter, expires_at:)
- submitter_name = (submitter.submission.template_submitters ||
- submitter.submission.template.submitters).find { |e| e['uuid'] == submitter.uuid }['name']
+ submission = submitter.submission
+
+ submitter_name = (submission.template_submitters ||
+ submission.template.submitters).find { |e| e['uuid'] == submitter.uuid }['name']
decline_reason =
submitter.declined_at? ? submitter.submission_events.find_by(event_type: :decline_form).data['reason'] : nil
@@ -31,20 +32,24 @@ module Submitters
'preferences' => submitter.preferences.except('default_values'),
'values' => values,
'documents' => documents,
- 'audit_log_url' => submitter.submission.audit_log_url,
- 'submission_url' => r.submissions_preview_url(submitter.submission.slug,
- **Docuseal.default_url_options),
- 'template' => submitter.template.as_json(only: %i[id name external_id created_at updated_at],
- methods: %i[folder_name]),
+ 'audit_log_url' => submitter.submission.audit_log_url(expires_at:),
+ 'submission_url' => r.submissions_preview_url(submission.slug, **Docuseal.default_url_options),
+ 'template' => submission.template.as_json(
+ only: %i[id name external_id created_at updated_at], methods: %i[folder_name]
+ ),
'submission' => {
- **submitter.submission.slice(:id, :audit_log_url, :combined_document_url, :created_at),
- status: build_submission_status(submitter.submission),
- url: r.submissions_preview_url(submitter.submission.slug, **Docuseal.default_url_options)
+ 'id' => submission.id,
+ 'audit_log_url' => submission.audit_log_url(expires_at:),
+ 'combined_document_url' => submission.combined_document_url(expires_at:),
+ 'status' => build_submission_status(submission),
+ 'url' => r.submissions_preview_url(submission.slug, **Docuseal.default_url_options),
+ 'variables' => (submission.variables || {}).as_json,
+ 'created_at' => submission.created_at.as_json
})
end
- def build_values_array(submitter)
- fields = submitter.submission.template_fields.presence || submitter.submission.template.fields
+ def build_values_array(submitter, expires_at: nil)
+ fields = submitter.submission.template_fields.presence || submitter.submission&.template&.fields || []
attachments_index = submitter.attachments.index_by(&:uuid)
submitter_field_counters = Hash.new { 0 }
@@ -59,14 +64,14 @@ module Submitters
next if !submitter.values.key?(field['uuid']) && !submitter.completed_at?
- value = fetch_field_value(field, submitter.values[field['uuid']], attachments_index)
+ value = fetch_field_value(field, submitter.values[field['uuid']], attachments_index, expires_at:)
- { field: field_name, value: }
+ { 'field' => field_name, 'value' => value }
end
end
- def build_fields_array(submitter)
- fields = submitter.submission.template_fields.presence || submitter.submission.template.fields
+ def build_fields_array(submitter, expires_at: nil)
+ fields = submitter.submission.template_fields.presence || submitter.submission&.template&.fields || []
attachments_index = submitter.attachments.index_by(&:uuid)
submitter_field_counters = Hash.new { 0 }
@@ -81,9 +86,9 @@ module Submitters
next if !submitter.values.key?(field['uuid']) && !submitter.completed_at?
- value = fetch_field_value(field, submitter.values[field['uuid']], attachments_index)
+ value = fetch_field_value(field, submitter.values[field['uuid']], attachments_index, expires_at:)
- { name: field_name, uuid: field['uuid'], value:, readonly: field['readonly'] == true }
+ { 'name' => field_name, 'uuid' => field['uuid'], 'value' => value, 'readonly' => field['readonly'] == true }
end
end
@@ -99,26 +104,26 @@ module Submitters
end
end
- def build_documents_array(submitter)
+ def build_documents_array(submitter, expires_at: nil)
submitter.documents.map do |attachment|
- { name: attachment.filename.base, url: rails_storage_proxy_url(attachment) }
+ { 'name' => attachment.filename.base, 'url' => rails_storage_proxy_url(attachment, expires_at:) }
end
end
- def fetch_field_value(field, value, attachments_index)
+ def fetch_field_value(field, value, attachments_index, expires_at: nil)
if field['type'].in?(%w[image signature initials stamp payment])
- rails_storage_proxy_url(attachments_index[value])
+ rails_storage_proxy_url(attachments_index[value], expires_at:)
elsif field['type'] == 'file'
- Array.wrap(value).compact_blank.filter_map { |e| rails_storage_proxy_url(attachments_index[e]) }
+ Array.wrap(value).compact_blank.filter_map { |e| rails_storage_proxy_url(attachments_index[e], expires_at:) }
else
value
end
end
- def rails_storage_proxy_url(attachment)
+ def rails_storage_proxy_url(attachment, expires_at: nil)
return if attachment.blank?
- ActiveStorage::Blob.proxy_url(attachment.blob)
+ ActiveStorage::Blob.proxy_url(attachment.blob, expires_at:)
end
def r
diff --git a/lib/submitters/submit_values.rb b/lib/submitters/submit_values.rb
index 15f2da02..613fca55 100644
--- a/lib/submitters/submit_values.rb
+++ b/lib/submitters/submit_values.rb
@@ -3,24 +3,31 @@
module Submitters
module SubmitValues
ValidationError = Class.new(StandardError)
+ RequiredFieldError = Class.new(StandardError)
VARIABLE_REGEXP = /\{\{?(\w+)\}\}?/
+ NONEDITABLE_FIELD_TYPES = %w[stamp heading strikethrough].freeze
+
+ STRFTIME_MAP = {
+ 'hour' => '%-k',
+ 'minute' => '%M',
+ 'day' => '%-d',
+ 'month' => '%-m',
+ 'year' => '%Y'
+ }.freeze
module_function
- def call(submitter, params, request)
+ def call(submitter, params, request, validate_required: true)
Submissions.update_template_fields!(submitter.submission) if submitter.submission.template_fields.blank?
unless submitter.submission_events.exists?(event_type: 'start_form')
SubmissionEvents.create_with_tracking_data(submitter, 'start_form', request)
- WebhookUrls.for_account_id(submitter.account_id, 'form.started').each do |webhook_url|
- SendFormStartedWebhookRequestJob.perform_async('submitter_id' => submitter.id,
- 'webhook_url_id' => webhook_url.id)
- end
+ WebhookUrls.enqueue_events(submitter, 'form.started')
end
- update_submitter!(submitter, params, request)
+ update_submitter!(submitter, params, request, validate_required:)
submitter.submission.save!
@@ -29,13 +36,13 @@ module Submitters
submitter
end
- def update_submitter!(submitter, params, request)
+ def update_submitter!(submitter, params, request, validate_required: true)
values = normalized_values(params)
submitter.values.merge!(values)
submitter.opened_at ||= Time.current
- assign_completed_attributes(submitter, request) if params[:completed] == 'true'
+ assign_completed_attributes(submitter, request, validate_required:) if params[:completed] == 'true'
ApplicationRecord.transaction do
maybe_set_signature_reason!(values, submitter, params)
@@ -46,28 +53,42 @@ module Submitters
submitter.save!
end
+ SearchEntries.enqueue_reindex(submitter) if submitter.completed_at?
+
submitter
end
- def assign_completed_attributes(submitter, request)
+ def assign_completed_attributes(submitter, request, validate_required: true)
submitter.completed_at = Time.current
submitter.ip = request.remote_ip
submitter.ua = request.user_agent
+ submitter.timezone = request.params[:timezone]
submitter.values = merge_default_values(submitter)
- submitter.values = maybe_remove_condition_values(submitter)
+
+ required_field_uuids_acc = Set.new
+
+ submitter.values = maybe_remove_condition_values(submitter, required_field_uuids_acc:)
formula_values = build_formula_values(submitter)
if formula_values.present?
submitter.values = submitter.values.merge(formula_values)
- submitter.values = maybe_remove_condition_values(submitter)
+ submitter.values = maybe_remove_condition_values(submitter, required_field_uuids_acc:)
end
submitter.values = submitter.values.transform_values do |v|
v == '{{date}}' ? Time.current.in_time_zone(submitter.account.timezone).to_date.to_s : v
end
+ required_field_uuids_acc.each do |uuid|
+ next if submitter.values[uuid].present?
+
+ raise RequiredFieldError, uuid if validate_required
+
+ Rollbar.warning("Required field #{submitter.id}: #{uuid}") if defined?(Rollbar)
+ end
+
submitter
end
@@ -122,7 +143,7 @@ module Submitters
end
end
- def merge_default_values(submitter)
+ def merge_default_values(submitter, with_verification: true)
default_values = submitter.submission.template_fields.each_with_object({}) do |field, acc|
next if field['submitter_uuid'] != submitter.uuid
@@ -136,7 +157,7 @@ module Submitters
next
end
- if field['type'] == 'verification'
+ if field['type'] == 'verification' && with_verification
acc[field['uuid']] =
if submitter.submission_events.exists?(event_type: :complete_verification)
I18n.t(:verified, locale: :en)
@@ -158,6 +179,8 @@ module Submitters
end
def build_formula_values(submitter)
+ submission_values = nil
+
computed_values = submitter.submission.template_fields.each_with_object({}) do |field, acc|
next if field['submitter_uuid'] != submitter.uuid
next if field['type'] == 'payment'
@@ -166,12 +189,39 @@ module Submitters
next if formula.blank?
- acc[field['uuid']] = calculate_formula_value(formula, submitter.values.merge(acc.compact_blank))
+ submission_values ||=
+ if submitter.submission.template_submitters.size > 1
+ merge_submitters_values(submitter)
+ else
+ submitter.values
+ end
+
+ formula = normalize_formula(formula, submitter.submission, submission_values:)
+
+ acc[field['uuid']] = calculate_formula_value(formula, submission_values.merge(acc.compact_blank))
end
computed_values.compact_blank
end
+ def normalize_formula(formula, submission, depth: 0, submission_values: nil)
+ raise ValidationError, 'Formula infinite loop' if depth > 10
+
+ formula.gsub(/{{(.*?)}}/) do |match|
+ uuid = Regexp.last_match(1)
+
+ if (nested_formula = submission.fields_uuid_index.dig(uuid, 'preferences', 'formula').presence)
+ if check_field_conditions(submission_values, submission.fields_uuid_index[uuid], submission.fields_uuid_index)
+ "(#{normalize_formula(nested_formula, submission, depth: depth + 1, submission_values:)})"
+ else
+ '0'
+ end
+ else
+ match
+ end
+ end
+ end
+
def calculate_formula_value(_formula, _values)
0
end
@@ -188,37 +238,68 @@ module Submitters
with_time:)
end
- def maybe_remove_condition_values(submitter)
- fields_uuid_index = submitter.submission.template_fields.index_by { |e| e['uuid'] }
+ def maybe_remove_condition_values(submitter, required_field_uuids_acc: nil)
+ submission = submitter.submission
- attachments_index =
- Submissions.filtered_conditions_schema(submitter.submission).index_by { |i| i['attachment_uuid'] }
+ submitters_values = nil
+ has_other_submitters = submission.template_submitters.size > 1
- submitter_values = nil
- is_other_submitter_conditions = submitter.submission.template_submitters.size > 1
+ has_document_conditions = submission_has_document_conditions?(submission)
- submitter.submission.template_fields.each do |field|
- next if field['submitter_uuid'] != submitter.uuid
+ attachments_index =
+ if has_document_conditions
+ Submissions.filtered_conditions_schema(submission).index_by { |i| i['attachment_uuid'] }
+ end
- submitter_values ||= submitter.values
+ submission.template_fields.each do |field|
+ next if field['submitter_uuid'] != submitter.uuid
- is_other_submitter_conditions &&= field_conditions_other_submitter?(submitter, field, fields_uuid_index)
+ required_field_uuids_acc.add(field['uuid']) if required_field_uuids_acc && required_editable_field?(field)
- if is_other_submitter_conditions
- submitter_values = submitter.submission.submitters.reduce({}) { |acc, sub| acc.merge(sub.values) }
+ if has_document_conditions && !check_field_areas_attachments(field, attachments_index)
+ submitter.values.delete(field['uuid'])
+ required_field_uuids_acc&.delete(field['uuid'])
end
- submitter.values.delete(field['uuid']) unless check_field_conditions(submitter_values, field, fields_uuid_index)
+ if has_other_submitters && !submitters_values &&
+ field_conditions_other_submitter?(submitter, field, submission.fields_uuid_index)
+ submitters_values = merge_submitters_values(submitter)
+ end
- if field['areas'].present? && field['areas'].none? { |area| attachments_index[area['attachment_uuid']] }
+ unless check_field_conditions(submitters_values || submitter.values, field, submission.fields_uuid_index)
submitter.values.delete(field['uuid'])
+ required_field_uuids_acc&.delete(field['uuid'])
end
end
submitter.values
end
+ def submission_has_document_conditions?(submission)
+ (submission.template_schema || submission.template.schema).any? { |e| e['conditions'].present? }
+ end
+
+ def required_editable_field?(field)
+ return false if NONEDITABLE_FIELD_TYPES.include?(field['type'])
+
+ field['required'].present? && field['readonly'].blank?
+ end
+
+ def check_field_areas_attachments(field, attachments_index)
+ return true if field['areas'].blank?
+
+ field['areas'].any? { |area| attachments_index[area['attachment_uuid']] }
+ end
+
+ def merge_submitters_values(submitter)
+ submitter.submission.submitters
+ .reduce({}) { |acc, sub| acc.merge(sub.values) }
+ .merge(submitter.values)
+ end
+
def field_conditions_other_submitter?(submitter, field, fields_uuid_index)
+ return false if field['conditions'].blank?
+
field['conditions'].to_a.any? do |c|
fields_uuid_index.dig(c['field_uuid'], 'submitter_uuid') != submitter.uuid
end
@@ -247,20 +328,20 @@ module Submitters
option = field['options'].find { |o| o['uuid'] == condition['value'] }
values = Array.wrap(submitter_values[condition['field_uuid']])
- values.include?(option['value'].presence || "#{I18n.t('option')} #{field['options'].index(option)}")
+ values.include?(option['value'].presence || "#{I18n.t('option')} #{field['options'].index(option) + 1}")
when 'not_equal', 'does_not_contain'
field = fields_uuid_index[condition['field_uuid']]
option = field['options'].find { |o| o['uuid'] == condition['value'] }
values = Array.wrap(submitter_values[condition['field_uuid']])
- values.exclude?(option['value'].presence || "#{I18n.t('option')} #{field['options'].index(option)}")
+ values.exclude?(option['value'].presence || "#{I18n.t('option')} #{field['options'].index(option) + 1}")
else
true
end
end
def replace_default_variables(value, attrs, submission, with_time: false)
- return value if value.in?([true, false]) || value.is_a?(Numeric)
+ return value if value.in?([true, false]) || value.is_a?(Numeric) || value.is_a?(Array)
return if value.blank?
value.to_s.gsub(VARIABLE_REGEXP) do |e|
@@ -274,12 +355,10 @@ module Submitters
else
e
end
+ when 'hour', 'minute', 'day', 'month', 'year'
+ with_time ? Time.current.in_time_zone(submission.account.timezone).strftime(STRFTIME_MAP[key]) : e
when 'date'
- if with_time
- Time.current.in_time_zone(submission.account.timezone).to_date.to_s
- else
- e
- end
+ with_time ? Time.current.in_time_zone(submission.account.timezone).to_date.to_s : e
when 'role', 'email', 'phone', 'name'
attrs[key] || e
else
diff --git a/lib/template_folders.rb b/lib/template_folders.rb
index 9a3738ea..00a6fc02 100644
--- a/lib/template_folders.rb
+++ b/lib/template_folders.rb
@@ -3,15 +3,89 @@
module TemplateFolders
module_function
+ def filter_by_full_name(template_folders, name)
+ return template_folders.none if name.blank?
+
+ parent_name, name = name.to_s.split(' / ', 2).map(&:squish)
+
+ if name.present?
+ parent_folder = template_folders.where(parent_folder_id: nil).find_by(name: parent_name)
+ else
+ name = parent_name
+ end
+
+ template_folders.where(name:, parent_folder:)
+ end
+
def search(folders, keyword)
return folders if keyword.blank?
folders.where(TemplateFolder.arel_table[:name].lower.matches("%#{keyword.downcase}%"))
end
+ def filter_active_folders(template_folders, templates)
+ folder_exists =
+ templates.active.where(TemplateFolder.arel_table[:id].eq(Template.arel_table[:folder_id]))
+ .select(1).limit(1).arel.exists
+
+ subfolders_arel = TemplateFolder.arel_table.alias('subfolders')
+
+ subfolder_exists =
+ TemplateFolder.from(subfolders_arel)
+ .where(subfolders_arel[:parent_folder_id].eq(TemplateFolder.arel_table[:id]))
+ .where(
+ templates.active.where(Template.arel_table[:folder_id].eq(subfolders_arel[:id])).arel.exists
+ ).select(1).limit(1).arel.exists
+
+ template_folders.where(folder_exists).or(template_folders.where(subfolder_exists))
+ end
+
+ def sort(template_folders, current_user, order)
+ case order
+ when 'used_at'
+ subquery =
+ Template.left_joins(:submissions)
+ .group(:folder_id)
+ .where(account_id: current_user.account_id)
+ .select(
+ :folder_id,
+ Template.arel_table[:updated_at].maximum.as('updated_at_max'),
+ Submission.arel_table[:created_at].maximum.as('submission_created_at_max')
+ )
+
+ template_folders = template_folders.joins(
+ Template.arel_table
+ .join(subquery.arel.as('templates'), Arel::Nodes::OuterJoin)
+ .on(TemplateFolder.arel_table[:id].eq(Template.arel_table[:folder_id]))
+ .join_sources
+ )
+
+ template_folders.order(
+ Arel::Nodes::Case.new
+ .when(Template.arel_table[:submission_created_at_max].gt(Template.arel_table[:updated_at_max]))
+ .then(Template.arel_table[:submission_created_at_max])
+ .else(Template.arel_table[:updated_at_max])
+ .desc
+ )
+ when 'name'
+ template_folders.order(name: :asc)
+ else
+ template_folders.order(id: :desc)
+ end
+ end
+
def find_or_create_by_name(author, name)
return author.account.default_template_folder if name.blank? || name == TemplateFolder::DEFAULT_NAME
- author.account.template_folders.create_with(author:, account: author.account).find_or_create_by(name:)
+ parent_name, name = name.to_s.split(' / ', 2).map(&:squish)
+
+ if name.present?
+ parent_folder = author.account.template_folders.create_with(author:)
+ .find_or_create_by(name: parent_name, parent_folder_id: nil)
+ else
+ name = parent_name
+ end
+
+ author.account.template_folders.create_with(author:).find_or_create_by(name:, parent_folder:)
end
end
diff --git a/lib/templates.rb b/lib/templates.rb
index 48407d51..73aaef80 100644
--- a/lib/templates.rb
+++ b/lib/templates.rb
@@ -1,6 +1,25 @@
# frozen_string_literal: true
module Templates
+ EXPIRATION_DURATIONS = {
+ one_day: 1.day,
+ two_days: 2.days,
+ three_days: 3.days,
+ four_days: 4.days,
+ five_days: 5.days,
+ six_days: 6.days,
+ seven_days: 7.days,
+ eight_days: 8.days,
+ nine_days: 9.days,
+ ten_days: 10.days,
+ two_weeks: 14.days,
+ three_weeks: 21.days,
+ four_weeks: 28.days,
+ one_month: 1.month,
+ two_months: 2.months,
+ three_months: 3.months
+ }.with_indifferent_access.freeze
+
module_function
def build_field_areas_index(fields)
@@ -18,16 +37,53 @@ module Templates
hash
end
- def search(templates, keyword)
+ def maybe_assign_access(_template)
+ nil
+ end
+
+ def search(current_user, templates, keyword)
+ if Docuseal.fulltext_search?
+ fulltext_search(current_user, templates, keyword)
+ else
+ plain_search(templates, keyword)
+ end
+ end
+
+ def plain_search(templates, keyword)
return templates if keyword.blank?
templates.where(Template.arel_table[:name].lower.matches("%#{keyword.downcase}%"))
end
- def filter_undefined_submitters(template)
- template.submitters.to_a.select do |item|
+ def fulltext_search(current_user, templates, keyword)
+ return templates if keyword.blank?
+
+ templates.where(
+ id: SearchEntry.where(record_type: 'Template')
+ .where(account_id: [current_user.account_id,
+ current_user.account.linked_account_account&.account_id].compact)
+ .where(*SearchEntries.build_tsquery(keyword))
+ .select(:record_id)
+ )
+ end
+
+ def filter_undefined_submitters(template_submitters)
+ template_submitters.to_a.select do |item|
item['invite_by_uuid'].blank? && item['optional_invite_by_uuid'].blank? &&
item['linked_to_uuid'].blank? && item['is_requester'].blank? && item['email'].blank?
end
end
+
+ def build_default_expire_at(template)
+ default_expire_at_duration = template.preferences['default_expire_at_duration'].presence
+ default_expire_at = template.preferences['default_expire_at'].presence
+
+ return if default_expire_at_duration.blank?
+
+ if default_expire_at_duration == 'specified_date' && default_expire_at.present?
+ Time.zone.parse(default_expire_at)
+ elsif EXPIRATION_DURATIONS[default_expire_at_duration]
+ Time.current + EXPIRATION_DURATIONS[default_expire_at_duration]
+ end
+ end
end
diff --git a/lib/templates/build_annotations.rb b/lib/templates/build_annotations.rb
index b654198b..9a933f99 100644
--- a/lib/templates/build_annotations.rb
+++ b/lib/templates/build_annotations.rb
@@ -10,6 +10,7 @@ module Templates
pdf.pages.flat_map.with_index do |page, index|
(page[:Annots] || []).filter_map do |annot|
next if annot.blank?
+ next if annot.is_a?(Integer) || annot.is_a?(Symbol)
next if annot[:A].blank? || annot[:A][:URI].blank?
next unless annot[:Subtype] == :Link
next if !annot[:A][:URI].starts_with?('https://') && !annot[:A][:URI].starts_with?('http://')
diff --git a/lib/templates/clone.rb b/lib/templates/clone.rb
index 2c15858f..e4b5fc60 100644
--- a/lib/templates/clone.rb
+++ b/lib/templates/clone.rb
@@ -4,10 +4,12 @@ module Templates
module Clone
module_function
+ # rubocop:disable Metrics, Style/CombinableLoops
def call(original_template, author:, external_id: nil, name: nil, folder_name: nil)
template = original_template.account.templates.new
template.external_id = external_id
+ template.shared_link = original_template.shared_link
template.author = author
template.name = name.presence || "#{original_template.name} (#{I18n.t('clone')})"
@@ -29,10 +31,13 @@ module Templates
template.schema.first['name'] = template.name
end
+ original_template.template_accesses.each do |template_access|
+ template.template_accesses.new(user_id: template_access.user_id)
+ end
+
template
end
- # rubocop:disable Metrics, Style/CombinableLoops
def update_submitters_and_fields_and_schema(cloned_submitters, cloned_fields, cloned_schema, cloned_preferences)
submitter_uuids_replacements = {}
field_uuids_replacements = {}
diff --git a/lib/templates/clone_attachments.rb b/lib/templates/clone_attachments.rb
index 8b08735d..11484c1f 100644
--- a/lib/templates/clone_attachments.rb
+++ b/lib/templates/clone_attachments.rb
@@ -4,10 +4,12 @@ module Templates
module CloneAttachments
module_function
- def call(template:, original_template:, documents: [])
+ def call(template:, original_template:, documents: [], excluded_attachment_uuids: [], save: true)
schema_uuids_replacements = {}
template.schema.each_with_index do |schema_item, index|
+ next if excluded_attachment_uuids.include?(schema_item['attachment_uuid'])
+
new_schema_item_uuid = SecureRandom.uuid
schema_uuids_replacements[schema_item['attachment_uuid']] = new_schema_item_uuid
@@ -22,32 +24,36 @@ module Templates
next if field['areas'].blank?
field['areas'].each do |area|
- area['attachment_uuid'] = schema_uuids_replacements[area['attachment_uuid']]
+ new_attachment_uuid = schema_uuids_replacements[area['attachment_uuid']]
+ area['attachment_uuid'] = new_attachment_uuid if new_attachment_uuid
end
end
- template.save!
+ attachments =
+ original_template.schema_documents.filter_map do |document|
+ new_attachment_uuid = schema_uuids_replacements[document.uuid]
+
+ next unless new_attachment_uuid
- original_template.schema_documents.map do |document|
- new_document =
- ApplicationRecord.no_touching do
- template.documents_attachments.create!(
- uuid: schema_uuids_replacements[document.uuid],
+ new_document =
+ template.documents_attachments.new(
+ uuid: new_attachment_uuid,
blob_id: document.blob_id
)
- end
- clone_document_preview_images_attachments(document:, new_document:)
+ clone_document_preview_images_attachments(document:, new_document:)
- new_document
- end
+ new_document
+ end
+
+ template.save! if save
+
+ attachments
end
def clone_document_preview_images_attachments(document:, new_document:)
- ApplicationRecord.no_touching do
- document.preview_images_attachments.each do |preview_image|
- new_document.preview_images_attachments.create!(blob_id: preview_image.blob_id)
- end
+ document.preview_images_attachments.each do |preview_image|
+ new_document.preview_images_attachments.new(blob_id: preview_image.blob_id)
end
end
end
diff --git a/lib/templates/create_attachments.rb b/lib/templates/create_attachments.rb
index 22d84e2f..10b08ac7 100644
--- a/lib/templates/create_attachments.rb
+++ b/lib/templates/create_attachments.rb
@@ -3,6 +3,20 @@
module Templates
module CreateAttachments
PDF_CONTENT_TYPE = 'application/pdf'
+ ZIP_CONTENT_TYPE = 'application/zip'
+ X_ZIP_CONTENT_TYPE = 'application/x-zip-compressed'
+ JSON_CONTENT_TYPE = 'application/json'
+ DOCUMENT_EXTENSIONS = %w[.docx .doc .xlsx .xls .odt .rtf].freeze
+
+ DOCUMENT_CONTENT_TYPES = %w[
+ application/vnd.openxmlformats-officedocument.wordprocessingml.document
+ application/msword
+ application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
+ application/vnd.ms-excel
+ application/vnd.oasis.opendocument.text
+ application/rtf
+ ].freeze
+
ANNOTATIONS_SIZE_LIMIT = 6.megabytes
InvalidFileType = Class.new(StandardError)
PdfEncrypted = Class.new(StandardError)
@@ -10,7 +24,7 @@ module Templates
module_function
def call(template, params, extract_fields: false)
- Array.wrap(params[:files].presence || params[:file]).map do |file|
+ extract_zip_files(params[:files].presence || params[:file]).flat_map do |file|
handle_file_types(template, file, params, extract_fields:)
end
end
@@ -53,6 +67,40 @@ module Templates
raise PdfEncrypted
end
+ def extract_zip_files(files)
+ extracted_files = []
+
+ Array.wrap(files).each do |file|
+ if file.content_type == ZIP_CONTENT_TYPE || file.content_type == X_ZIP_CONTENT_TYPE
+ Zip::File.open(file.tempfile).each do |entry|
+ next if entry.directory?
+
+ tempfile = Tempfile.new(entry.name)
+ tempfile.binmode
+ entry.get_input_stream { |in_stream| IO.copy_stream(in_stream, tempfile) }
+ tempfile.rewind
+
+ type = Marcel::MimeType.for(tempfile, name: entry.name)
+
+ next if type.exclude?('image') &&
+ type != PDF_CONTENT_TYPE &&
+ type != JSON_CONTENT_TYPE &&
+ DOCUMENT_CONTENT_TYPES.exclude?(type)
+
+ extracted_files << ActionDispatch::Http::UploadedFile.new(
+ filename: File.basename(entry.name),
+ type:,
+ tempfile:
+ )
+ end
+ else
+ extracted_files << file
+ end
+ end
+
+ extracted_files
+ end
+
def handle_file_types(template, file, params, extract_fields:)
if file.content_type.include?('image') || file.content_type == PDF_CONTENT_TYPE
return handle_pdf_or_image(template, file, file.read, params, extract_fields:)
diff --git a/lib/templates/detect_fields.rb b/lib/templates/detect_fields.rb
new file mode 100755
index 00000000..1f3b5c0c
--- /dev/null
+++ b/lib/templates/detect_fields.rb
@@ -0,0 +1,485 @@
+# frozen_string_literal: true
+
+module Templates
+ module DetectFields
+ module_function
+
+ TextFieldBox = Struct.new(:x, :y, :w, :h, keyword_init: true)
+ PageNode = Struct.new(:prev, :next, :elem, :page, :attachment_uuid, keyword_init: true)
+
+ DATE_REGEXP = /
+ (?:
+ date
+ | signed\sat
+ | datum
+ )
+ \s*[:-]?\s*\z
+ /ix
+
+ NUMBER_REGEXP = /
+ (?:
+ price
+ | \$
+ | €
+ | total
+ | quantity
+ | prix
+ | quantité
+ | preis
+ | summe
+ | gesamt(?:betrag)?
+ | menge
+ | anzahl
+ | stückzahl
+ )
+ \s*[:-]?\s*\z
+ /ix
+
+ SIGNATURE_REGEXP = /
+ (?:
+ signature
+ | sign\shere
+ | sign
+ | signez\sici
+ | signer\sici
+ | unterschrift
+ | unterschreiben
+ | unterzeichnen
+ )
+ \s*[:-]?\s*\z
+ /ix
+
+ # rubocop:disable Metrics, Style
+ def call(io, attachment: nil, confidence: 0.3, temperature: 1, inference: Templates::ImageToFields,
+ nms: 0.1, split_page: false, aspect_ratio: true, padding: 20, regexp_type: true, &)
+ fields, head_node =
+ if attachment&.image?
+ process_image_attachment(io, attachment:, confidence:, nms:, split_page:, inference:,
+ temperature:, aspect_ratio:, padding:, &)
+ else
+ process_pdf_attachment(io, attachment:, confidence:, nms:, split_page:, inference:,
+ temperature:, aspect_ratio:, regexp_type:, padding:, &)
+ end
+
+ [fields, head_node]
+ end
+
+ def process_image_attachment(io, attachment:, confidence:, nms:, temperature:, inference:,
+ split_page: false, aspect_ratio: false, padding: nil)
+ image = Vips::Image.new_from_buffer(io.read, '')
+
+ fields = inference.call(image, confidence:, nms:, split_page:,
+ temperature:, aspect_ratio:, padding:)
+
+ fields = fields.map do |f|
+ {
+ uuid: SecureRandom.uuid,
+ type: f.type,
+ required: f.type != 'checkbox',
+ preferences: {},
+ areas: [{
+ x: f.x,
+ y: f.y,
+ w: f.w,
+ h: f.h,
+ page: 0,
+ attachment_uuid: attachment&.uuid
+ }]
+ }
+ end
+
+ yield [attachment&.uuid, 0, fields] if block_given?
+
+ [fields, nil]
+ end
+
+ def process_pdf_attachment(io, attachment:, confidence:, nms:, temperature:, inference:,
+ split_page: false, aspect_ratio: false, padding: nil, regexp_type: false)
+ doc = Pdfium::Document.open_bytes(io.read)
+
+ head_node = PageNode.new(elem: ''.b, page: 0, attachment_uuid: attachment&.uuid)
+ tail_node = head_node
+
+ fields = doc.page_count.times.flat_map do |page_number|
+ page = doc.get_page(page_number)
+
+ data, width, height = page.render_to_bitmap(width: inference::RESOLUTION * 1.5)
+
+ image = Vips::Image.new_from_memory(data, width, height, 4, :uchar)
+
+ fields = inference.call(image, confidence: confidence / 4.0, nms:, split_page:,
+ temperature:, aspect_ratio:, padding:)
+
+ text_fields = extract_text_fields_from_page(page)
+ line_fields = extract_line_fields_from_page(page)
+
+ fields = increase_confidence_for_overlapping_fields(fields, text_fields)
+ fields = increase_confidence_for_overlapping_fields(fields, line_fields)
+
+ fields = fields.reject { |f| f.confidence < confidence }
+
+ field_nodes, tail_node = build_page_nodes(page, fields, tail_node, attachment_uuid: attachment&.uuid)
+
+ fields = field_nodes.map do |node|
+ field = node.elem
+
+ type = regexp_type ? type_from_page_node(node) : field.type
+
+ {
+ uuid: SecureRandom.uuid,
+ type:,
+ required: type != 'checkbox',
+ preferences: {},
+ areas: [{
+ x: field.x, y: field.y,
+ w: field.w, h: field.h,
+ page: page_number,
+ attachment_uuid: attachment&.uuid
+ }]
+ }
+ end
+
+ yield [attachment&.uuid, page_number, fields] if block_given?
+
+ fields
+ ensure
+ page.close
+ end
+
+ print_debug(head_node) if Rails.env.development?
+
+ [fields, head_node]
+ ensure
+ doc.close
+ end
+
+ def print_debug(head_node)
+ current_node = head_node
+ index = 0
+ string = ''.b
+
+ loop do
+ string <<
+ if current_node.elem.is_a?(String)
+ current_node.elem
+ else
+ "[#{current_node.elem.type == 'checkbox' ? 'Checkbox' : 'Field'}_#{index += 1}]"
+ end
+
+ current_node = current_node.next
+
+ break unless current_node
+ end
+
+ Rails.logger.info(string)
+ end
+
+ def type_from_page_node(node)
+ return node.elem.type unless node.prev.elem.is_a?(String)
+ return node.elem.type unless node.elem.type == 'text'
+
+ string = node.prev.elem
+
+ return 'date' if string.match?(DATE_REGEXP)
+ return 'signature' if string.match?(SIGNATURE_REGEXP)
+ return 'number' if string.match?(NUMBER_REGEXP)
+
+ return 'text'
+ end
+
+ def build_page_nodes(page, fields, tail_node, attachment_uuid: nil)
+ field_nodes = []
+ current_text = ''.b
+
+ text_nodes = page.text_nodes
+
+ text_idx = 0
+ field_idx = 0
+
+ while text_idx < text_nodes.length || field_idx < fields.length
+ text_node = text_nodes[text_idx]
+ field = fields[field_idx]
+
+ process_text_node = false
+ process_field_node = false
+
+ if text_node && field
+ text_y_center = text_node.y + (text_node.h / 2.0)
+ field_y_center = field.y + (field.h / 2.0)
+ y_threshold = text_node.h / 2.0
+ vertical_distance = (text_y_center - field_y_center).abs
+
+ if vertical_distance < y_threshold
+ is_underscore = text_node.content == '_'
+ is_left_of_field = text_node.x < field.x
+
+ if is_underscore && is_left_of_field
+ text_x_end = text_node.x + text_node.w
+
+ distance = field.x - text_x_end
+ proximity_threshold = text_node.w * 3.0
+
+ if distance < proximity_threshold
+ process_field_node = true
+ else
+ process_text_node = true
+ end
+
+ elsif is_left_of_field
+ process_text_node = true
+ else
+ process_field_node = true
+ end
+
+ elsif text_node.y < field.y
+ process_text_node = true
+ else
+ process_field_node = true
+ end
+
+ elsif text_node
+ process_text_node = true
+ elsif field
+ process_field_node = true
+ end
+
+ if process_field_node
+ unless current_text.empty?
+ new_text_node = PageNode.new(prev: tail_node, elem: current_text, page: page.page_index, attachment_uuid:)
+ tail_node.next = new_text_node
+ tail_node = new_text_node
+ current_text = ''.b
+ end
+
+ new_field_node = PageNode.new(prev: tail_node, elem: field, page: page.page_index, attachment_uuid:)
+ tail_node.next = new_field_node
+ tail_node = new_field_node
+
+ field_nodes << tail_node
+
+ while text_idx < text_nodes.length
+ text_node_to_check = text_nodes[text_idx]
+
+ is_part_of_field = false
+
+ if text_node_to_check.content == '_'
+ check_y_center = text_node_to_check.y + (text_node_to_check.h / 2.0)
+ check_y_dist = (check_y_center - field_y_center).abs
+ check_y_thresh = text_node_to_check.h / 2.0
+
+ if check_y_dist < check_y_thresh
+ padding = text_node_to_check.w * 3.0
+ field_x_start = field.x - padding
+ field_x_end = field.x + field.w + padding
+ text_x_start = text_node_to_check.x
+ text_x_end = text_node_to_check.x + text_node_to_check.w
+
+ is_part_of_field = true if text_x_start <= field_x_end && field_x_start <= text_x_end
+ end
+ end
+
+ break unless is_part_of_field
+
+ text_idx += 1
+ end
+
+ field_idx += 1
+ elsif process_text_node
+ if text_idx > 0
+ prev_text_node = text_nodes[text_idx - 1]
+
+ x_gap = text_node.x - (prev_text_node.x + prev_text_node.w)
+
+ gap_w = text_node.w > prev_text_node.w ? text_node.w : prev_text_node.w
+
+ current_text << ' ' if x_gap > gap_w * 2
+ end
+
+ current_text << text_node.content
+ text_idx += 1
+ end
+ end
+
+ unless current_text.empty?
+ new_text_node = PageNode.new(prev: tail_node, elem: current_text, page: page.page_index, attachment_uuid:)
+ tail_node.next = new_text_node
+ tail_node = new_text_node
+ end
+
+ [field_nodes, tail_node]
+ end
+
+ def extract_line_fields_from_page(page)
+ line_thickness = 5.0 / page.height
+
+ vertical_lines, all_horizontal_lines = page.line_nodes.partition { |line| line.tilt == 90 }
+
+ horizontal_lines = all_horizontal_lines.reject do |h_line|
+ next true if h_line.w > 0.7 && (h_line.h < 0.1 || h_line.h < 0.9)
+
+ next false if vertical_lines.blank?
+
+ h_x_min = h_line.x
+ h_x_max = h_line.x + h_line.w
+ h_y_avg = h_line.y + (h_line.h / 2)
+
+ vertical_lines.any? do |v_line|
+ v_x_avg = v_line.x + (v_line.w / 2)
+ v_y_min = v_line.y
+ v_y_max = v_line.y + v_line.h
+
+ h_x_min_expanded = h_x_min - line_thickness
+ h_x_max_expanded = h_x_max + line_thickness
+ h_y_min_expanded = h_y_avg - line_thickness
+ h_y_max_expanded = h_y_avg + line_thickness
+
+ v_x_min_expanded = v_x_avg - line_thickness
+ v_x_max_expanded = v_x_avg + line_thickness
+ v_y_min_expanded = v_y_min - line_thickness
+ v_y_max_expanded = v_y_max + line_thickness
+
+ x_overlap = v_x_min_expanded <= h_x_max_expanded && v_x_max_expanded >= h_x_min_expanded
+ y_overlap = h_y_min_expanded <= v_y_max_expanded && h_y_max_expanded >= v_y_min_expanded
+
+ x_overlap && y_overlap
+ end
+ end
+
+ node_index = 0
+
+ horizontal_lines = horizontal_lines.reject do |line|
+ nodes = []
+
+ loop do
+ node = page.text_nodes[node_index += 1]
+
+ break unless node
+
+ break if node.y > line.y
+
+ next if node.x + node.w < line.x || line.x + line.w < node.x ||
+ node.y + node.h < line.y - node.h || line.y < node.y
+
+ nodes << node
+
+ next if nodes.blank?
+
+ next_node = page.text_nodes[node_index + 1]
+
+ break unless next_node
+
+ break if next_node.x + next_node.w < line.x || line.x + line.w < next_node.x ||
+ next_node.y + next_node.h < line.y - next_node.h || line.y < next_node.y
+ end
+
+ next if nodes.blank?
+
+ width = nodes.last.x + nodes.last.w - nodes.first.x
+
+ next true if width > line.w / 2.0
+ end
+
+ horizontal_lines.each do |line|
+ line.h += 4 * line_thickness
+ line.y -= 4 * line_thickness
+ end
+ end
+
+ def extract_text_fields_from_page(page)
+ text_nodes = page.text_nodes
+
+ field_boxes = []
+
+ i = 0
+
+ while i < text_nodes.length
+ node = text_nodes[i]
+
+ next i += 1 if node.content != '_'
+
+ x1 = node.x
+ y1 = node.y
+ x2 = node.x + node.w
+ y2 = node.y + node.h
+
+ underscore_count = 1
+
+ j = i + 1
+
+ while j < text_nodes.length
+ next_node = text_nodes[j]
+
+ break unless next_node.content == '_'
+
+ distance = next_node.x - x2
+ height_diff = (next_node.y - y1).abs
+
+ break if distance > 0.02 || height_diff > node.h * 0.5
+
+ underscore_count += 1
+ next_x2 = next_node.x + next_node.w
+ next_y2 = next_node.y + next_node.h
+
+ x2 = next_x2
+ y2 = [y2, next_y2].max
+ y1 = [y1, next_node.y].min
+
+ j += 1
+ end
+
+ field_boxes << TextFieldBox.new(x: x1, y: y1, w: x2 - x1, h: y2 - y1) if underscore_count >= 2
+
+ i = j
+ end
+
+ field_boxes
+ end
+
+ def calculate_iou(box1, box2)
+ x1 = [box1.x, box2.x].max
+ y1 = [box1.y, box2.y].max
+ x2 = [box1.x + box1.w, box2.x + box2.w].min
+ y2 = [box1.y + box1.h, box2.y + box2.h].min
+
+ intersection_width = [0, x2 - x1].max
+ intersection_height = [0, y2 - y1].max
+ intersection_area = intersection_width * intersection_height
+
+ return 0.0 if intersection_area.zero?
+
+ box1_area = box1.w * box1.h
+ box2_area = box2.w * box2.h
+ union_area = box1_area + box2_area - intersection_area
+
+ intersection_area / union_area
+ end
+
+ def boxes_overlap?(box1, box2)
+ !(box1.x + box1.w < box2.x || box2.x + box2.w < box1.x ||
+ box1.y + box1.h < box2.y || box2.y + box2.h < box1.y)
+ end
+
+ def increase_confidence_for_overlapping_fields(image_fields, text_fields, by: 1.0)
+ return image_fields if text_fields.blank?
+
+ image_fields.map do |image_field|
+ next if image_field.type != 'text'
+
+ field_bottom = image_field.y + image_field.h
+
+ text_fields.each do |text_field|
+ break if text_field.y > field_bottom
+
+ next if text_field.y + text_field.h < image_field.y
+
+ next unless boxes_overlap?(image_field, text_field) && calculate_iou(image_field, text_field) > 0.5
+
+ break image_field.confidence += by
+ end
+ end
+
+ image_fields
+ end
+ # rubocop:enable Metrics, Style
+ end
+end
diff --git a/lib/templates/find_acro_fields.rb b/lib/templates/find_acro_fields.rb
index 11c319c7..7940145a 100644
--- a/lib/templates/find_acro_fields.rb
+++ b/lib/templates/find_acro_fields.rb
@@ -21,6 +21,8 @@ module Templates
Escolher
)\b/ix
+ DATE_FORMAT_REGEXP = %r{[myd]{2,4}[-\\/\s.][myd]{2,4}[-\\/\s.][myd]{2,4}}i
+
FIELD_ALIGNMENT = {
0 => 'left',
1 => 'center',
@@ -30,8 +32,8 @@ module Templates
module_function
# rubocop:disable Metrics
- def call(pdf, attachment)
- return [] unless pdf.acro_form
+ def call(pdf, attachment, data)
+ return [] if pdf.acro_form.blank? && data.exclude?('/Form')
fields, annots_index = build_fields_with_pages(pdf)
@@ -76,7 +78,7 @@ module Templates
next if attrs[:w].zero? || attrs[:h].zero?
if child_field[:MaxLen] && child_field.try(:concrete_field_type) == :comb_text_field
- attrs[:cell_w] = w / page_width / child_field[:MaxLen].to_f
+ attrs[:cell_w] = w / page_width.to_f / child_field[:MaxLen].to_f
end
attrs
@@ -147,7 +149,7 @@ module Templates
options: build_options(field[:Opt], 'radio'),
default_value: selected_option
}
- elsif field.field_type == :Btn && field.concrete_field_type == :check_box &&
+ elsif field.field_type == :Btn && %i[check_box radio_button].include?(field.concrete_field_type) &&
field[:Kids].present? && field[:Kids].size > 1 && field.allowed_values.size > 1
selected_option = (field.allowed_values || []).find { |v| v == field.field_value }
@@ -159,7 +161,7 @@ module Templates
options: build_options(field.allowed_values, 'radio'),
default_value: selected_option
}
- elsif field.field_type == :Btn && field.concrete_field_type == :check_box
+ elsif field.field_type == :Btn && %i[check_box radio_button].include?(field.concrete_field_type)
{
**attrs,
type: 'checkbox',
@@ -187,15 +189,29 @@ module Templates
default_value: field.field_value
}
elsif field.field_type == :Tx
- {
- **attrs,
- type: 'text',
- default_value: field.field_value
- }
+ if field[:AA] && ((field[:AA][:F] && field[:AA][:F][:JS].include?('AFDate_')) ||
+ (field[:AA][:K] && field[:AA][:K][:JS].include?('AFDate_')))
+ if (format = field[:AA][:F][:JS][DATE_FORMAT_REGEXP])
+ attrs[:preferences] ||= {}
+ attrs[:preferences][:format] = format.upcase
+ end
+
+ {
+ **attrs,
+ type: 'date',
+ default_value: field.field_value
+ }
+ else
+ {
+ **attrs,
+ type: 'text',
+ default_value: field.field_value
+ }
+ end
elsif field.field_type == :Sig
{
**attrs,
- type: 'signature'
+ type: field.try(:field_name).to_s.downcase.include?('initials') ? 'initials' : 'signature'
}
else
{}
@@ -209,7 +225,10 @@ module Templates
is_option_number = option.is_a?(Symbol) && option.to_s.match?(/\A\d+\z/)
option = option[1] if option.is_a?(Array) && option.size == 2
- option = option.encode('utf-8', invalid: :replace, undef: :replace, replace: '') if option.is_a?(String)
+
+ if option.is_a?(String) || option.is_a?(Symbol)
+ option = option.to_s.encode('utf-8', invalid: :replace, undef: :replace, replace: '')
+ end
next if type == 'select' && option.to_s.match?(SELECT_PLACEHOLDER_REGEXP)
diff --git a/lib/templates/image_to_fields.rb b/lib/templates/image_to_fields.rb
new file mode 100755
index 00000000..786e9785
--- /dev/null
+++ b/lib/templates/image_to_fields.rb
@@ -0,0 +1,346 @@
+# frozen_string_literal: true
+
+module Templates
+ module ImageToFields
+ module_function
+
+ Field = Struct.new(:type, :x, :y, :w, :h, :confidence, keyword_init: true)
+
+ MODEL_PATH = Rails.root.join('tmp/model.onnx')
+
+ RESOLUTION = 704
+
+ ID_TO_CLASS = %w[text checkbox].freeze
+
+ MEAN = [0.485, 0.456, 0.406].freeze
+ STD = [0.229, 0.224, 0.225].freeze
+
+ CPU_THREADS = Etc.nprocessors
+
+ # rubocop:disable Metrics
+ def call(image, confidence: 0.3, nms: 0.1, temperature: 1,
+ split_page: false, aspect_ratio: true, padding: nil, resolution: RESOLUTION)
+ base_image = image.extract_band(0, n: 3)
+
+ trimmed_base, base_offset_x, base_offset_y = trim_image_with_padding(base_image, padding)
+
+ if split_page && image.height > image.width
+ regions = build_split_image_regions(trimmed_base)
+
+ detections = { xyxy: Numo::SFloat[], confidence: Numo::SFloat[], class_id: Numo::Int32[] }
+
+ detections = regions.reduce(detections) do |acc, r|
+ next detections if r[:img].height <= 0 || r[:img].width <= 0
+
+ input_tensor, transform_info = preprocess_image(r[:img], resolution, aspect_ratio:)
+
+ transform_info[:trim_offset_x] = base_offset_x
+ transform_info[:trim_offset_y] = base_offset_y + r[:offset_y]
+
+ outputs = model.predict({ 'input' => input_tensor }, output_type: :numo)
+
+ boxes = outputs['dets'][0, true, true]
+ logits = outputs['labels'][0, true, true]
+
+ postprocess_outputs(boxes, logits, transform_info, acc, confidence:, temperature:, resolution:)
+ end
+ else
+ input_tensor, transform_info = preprocess_image(trimmed_base, resolution, aspect_ratio:)
+
+ transform_info[:trim_offset_x] = base_offset_x
+ transform_info[:trim_offset_y] = base_offset_y
+
+ outputs = model.predict({ 'input' => input_tensor }, output_type: :numo)
+
+ boxes = outputs['dets'][0, true, true]
+ logits = outputs['labels'][0, true, true]
+
+ detections = postprocess_outputs(boxes, logits, transform_info, confidence:, temperature:, resolution:)
+ end
+
+ detections = apply_nms(detections, nms)
+
+ fields = build_fields_from_detections(detections, image)
+
+ sort_fields(fields, y_threshold: 10.0 / image.height)
+ end
+
+ def build_split_image_regions(image)
+ half_h = image.height / 2
+ top_h = half_h
+ bottom_h = image.height - half_h
+
+ [
+ { img: image.crop(0, 0, image.width, top_h), offset_y: 0 },
+ { img: image.crop(0, top_h, image.width, bottom_h), offset_y: top_h }
+ ]
+ end
+
+ def build_fields_from_detections(detections, image)
+ detections[:xyxy].shape[0].times.filter_map do |i|
+ x1 = detections[:xyxy][i, 0]
+ y1 = detections[:xyxy][i, 1]
+ x2 = detections[:xyxy][i, 2]
+ y2 = detections[:xyxy][i, 3]
+
+ class_id = detections[:class_id][i].to_i
+
+ confidence = detections[:confidence][i]
+
+ x0_norm = x1 / image.width.to_f
+ y0_norm = y1 / image.height.to_f
+ x1_norm = x2 / image.width.to_f
+ y1_norm = y2 / image.height.to_f
+
+ x1_norm = 1 if x1_norm > 1
+ y1_norm = 1 if y1_norm > 1
+
+ next if x0_norm < 0 || x0_norm > 1
+ next if y0_norm < 0 || y0_norm > 1
+
+ type_name = ID_TO_CLASS[class_id]
+
+ Field.new(
+ type: type_name,
+ x: x0_norm,
+ y: y0_norm,
+ w: (x1_norm - x0_norm),
+ h: (y1_norm - y0_norm),
+ confidence:
+ )
+ end
+ end
+
+ def trim_image_with_padding(image, padding = 0)
+ return [image, 0, 0] if padding.nil?
+
+ left, top, trim_width, trim_height = image.find_trim(threshold: 10, background: [255, 255, 255])
+
+ padded_left = [left - padding, 0].max
+ padded_top = [top - padding, 0].max
+ padded_right = [left + trim_width + padding, image.width].min
+ padded_bottom = [top + trim_height + padding, image.height].min
+
+ width = padded_right - padded_left
+ height = padded_bottom - padded_top
+
+ trimmed_image = image.crop(padded_left, padded_top, width, height)
+
+ [trimmed_image, padded_left, padded_top]
+ end
+
+ def preprocess_image(image, resolution, aspect_ratio: false)
+ scale_x = resolution.to_f / image.width
+ scale_y = resolution.to_f / image.height
+
+ if aspect_ratio
+ scale = [scale_x, scale_y].min
+
+ new_width = (image.width * scale).round
+ new_height = (image.height * scale).round
+
+ resized = image.resize(scale, vscale: scale, kernel: :lanczos3)
+
+ pad_x = ((resolution - new_width) / 2.0).round
+ pad_y = ((resolution - new_height) / 2.0).round
+
+ image = resized.embed(pad_x, pad_y, resolution, resolution, background: [255, 255, 255])
+
+ transform_info = { scale_x: scale, scale_y: scale, pad_x: pad_x, pad_y: pad_y }
+ else
+ image = image.resize(scale_x, vscale: scale_y, kernel: :lanczos3)
+
+ transform_info = { scale_x: scale_x, scale_y: scale_y, pad_x: 0, pad_y: 0 }
+ end
+
+ image /= 255.0
+
+ image = (image - MEAN) / STD
+
+ pixel_data = image.write_to_memory
+
+ img_array = Numo::SFloat.from_binary(pixel_data, [resolution, resolution, 3])
+
+ img_array = img_array.transpose(2, 0, 1)
+
+ [img_array.reshape(1, 3, resolution, resolution), transform_info]
+ end
+
+ def nms(boxes, scores, iou_threshold = 0.5)
+ return Numo::Int32[] if boxes.shape[0].zero?
+
+ x1 = boxes[true, 0]
+ y1 = boxes[true, 1]
+ x2 = boxes[true, 2]
+ y2 = boxes[true, 3]
+
+ areas = (x2 - x1) * (y2 - y1)
+ order = scores.sort_index.reverse
+
+ keep = []
+
+ while order.size.positive?
+ i = order[0]
+ keep << i
+
+ break if order.size == 1
+
+ xx1 = Numo::SFloat.maximum(x1[i], x1[order[1..]])
+ yy1 = Numo::SFloat.maximum(y1[i], y1[order[1..]])
+ xx2 = Numo::SFloat.minimum(x2[i], x2[order[1..]])
+ yy2 = Numo::SFloat.minimum(y2[i], y2[order[1..]])
+
+ w = Numo::SFloat.maximum(0.0, xx2 - xx1)
+ h = Numo::SFloat.maximum(0.0, yy2 - yy1)
+
+ intersection = w * h
+
+ iou = intersection / (areas[i] + areas[order[1..]] - intersection)
+
+ inds = iou.le(iou_threshold).where
+
+ order = order[inds + 1]
+ end
+
+ Numo::Int32.cast(keep)
+ end
+
+ def postprocess_outputs(boxes, logits, transform_info, detections = nil, confidence: 0.3, temperature: 1,
+ resolution: RESOLUTION)
+ scaled_logits = logits / temperature
+
+ probs = 1.0 / (1.0 + Numo::NMath.exp(-scaled_logits))
+
+ scores = probs.max(axis: 1)
+ labels = probs.argmax(axis: 1)
+
+ cx = boxes[true, 0]
+ cy = boxes[true, 1]
+ w = boxes[true, 2]
+ h = boxes[true, 3]
+
+ x1 = cx - (w / 2.0)
+ y1 = cy - (h / 2.0)
+ x2 = cx + (w / 2.0)
+ y2 = cy + (h / 2.0)
+
+ boxes_xyxy = Numo::SFloat.zeros(boxes.shape[0], 4)
+ boxes_xyxy[true, 0] = x1
+ boxes_xyxy[true, 1] = y1
+ boxes_xyxy[true, 2] = x2
+ boxes_xyxy[true, 3] = y2
+
+ boxes_xyxy *= resolution
+
+ pad_x = transform_info[:pad_x]
+ pad_y = transform_info[:pad_y]
+ boxes_xyxy[true, 0] -= pad_x
+ boxes_xyxy[true, 1] -= pad_y
+ boxes_xyxy[true, 2] -= pad_x
+ boxes_xyxy[true, 3] -= pad_y
+
+ scale_x = transform_info[:scale_x]
+ scale_y = transform_info[:scale_y]
+ boxes_xyxy[true, 0] /= scale_x
+ boxes_xyxy[true, 1] /= scale_y
+ boxes_xyxy[true, 2] /= scale_x
+ boxes_xyxy[true, 3] /= scale_y
+
+ trim_offset_x = transform_info[:trim_offset_x]
+ trim_offset_y = transform_info[:trim_offset_y]
+ boxes_xyxy[true, 0] += trim_offset_x
+ boxes_xyxy[true, 1] += trim_offset_y
+ boxes_xyxy[true, 2] += trim_offset_x
+ boxes_xyxy[true, 3] += trim_offset_y
+
+ keep_mask = scores.gt(confidence)
+
+ keep_indices = keep_mask.where
+
+ if keep_indices.empty?
+ detections || {
+ xyxy: Numo::SFloat[],
+ confidence: Numo::SFloat[],
+ class_id: Numo::Int32[]
+ }
+ else
+ scores = scores[keep_indices]
+ labels = labels[keep_indices]
+ boxes_xyxy = boxes_xyxy[keep_indices, true]
+
+ if detections
+ existing_n = detections[:xyxy].shape[0]
+ new_n = boxes_xyxy.shape[0]
+ total = existing_n + new_n
+
+ xyxy = Numo::SFloat.zeros(total, 4)
+ conf = Numo::SFloat.zeros(total)
+ cls = Numo::Int32.zeros(total)
+
+ if existing_n.positive?
+ xyxy[0...existing_n, true] = detections[:xyxy]
+ conf[0...existing_n] = detections[:confidence]
+ cls[0...existing_n] = detections[:class_id]
+ end
+
+ xyxy[existing_n...(existing_n + new_n), true] = boxes_xyxy
+ conf[existing_n...(existing_n + new_n)] = scores
+ cls[existing_n...(existing_n + new_n)] = Numo::Int32.cast(labels)
+
+ { xyxy: xyxy, confidence: conf, class_id: cls }
+ else
+ {
+ xyxy: boxes_xyxy,
+ confidence: scores,
+ class_id: Numo::Int32.cast(labels)
+ }
+ end
+ end
+ end
+
+ def sort_fields(fields, y_threshold: 0.01)
+ sorted_fields = fields.sort { |a, b| a.y == b.y ? a.x <=> b.x : a.y <=> b.y }
+
+ lines = []
+ current_line = []
+
+ sorted_fields.each do |field|
+ if current_line.blank? || (field.y - current_line.first.y).abs < y_threshold
+ current_line << field
+ else
+ lines << current_line.sort_by(&:x)
+
+ current_line = [field]
+ end
+ end
+
+ lines << current_line.sort_by(&:x) if current_line.present?
+
+ lines.flatten
+ end
+
+ def apply_nms(detections, threshold = 0.5)
+ return detections if detections[:xyxy].shape[0].zero?
+
+ keep_indices = nms(detections[:xyxy], detections[:confidence], threshold)
+
+ {
+ xyxy: detections[:xyxy][keep_indices, true],
+ confidence: detections[:confidence][keep_indices],
+ class_id: detections[:class_id][keep_indices]
+ }
+ end
+
+ def model
+ @model ||= OnnxRuntime::Model.new(
+ MODEL_PATH.to_s,
+ inter_op_num_threads: CPU_THREADS,
+ intra_op_num_threads: CPU_THREADS,
+ enable_mem_pattern: false,
+ enable_cpu_mem_arena: false,
+ providers: ['CPUExecutionProvider']
+ )
+ end
+ # rubocop:enable Metrics
+ end
+end
diff --git a/lib/templates/order.rb b/lib/templates/order.rb
new file mode 100644
index 00000000..e1c7400d
--- /dev/null
+++ b/lib/templates/order.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module Templates
+ module Order
+ module_function
+
+ def call(templates, current_user, order)
+ case order
+ when 'used_at'
+ subquery = Submission.select(:template_id, Submission.arel_table[:created_at].maximum.as('created_at'))
+ .where(account_id: current_user.account_id)
+ .group(:template_id)
+
+ templates = templates.joins(
+ Template.arel_table
+ .join(subquery.arel.as('submissions'), Arel::Nodes::OuterJoin)
+ .on(Template.arel_table[:id].eq(Submission.arel_table[:template_id]))
+ .join_sources
+ )
+
+ templates.order(
+ Arel::Nodes::Case.new
+ .when(Submission.arel_table[:created_at].gt(Template.arel_table[:updated_at]))
+ .then(Submission.arel_table[:created_at])
+ .else(Template.arel_table[:updated_at])
+ .desc
+ )
+ when 'name'
+ templates.order(name: :asc)
+ else
+ templates.order(id: :desc)
+ end
+ end
+ end
+end
diff --git a/lib/templates/process_document.rb b/lib/templates/process_document.rb
index d7f3d36f..6b40a502 100644
--- a/lib/templates/process_document.rb
+++ b/lib/templates/process_document.rb
@@ -6,6 +6,7 @@ module Templates
FORMAT = '.png'
ATTACHMENT_NAME = 'preview_images'
+ BMP_REGEXP = %r{\Aimage/(?:bmp|x-bmp|x-ms-bmp)\z}
PDF_CONTENT_TYPE = 'application/pdf'
CONCURRENCY = 2
Q = 95
@@ -14,6 +15,7 @@ module Templates
MAX_NUMBER_OF_PAGES_PROCESSED = 15
MAX_FLATTEN_FILE_SIZE = 20.megabytes
GENERATE_PREVIEW_SIZE_LIMIT = 50.megabytes
+ US_LETTER_SIZE = { 'width' => MAX_WIDTH, 'height' => 1812 }.freeze
module_function
@@ -22,7 +24,7 @@ module Templates
if extract_fields && data.size < MAX_FLATTEN_FILE_SIZE
pdf = HexaPDF::Document.new(io: StringIO.new(data))
- fields = Templates::FindAcroFields.call(pdf, attachment)
+ fields = Templates::FindAcroFields.call(pdf, attachment, data)
end
generate_pdf_preview_images(attachment, data, pdf, max_pages:)
@@ -35,16 +37,40 @@ module Templates
attachment
end
+ def process(attachment, data, extract_fields: false)
+ if attachment.content_type == PDF_CONTENT_TYPE && extract_fields && data.size < MAX_FLATTEN_FILE_SIZE
+ pdf = HexaPDF::Document.new(io: StringIO.new(data))
+
+ fields = Templates::FindAcroFields.call(pdf, attachment, data)
+ end
+
+ pdf ||= HexaPDF::Document.new(io: StringIO.new(data))
+
+ number_of_pages = pdf.pages.size
+
+ attachment.metadata['pdf'] ||= {}
+ attachment.metadata['pdf']['number_of_pages'] = number_of_pages
+ attachment.metadata['pdf']['fields'] = fields if fields
+
+ attachment
+ end
+
def generate_preview_image(attachment, data)
ActiveStorage::Attachment.where(name: ATTACHMENT_NAME, record: attachment).destroy_all
- image = Vips::Image.new_from_buffer(data, '')
+ image =
+ if BMP_REGEXP.match?(attachment.content_type)
+ LoadBmp.call(data)
+ else
+ Vips::Image.new_from_buffer(data, '')
+ end
+
image = image.autorot.resize(MAX_WIDTH / image.width.to_f)
bitdepth = 2**image.stats.to_a[1..3].pluck(2).uniq.size
io = StringIO.new(image.write_to_buffer(FORMAT, compression: 7, filter: 0, bitdepth:,
- palette: true, Q: bitdepth == 8 ? Q : 5, dither: 0))
+ palette: true, Q: Q, dither: 0))
ActiveStorage::Attachment.create!(
blob: ActiveStorage::Blob.create_and_upload!(
@@ -73,18 +99,22 @@ module Templates
max_pages_to_process = data.size < GENERATE_PREVIEW_SIZE_LIMIT ? max_pages : 1
- generate_document_preview_images(attachment, data, (0..[number_of_pages - 1, max_pages_to_process].min))
+ generate_document_preview_images(attachment, data, 0..[number_of_pages - 1, max_pages_to_process].min)
end
def generate_document_preview_images(attachment, data, range, concurrency: CONCURRENCY)
+ doc = Pdfium::Document.open_bytes(data)
+
pool = Concurrent::FixedThreadPool.new(concurrency)
promises =
range.map do |page_number|
- Concurrent::Promise.execute(executor: pool) { build_and_upload_blob(data, page_number) }
+ Concurrent::Promise.execute(executor: pool) { build_and_upload_blob(doc, page_number) }
end
Concurrent::Promise.zip(*promises).value!.each do |blob|
+ next unless blob
+
ApplicationRecord.no_touching do
ActiveStorage::Attachment.create!(
blob:,
@@ -93,27 +123,44 @@ module Templates
)
end
end
-
- pool.kill
+ ensure
+ doc&.close
+ pool&.kill
end
- def build_and_upload_blob(data, page_number)
- page = Vips::Image.new_from_buffer(data, '', dpi: DPI, page: page_number)
- page = page.resize(MAX_WIDTH / page.width.to_f)
+ def build_and_upload_blob(doc, page_number, format = FORMAT)
+ doc_page = doc.get_page(page_number)
+
+ data, width, height = doc_page.render_to_bitmap(width: MAX_WIDTH)
- bitdepth = 2**page.stats.to_a[1..3].pluck(2).uniq.size
+ page = Vips::Image.new_from_memory(data, width, height, 4, :uchar)
- io = StringIO.new(page.write_to_buffer(FORMAT, compression: 7, filter: 0, bitdepth:,
- palette: true, Q: bitdepth == 8 ? Q : 5, dither: 0))
+ page = page.copy(interpretation: :srgb)
+
+ data =
+ if format == FORMAT
+ bitdepth = 2**page.stats.to_a[1..3].pluck(2).uniq.size
+
+ page.write_to_buffer(format, compression: 7, filter: 0, bitdepth:,
+ palette: true, Q: Q, dither: 0)
+ else
+ page.write_to_buffer(format, interlace: true, Q: JPEG_Q)
+ end
blob = ActiveStorage::Blob.new(
- filename: "#{page_number}#{FORMAT}",
+ filename: "#{page_number}#{format}",
metadata: { analyzed: true, identified: true, width: page.width, height: page.height }
)
- blob.upload(io)
+ blob.upload(StringIO.new(data))
blob
+ rescue Vips::Error, Pdfium::PdfiumError => e
+ Rollbar.warning(e) if defined?(Rollbar)
+
+ nil
+ ensure
+ doc_page&.close
end
def maybe_flatten_form(data, pdf)
@@ -156,35 +203,19 @@ module Templates
end
def generate_pdf_preview_from_file(attachment, file_path, page_number)
- io = StringIO.new
-
- command = [
- 'pdftocairo', '-jpeg', '-jpegopt', "progressive=y,quality=#{JPEG_Q},optimize=y",
- '-scale-to-x', MAX_WIDTH, '-scale-to-y', '-1',
- '-r', DPI, '-f', page_number + 1, '-l', page_number + 1,
- '-singlefile', Shellwords.escape(file_path), '-'
- ].join(' ')
-
- Open3.popen3(command) do |_, stdout, _, _|
- io.write(stdout.read)
-
- io.rewind
- end
-
- page = Vips::Image.new_from_buffer(io.read, '')
+ doc = Pdfium::Document.open_file(file_path)
- io.rewind
+ blob = build_and_upload_blob(doc, page_number, '.jpeg')
ApplicationRecord.no_touching do
ActiveStorage::Attachment.create!(
- blob: ActiveStorage::Blob.create_and_upload!(
- io:, filename: "#{page_number}.jpg",
- metadata: { analyzed: true, identified: true, width: page.width, height: page.height }
- ),
+ blob: blob,
name: ATTACHMENT_NAME,
record: attachment
)
end
+ ensure
+ doc&.close
end
end
end
diff --git a/lib/templates/replace_attachments.rb b/lib/templates/replace_attachments.rb
new file mode 100644
index 00000000..0333d897
--- /dev/null
+++ b/lib/templates/replace_attachments.rb
@@ -0,0 +1,65 @@
+# frozen_string_literal: true
+
+module Templates
+ module ReplaceAttachments
+ module_function
+
+ # rubocop:disable Metrics
+ def call(template, params = {}, extract_fields: false)
+ documents = Templates::CreateAttachments.call(template, params, extract_fields:)
+ submitter = template.submitters.first
+
+ documents.each_with_index do |document, index|
+ replaced_document_schema = template.schema[index]
+
+ template.schema[index] = { attachment_uuid: document.uuid, name: document.filename.base }
+
+ if replaced_document_schema
+ template.fields.each do |field|
+ next if field['areas'].blank?
+
+ field['areas'].each do |area|
+ if area['attachment_uuid'] == replaced_document_schema['attachment_uuid']
+ area['attachment_uuid'] = document.uuid
+ end
+ end
+ end
+ end
+
+ next if template.fields.any? { |f| f['areas']&.any? { |a| a['attachment_uuid'] == document.uuid } }
+ next if submitter.blank? || document.metadata.dig('pdf', 'fields').blank?
+
+ pdf_fields = document.metadata['pdf'].delete('fields').to_a
+ pdf_fields.each { |f| f['submitter_uuid'] = submitter['uuid'] }
+
+ if index.positive? && pdf_fields.present?
+ preview_document = template.schema[index - 1]
+ preview_document_last_field = template.fields.reverse.find do |f|
+ f['areas']&.any? do |a|
+ a['attachment_uuid'] == preview_document[:attachment_uuid]
+ end
+ end
+
+ if preview_document_last_field
+ last_preview_document_field_index = template.fields.find_index do |f|
+ f['uuid'] == preview_document_last_field['uuid']
+ end
+ end
+
+ if last_preview_document_field_index
+ template.fields.insert(index, *pdf_fields)
+ else
+ template.fields += pdf_fields
+ end
+ elsif pdf_fields.present?
+ template.fields += pdf_fields
+
+ template.schema[index]['pending_fields'] = true
+ end
+ end
+
+ documents
+ end
+ # rubocop:enable Metrics
+ end
+end
diff --git a/lib/templates/serialize_for_api.rb b/lib/templates/serialize_for_api.rb
index f5f03ebe..ec9cb628 100644
--- a/lib/templates/serialize_for_api.rb
+++ b/lib/templates/serialize_for_api.rb
@@ -6,7 +6,7 @@ module Templates
only: %w[
id archived_at fields name preferences schema
slug source submitters created_at updated_at
- author_id external_id folder_id
+ author_id external_id folder_id shared_link
],
methods: %i[application_key folder_name],
include: { author: { only: %i[id email first_name last_name] } }
@@ -14,7 +14,8 @@ module Templates
module_function
- def call(template, schema_documents = template.schema_documents.preload(:blob), preview_image_attachments = nil)
+ def call(template, schema_documents: template.schema_documents.preload(:blob), preview_image_attachments: nil,
+ expires_at: Accounts.link_expires_at(Account.new(id: template.account_id)))
json = template.as_json(SERIALIZE_PARAMS)
preview_image_attachments ||=
@@ -25,7 +26,7 @@ module Templates
name: :preview_images)
.preload(:blob)
- json[:documents] = template.schema.filter_map do |item|
+ json['documents'] = template.schema.filter_map do |item|
attachment = schema_documents.find { |e| e.uuid == item['attachment_uuid'] }
unless attachment
@@ -38,11 +39,11 @@ module Templates
first_page_blob ||= attachment.preview_images.joins(:blob).find_by(blob: { filename: ['0.jpg', '0.png'] })&.blob
{
- id: attachment.id,
- uuid: attachment.uuid,
- url: ActiveStorage::Blob.proxy_url(attachment.blob),
- preview_image_url: first_page_blob && ActiveStorage::Blob.proxy_url(first_page_blob),
- filename: attachment.filename
+ 'id' => attachment.id,
+ 'uuid' => attachment.uuid,
+ 'url' => ActiveStorage::Blob.proxy_url(attachment.blob, expires_at:),
+ 'preview_image_url' => first_page_blob && ActiveStorage::Blob.proxy_url(first_page_blob, expires_at:),
+ 'filename' => attachment.filename
}
end
diff --git a/lib/text_utils.rb b/lib/text_utils.rb
index f286311f..e4e7d671 100644
--- a/lib/text_utils.rb
+++ b/lib/text_utils.rb
@@ -2,9 +2,14 @@
module TextUtils
RTL_REGEXP = /[\p{Hebrew}\p{Arabic}]/
- MASK_REGEXP = /[^\s\-_\[\]\(\)\+\?\.\,]/
+ MASK_REGEXP = /[^\s\-_\[\]()+?.,]/
MASK_SYMBOL = 'X'
+ TRANSLITERATIONS =
+ I18n::Backend::Transliterator::HashTransliterator::DEFAULT_APPROXIMATIONS.reject { |_, v| v.length > 1 }
+
+ TRANSLITERATION_REGEXP = Regexp.union(TRANSLITERATIONS.keys)
+
module_function
def rtl?(text)
@@ -15,6 +20,10 @@ module TextUtils
false
end
+ def transliterate(text)
+ text.to_s.gsub(TRANSLITERATION_REGEXP) { |e| TRANSLITERATIONS[e] }
+ end
+
def mask_value(text, unmask_size = 0)
if unmask_size.is_a?(Numeric) && !unmask_size.zero? && unmask_size.abs < text.length
if unmask_size.negative?
diff --git a/lib/time_utils.rb b/lib/time_utils.rb
index 9150b1b9..c1c0d07e 100644
--- a/lib/time_utils.rb
+++ b/lib/time_utils.rb
@@ -53,11 +53,13 @@ module TimeUtils
def format_date_string(string, format, locale)
date = Date.parse(string.to_s)
+ format = format.upcase if format
+
format ||= locale.to_s.ends_with?('US') ? DEFAULT_DATE_FORMAT_US : DEFAULT_DATE_FORMAT
- i18n_format = format.sub(/D+/, DAY_FORMATS[format[/D+/]])
- .sub(/M+/, MONTH_FORMATS[format[/M+/]])
- .sub(/Y+/, YEAR_FORMATS[format[/Y+/]])
+ i18n_format = format.sub(/D+/) { DAY_FORMATS[format[/D+/]] }
+ .sub(/M+/) { MONTH_FORMATS[format[/M+/]] }
+ .sub(/Y+/) { YEAR_FORMATS[format[/Y+/]] }
I18n.l(date, format: i18n_format, locale:)
rescue Date::Error
diff --git a/lib/webhook_urls.rb b/lib/webhook_urls.rb
index e57c802b..50ab4785 100644
--- a/lib/webhook_urls.rb
+++ b/lib/webhook_urls.rb
@@ -1,6 +1,25 @@
# frozen_string_literal: true
module WebhookUrls
+ EVENT_TYPE_TO_JOB_CLASS = {
+ 'form.started' => SendFormStartedWebhookRequestJob,
+ 'form.completed' => SendFormCompletedWebhookRequestJob,
+ 'form.declined' => SendFormDeclinedWebhookRequestJob,
+ 'form.viewed' => SendFormViewedWebhookRequestJob,
+ 'submission.created' => SendSubmissionCreatedWebhookRequestJob,
+ 'submission.completed' => SendSubmissionCompletedWebhookRequestJob,
+ 'submission.expired' => SendSubmissionExpiredWebhookRequestJob,
+ 'submission.archived' => SendSubmissionArchivedWebhookRequestJob,
+ 'template.created' => SendTemplateCreatedWebhookRequestJob,
+ 'template.updated' => SendTemplateUpdatedWebhookRequestJob
+ }.freeze
+
+ EVENT_TYPE_ID_KEYS = {
+ 'form' => 'submitter_id',
+ 'submission' => 'submission_id',
+ 'template' => 'template_id'
+ }.freeze
+
module_function
def for_account_id(account_id, events)
@@ -24,4 +43,26 @@ module WebhookUrls
(account_urls.present? ? WebhookUrl.none : linked_urls)
end
end
+
+ def enqueue_events(records, event_type)
+ args = []
+
+ id_key = EVENT_TYPE_ID_KEYS.fetch(event_type.split('.').first)
+
+ Array.wrap(records).group_by(&:account_id).each do |account_id, account_records|
+ webhook_urls = for_account_id(account_id, event_type)
+
+ account_records.each do |record|
+ event_uuid = SecureRandom.uuid
+
+ webhook_urls.each do |webhook_url|
+ next unless webhook_url.events.include?(event_type)
+
+ args << [{ id_key => record.id, 'webhook_url_id' => webhook_url.id, 'event_uuid' => event_uuid }]
+ end
+ end
+ end
+
+ Sidekiq::Client.push_bulk('class' => EVENT_TYPE_TO_JOB_CLASS[event_type], 'args' => args)
+ end
end
diff --git a/package.json b/package.json
index 096cc9de..4b664b19 100644
--- a/package.json
+++ b/package.json
@@ -6,10 +6,13 @@
"@babel/plugin-transform-runtime": "7.21.4",
"@babel/preset-env": "7.21.5",
"@babel/runtime": "7.21.5",
- "@eid-easy/eideasy-widget": "^2.132.1",
+ "@braintree/sanitize-url": "^7.1.1",
+ "@codemirror/lang-html": "^6.4.9",
+ "@eid-easy/eideasy-widget": "^2.171.0",
"@github/catalyst": "^2.0.0-beta",
"@hotwired/turbo": "https://github.com/docusealco/turbo#main",
"@hotwired/turbo-rails": "^7.3.0",
+ "@specious/htmlflow": "^1.1.0",
"@tabler/icons-vue": "^2.47.0",
"autocompleter": "^9.1.0",
"autoprefixer": "^10.4.14",
@@ -17,10 +20,12 @@
"babel-plugin-dynamic-import-node": "^2.3.3",
"babel-plugin-macros": "^3.1.0",
"canvas-confetti": "^1.6.0",
+ "codemirror": "^6.0.2",
"compression-webpack-plugin": "10.0.0",
"css-loader": "^6.7.3",
"css-minimizer-webpack-plugin": "^5.0.0",
"daisyui": "^3.9.4",
+ "driver.js": "^1.3.5",
"mathjs": "^12.4.0",
"mini-css-extract-plugin": "^2.7.5",
"postcss": "^8.4.31",
@@ -33,7 +38,7 @@
"shakapacker": "8.0.0",
"signature_pad": "^4.1.5",
"snarkdown": "^2.0.0",
- "tailwindcss": "^3.3.2",
+ "tailwindcss": "^3.4.17",
"terser-webpack-plugin": "5.3.8",
"uuid": "^9.0.0",
"vue": "^3.3.2",
@@ -56,7 +61,7 @@
]
},
"browserslist": [
- "last 3 years"
+ "last 5 years"
],
"devDependencies": {
"@babel/eslint-parser": "^7.21.8",
diff --git a/public/preview.png b/public/preview.png
new file mode 100644
index 00000000..9cbbfd0d
Binary files /dev/null and b/public/preview.png differ
diff --git a/spec/factories/email_events.rb b/spec/factories/email_events.rb
new file mode 100644
index 00000000..37b7aa5c
--- /dev/null
+++ b/spec/factories/email_events.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :email_event do
+ account
+ event_type { 'bounce' }
+ message_id { SecureRandom.uuid }
+ tag { 'submitter_invitation' }
+ email { Faker::Internet.email }
+ event_datetime { 1.hour.ago }
+ end
+end
diff --git a/spec/factories/template_accesses.rb b/spec/factories/template_accesses.rb
new file mode 100644
index 00000000..9c33173e
--- /dev/null
+++ b/spec/factories/template_accesses.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :template_access do
+ template
+ user
+ end
+end
diff --git a/spec/factories/templates.rb b/spec/factories/templates.rb
index 8f619353..2091821c 100644
--- a/spec/factories/templates.rb
+++ b/spec/factories/templates.rb
@@ -14,6 +14,7 @@ FactoryBot.define do
%w[text date checkbox radio signature number multiple select initials image file stamp cells phone payment]
end
except_field_types { [] }
+ private_access_user { nil }
end
after(:create) do |template, ev|
@@ -343,5 +344,17 @@ FactoryBot.define do
template.save!
end
+
+ trait :with_admin_only_access do
+ after(:create) do |template|
+ create(:template_access, template:, user_id: TemplateAccess::ADMIN_USER_ID)
+ end
+ end
+
+ trait :with_private_access do
+ after(:create) do |template, ev|
+ create(:template_access, template:, user: ev.private_access_user || template.author)
+ end
+ end
end
end
diff --git a/spec/fixtures/fieldtags.docx b/spec/fixtures/fieldtags.docx
new file mode 100644
index 00000000..50655a04
Binary files /dev/null and b/spec/fixtures/fieldtags.docx differ
diff --git a/spec/jobs/process_submitter_completion_job_spec.rb b/spec/jobs/process_submitter_completion_job_spec.rb
index 632003b3..cb357efc 100644
--- a/spec/jobs/process_submitter_completion_job_spec.rb
+++ b/spec/jobs/process_submitter_completion_job_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe ProcessSubmitterCompletionJob do
let(:account) { create(:account) }
let(:user) { create(:user, account:) }
diff --git a/spec/jobs/send_form_completed_webhook_request_job_spec.rb b/spec/jobs/send_form_completed_webhook_request_job_spec.rb
index b57e74b2..b60a3d9b 100644
--- a/spec/jobs/send_form_completed_webhook_request_job_spec.rb
+++ b/spec/jobs/send_form_completed_webhook_request_job_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe SendFormCompletedWebhookRequestJob do
let(:account) { create(:account) }
let(:user) { create(:user, account:) }
@@ -23,7 +21,8 @@ RSpec.describe SendFormCompletedWebhookRequestJob do
end
it 'sends a webhook request' do
- described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).to have_requested(:post, webhook_url.url).with(
body: {
@@ -40,7 +39,8 @@ RSpec.describe SendFormCompletedWebhookRequestJob do
it 'sends a webhook request with the secret' do
webhook_url.update(secret: { 'X-Secret-Header' => 'secret_value' })
- described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).to have_requested(:post, webhook_url.url).with(
body: {
@@ -59,7 +59,8 @@ RSpec.describe SendFormCompletedWebhookRequestJob do
it "doesn't send a webhook request if the event is not in the webhook's events" do
webhook_url.update!(events: ['form.declined'])
- described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).not_to have_requested(:post, webhook_url.url)
end
@@ -67,8 +68,11 @@ RSpec.describe SendFormCompletedWebhookRequestJob do
it 'sends again if the response status is 400 or higher' do
stub_request(:post, webhook_url.url).to_return(status: 401)
+ event_uuid = SecureRandom.uuid
+
expect do
- described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => event_uuid)
end.to change(described_class.jobs, :size).by(1)
expect(WebMock).to have_requested(:post, webhook_url.url).once
@@ -77,6 +81,7 @@ RSpec.describe SendFormCompletedWebhookRequestJob do
expect(args['attempt']).to eq(1)
expect(args['last_status']).to eq(401)
+ expect(args['event_uuid']).to eq(event_uuid)
expect(args['webhook_url_id']).to eq(webhook_url.id)
expect(args['submitter_id']).to eq(submitter.id)
end
@@ -85,7 +90,8 @@ RSpec.describe SendFormCompletedWebhookRequestJob do
stub_request(:post, webhook_url.url).to_return(status: 401)
expect do
- described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id, 'attempt' => 21)
+ described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid, 'attempt' => 21)
end.not_to change(described_class.jobs, :size)
expect(WebMock).to have_requested(:post, webhook_url.url).once
diff --git a/spec/jobs/send_form_declined_webhook_request_job_spec.rb b/spec/jobs/send_form_declined_webhook_request_job_spec.rb
index c53a1999..8e9d2d0d 100644
--- a/spec/jobs/send_form_declined_webhook_request_job_spec.rb
+++ b/spec/jobs/send_form_declined_webhook_request_job_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe SendFormDeclinedWebhookRequestJob do
let(:account) { create(:account) }
let(:user) { create(:user, account:) }
@@ -23,7 +21,8 @@ RSpec.describe SendFormDeclinedWebhookRequestJob do
end
it 'sends a webhook request' do
- described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).to have_requested(:post, webhook_url.url).with(
body: {
@@ -40,7 +39,8 @@ RSpec.describe SendFormDeclinedWebhookRequestJob do
it 'sends a webhook request with the secret' do
webhook_url.update(secret: { 'X-Secret-Header' => 'secret_value' })
- described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).to have_requested(:post, webhook_url.url).with(
body: {
@@ -59,7 +59,8 @@ RSpec.describe SendFormDeclinedWebhookRequestJob do
it "doesn't send a webhook request if the event is not in the webhook's events" do
webhook_url.update!(events: ['form.completed'])
- described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).not_to have_requested(:post, webhook_url.url)
end
@@ -67,8 +68,11 @@ RSpec.describe SendFormDeclinedWebhookRequestJob do
it 'sends again if the response status is 400 or higher' do
stub_request(:post, webhook_url.url).to_return(status: 401)
+ event_uuid = SecureRandom.uuid
+
expect do
- described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => event_uuid)
end.to change(described_class.jobs, :size).by(1)
expect(WebMock).to have_requested(:post, webhook_url.url).once
@@ -77,6 +81,7 @@ RSpec.describe SendFormDeclinedWebhookRequestJob do
expect(args['attempt']).to eq(1)
expect(args['last_status']).to eq(401)
+ expect(args['event_uuid']).to eq(event_uuid)
expect(args['webhook_url_id']).to eq(webhook_url.id)
expect(args['submitter_id']).to eq(submitter.id)
end
@@ -85,7 +90,8 @@ RSpec.describe SendFormDeclinedWebhookRequestJob do
stub_request(:post, webhook_url.url).to_return(status: 401)
expect do
- described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id, 'attempt' => 11)
+ described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid, 'attempt' => 11)
end.not_to change(described_class.jobs, :size)
expect(WebMock).to have_requested(:post, webhook_url.url).once
diff --git a/spec/jobs/send_form_started_webhook_request_job_spec.rb b/spec/jobs/send_form_started_webhook_request_job_spec.rb
index 929a2187..e09f4205 100644
--- a/spec/jobs/send_form_started_webhook_request_job_spec.rb
+++ b/spec/jobs/send_form_started_webhook_request_job_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe SendFormStartedWebhookRequestJob do
let(:account) { create(:account) }
let(:user) { create(:user, account:) }
@@ -23,7 +21,8 @@ RSpec.describe SendFormStartedWebhookRequestJob do
end
it 'sends a webhook request' do
- described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).to have_requested(:post, webhook_url.url).with(
body: {
@@ -40,7 +39,8 @@ RSpec.describe SendFormStartedWebhookRequestJob do
it 'sends a webhook request with the secret' do
webhook_url.update(secret: { 'X-Secret-Header' => 'secret_value' })
- described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).to have_requested(:post, webhook_url.url).with(
body: {
@@ -59,7 +59,8 @@ RSpec.describe SendFormStartedWebhookRequestJob do
it "doesn't send a webhook request if the event is not in the webhook's events" do
webhook_url.update!(events: ['form.declined'])
- described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).not_to have_requested(:post, webhook_url.url)
end
@@ -67,8 +68,11 @@ RSpec.describe SendFormStartedWebhookRequestJob do
it 'sends again if the response status is 400 or higher' do
stub_request(:post, webhook_url.url).to_return(status: 401)
+ event_uuid = SecureRandom.uuid
+
expect do
- described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => event_uuid)
end.to change(described_class.jobs, :size).by(1)
expect(WebMock).to have_requested(:post, webhook_url.url).once
@@ -77,6 +81,7 @@ RSpec.describe SendFormStartedWebhookRequestJob do
expect(args['attempt']).to eq(1)
expect(args['last_status']).to eq(401)
+ expect(args['event_uuid']).to eq(event_uuid)
expect(args['webhook_url_id']).to eq(webhook_url.id)
expect(args['submitter_id']).to eq(submitter.id)
end
@@ -85,7 +90,8 @@ RSpec.describe SendFormStartedWebhookRequestJob do
stub_request(:post, webhook_url.url).to_return(status: 401)
expect do
- described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id, 'attempt' => 11)
+ described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid, 'attempt' => 11)
end.not_to change(described_class.jobs, :size)
expect(WebMock).to have_requested(:post, webhook_url.url).once
diff --git a/spec/jobs/send_form_viewed_webhook_request_job_spec.rb b/spec/jobs/send_form_viewed_webhook_request_job_spec.rb
index c3c7c216..31026341 100644
--- a/spec/jobs/send_form_viewed_webhook_request_job_spec.rb
+++ b/spec/jobs/send_form_viewed_webhook_request_job_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe SendFormViewedWebhookRequestJob do
let(:account) { create(:account) }
let(:user) { create(:user, account:) }
@@ -23,7 +21,8 @@ RSpec.describe SendFormViewedWebhookRequestJob do
end
it 'sends a webhook request' do
- described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).to have_requested(:post, webhook_url.url).with(
body: {
@@ -40,7 +39,8 @@ RSpec.describe SendFormViewedWebhookRequestJob do
it 'sends a webhook request with the secret' do
webhook_url.update(secret: { 'X-Secret-Header' => 'secret_value' })
- described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).to have_requested(:post, webhook_url.url).with(
body: {
@@ -59,7 +59,8 @@ RSpec.describe SendFormViewedWebhookRequestJob do
it "doesn't send a webhook request if the event is not in the webhook's events" do
webhook_url.update!(events: ['form.started'])
- described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).not_to have_requested(:post, webhook_url.url)
end
@@ -67,8 +68,11 @@ RSpec.describe SendFormViewedWebhookRequestJob do
it 'sends again if the response status is 400 or higher' do
stub_request(:post, webhook_url.url).to_return(status: 401)
+ event_uuid = SecureRandom.uuid
+
expect do
- described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => event_uuid)
end.to change(described_class.jobs, :size).by(1)
expect(WebMock).to have_requested(:post, webhook_url.url).once
@@ -77,6 +81,7 @@ RSpec.describe SendFormViewedWebhookRequestJob do
expect(args['attempt']).to eq(1)
expect(args['last_status']).to eq(401)
+ expect(args['event_uuid']).to eq(event_uuid)
expect(args['webhook_url_id']).to eq(webhook_url.id)
expect(args['submitter_id']).to eq(submitter.id)
end
@@ -85,7 +90,8 @@ RSpec.describe SendFormViewedWebhookRequestJob do
stub_request(:post, webhook_url.url).to_return(status: 401)
expect do
- described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id, 'attempt' => 11)
+ described_class.new.perform('submitter_id' => submitter.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid, 'attempt' => 11)
end.not_to change(described_class.jobs, :size)
expect(WebMock).to have_requested(:post, webhook_url.url).once
diff --git a/spec/jobs/send_submission_archived_webhook_request_job_spec.rb b/spec/jobs/send_submission_archived_webhook_request_job_spec.rb
index 05947f33..6124ebe3 100644
--- a/spec/jobs/send_submission_archived_webhook_request_job_spec.rb
+++ b/spec/jobs/send_submission_archived_webhook_request_job_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe SendSubmissionArchivedWebhookRequestJob do
let(:account) { create(:account) }
let(:user) { create(:user, account:) }
@@ -20,7 +18,8 @@ RSpec.describe SendSubmissionArchivedWebhookRequestJob do
end
it 'sends a webhook request' do
- described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).to have_requested(:post, webhook_url.url).with(
body: {
@@ -37,7 +36,8 @@ RSpec.describe SendSubmissionArchivedWebhookRequestJob do
it 'sends a webhook request with the secret' do
webhook_url.update(secret: { 'X-Secret-Header' => 'secret_value' })
- described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).to have_requested(:post, webhook_url.url).with(
body: {
@@ -56,7 +56,8 @@ RSpec.describe SendSubmissionArchivedWebhookRequestJob do
it "doesn't send a webhook request if the event is not in the webhook's events" do
webhook_url.update!(events: ['submission.created'])
- described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).not_to have_requested(:post, webhook_url.url)
end
@@ -64,8 +65,11 @@ RSpec.describe SendSubmissionArchivedWebhookRequestJob do
it 'sends again if the response status is 400 or higher' do
stub_request(:post, webhook_url.url).to_return(status: 401)
+ event_uuid = SecureRandom.uuid
+
expect do
- described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => event_uuid)
end.to change(described_class.jobs, :size).by(1)
expect(WebMock).to have_requested(:post, webhook_url.url).once
@@ -74,6 +78,7 @@ RSpec.describe SendSubmissionArchivedWebhookRequestJob do
expect(args['attempt']).to eq(1)
expect(args['last_status']).to eq(401)
+ expect(args['event_uuid']).to eq(event_uuid)
expect(args['webhook_url_id']).to eq(webhook_url.id)
expect(args['submission_id']).to eq(submission.id)
end
@@ -83,7 +88,7 @@ RSpec.describe SendSubmissionArchivedWebhookRequestJob do
expect do
described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id,
- 'attempt' => 11)
+ 'event_uuid' => SecureRandom.uuid, 'attempt' => 11)
end.not_to change(described_class.jobs, :size)
expect(WebMock).to have_requested(:post, webhook_url.url).once
diff --git a/spec/jobs/send_submission_completed_webhook_request_job_spec.rb b/spec/jobs/send_submission_completed_webhook_request_job_spec.rb
index e2f0d26e..97ec0b69 100644
--- a/spec/jobs/send_submission_completed_webhook_request_job_spec.rb
+++ b/spec/jobs/send_submission_completed_webhook_request_job_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe SendSubmissionCompletedWebhookRequestJob do
let(:account) { create(:account) }
let(:user) { create(:user, account:) }
@@ -20,7 +18,8 @@ RSpec.describe SendSubmissionCompletedWebhookRequestJob do
end
it 'sends a webhook request' do
- described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).to have_requested(:post, webhook_url.url).with(
body: {
@@ -37,7 +36,8 @@ RSpec.describe SendSubmissionCompletedWebhookRequestJob do
it 'sends a webhook request with the secret' do
webhook_url.update(secret: { 'X-Secret-Header' => 'secret_value' })
- described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).to have_requested(:post, webhook_url.url).with(
body: {
@@ -56,7 +56,8 @@ RSpec.describe SendSubmissionCompletedWebhookRequestJob do
it "doesn't send a webhook request if the event is not in the webhook's events" do
webhook_url.update!(events: ['submission.archived'])
- described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).not_to have_requested(:post, webhook_url.url)
end
@@ -64,8 +65,11 @@ RSpec.describe SendSubmissionCompletedWebhookRequestJob do
it 'sends again if the response status is 400 or higher' do
stub_request(:post, webhook_url.url).to_return(status: 401)
+ event_uuid = SecureRandom.uuid
+
expect do
- described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => event_uuid)
end.to change(described_class.jobs, :size).by(1)
expect(WebMock).to have_requested(:post, webhook_url.url).once
@@ -74,6 +78,7 @@ RSpec.describe SendSubmissionCompletedWebhookRequestJob do
expect(args['attempt']).to eq(1)
expect(args['last_status']).to eq(401)
+ expect(args['event_uuid']).to eq(event_uuid)
expect(args['webhook_url_id']).to eq(webhook_url.id)
expect(args['submission_id']).to eq(submission.id)
end
@@ -83,7 +88,7 @@ RSpec.describe SendSubmissionCompletedWebhookRequestJob do
expect do
described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id,
- 'attempt' => 21)
+ 'event_uuid' => SecureRandom.uuid, 'attempt' => 21)
end.not_to change(described_class.jobs, :size)
expect(WebMock).to have_requested(:post, webhook_url.url).once
diff --git a/spec/jobs/send_submission_created_webhook_request_job_spec.rb b/spec/jobs/send_submission_created_webhook_request_job_spec.rb
index 1b2e02fe..e80b97a6 100644
--- a/spec/jobs/send_submission_created_webhook_request_job_spec.rb
+++ b/spec/jobs/send_submission_created_webhook_request_job_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe SendSubmissionCreatedWebhookRequestJob do
let(:account) { create(:account) }
let(:user) { create(:user, account:) }
@@ -20,7 +18,8 @@ RSpec.describe SendSubmissionCreatedWebhookRequestJob do
end
it 'sends a webhook request' do
- described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).to have_requested(:post, webhook_url.url).with(
body: {
@@ -37,7 +36,8 @@ RSpec.describe SendSubmissionCreatedWebhookRequestJob do
it 'sends a webhook request with the secret' do
webhook_url.update(secret: { 'X-Secret-Header' => 'secret_value' })
- described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).to have_requested(:post, webhook_url.url).with(
body: {
@@ -56,7 +56,8 @@ RSpec.describe SendSubmissionCreatedWebhookRequestJob do
it "doesn't send a webhook request if the event is not in the webhook's events" do
webhook_url.update!(events: ['submission.completed'])
- described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).not_to have_requested(:post, webhook_url.url)
end
@@ -64,8 +65,11 @@ RSpec.describe SendSubmissionCreatedWebhookRequestJob do
it 'sends again if the response status is 400 or higher' do
stub_request(:post, webhook_url.url).to_return(status: 401)
+ event_uuid = SecureRandom.uuid
+
expect do
- described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => event_uuid)
end.to change(described_class.jobs, :size).by(1)
expect(WebMock).to have_requested(:post, webhook_url.url).once
@@ -74,6 +78,7 @@ RSpec.describe SendSubmissionCreatedWebhookRequestJob do
expect(args['attempt']).to eq(1)
expect(args['last_status']).to eq(401)
+ expect(args['event_uuid']).to eq(event_uuid)
expect(args['webhook_url_id']).to eq(webhook_url.id)
expect(args['submission_id']).to eq(submission.id)
end
@@ -83,7 +88,7 @@ RSpec.describe SendSubmissionCreatedWebhookRequestJob do
expect do
described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id,
- 'attempt' => 11)
+ 'event_uuid' => SecureRandom.uuid, 'attempt' => 11)
end.not_to change(described_class.jobs, :size)
expect(WebMock).to have_requested(:post, webhook_url.url).once
diff --git a/spec/jobs/send_submission_expired_webhook_request_job_spec.rb b/spec/jobs/send_submission_expired_webhook_request_job_spec.rb
new file mode 100644
index 00000000..dbce55ba
--- /dev/null
+++ b/spec/jobs/send_submission_expired_webhook_request_job_spec.rb
@@ -0,0 +1,97 @@
+# frozen_string_literal: true
+
+RSpec.describe SendSubmissionExpiredWebhookRequestJob do
+ let(:account) { create(:account) }
+ let(:user) { create(:user, account:) }
+ let(:template) { create(:template, account:, author: user) }
+ let(:submission) { create(:submission, :with_submitters, template:, created_by_user: user, expire_at: 1.day.ago) }
+ let(:webhook_url) { create(:webhook_url, account:, events: ['submission.expired']) }
+
+ before do
+ create(:encrypted_config, key: EncryptedConfig::ESIGN_CERTS_KEY,
+ value: GenerateCertificate.call.transform_values(&:to_pem))
+ end
+
+ describe '#perform' do
+ before do
+ stub_request(:post, webhook_url.url).to_return(status: 200)
+ end
+
+ it 'sends a webhook request' do
+ described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
+
+ expect(WebMock).to have_requested(:post, webhook_url.url).with(
+ body: {
+ 'event_type' => 'submission.expired',
+ 'timestamp' => /.*/,
+ 'data' => JSON.parse(Submissions::SerializeForApi.call(submission.reload).to_json)
+ },
+ headers: {
+ 'Content-Type' => 'application/json',
+ 'User-Agent' => 'DocuSeal.com Webhook'
+ }
+ ).once
+ end
+
+ it 'sends a webhook request with the secret' do
+ webhook_url.update(secret: { 'X-Secret-Header' => 'secret_value' })
+ described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
+
+ expect(WebMock).to have_requested(:post, webhook_url.url).with(
+ body: {
+ 'event_type' => 'submission.expired',
+ 'timestamp' => /.*/,
+ 'data' => JSON.parse(Submissions::SerializeForApi.call(submission.reload).to_json)
+ },
+ headers: {
+ 'Content-Type' => 'application/json',
+ 'User-Agent' => 'DocuSeal.com Webhook',
+ 'X-Secret-Header' => 'secret_value'
+ }
+ ).once
+ end
+
+ it "doesn't send a webhook request if the event is not in the webhook's events" do
+ webhook_url.update!(events: ['submission.archived'])
+
+ described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
+
+ expect(WebMock).not_to have_requested(:post, webhook_url.url)
+ end
+
+ it 'sends again if the response status is 400 or higher' do
+ stub_request(:post, webhook_url.url).to_return(status: 401)
+
+ event_uuid = SecureRandom.uuid
+
+ expect do
+ described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => event_uuid)
+ end.to change(described_class.jobs, :size).by(1)
+
+ expect(WebMock).to have_requested(:post, webhook_url.url).once
+
+ args = described_class.jobs.last['args'].first
+
+ expect(args['attempt']).to eq(1)
+ expect(args['last_status']).to eq(401)
+ expect(args['event_uuid']).to eq(event_uuid)
+ expect(args['webhook_url_id']).to eq(webhook_url.id)
+ expect(args['submission_id']).to eq(submission.id)
+ end
+
+ it "doesn't send again if the max attempts is reached" do
+ stub_request(:post, webhook_url.url).to_return(status: 401)
+
+ expect do
+ described_class.new.perform('submission_id' => submission.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid, 'attempt' => 21)
+ end.not_to change(described_class.jobs, :size)
+
+ expect(WebMock).to have_requested(:post, webhook_url.url).once
+ end
+ end
+end
diff --git a/spec/jobs/send_template_created_webhook_request_job_spec.rb b/spec/jobs/send_template_created_webhook_request_job_spec.rb
index 14df0b3e..e5ce6f10 100644
--- a/spec/jobs/send_template_created_webhook_request_job_spec.rb
+++ b/spec/jobs/send_template_created_webhook_request_job_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe SendTemplateCreatedWebhookRequestJob do
let(:account) { create(:account) }
let(:user) { create(:user, account:) }
@@ -19,7 +17,8 @@ RSpec.describe SendTemplateCreatedWebhookRequestJob do
end
it 'sends a webhook request' do
- described_class.new.perform('template_id' => template.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('template_id' => template.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).to have_requested(:post, webhook_url.url).with(
body: {
@@ -36,7 +35,8 @@ RSpec.describe SendTemplateCreatedWebhookRequestJob do
it 'sends a webhook request with the secret' do
webhook_url.update(secret: { 'X-Secret-Header' => 'secret_value' })
- described_class.new.perform('template_id' => template.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('template_id' => template.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).to have_requested(:post, webhook_url.url).with(
body: {
@@ -55,7 +55,8 @@ RSpec.describe SendTemplateCreatedWebhookRequestJob do
it "doesn't send a webhook request if the event is not in the webhook's events" do
webhook_url.update!(events: ['template.updated'])
- described_class.new.perform('template_id' => template.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('template_id' => template.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).not_to have_requested(:post, webhook_url.url)
end
@@ -63,8 +64,11 @@ RSpec.describe SendTemplateCreatedWebhookRequestJob do
it 'sends again if the response status is 400 or higher' do
stub_request(:post, webhook_url.url).to_return(status: 401)
+ event_uuid = SecureRandom.uuid
+
expect do
- described_class.new.perform('template_id' => template.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('template_id' => template.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => event_uuid)
end.to change(described_class.jobs, :size).by(1)
expect(WebMock).to have_requested(:post, webhook_url.url).once
@@ -73,6 +77,7 @@ RSpec.describe SendTemplateCreatedWebhookRequestJob do
expect(args['attempt']).to eq(1)
expect(args['last_status']).to eq(401)
+ expect(args['event_uuid']).to eq(event_uuid)
expect(args['webhook_url_id']).to eq(webhook_url.id)
expect(args['template_id']).to eq(template.id)
end
@@ -81,7 +86,8 @@ RSpec.describe SendTemplateCreatedWebhookRequestJob do
stub_request(:post, webhook_url.url).to_return(status: 401)
expect do
- described_class.new.perform('template_id' => template.id, 'webhook_url_id' => webhook_url.id, 'attempt' => 11)
+ described_class.new.perform('template_id' => template.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid, 'attempt' => 11)
end.not_to change(described_class.jobs, :size)
expect(WebMock).to have_requested(:post, webhook_url.url).once
diff --git a/spec/jobs/send_template_updated_webhook_request_job_spec.rb b/spec/jobs/send_template_updated_webhook_request_job_spec.rb
index 4451b071..f13675a1 100644
--- a/spec/jobs/send_template_updated_webhook_request_job_spec.rb
+++ b/spec/jobs/send_template_updated_webhook_request_job_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe SendTemplateUpdatedWebhookRequestJob do
let(:account) { create(:account) }
let(:user) { create(:user, account:) }
@@ -19,7 +17,8 @@ RSpec.describe SendTemplateUpdatedWebhookRequestJob do
end
it 'sends a webhook request' do
- described_class.new.perform('template_id' => template.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('template_id' => template.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).to have_requested(:post, webhook_url.url).with(
body: {
@@ -36,7 +35,8 @@ RSpec.describe SendTemplateUpdatedWebhookRequestJob do
it 'sends a webhook request with the secret' do
webhook_url.update(secret: { 'X-Secret-Header' => 'secret_value' })
- described_class.new.perform('template_id' => template.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('template_id' => template.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).to have_requested(:post, webhook_url.url).with(
body: {
@@ -55,7 +55,8 @@ RSpec.describe SendTemplateUpdatedWebhookRequestJob do
it "doesn't send a webhook request if the event is not in the webhook's events" do
webhook_url.update!(events: ['template.created'])
- described_class.new.perform('template_id' => template.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('template_id' => template.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid)
expect(WebMock).not_to have_requested(:post, webhook_url.url)
end
@@ -63,8 +64,11 @@ RSpec.describe SendTemplateUpdatedWebhookRequestJob do
it 'sends again if the response status is 400 or higher' do
stub_request(:post, webhook_url.url).to_return(status: 401)
+ event_uuid = SecureRandom.uuid
+
expect do
- described_class.new.perform('template_id' => template.id, 'webhook_url_id' => webhook_url.id)
+ described_class.new.perform('template_id' => template.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => event_uuid)
end.to change(described_class.jobs, :size).by(1)
expect(WebMock).to have_requested(:post, webhook_url.url).once
@@ -73,6 +77,7 @@ RSpec.describe SendTemplateUpdatedWebhookRequestJob do
expect(args['attempt']).to eq(1)
expect(args['last_status']).to eq(401)
+ expect(args['event_uuid']).to eq(event_uuid)
expect(args['webhook_url_id']).to eq(webhook_url.id)
expect(args['template_id']).to eq(template.id)
end
@@ -81,7 +86,8 @@ RSpec.describe SendTemplateUpdatedWebhookRequestJob do
stub_request(:post, webhook_url.url).to_return(status: 401)
expect do
- described_class.new.perform('template_id' => template.id, 'webhook_url_id' => webhook_url.id, 'attempt' => 11)
+ described_class.new.perform('template_id' => template.id, 'webhook_url_id' => webhook_url.id,
+ 'event_uuid' => SecureRandom.uuid, 'attempt' => 11)
end.not_to change(described_class.jobs, :size)
expect(WebMock).to have_requested(:post, webhook_url.url).once
diff --git a/spec/lib/params/base_validator_spec.rb b/spec/lib/params/base_validator_spec.rb
index 5a00e188..7021a6b3 100644
--- a/spec/lib/params/base_validator_spec.rb
+++ b/spec/lib/params/base_validator_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe Params::BaseValidator do
let(:validator) { described_class.new({}) }
diff --git a/spec/mailers/previews/template_mailer_preview.rb b/spec/mailers/previews/template_mailer_preview.rb
new file mode 100644
index 00000000..f6d8326b
--- /dev/null
+++ b/spec/mailers/previews/template_mailer_preview.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class TemplateMailerPreview < ActionMailer::Preview
+ def otp_verification_email
+ template = Template.active.last
+
+ TemplateMailer.otp_verification_email(template, email: 'john.doe@example.com')
+ end
+end
diff --git a/spec/requests/submissions_spec.rb b/spec/requests/submissions_spec.rb
index 502f6520..82698613 100644
--- a/spec/requests/submissions_spec.rb
+++ b/spec/requests/submissions_spec.rb
@@ -1,8 +1,6 @@
# frozen_string_literal: true
-require 'rails_helper'
-
-describe 'Submission API', type: :request do
+describe 'Submission API' do
let(:account) { create(:account, :with_testing_account) }
let(:testing_account) { account.testing_accounts.first }
let(:author) { create(:user, account:) }
@@ -104,6 +102,21 @@ describe 'Submission API', type: :request do
expect(response.parsed_body).to eq(JSON.parse(create_submission_body(submission).to_json))
end
+ it 'creates a submission when the submitter is marked as completed' do
+ post '/api/submissions', headers: { 'x-auth-token': author.access_token.token }, params: {
+ template_id: templates[0].id,
+ submitters: [{ role: 'First Party', email: 'john.doe@example.com', completed: true }]
+ }.to_json
+
+ expect(response).to have_http_status(:ok)
+
+ submission = Submission.last
+ submitter = submission.submitters.first
+
+ expect(submitter.status).to eq('completed')
+ expect(submitter.completed_at).not_to be_nil
+ end
+
it 'creates a submission when some submitter roles are not provided' do
post '/api/submissions', headers: { 'x-auth-token': author.access_token.token }, params: {
template_id: multiple_submitters_template.id,
@@ -138,7 +151,7 @@ describe 'Submission API', type: :request do
]
}.to_json
- expect(response).to have_http_status(:unprocessable_entity)
+ expect(response).to have_http_status(:unprocessable_content)
expect(response.parsed_body).to eq({ 'error' => 'email is invalid in `submitters[0]`.' })
end
@@ -152,7 +165,7 @@ describe 'Submission API', type: :request do
submitters: [{ role: 'First Party', email: 'john.doe@example.com' }]
}.to_json
- expect(response).to have_http_status(:unprocessable_entity)
+ expect(response).to have_http_status(:unprocessable_content)
expect(response.parsed_body).to eq({ 'error' => 'Template does not contain fields' })
end
@@ -166,7 +179,7 @@ describe 'Submission API', type: :request do
]
}.to_json
- expect(response).to have_http_status(:unprocessable_entity)
+ expect(response).to have_http_status(:unprocessable_content)
expect(response.parsed_body).to eq({ 'error' => 'role must be unique in `submitters`.' })
end
@@ -180,7 +193,7 @@ describe 'Submission API', type: :request do
]
}.to_json
- expect(response).to have_http_status(:unprocessable_entity)
+ expect(response).to have_http_status(:unprocessable_content)
expect(response.parsed_body).to eq({ 'error' => 'Defined more signing parties than in template' })
end
@@ -196,7 +209,7 @@ describe 'Submission API', type: :request do
}
}.to_json
- expect(response).to have_http_status(:unprocessable_entity)
+ expect(response).to have_http_status(:unprocessable_content)
expect(response.parsed_body).to eq({ 'error' => 'body is required in `message`.' })
end
end
@@ -222,7 +235,7 @@ describe 'Submission API', type: :request do
emails: 'amy.baker@example.com, george.morris@example.com@gmail.com'
}.to_json
- expect(response).to have_http_status(:unprocessable_entity)
+ expect(response).to have_http_status(:unprocessable_content)
expect(response.parsed_body).to eq({ 'error' => 'emails are invalid' })
end
@@ -275,6 +288,7 @@ describe 'Submission API', type: :request do
{
id: submission.id,
+ name: submission.name,
source: 'link',
submitters_order: 'random',
slug: submission.slug,
@@ -284,6 +298,7 @@ describe 'Submission API', type: :request do
completed_at: nil,
created_at: submission.created_at,
updated_at: submission.updated_at,
+ variables: {},
archived_at: nil,
status: 'pending',
submitters:,
@@ -333,6 +348,7 @@ describe 'Submission API', type: :request do
{
id: submission.id,
+ name: submission.name,
source: 'link',
status: 'pending',
submitters_order: 'random',
@@ -343,6 +359,7 @@ describe 'Submission API', type: :request do
completed_at: nil,
created_at: submission.created_at,
updated_at: submission.updated_at,
+ variables: {},
archived_at: nil,
submitters:,
template: {
@@ -395,7 +412,7 @@ describe 'Submission API', type: :request do
preferences: { send_email: true, send_sms: false },
role: submitter.template.submitters.find { |s| s['uuid'] == submitter.uuid }['name'],
embed_src: "#{Docuseal::DEFAULT_APP_URL}/s/#{submitter.slug}",
- values: []
+ values: Submitters::SerializeForWebhook.build_values_array(submitter)
}
end
end
diff --git a/spec/requests/submitters_spec.rb b/spec/requests/submitters_spec.rb
index ffe35cd9..faa7dd4d 100644
--- a/spec/requests/submitters_spec.rb
+++ b/spec/requests/submitters_spec.rb
@@ -1,8 +1,6 @@
# frozen_string_literal: true
-require 'rails_helper'
-
-describe 'Submitter API', type: :request do
+describe 'Submitter API' do
let(:account) { create(:account, :with_testing_account) }
let(:testing_account) { account.testing_accounts.first }
let(:author) { create(:user, account:) }
@@ -95,6 +93,23 @@ describe 'Submitter API', type: :request do
expect(submitter.email).to eq('john.doe+updated@example.com')
expect(response.parsed_body).to eq(JSON.parse(update_submitter_body(submitter).to_json))
end
+
+ it 'marks a submitter as completed' do
+ submitter = create(:submission, :with_submitters, :with_events,
+ template: templates[0],
+ created_by_user: author).submitters.first
+
+ put "/api/submitters/#{submitter.id}", headers: { 'x-auth-token': author.access_token.token }, params: {
+ completed: true
+ }.to_json
+
+ expect(response).to have_http_status(:ok)
+
+ submitter.reload
+
+ expect(submitter.status).to eq('completed')
+ expect(submitter.completed_at).not_to be_nil
+ end
end
private
@@ -134,8 +149,8 @@ describe 'Submitter API', type: :request do
data: event.data.slice(:reason)
}
end,
- values: [],
- documents: [],
+ values: Submitters::SerializeForWebhook.build_values_array(submitter),
+ documents: Submitters::SerializeForWebhook.build_documents_array(submitter),
role: submitter.template.submitters.find { |s| s['uuid'] == submitter.uuid }['name']
}
end
diff --git a/spec/requests/templates_spec.rb b/spec/requests/templates_spec.rb
index 3d6e1284..94c4205b 100644
--- a/spec/requests/templates_spec.rb
+++ b/spec/requests/templates_spec.rb
@@ -1,8 +1,6 @@
# frozen_string_literal: true
-require 'rails_helper'
-
-describe 'Templates API', type: :request do
+describe 'Templates API' do
let(:account) { create(:account, :with_testing_account) }
let(:testing_account) { account.testing_accounts.first }
let(:author) { create(:user, account:) }
@@ -10,6 +8,10 @@ describe 'Templates API', type: :request do
let(:folder) { create(:template_folder, account:) }
let(:template_preferences) { { 'request_email_subject' => 'Subject text', 'request_email_body' => 'Body Text' } }
+ before do
+ allow(Accounts).to receive(:link_expires_at).and_return(Accounts::LINK_EXPIRES_AT)
+ end
+
describe 'GET /api/templates' do
it 'returns a list of templates' do
templates = [
@@ -85,13 +87,15 @@ describe 'Templates API', type: :request do
end
describe 'PUT /api/templates' do
- it 'update a template' do
- template = create(:template, account:,
- author:,
- folder:,
- external_id: SecureRandom.base58(10),
- preferences: template_preferences)
+ let(:template) do
+ create(:template, account:,
+ author:,
+ folder:,
+ external_id: SecureRandom.base58(10),
+ preferences: template_preferences)
+ end
+ it 'updates a template' do
put "/api/templates/#{template.id}", headers: { 'x-auth-token': author.access_token.token }, params: {
name: 'Updated Template Name',
external_id: '123456'
@@ -108,6 +112,24 @@ describe 'Templates API', type: :request do
updated_at: template.updated_at
}.to_json))
end
+
+ it "enables the template's shared link" do
+ expect do
+ put "/api/templates/#{template.id}", headers: { 'x-auth-token': author.access_token.token }, params: {
+ shared_link: true
+ }.to_json
+ end.to change { template.reload.shared_link }.from(false).to(true)
+ end
+
+ it "disables the template's shared link" do
+ template.update(shared_link: true)
+
+ expect do
+ put "/api/templates/#{template.id}", headers: { 'x-auth-token': author.access_token.token }, params: {
+ shared_link: false
+ }.to_json
+ end.to change { template.reload.shared_link }.from(true).to(false)
+ end
end
describe 'DELETE /api/templates/:id' do
@@ -193,8 +215,8 @@ describe 'Templates API', type: :request do
{
id: template.documents.first.id,
uuid: template.documents.first.uuid,
- url: ActiveStorage::Blob.proxy_url(attachment.blob),
- preview_image_url: ActiveStorage::Blob.proxy_url(first_page_blob),
+ url: ActiveStorage::Blob.proxy_url(attachment.blob, expires_at: Accounts::LINK_EXPIRES_AT),
+ preview_image_url: ActiveStorage::Blob.proxy_url(first_page_blob, expires_at: Accounts::LINK_EXPIRES_AT),
filename: 'sample-document.pdf'
}
],
@@ -208,6 +230,7 @@ describe 'Templates API', type: :request do
name: 'sample-document'
}
],
+ shared_link: template.shared_link,
author_id: author.id,
archived_at: nil,
created_at: template.created_at,
@@ -216,7 +239,7 @@ describe 'Templates API', type: :request do
folder_name: folder.name,
source: 'native',
external_id: template.external_id,
- application_key: template.external_id # Backward compatibility
+ application_key: template.external_id
}
end
diff --git a/spec/requests/tools_spec.rb b/spec/requests/tools_spec.rb
index b51f771c..3de12fcc 100644
--- a/spec/requests/tools_spec.rb
+++ b/spec/requests/tools_spec.rb
@@ -1,8 +1,6 @@
# frozen_string_literal: true
-require 'rails_helper'
-
-describe 'Tools API', type: :request do
+describe 'Tools API' do
let(:account) { create(:account) }
let(:author) { create(:user, account:) }
let(:file_path) { Rails.root.join('spec/fixtures/sample-document.pdf') }
diff --git a/spec/signing_form_helper.rb b/spec/signing_form_helper.rb
index 6d86484b..a0b05a2a 100644
--- a/spec/signing_form_helper.rb
+++ b/spec/signing_form_helper.rb
@@ -4,22 +4,50 @@ module SigningFormHelper
module_function
def draw_canvas
- page.find('canvas').click([], { x: 150, y: 100 })
page.execute_script <<~JS
const canvas = document.getElementsByTagName('canvas')[0];
- const ctx = canvas.getContext('2d');
+ const rect = canvas.getBoundingClientRect();
- ctx.beginPath();
- ctx.moveTo(150, 100);
- ctx.lineTo(450, 100);
- ctx.stroke();
+ const startX = rect.left + 50;
+ const startY = rect.top + 100;
- ctx.beginPath();
- ctx.moveTo(150, 100);
- ctx.lineTo(150, 150);
- ctx.stroke();
+ const amplitude = 20;
+ const wavelength = 30;
+ const length = 300;
+
+ function dispatchPointerEvent(type, x, y) {
+ const event = new PointerEvent(type, {
+ pointerId: 1,
+ pointerType: 'pen',
+ isPrimary: true,
+ clientX: x,
+ clientY: y,
+ bubbles: true,
+ pressure: 0.5
+ });
+
+ canvas.dispatchEvent(event);
+ }
+
+ dispatchPointerEvent('pointerdown', startX, startY);
+
+ let x = 0;
+ function drawStep() {
+ if (x > length) {
+ dispatchPointerEvent('pointerup', startX + x, startY);
+ return;
+ }
+
+ const y = startY + amplitude * Math.sin((x / wavelength) * 2 * Math.PI);
+ dispatchPointerEvent('pointermove', startX + x, y);
+ x += 5;
+ requestAnimationFrame(drawStep);
+ }
+
+ drawStep();
JS
- sleep 0.5
+
+ sleep 0.1
end
def field_value(submitter, field_name)
diff --git a/spec/system/account_settings_spec.rb b/spec/system/account_settings_spec.rb
index ae3bef28..7c194219 100644
--- a/spec/system/account_settings_spec.rb
+++ b/spec/system/account_settings_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe 'Account Settings' do
let!(:account) { create(:account) }
let!(:user) { create(:user, account:) }
diff --git a/spec/system/api_settings_spec.rb b/spec/system/api_settings_spec.rb
index 648e202d..6f796add 100644
--- a/spec/system/api_settings_spec.rb
+++ b/spec/system/api_settings_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe 'API Settings' do
let!(:account) { create(:account) }
let!(:user) { create(:user, account:) }
@@ -16,4 +14,26 @@ RSpec.describe 'API Settings' do
token = user.access_token.token
expect(page).to have_field('X-Auth-Token', with: token.sub(token[5..], '*' * token[5..].size))
end
+
+ it 'reveals API key with correct password' do
+ find('#api_key').click
+
+ within('.modal') do
+ fill_in 'password', with: user.password
+ click_button 'Submit'
+ end
+
+ expect(page).to have_field('X-Auth-Token', with: user.access_token.token)
+ end
+
+ it 'shows error with incorrect password' do
+ find('#api_key').click
+
+ within('.modal') do
+ fill_in 'password', with: 'wrong_password'
+ click_button 'Submit'
+ end
+
+ expect(page).to have_content('Wrong password')
+ end
end
diff --git a/spec/system/dashboard_spec.rb b/spec/system/dashboard_spec.rb
index f2bd11b1..beca9606 100644
--- a/spec/system/dashboard_spec.rb
+++ b/spec/system/dashboard_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe 'Dashboard Page' do
let!(:account) { create(:account) }
let!(:user) { create(:user, account:) }
@@ -51,5 +49,18 @@ RSpec.describe 'Dashboard Page' do
expect(page).to have_current_path(edit_template_path(Template.last), ignore_query: true)
end
end
+
+ it 'searches be submitter email' do
+ submission = create(:submission, :with_submitters, template: templates[0])
+ submitter = submission.submitters.first
+
+ SearchEntries.reindex_all
+
+ visit root_path(q: submitter.email)
+
+ expect(page).to have_content('Templates not Found')
+ expect(page).to have_content('Submissions')
+ expect(page).to have_content(submitter.name)
+ end
end
end
diff --git a/spec/system/email_settings_spec.rb b/spec/system/email_settings_spec.rb
index 5e2a00e5..f7d683b8 100644
--- a/spec/system/email_settings_spec.rb
+++ b/spec/system/email_settings_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe 'Email Settings' do
let!(:account) { create(:account) }
let!(:user) { create(:user, account:) }
diff --git a/spec/system/esign_spec.rb b/spec/system/esign_spec.rb
index b1a48f62..d7441d7e 100644
--- a/spec/system/esign_spec.rb
+++ b/spec/system/esign_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe 'PDF Signature Settings' do
let!(:account) { create(:account) }
let!(:user) { create(:user, account:) }
diff --git a/spec/system/newsletters_spec.rb b/spec/system/newsletters_spec.rb
index a4fc3c18..274ba7e3 100644
--- a/spec/system/newsletters_spec.rb
+++ b/spec/system/newsletters_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe 'Newsletter' do
let(:user) { create(:user, account: create(:account)) }
diff --git a/spec/system/notifications_settings_spec.rb b/spec/system/notifications_settings_spec.rb
index 4f0d0f7c..2edd3eb5 100644
--- a/spec/system/notifications_settings_spec.rb
+++ b/spec/system/notifications_settings_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe 'Notifications Settings' do
let(:user) { create(:user, account: create(:account)) }
diff --git a/spec/system/personalization_settings_spec.rb b/spec/system/personalization_settings_spec.rb
index 9d16d0c0..8b7fa214 100644
--- a/spec/system/personalization_settings_spec.rb
+++ b/spec/system/personalization_settings_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe 'Personalization Settings', :js do
let!(:account) { create(:account) }
let!(:user) { create(:user, account:) }
diff --git a/spec/system/personalization_spec.rb b/spec/system/personalization_spec.rb
index f82173a1..18aa04b1 100644
--- a/spec/system/personalization_spec.rb
+++ b/spec/system/personalization_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe 'Personalization' do
let!(:account) { create(:account) }
let!(:user) { create(:user, account:) }
diff --git a/spec/system/profile_settings_spec.rb b/spec/system/profile_settings_spec.rb
index 351b636c..9cce6088 100644
--- a/spec/system/profile_settings_spec.rb
+++ b/spec/system/profile_settings_spec.rb
@@ -1,12 +1,13 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe 'Profile Settings' do
let(:user) { create(:user, account: create(:account)) }
before do
sign_in(user)
+
+ allow(Accounts).to receive(:can_send_emails?).and_return(true)
+
visit settings_profile_index_path
end
@@ -18,7 +19,6 @@ RSpec.describe 'Profile Settings' do
expect(page).to have_content('Change Password')
expect(page).to have_field('user[password]')
- expect(page).to have_field('user[password_confirmation]')
end
context 'when changes contact information' do
@@ -35,12 +35,21 @@ RSpec.describe 'Profile Settings' do
expect(user.last_name).to eq('Beckham')
expect(user.email).to eq('david.beckham@example.com')
end
+
+ it 'does not update if email is invalid' do
+ fill_in 'Email', with: 'devid+test@example'
+
+ all(:button, 'Update')[0].click
+
+ expect(page).to have_content('Email is invalid')
+ end
end
context 'when changes password' do
it 'updates password' do
fill_in 'New password', with: 'newpassword'
fill_in 'Confirm new password', with: 'newpassword'
+ fill_in 'Current password', with: 'password'
all(:button, 'Update')[1].click
@@ -50,10 +59,51 @@ RSpec.describe 'Profile Settings' do
it 'does not update if password confirmation does not match' do
fill_in 'New password', with: 'newpassword'
fill_in 'Confirm new password', with: 'newpassword1'
+ fill_in 'Current password', with: 'password'
all(:button, 'Update')[1].click
expect(page).to have_content("Password confirmation doesn't match Password")
end
+
+ it 'does not update if current password is incorrect' do
+ fill_in 'New password', with: 'newpassword'
+ fill_in 'Confirm new password', with: 'newpassword'
+ fill_in 'Current password', with: 'wrongpassword'
+
+ all(:button, 'Update')[1].click
+
+ expect(page).to have_content('Current password is invalid')
+ end
+
+ it 'resets password and signs in with new password', sidekiq: :inline do
+ fill_in 'New password', with: 'newpassword'
+ accept_confirm('Are you sure?') do
+ find('label', text: 'Click here').click
+ end
+
+ expect(page).to have_content('An email with password reset instructions has been sent.')
+
+ email = ActionMailer::Base.deliveries.last
+ reset_password_url = email.body
+ .encoded[/href="([^"]+)"/, 1]
+ .sub(%r{https?://(.*?)/}, "#{Capybara.current_session.server.base_url}/")
+
+ visit reset_password_url
+
+ fill_in 'New password', with: 'new_strong_password'
+ fill_in 'Confirm new password', with: 'new_strong_password'
+ click_button 'Change my password'
+
+ expect(page).to have_content('Your password has been changed successfully. You are now signed in.')
+
+ visit new_user_session_path
+
+ fill_in 'Email', with: user.email
+ fill_in 'Password', with: 'new_strong_password'
+ click_button 'Sign In'
+
+ expect(page).to have_content('Signed in successfully')
+ end
end
end
diff --git a/spec/system/setup_spec.rb b/spec/system/setup_spec.rb
index 25c6df27..da4a37da 100644
--- a/spec/system/setup_spec.rb
+++ b/spec/system/setup_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe 'App Setup' do
let(:form_data) do
{
@@ -53,6 +51,16 @@ RSpec.describe 'App Setup' do
end
context 'when invalid information' do
+ it 'does not setup the app if the email is invalid' do
+ fill_setup_form(form_data.merge(email: 'bob@example-com'))
+
+ expect do
+ click_button 'Submit'
+ end.not_to(change(User, :count))
+
+ expect(page).to have_content('Email is invalid')
+ end
+
it 'does not setup the app if the password is too short' do
fill_setup_form(form_data.merge(password: 'pass'))
diff --git a/spec/system/sign_in_spec.rb b/spec/system/sign_in_spec.rb
index e9e2f4d1..df0e4f02 100644
--- a/spec/system/sign_in_spec.rb
+++ b/spec/system/sign_in_spec.rb
@@ -1,8 +1,6 @@
# frozen_string_literal: true
-require 'rails_helper'
-
-RSpec.describe 'Sign In', type: :system do
+RSpec.describe 'Sign In' do
let(:account) { create(:account) }
let!(:user) { create(:user, account:, email: 'john.dou@example.com', password: 'strong_password') }
diff --git a/spec/system/signing_form_spec.rb b/spec/system/signing_form_spec.rb
index be486c65..92730508 100644
--- a/spec/system/signing_form_spec.rb
+++ b/spec/system/signing_form_spec.rb
@@ -1,26 +1,86 @@
# frozen_string_literal: true
-require 'rails_helper'
-
-RSpec.describe 'Signing Form', type: :system do
+RSpec.describe 'Signing Form' do
let(:account) { create(:account) }
let(:author) { create(:user, account:) }
context 'when the template form link is opened' do
- let(:template) { create(:template, account:, author:, except_field_types: %w[phone payment stamp]) }
+ let(:template) do
+ create(:template, shared_link: true, account:, author:, except_field_types: %w[phone payment stamp])
+ end
+
+ it 'displays only the email step when only email is required' do
+ visit start_form_path(slug: template.slug)
+
+ expect(page).to have_content('You have been invited to submit a form')
+ expect(page).to have_content("Invited by #{account.name}")
+ expect(page).to have_field('Email', type: 'email', placeholder: 'Provide your email to start')
+ expect(page).not_to have_field('Phone', type: 'tel')
+ expect(page).not_to have_field('Name', type: 'text')
+ expect(page).to have_button('Start')
+ end
+
+ it 'displays name, email, and phone fields together when all are required' do
+ template.update(preferences: { link_form_fields: %w[email name phone] })
+
+ visit start_form_path(slug: template.slug)
+
+ expect(page).to have_content('You have been invited to submit a form')
+ expect(page).to have_content("Invited by #{account.name}")
+ expect(page).to have_field('Email', type: 'email', placeholder: 'Provide your email')
+ expect(page).to have_field('Name', type: 'text', placeholder: 'Provide your name')
+ expect(page).to have_field('Phone', type: 'tel', placeholder: 'Provide your phone in international format')
+ expect(page).to have_button('Start')
+ end
+
+ it 'displays only the name step when only name is required' do
+ template.update(preferences: { link_form_fields: %w[name] })
- before do
visit start_form_path(slug: template.slug)
+
+ expect(page).to have_content('You have been invited to submit a form')
+ expect(page).to have_content("Invited by #{account.name}")
+ expect(page).to have_field('Name', type: 'text', placeholder: 'Provide your name to start')
+ expect(page).not_to have_field('Phone', type: 'tel')
+ expect(page).not_to have_field('Email', type: 'email')
+ expect(page).to have_button('Start')
end
- it 'shows the email step', type: :system do
+ it 'displays only the phone step when only phone is required' do
+ template.update(preferences: { link_form_fields: %w[phone] })
+
+ visit start_form_path(slug: template.slug)
+
expect(page).to have_content('You have been invited to submit a form')
expect(page).to have_content("Invited by #{account.name}")
- expect(page).to have_field('Email', type: 'email')
+ expect(page).to have_field('Phone', type: 'tel',
+ placeholder: 'Provide your phone in international format to start')
+ expect(page).not_to have_field('Name', type: 'text')
+ expect(page).not_to have_field('Email', type: 'email')
expect(page).to have_button('Start')
end
+ it 'prevents starting the form if phone is not in international format' do
+ template.update(preferences: { link_form_fields: %w[phone] })
+
+ visit start_form_path(slug: template.slug)
+
+ fill_in 'Phone', with: '12345'
+
+ expect { click_button 'Start' }.not_to(change { current_path })
+ end
+
+ it 'prevents starting the form if email is invali' do
+ visit start_form_path(slug: template.slug)
+
+ fill_in 'Email', with: 'invalid-email'
+
+ expect { click_button 'Start' }.not_to(change { current_path })
+ end
+
it 'completes the form' do
+ visit start_form_path(slug: template.slug)
+
# Submit's email step
fill_in 'Email', with: 'john.dou@example.com'
click_button 'Start'
@@ -100,6 +160,182 @@ RSpec.describe 'Signing Form', type: :system do
expect(field_value(submitter, 'Attachment')).to be_present
expect(field_value(submitter, 'Cell code')).to eq '123'
end
+
+ it 'completes the form when name, email, and phone are required' do
+ template.update(preferences: { link_form_fields: %w[email name phone] })
+
+ visit start_form_path(slug: template.slug)
+
+ # Submit's name, email, and phone step
+ fill_in 'Email', with: 'john.dou@example.com'
+ fill_in 'Name', with: 'John Doe'
+ fill_in 'Phone', with: '+17732298825'
+ click_button 'Start'
+
+ # Text step
+ fill_in 'First Name', with: 'John'
+ click_button 'next'
+
+ # Date step
+ fill_in 'Birthday', with: I18n.l(20.years.ago, format: '%Y-%m-%d')
+ click_button 'next'
+
+ # Checkbox step
+ check 'Do you agree?'
+ click_button 'next'
+
+ # Radio step
+ choose 'Boy'
+ click_button 'next'
+
+ # Signature step
+ draw_canvas
+ click_button 'next'
+
+ # Number step
+ fill_in 'House number', with: '123'
+ click_button 'next'
+
+ # Multiple choice step
+ %w[Red Blue].each { |color| check color }
+ click_button 'next'
+
+ # Select step
+ select 'Male', from: 'Gender'
+ click_button 'next'
+
+ # Initials step
+ draw_canvas
+ click_button 'next'
+
+ # Image step
+ find('#dropzone').click
+ find('input[type="file"]', visible: false).attach_file(Rails.root.join('spec/fixtures/sample-image.png'))
+ click_button 'next'
+
+ # File step
+ find('#dropzone').click
+ find('input[type="file"]', visible: false).attach_file(Rails.root.join('spec/fixtures/sample-document.pdf'))
+ click_button 'next'
+
+ # Cell step
+ fill_in 'Cell code', with: '123'
+ click_on 'Complete'
+
+ expect(page).to have_button('Download')
+ expect(page).to have_content('Document has been signed!')
+
+ submitter = template.submissions.last.submitters.last
+
+ expect(submitter.email).to eq('john.dou@example.com')
+ expect(submitter.name).to eq('John Doe')
+ expect(submitter.phone).to eq('+17732298825')
+ expect(submitter.ip).to eq('127.0.0.1')
+ expect(submitter.ua).to be_present
+ expect(submitter.opened_at).to be_present
+ expect(submitter.completed_at).to be_present
+ expect(submitter.declined_at).to be_nil
+
+ expect(field_value(submitter, 'First Name')).to eq 'John'
+ expect(field_value(submitter, 'Birthday')).to eq 20.years.ago.strftime('%Y-%m-%d')
+ expect(field_value(submitter, 'Do you agree?')).to be_truthy
+ expect(field_value(submitter, 'First child')).to eq 'Boy'
+ expect(field_value(submitter, 'Signature')).to be_present
+ expect(field_value(submitter, 'House number')).to eq 123
+ expect(field_value(submitter, 'Colors')).to contain_exactly('Red', 'Blue')
+ expect(field_value(submitter, 'Gender')).to eq 'Male'
+ expect(field_value(submitter, 'Initials')).to be_present
+ expect(field_value(submitter, 'Avatar')).to be_present
+ expect(field_value(submitter, 'Attachment')).to be_present
+ expect(field_value(submitter, 'Cell code')).to eq '123'
+ end
+
+ it 'completes the form when identity verification with a 2FA code is enabled', sidekiq: :inline do
+ create(:encrypted_config, key: EncryptedConfig::ESIGN_CERTS_KEY,
+ value: GenerateCertificate.call.transform_values(&:to_pem))
+
+ template.update(preferences: { link_form_fields: %w[email name], shared_link_2fa: true })
+
+ visit start_form_path(slug: template.slug)
+
+ fill_in 'Email', with: 'john.dou@example.com'
+ fill_in 'Name', with: 'John Doe'
+
+ expect do
+ click_button 'Start'
+ end.to change { ActionMailer::Base.deliveries.count }.by(1)
+
+ email = ActionMailer::Base.deliveries.last
+ code = email.body.encoded[%r{(.*?)}, 1]
+
+ fill_in 'one_time_code', with: code
+
+ click_button 'Submit'
+
+ fill_in 'First Name', with: 'John'
+ click_button 'next'
+
+ fill_in 'Birthday', with: I18n.l(20.years.ago, format: '%Y-%m-%d')
+ click_button 'next'
+
+ check 'Do you agree?'
+ click_button 'next'
+
+ choose 'Boy'
+ click_button 'next'
+
+ draw_canvas
+ click_button 'next'
+
+ fill_in 'House number', with: '123'
+ click_button 'next'
+
+ %w[Red Blue].each { |color| check color }
+ click_button 'next'
+
+ select 'Male', from: 'Gender'
+ click_button 'next'
+
+ draw_canvas
+ click_button 'next'
+
+ find('#dropzone').click
+ find('input[type="file"]', visible: false).attach_file(Rails.root.join('spec/fixtures/sample-image.png'))
+ click_button 'next'
+
+ find('#dropzone').click
+ find('input[type="file"]', visible: false).attach_file(Rails.root.join('spec/fixtures/sample-document.pdf'))
+ click_button 'next'
+
+ fill_in 'Cell code', with: '123'
+ click_on 'Complete'
+
+ expect(page).to have_button('Download')
+ expect(page).to have_content('Document has been signed!')
+
+ submitter = template.submissions.last.submitters.last
+
+ expect(submitter.email).to eq('john.dou@example.com')
+ expect(submitter.name).to eq('John Doe')
+ expect(submitter.ip).to eq('127.0.0.1')
+ expect(submitter.ua).to be_present
+ expect(submitter.opened_at).to be_present
+ expect(submitter.completed_at).to be_present
+ expect(submitter.declined_at).to be_nil
+
+ expect(field_value(submitter, 'First Name')).to eq 'John'
+ expect(field_value(submitter, 'Birthday')).to eq 20.years.ago.strftime('%Y-%m-%d')
+ expect(field_value(submitter, 'Do you agree?')).to be_truthy
+ expect(field_value(submitter, 'First child')).to eq 'Boy'
+ expect(field_value(submitter, 'Signature')).to be_present
+ expect(field_value(submitter, 'House number')).to eq 123
+ expect(field_value(submitter, 'Colors')).to contain_exactly('Red', 'Blue')
+ expect(field_value(submitter, 'Gender')).to eq 'Male'
+ expect(field_value(submitter, 'Initials')).to be_present
+ expect(field_value(submitter, 'Avatar')).to be_present
+ expect(field_value(submitter, 'Attachment')).to be_present
+ expect(field_value(submitter, 'Cell code')).to eq '123'
+ end
end
context 'when the submitter form link is opened' do
@@ -360,6 +596,19 @@ RSpec.describe 'Signing Form', type: :system do
expect(field_value(submitter, 'Signature')).to be_present
end
+ it 'shows an error message if the canvas is not drawn or too simple' do
+ visit submit_form_path(slug: submitter.slug)
+
+ find('#expand_form_button').click
+ page.find('canvas').click([], { x: 150, y: 100 })
+
+ alert_text = page.accept_alert do
+ click_button 'Sign and Complete'
+ end
+
+ expect(alert_text).to eq 'Signature is too small or simple. Please redraw.'
+ end
+
it 'completes the form if the canvas is typed' do
visit submit_form_path(slug: submitter.slug)
@@ -493,6 +742,9 @@ RSpec.describe 'Signing Form', type: :system do
find('#expand_form_button').click
find('span[data-tip="Click to upload"]').click
find('input[type="file"]', visible: false).attach_file(Rails.root.join('spec/fixtures/sample-image.png'))
+
+ sleep 0.1
+
click_button 'Complete'
expect(page).to have_content('Document has been signed!')
@@ -796,20 +1048,86 @@ RSpec.describe 'Signing Form', type: :system do
end
end
- it 'sends completed email' do
- template = create(:template, account:, author:, only_field_types: %w[text signature])
- submission = create(:submission, template:)
- submitter = create(:submitter, submission:, uuid: template.submitters.first['uuid'], account:)
+ context 'when the template requires multiple submitters' do
+ let(:template) do
+ create(:template, shared_link: true, submitter_count: 2, account:, author:, only_field_types: %w[text])
+ end
+
+ context 'when default signer details are not defined' do
+ it 'shows an explanation error message if a logged-in user associated with the template account opens the link' do
+ sign_in author
+ visit start_form_path(slug: template.slug)
+ fill_in 'Email', with: author.email
+ click_button 'Start'
+
+ expect(page).to have_content('This submission has multiple signers, which prevents the use of a sharing link ' \
+ "as it's unclear which signer is responsible for specific fields. " \
+ 'To resolve this, follow this guide to define the default signer details.')
+ expect(page).to have_link('guide', href: 'https://www.docuseal.com/resources/pre-filling-recipients')
+ end
+
+ it 'shows a "Not found" error message if a logged-out user associated with the template account opens the link' do
+ visit start_form_path(slug: template.slug)
+ fill_in 'Email', with: author.email
+ click_button 'Start'
- visit submit_form_path(slug: submitter.slug)
+ expect(page).to have_content('Not found')
+ end
+
+ it 'shows a "Not found" error message if an unrelated user opens the link' do
+ visit start_form_path(slug: template.slug)
+ fill_in 'Email', with: 'john.doe@example.com'
+ click_button 'Start'
- fill_in 'First Name', with: 'Adam'
- click_on 'next'
- click_link 'Type'
- fill_in 'signature_text_input', with: 'Adam'
+ expect(page).to have_content('Not found')
+ end
+ end
+ end
+
+ context 'when the template shared link is disabled' do
+ let(:template) do
+ create(:template, shared_link: false, account:, author:, only_field_types: %w[text])
+ end
+
+ context 'when user is logged in' do
+ before do
+ login_as author
+ visit start_form_path(slug: template.slug)
+ end
+
+ it 'shows a warning that the shared link is disabled and provides an option to enable it' do
+ expect(page).to have_content('Share link is currently disabled')
+ expect(page).to have_content(template.name)
+ expect(page).to have_button('Enable shared link')
+ end
- expect do
- click_on 'Sign and Complete'
- end.to change(ProcessSubmitterCompletionJob.jobs, :size).by(1)
+ it 'enables the shared link' do
+ expect do
+ click_button 'Enable shared link'
+ end.to change { template.reload.shared_link }.from(false).to(true)
+
+ expect(page).to have_content('You have been invited to submit a form')
+ end
+ end
+ end
+
+ context 'when a form is completed' do
+ let(:template) { create(:template, account:, author:, only_field_types: %w[text signature]) }
+ let(:submission) { create(:submission, template:) }
+ let(:submitter) { create(:submitter, submission:, uuid: template.submitters.first['uuid'], account:) }
+
+ before do
+ visit submit_form_path(slug: submitter.slug)
+ end
+
+ it 'sends completed email' do
+ fill_in 'First Name', with: 'Adam'
+ click_on 'next'
+ draw_canvas
+
+ expect do
+ click_on 'Sign and Complete'
+ end.to change(ProcessSubmitterCompletionJob.jobs, :size).by(1)
+ end
end
end
diff --git a/spec/system/storage_settings_spec.rb b/spec/system/storage_settings_spec.rb
index d57564d7..c11d0ea0 100644
--- a/spec/system/storage_settings_spec.rb
+++ b/spec/system/storage_settings_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe 'Storage Settings' do
let!(:account) { create(:account) }
let!(:user) { create(:user, account:) }
diff --git a/spec/system/submission_preview_spec.rb b/spec/system/submission_preview_spec.rb
index b231fcff..3048e96d 100644
--- a/spec/system/submission_preview_spec.rb
+++ b/spec/system/submission_preview_spec.rb
@@ -1,25 +1,59 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe 'Submission Preview' do
let(:account) { create(:account) }
let(:user) { create(:user, account:) }
let(:template) { create(:template, account:, author: user) }
context 'when not submitted' do
- let(:submission) { create(:submission, template:, created_by_user: user) }
+ let(:submission) { create(:submission, :with_submitters, template:, created_by_user: user) }
- before do
- template.submitters.map { |s| create(:submitter, submission:, uuid: s['uuid']) }
+ context 'when user is signed in' do
+ before do
+ sign_in(user)
- sign_in(user)
+ visit submissions_preview_path(slug: submission.slug)
+ end
- visit submissions_preview_path(slug: submission.slug)
+ it 'completes the form' do
+ expect(page).to have_content('Not completed')
+ end
end
- it 'completes the form' do
- expect(page).to have_content('Not completed')
+ context 'when user is not signed in' do
+ context 'when submission is not completed' do
+ before do
+ create(:encrypted_config, account:, key: EncryptedConfig::EMAIL_SMTP_KEY, value: '{}')
+
+ submission.submitters.each { |s| s.update(completed_at: 1.day.ago) }
+
+ visit submissions_preview_path(slug: submission.slug)
+ end
+
+ it "sends a copy to the submitter's email" do
+ fill_in 'Email', with: submission.submitters.first.email
+ click_button 'Send copy to Email'
+
+ expect(page).to have_content('Email has been sent.')
+ end
+
+ it 'shows an error for an email not associated with the submission' do
+ fill_in 'Email', with: 'john.due@example.com'
+ click_button 'Send copy to Email'
+
+ expect(page).to have_content('Please enter your email address associated with the completed submission.')
+ end
+ end
+
+ it "doesn't display the email form if SMTP is not configured" do
+ submission.submitters.each { |s| s.update(completed_at: 1.day.ago) }
+
+ visit submissions_preview_path(slug: submission.slug)
+
+ expect(page).to have_content(template.name)
+ expect(page).not_to have_field('Email')
+ expect(page).not_to have_content('Send copy to Email')
+ end
end
end
end
diff --git a/spec/system/team_settings_spec.rb b/spec/system/team_settings_spec.rb
index 077c5104..693f31df 100644
--- a/spec/system/team_settings_spec.rb
+++ b/spec/system/team_settings_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe 'Team Settings' do
let(:account) { create(:account) }
let(:second_account) { create(:account) }
@@ -94,13 +92,29 @@ RSpec.describe 'Team Settings' do
end
end
+ it 'does not allow to create a new user with an invalid email' do
+ click_link 'New User'
+
+ within '#modal' do
+ fill_in 'First name', with: 'Joseph'
+ fill_in 'Last name', with: 'Smith'
+ fill_in 'Email', with: 'joseph.smith@gmail'
+ fill_in 'Password', with: 'password'
+
+ expect do
+ click_button 'Submit'
+ end.not_to change(User, :count)
+
+ expect(page).to have_content('Email is invalid')
+ end
+ end
+
it 'updates a user' do
first(:link, 'Edit').click
fill_in 'First name', with: 'Adam'
fill_in 'Last name', with: 'Meier'
fill_in 'Email', with: 'adam.meier@example.com'
- fill_in 'Password', with: 'new_password'
expect do
click_button 'Submit'
diff --git a/spec/system/template_builder_spec.rb b/spec/system/template_builder_spec.rb
new file mode 100644
index 00000000..2f4b9456
--- /dev/null
+++ b/spec/system/template_builder_spec.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+RSpec.describe 'Template Builder' do
+ let(:account) { create(:account) }
+ let(:author) { create(:user, account:) }
+ let(:template) { create(:template, account:, author:, attachment_count: 3, except_field_types: %w[phone payment]) }
+
+ before do
+ sign_in(author)
+ end
+
+ context 'when manage template documents' do
+ before do
+ visit edit_template_path(template)
+ end
+
+ it 'replaces the document' do
+ doc = find("div[id='documents_container'] div[data-document-uuid='#{template.schema[1]['attachment_uuid']}'")
+ doc.click
+
+ expect do
+ doc.find('.replace-document-button').click
+ doc.find('.replace-document-button input[type="file"]', visible: false)
+ .attach_file(Rails.root.join('spec/fixtures/sample-image.png'))
+
+ page.driver.wait_for_network_idle
+ end.to change { template.documents.count }.by(1)
+
+ expect(page).to have_content('sample-image')
+ end
+ end
+end
diff --git a/spec/system/template_share_link_spec.rb b/spec/system/template_share_link_spec.rb
new file mode 100644
index 00000000..23499434
--- /dev/null
+++ b/spec/system/template_share_link_spec.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+RSpec.describe 'Template Share Link' do
+ let!(:account) { create(:account) }
+ let!(:author) { create(:user, account:) }
+ let!(:template) { create(:template, account:, author:) }
+
+ before do
+ sign_in(author)
+ end
+
+ context 'when the template is not shareable' do
+ before do
+ visit template_path(template)
+ end
+
+ it 'makes the template shareable' do
+ click_on 'Link'
+
+ expect do
+ within '#modal' do
+ check 'template_shared_link'
+ end
+ end.to change { template.reload.shared_link }.from(false).to(true)
+ end
+
+ it 'makes the template shareable on toggle' do
+ click_on 'Link'
+
+ expect do
+ within '#modal' do
+ find('#template_shared_link').click
+ end
+ end.to change { template.reload.shared_link }.from(false).to(true)
+ end
+ end
+
+ context 'when the template is already shareable' do
+ before do
+ template.update(shared_link: true)
+ visit template_path(template)
+ end
+
+ it 'makes the template unshareable' do
+ click_on 'Link'
+
+ expect do
+ within '#modal' do
+ uncheck 'template_shared_link'
+ end
+ end.to change { template.reload.shared_link }.from(true).to(false)
+ end
+ end
+end
diff --git a/spec/system/template_spec.rb b/spec/system/template_spec.rb
index 0b512041..83aa0f8d 100644
--- a/spec/system/template_spec.rb
+++ b/spec/system/template_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe 'Template' do
let!(:account) { create(:account) }
let!(:user) { create(:user, account:) }
@@ -18,7 +16,7 @@ RSpec.describe 'Template' do
expect(page).to have_content(template.name)
expect(page).to have_content('There are no Submissions')
expect(page).to have_content('Send an invitation to fill and complete the form')
- expect(page).to have_link('Sign it Yourself')
+ expect(page).to have_button('Sign it Yourself')
end
end
@@ -80,7 +78,7 @@ RSpec.describe 'Template' do
within '#modal' do
fill_in 'template[name]', with: 'New Template Name'
- click_link 'Change Folder'
+ find('label', text: 'Change Folder').click
fill_in 'folder_name', with: 'New Folder Name'
expect do
@@ -103,7 +101,7 @@ RSpec.describe 'Template' do
within '#modal' do
template_folder.reload
fill_in 'template[name]', with: 'New Template Name'
- click_link 'Change Folder'
+ find('label', text: 'Change Folder').click
end
within '.autocomplete' do
diff --git a/spec/system/webhook_settings_spec.rb b/spec/system/webhook_settings_spec.rb
index fbbcaea2..938b6eb9 100644
--- a/spec/system/webhook_settings_spec.rb
+++ b/spec/system/webhook_settings_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'rails_helper'
-
RSpec.describe 'Webhook Settings' do
let!(:account) { create(:account) }
let!(:user) { create(:user, account:) }
@@ -177,9 +175,9 @@ RSpec.describe 'Webhook Settings' do
expect do
click_button 'Test Webhook'
- end.to change(SendFormCompletedWebhookRequestJob.jobs, :size).by(1)
+ end.to change(SendTestWebhookRequestJob.jobs, :size).by(1)
- args = SendFormCompletedWebhookRequestJob.jobs.last['args'].first
+ args = SendTestWebhookRequestJob.jobs.last['args'].first
expect(args['webhook_url_id']).to eq(webhook_url.id)
expect(args['submitter_id']).to eq(submitter.id)
diff --git a/yarn.lock b/yarn.lock
index 9ab83c8a..2faf9648 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1030,27 +1030,138 @@
"@babel/helper-string-parser" "^7.25.9"
"@babel/helper-validator-identifier" "^7.25.9"
+"@braintree/sanitize-url@^7.1.1":
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz#15e19737d946559289b915e5dad3b4c28407735e"
+ integrity sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==
+
+"@codemirror/autocomplete@^6.0.0":
+ version "6.18.6"
+ resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.18.6.tgz#de26e864a1ec8192a1b241eb86addbb612964ddb"
+ integrity sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==
+ dependencies:
+ "@codemirror/language" "^6.0.0"
+ "@codemirror/state" "^6.0.0"
+ "@codemirror/view" "^6.17.0"
+ "@lezer/common" "^1.0.0"
+
+"@codemirror/commands@^6.0.0":
+ version "6.8.1"
+ resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.8.1.tgz#639f5559d2f33f2582a2429c58cb0c1b925c7a30"
+ integrity sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw==
+ dependencies:
+ "@codemirror/language" "^6.0.0"
+ "@codemirror/state" "^6.4.0"
+ "@codemirror/view" "^6.27.0"
+ "@lezer/common" "^1.1.0"
+
+"@codemirror/lang-css@^6.0.0":
+ version "6.3.1"
+ resolved "https://registry.yarnpkg.com/@codemirror/lang-css/-/lang-css-6.3.1.tgz#763ca41aee81bb2431be55e3cfcc7cc8e91421a3"
+ integrity sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==
+ dependencies:
+ "@codemirror/autocomplete" "^6.0.0"
+ "@codemirror/language" "^6.0.0"
+ "@codemirror/state" "^6.0.0"
+ "@lezer/common" "^1.0.2"
+ "@lezer/css" "^1.1.7"
+
+"@codemirror/lang-html@^6.4.9":
+ version "6.4.9"
+ resolved "https://registry.yarnpkg.com/@codemirror/lang-html/-/lang-html-6.4.9.tgz#d586f2cc9c341391ae07d1d7c545990dfa069727"
+ integrity sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==
+ dependencies:
+ "@codemirror/autocomplete" "^6.0.0"
+ "@codemirror/lang-css" "^6.0.0"
+ "@codemirror/lang-javascript" "^6.0.0"
+ "@codemirror/language" "^6.4.0"
+ "@codemirror/state" "^6.0.0"
+ "@codemirror/view" "^6.17.0"
+ "@lezer/common" "^1.0.0"
+ "@lezer/css" "^1.1.0"
+ "@lezer/html" "^1.3.0"
+
+"@codemirror/lang-javascript@^6.0.0":
+ version "6.2.4"
+ resolved "https://registry.yarnpkg.com/@codemirror/lang-javascript/-/lang-javascript-6.2.4.tgz#eef2227d1892aae762f3a0f212f72bec868a02c5"
+ integrity sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA==
+ dependencies:
+ "@codemirror/autocomplete" "^6.0.0"
+ "@codemirror/language" "^6.6.0"
+ "@codemirror/lint" "^6.0.0"
+ "@codemirror/state" "^6.0.0"
+ "@codemirror/view" "^6.17.0"
+ "@lezer/common" "^1.0.0"
+ "@lezer/javascript" "^1.0.0"
+
+"@codemirror/language@^6.0.0", "@codemirror/language@^6.4.0", "@codemirror/language@^6.6.0":
+ version "6.11.2"
+ resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.11.2.tgz#90d2d094cfbd14263bc5354ebd2445ee4e81bdc3"
+ integrity sha512-p44TsNArL4IVXDTbapUmEkAlvWs2CFQbcfc0ymDsis1kH2wh0gcY96AS29c/vp2d0y2Tquk1EDSaawpzilUiAw==
+ dependencies:
+ "@codemirror/state" "^6.0.0"
+ "@codemirror/view" "^6.23.0"
+ "@lezer/common" "^1.1.0"
+ "@lezer/highlight" "^1.0.0"
+ "@lezer/lr" "^1.0.0"
+ style-mod "^4.0.0"
+
+"@codemirror/lint@^6.0.0":
+ version "6.8.5"
+ resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.8.5.tgz#9edaa808e764e28e07665b015951934c8ec3a418"
+ integrity sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==
+ dependencies:
+ "@codemirror/state" "^6.0.0"
+ "@codemirror/view" "^6.35.0"
+ crelt "^1.0.5"
+
+"@codemirror/search@^6.0.0":
+ version "6.5.11"
+ resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-6.5.11.tgz#a324ffee36e032b7f67aa31c4fb9f3e6f9f3ed63"
+ integrity sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA==
+ dependencies:
+ "@codemirror/state" "^6.0.0"
+ "@codemirror/view" "^6.0.0"
+ crelt "^1.0.5"
+
+"@codemirror/state@^6.0.0", "@codemirror/state@^6.4.0", "@codemirror/state@^6.5.0":
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.5.2.tgz#8eca3a64212a83367dc85475b7d78d5c9b7076c6"
+ integrity sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==
+ dependencies:
+ "@marijn/find-cluster-break" "^1.0.0"
+
+"@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.27.0", "@codemirror/view@^6.35.0":
+ version "6.38.0"
+ resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.38.0.tgz#4486062b791a4247793e0953e05ae71a9e172217"
+ integrity sha512-yvSchUwHOdupXkd7xJ0ob36jdsSR/I+/C+VbY0ffBiL5NiSTEBDfB1ZGWbbIlDd5xgdUkody+lukAdOxYrOBeg==
+ dependencies:
+ "@codemirror/state" "^6.5.0"
+ crelt "^1.0.6"
+ style-mod "^4.1.0"
+ w3c-keyname "^2.2.4"
+
"@discoveryjs/json-ext@0.5.7", "@discoveryjs/json-ext@^0.5.0":
version "0.5.7"
resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70"
integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==
-"@eid-easy/eideasy-browser-client@2.104.1":
- version "2.104.1"
- resolved "https://registry.yarnpkg.com/@eid-easy/eideasy-browser-client/-/eideasy-browser-client-2.104.1.tgz#e492e0fc8ef1ff470c66522d530d5636264f30b3"
- integrity sha512-d4fgqF5U+pWuPpfgbb/+BxI2CYThkbviAfl9NbLoKMOMO4bh7HZFxLdW5uU2O8yIeldGFunJWxEbMTLv/2PlTA==
+"@eid-easy/eideasy-browser-client@2.135.0":
+ version "2.135.0"
+ resolved "https://registry.yarnpkg.com/@eid-easy/eideasy-browser-client/-/eideasy-browser-client-2.135.0.tgz#ade3cd72210aba2bdef99ec8ffdabbefdd5e6480"
+ integrity sha512-QaFMxdZaEzN/MdQ/ZhJBDN2v+6XJL0l9vK3zDgJFDyaUYvMvWcjFpHvtMiQEOivTD3sB4cM7/sJdwzA01APvsw==
dependencies:
- axios "1.7.8"
+ axios "1.8.2"
jsencrypt "3.2.1"
lodash "^4.17.21"
serialize-error "^9.1.1"
-"@eid-easy/eideasy-widget@^2.132.1":
- version "2.132.1"
- resolved "https://registry.yarnpkg.com/@eid-easy/eideasy-widget/-/eideasy-widget-2.132.1.tgz#634c077c55d7e582846dbeae47f6f37796b76bd6"
- integrity sha512-bZNdKsxja4iIUm6B4x6pOyiBdoMNNUB3615oJgNUWallrfeiIbBQxLwG+m5nmivmHMgdaIQylmtfrhc6e7kgYA==
+"@eid-easy/eideasy-widget@^2.171.0":
+ version "2.171.0"
+ resolved "https://registry.yarnpkg.com/@eid-easy/eideasy-widget/-/eideasy-widget-2.171.0.tgz#2072e50a187ef36dd89d0bc5102d5996657ea180"
+ integrity sha512-zDQgq2JhGR+omomU+4PU9vyWXJbMutklWCzZ74YVXzP1LmV0SD/X9Vy/bqofSZ1iRwgT+A+lCqLSmkoztaPC3A==
dependencies:
- "@eid-easy/eideasy-browser-client" "2.104.1"
+ "@eid-easy/eideasy-browser-client" "2.135.0"
core-js "^3.8.3"
i18n-iso-countries "^6.7.0"
lodash.defaultsdeep "^4.6.1"
@@ -1128,6 +1239,18 @@
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
+"@isaacs/cliui@^8.0.2":
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550"
+ integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==
+ dependencies:
+ string-width "^5.1.2"
+ string-width-cjs "npm:string-width@^4.2.0"
+ strip-ansi "^7.0.1"
+ strip-ansi-cjs "npm:strip-ansi@^6.0.1"
+ wrap-ansi "^8.1.0"
+ wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
+
"@jest/schemas@^29.4.3":
version "29.4.3"
resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788"
@@ -1237,6 +1360,57 @@
resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b"
integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==
+"@lezer/common@^1.0.0", "@lezer/common@^1.0.2", "@lezer/common@^1.1.0", "@lezer/common@^1.2.0":
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.2.3.tgz#138fcddab157d83da557554851017c6c1e5667fd"
+ integrity sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==
+
+"@lezer/css@^1.1.0", "@lezer/css@^1.1.7":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@lezer/css/-/css-1.3.0.tgz#296f298814782c2fad42a936f3510042cdcd2034"
+ integrity sha512-pBL7hup88KbI7hXnZV3PQsn43DHy6TWyzuyk2AO9UyoXcDltvIdqWKE1dLL/45JVZ+YZkHe1WVHqO6wugZZWcw==
+ dependencies:
+ "@lezer/common" "^1.2.0"
+ "@lezer/highlight" "^1.0.0"
+ "@lezer/lr" "^1.3.0"
+
+"@lezer/highlight@^1.0.0", "@lezer/highlight@^1.1.3":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@lezer/highlight/-/highlight-1.2.1.tgz#596fa8f9aeb58a608be0a563e960c373cbf23f8b"
+ integrity sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==
+ dependencies:
+ "@lezer/common" "^1.0.0"
+
+"@lezer/html@^1.3.0":
+ version "1.3.10"
+ resolved "https://registry.yarnpkg.com/@lezer/html/-/html-1.3.10.tgz#1be9a029a6fe835c823b20a98a449a630416b2af"
+ integrity sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==
+ dependencies:
+ "@lezer/common" "^1.2.0"
+ "@lezer/highlight" "^1.0.0"
+ "@lezer/lr" "^1.0.0"
+
+"@lezer/javascript@^1.0.0":
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/@lezer/javascript/-/javascript-1.5.1.tgz#2a424a6ec29f1d4ef3c34cbccc5447e373618ad8"
+ integrity sha512-ATOImjeVJuvgm3JQ/bpo2Tmv55HSScE2MTPnKRMRIPx2cLhHGyX2VnqpHhtIV1tVzIjZDbcWQm+NCTF40ggZVw==
+ dependencies:
+ "@lezer/common" "^1.2.0"
+ "@lezer/highlight" "^1.1.3"
+ "@lezer/lr" "^1.3.0"
+
+"@lezer/lr@^1.0.0", "@lezer/lr@^1.3.0":
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.4.2.tgz#931ea3dea8e9de84e90781001dae30dea9ff1727"
+ integrity sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==
+ dependencies:
+ "@lezer/common" "^1.0.0"
+
+"@marijn/find-cluster-break@^1.0.0":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz#775374306116d51c0c500b8c4face0f9a04752d8"
+ integrity sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==
+
"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1":
version "5.1.1-v1"
resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129"
@@ -1265,6 +1439,11 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
+"@pkgjs/parseargs@^0.11.0":
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
+ integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
+
"@polka/url@^1.0.0-next.20":
version "1.0.0-next.21"
resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1"
@@ -1280,6 +1459,13 @@
resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718"
integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==
+"@specious/htmlflow@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@specious/htmlflow/-/htmlflow-1.1.0.tgz#cc8319c2cc6b5e2e309fa213d5a1f54cc093d9eb"
+ integrity sha512-g41FgN5kfuGkOrWhhmVvFes2BzQ3msU5oR/8KPdXbkBt8UIHtwL+by9maItDIhu+BR7pxshABtaB/FqpESa9Mg==
+ dependencies:
+ htmlparser2 "^8.0.1"
+
"@tabler/icons-vue@^2.47.0":
version "2.47.0"
resolved "https://registry.yarnpkg.com/@tabler/icons-vue/-/icons-vue-2.47.0.tgz#604608a6df673d035c0e8e33f0565eeffa3adf36"
@@ -1796,6 +1982,11 @@ ansi-regex@^5.0.1:
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+ansi-regex@^6.0.1:
+ version "6.2.2"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1"
+ integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==
+
ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
@@ -1803,13 +1994,18 @@ ansi-styles@^3.2.1:
dependencies:
color-convert "^1.9.0"
-ansi-styles@^4.1.0:
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
dependencies:
color-convert "^2.0.1"
+ansi-styles@^6.1.0:
+ version "6.2.3"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041"
+ integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==
+
any-promise@^1.0.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
@@ -1914,10 +2110,10 @@ available-typed-arrays@^1.0.5:
resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7"
integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
-axios@1.7.8:
- version "1.7.8"
- resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.8.tgz#1997b1496b394c21953e68c14aaa51b7b5de3d6e"
- integrity sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==
+axios@1.8.2:
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-1.8.2.tgz#fabe06e241dfe83071d4edfbcaa7b1c3a40f7979"
+ integrity sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==
dependencies:
follow-redirects "^1.15.6"
form-data "^4.0.0"
@@ -2039,7 +2235,14 @@ brace-expansion@^1.1.7:
balanced-match "^1.0.0"
concat-map "0.0.1"
-braces@^3.0.2, braces@~3.0.2:
+brace-expansion@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7"
+ integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==
+ dependencies:
+ balanced-match "^1.0.0"
+
+braces@^3.0.2, braces@^3.0.3, braces@~3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
@@ -2153,6 +2356,21 @@ chalk@^4.0, chalk@^4.0.0, chalk@^4.1.0:
optionalDependencies:
fsevents "~2.3.2"
+chokidar@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
+ integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
chrome-trace-event@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac"
@@ -2172,6 +2390,19 @@ clone-deep@^4.0.1:
kind-of "^6.0.2"
shallow-clone "^3.0.0"
+codemirror@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-6.0.2.tgz#4d3fea1ad60b6753f97ca835f2f48c6936a8946e"
+ integrity sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==
+ dependencies:
+ "@codemirror/autocomplete" "^6.0.0"
+ "@codemirror/commands" "^6.0.0"
+ "@codemirror/language" "^6.0.0"
+ "@codemirror/lint" "^6.0.0"
+ "@codemirror/search" "^6.0.0"
+ "@codemirror/state" "^6.0.0"
+ "@codemirror/view" "^6.0.0"
+
color-convert@^1.9.0:
version "1.9.3"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
@@ -2351,6 +2582,11 @@ cosmiconfig@^8.1.3:
parse-json "^5.0.0"
path-type "^4.0.0"
+crelt@^1.0.5, crelt@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.6.tgz#7cc898ea74e190fb6ef9dae57f8f81cf7302df72"
+ integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==
+
cross-spawn@^7.0.2, cross-spawn@^7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
@@ -2360,6 +2596,15 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3:
shebang-command "^2.0.0"
which "^2.0.1"
+cross-spawn@^7.0.6:
+ version "7.0.6"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f"
+ integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
css-declaration-sorter@^6.3.1:
version "6.4.0"
resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz#630618adc21724484b3e9505bce812def44000ad"
@@ -2678,11 +2923,21 @@ domutils@^3.0.1:
domelementtype "^2.3.0"
domhandler "^5.0.3"
+driver.js@^1.3.5:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/driver.js/-/driver.js-1.3.5.tgz#70695fd2b3b15a3db409c8a37d9b3a563a7c176a"
+ integrity sha512-exkp49hXuujvTOZ3zYgySWRlEAa8/3nA8glYjtuZjmkTdsQITXivBsW1ytyhKQx3WkeYaovlnvVcLbtTaN86kA==
+
duplexer@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6"
integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==
+eastasianwidth@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
+ integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
+
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@@ -2693,6 +2948,16 @@ electron-to-chromium@^1.5.4:
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz#1abf0410c5344b2b829b7247e031f02810d442e6"
integrity sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+emoji-regex@^9.2.2:
+ version "9.2.2"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
+ integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
+
encodeurl@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
@@ -2706,7 +2971,7 @@ enhanced-resolve@^5.17.1:
graceful-fs "^4.2.4"
tapable "^2.2.0"
-entities@^4.2.0:
+entities@^4.2.0, entities@^4.4.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
@@ -3112,10 +3377,10 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
-fast-glob@^3.2.12:
- version "3.2.12"
- resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80"
- integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==
+fast-glob@^3.3.0:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
+ integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
dependencies:
"@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3"
@@ -3123,16 +3388,16 @@ fast-glob@^3.2.12:
merge2 "^1.3.0"
micromatch "^4.0.4"
-fast-glob@^3.3.0:
- version "3.3.2"
- resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
- integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
+fast-glob@^3.3.2:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818"
+ integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==
dependencies:
"@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3"
glob-parent "^5.1.2"
merge2 "^1.3.0"
- micromatch "^4.0.4"
+ micromatch "^4.0.8"
fast-json-stable-stringify@^2.0.0:
version "2.1.0"
@@ -3257,6 +3522,14 @@ for-each@^0.3.3:
dependencies:
is-callable "^1.1.3"
+foreground-child@^3.1.0:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f"
+ integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==
+ dependencies:
+ cross-spawn "^7.0.6"
+ signal-exit "^4.0.1"
+
form-data@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48"
@@ -3306,6 +3579,11 @@ function-bind@^1.1.1:
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
function.prototype.name@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621"
@@ -3380,6 +3658,18 @@ glob@7.1.6:
once "^1.3.0"
path-is-absolute "^1.0.0"
+glob@^10.3.10:
+ version "10.4.5"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956"
+ integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==
+ dependencies:
+ foreground-child "^3.1.0"
+ jackspeak "^3.1.2"
+ minimatch "^9.0.4"
+ minipass "^7.1.2"
+ package-json-from-dist "^1.0.0"
+ path-scurry "^1.11.1"
+
glob@^7.1.3:
version "7.2.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
@@ -3491,6 +3781,13 @@ hash-sum@^2.0.0:
resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a"
integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==
+hasown@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
+ integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
+ dependencies:
+ function-bind "^1.1.2"
+
hpack.js@^2.1.6:
version "2.1.6"
resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2"
@@ -3506,6 +3803,16 @@ html-entities@^2.3.2:
resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46"
integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==
+htmlparser2@^8.0.1:
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21"
+ integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==
+ dependencies:
+ domelementtype "^2.3.0"
+ domhandler "^5.0.3"
+ domutils "^3.0.1"
+ entities "^4.4.0"
+
http-deceiver@^1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
@@ -3702,6 +4009,13 @@ is-core-module@^2.11.0:
dependencies:
has "^1.0.3"
+is-core-module@^2.16.0:
+ version "2.16.1"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4"
+ integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==
+ dependencies:
+ hasown "^2.0.2"
+
is-date-object@^1.0.1:
version "1.0.5"
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
@@ -3719,6 +4033,11 @@ is-extglob@^2.1.1:
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
@@ -3834,6 +4153,15 @@ isobject@^3.0.1:
resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
+jackspeak@^3.1.2:
+ version "3.4.3"
+ resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a"
+ integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==
+ dependencies:
+ "@isaacs/cliui" "^8.0.2"
+ optionalDependencies:
+ "@pkgjs/parseargs" "^0.11.0"
+
javascript-natural-sort@^0.7.1:
version "0.7.1"
resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59"
@@ -3880,6 +4208,11 @@ jiti@^1.21.0:
resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d"
integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==
+jiti@^1.21.6:
+ version "1.21.7"
+ resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.7.tgz#9dd81043424a3d28458b193d965f0d18a2300ba9"
+ integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==
+
js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -3975,6 +4308,11 @@ lilconfig@^2.0.5, lilconfig@^2.1.0:
resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52"
integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==
+lilconfig@^3.0.0, lilconfig@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4"
+ integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==
+
lines-and-columns@^1.1.6:
version "1.2.4"
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
@@ -4046,6 +4384,11 @@ lodash@^4.17.20, lodash@^4.17.21:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+lru-cache@^10.2.0:
+ version "10.4.3"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119"
+ integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==
+
lru-cache@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
@@ -4144,6 +4487,14 @@ micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5:
braces "^3.0.2"
picomatch "^2.3.1"
+micromatch@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
+ integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
+ dependencies:
+ braces "^3.0.3"
+ picomatch "^2.3.1"
+
mime-db@1.52.0, "mime-db@>= 1.43.0 < 2":
version "1.52.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
@@ -4185,11 +4536,23 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
dependencies:
brace-expansion "^1.1.7"
+minimatch@^9.0.4:
+ version "9.0.5"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5"
+ integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
+ dependencies:
+ brace-expansion "^2.0.1"
+
minimist@^1.2.0, minimist@^1.2.6:
version "1.2.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707"
+ integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
+
mrmime@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27"
@@ -4227,6 +4590,11 @@ mz@^2.7.0:
object-assign "^4.0.1"
thenify-all "^1.0.0"
+nanoid@^3.3.11:
+ version "3.3.11"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b"
+ integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
+
nanoid@^3.3.6:
version "3.3.6"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c"
@@ -4423,6 +4791,11 @@ p-try@^2.0.0:
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+package-json-from-dist@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505"
+ integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==
+
parent-module@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
@@ -4470,6 +4843,14 @@ path-parse@^1.0.7:
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+path-scurry@^1.11.1:
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2"
+ integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==
+ dependencies:
+ lru-cache "^10.2.0"
+ minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
+
path-to-regexp@0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
@@ -4587,6 +4968,14 @@ postcss-load-config@^4.0.1:
lilconfig "^2.0.5"
yaml "^2.1.1"
+postcss-load-config@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3"
+ integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==
+ dependencies:
+ lilconfig "^3.0.0"
+ yaml "^2.3.4"
+
postcss-loader@^7.3.0:
version "7.3.0"
resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.0.tgz#05991c1e490d8ff86ef18358d87db3b5b2dcb5f5"
@@ -4682,6 +5071,13 @@ postcss-nested@^6.0.1:
dependencies:
postcss-selector-parser "^6.0.11"
+postcss-nested@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.2.0.tgz#4c2d22ab5f20b9cb61e2c5c5915950784d068131"
+ integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==
+ dependencies:
+ postcss-selector-parser "^6.1.1"
+
postcss-normalize-charset@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-6.0.0.tgz#36cc12457259064969fb96f84df491652a4b0975"
@@ -4775,6 +5171,14 @@ postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selecto
cssesc "^3.0.0"
util-deprecate "^1.0.2"
+postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2:
+ version "6.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de"
+ integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==
+ dependencies:
+ cssesc "^3.0.0"
+ util-deprecate "^1.0.2"
+
postcss-svgo@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-6.0.0.tgz#7b18742d38d4505a0455bbe70d52b49f00eaf69d"
@@ -4813,6 +5217,15 @@ postcss@^8.4.14:
picocolors "^1.1.1"
source-map-js "^1.2.1"
+postcss@^8.4.47:
+ version "8.5.6"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c"
+ integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==
+ dependencies:
+ nanoid "^3.3.11"
+ picocolors "^1.1.1"
+ source-map-js "^1.2.1"
+
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
@@ -5031,6 +5444,15 @@ resolve@^1.1.7, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
+resolve@^1.22.8:
+ version "1.22.10"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39"
+ integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==
+ dependencies:
+ is-core-module "^2.16.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
retry@^0.13.1:
version "0.13.1"
resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658"
@@ -5271,6 +5693,11 @@ signal-exit@^3.0.2, signal-exit@^3.0.3:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+signal-exit@^4.0.1:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04"
+ integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
+
signature_pad@^4.1.4:
version "4.2.0"
resolved "https://registry.yarnpkg.com/signature_pad/-/signature_pad-4.2.0.tgz#7513cee8cb8afd6594d871c61cf4d61420601422"
@@ -5370,6 +5797,33 @@ statuses@2.0.1:
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
+"string-width-cjs@npm:string-width@^4.2.0":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string-width@^4.1.0:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string-width@^5.0.1, string-width@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794"
+ integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
+ dependencies:
+ eastasianwidth "^0.2.0"
+ emoji-regex "^9.2.2"
+ strip-ansi "^7.0.1"
+
string.prototype.trim@^1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533"
@@ -5411,13 +5865,27 @@ string_decoder@~1.1.1:
dependencies:
safe-buffer "~5.1.0"
-strip-ansi@^6.0.1:
+"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
dependencies:
ansi-regex "^5.0.1"
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-ansi@^7.0.1:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.2.tgz#132875abde678c7ea8d691533f2e7e22bb744dba"
+ integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==
+ dependencies:
+ ansi-regex "^6.0.1"
+
strip-bom@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
@@ -5433,6 +5901,11 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+style-mod@^4.0.0, style-mod@^4.1.0:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.1.2.tgz#ca238a1ad4786520f7515a8539d5a63691d7bf67"
+ integrity sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==
+
stylehacks@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-6.0.0.tgz#9fdd7c217660dae0f62e14d51c89f6c01b3cb738"
@@ -5454,6 +5927,19 @@ sucrase@^3.32.0:
pirates "^4.0.1"
ts-interface-checker "^0.1.9"
+sucrase@^3.35.0:
+ version "3.35.0"
+ resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263"
+ integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.2"
+ commander "^4.0.0"
+ glob "^10.3.10"
+ lines-and-columns "^1.1.6"
+ mz "^2.7.0"
+ pirates "^4.0.1"
+ ts-interface-checker "^0.1.9"
+
supports-color@^5.3.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
@@ -5520,34 +6006,33 @@ tailwindcss@^3.1:
resolve "^1.22.2"
sucrase "^3.32.0"
-tailwindcss@^3.3.2:
- version "3.3.2"
- resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.2.tgz#2f9e35d715fdf0bbf674d90147a0684d7054a2d3"
- integrity sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==
+tailwindcss@^3.4.17:
+ version "3.4.17"
+ resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.17.tgz#ae8406c0f96696a631c790768ff319d46d5e5a63"
+ integrity sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==
dependencies:
"@alloc/quick-lru" "^5.2.0"
arg "^5.0.2"
- chokidar "^3.5.3"
+ chokidar "^3.6.0"
didyoumean "^1.2.2"
dlv "^1.1.3"
- fast-glob "^3.2.12"
+ fast-glob "^3.3.2"
glob-parent "^6.0.2"
is-glob "^4.0.3"
- jiti "^1.18.2"
- lilconfig "^2.1.0"
- micromatch "^4.0.5"
+ jiti "^1.21.6"
+ lilconfig "^3.1.3"
+ micromatch "^4.0.8"
normalize-path "^3.0.0"
object-hash "^3.0.0"
- picocolors "^1.0.0"
- postcss "^8.4.23"
+ picocolors "^1.1.1"
+ postcss "^8.4.47"
postcss-import "^15.1.0"
postcss-js "^4.0.1"
- postcss-load-config "^4.0.1"
- postcss-nested "^6.0.1"
- postcss-selector-parser "^6.0.11"
- postcss-value-parser "^4.2.0"
- resolve "^1.22.2"
- sucrase "^3.32.0"
+ postcss-load-config "^4.0.2"
+ postcss-nested "^6.2.0"
+ postcss-selector-parser "^6.1.2"
+ resolve "^1.22.8"
+ sucrase "^3.35.0"
tapable@^2.0, tapable@^2.1.1, tapable@^2.2.0:
version "2.2.1"
@@ -5840,6 +6325,11 @@ vue@^3.3.2:
"@vue/server-renderer" "3.3.4"
"@vue/shared" "3.3.4"
+w3c-keyname@^2.2.4:
+ version "2.2.8"
+ resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz#7b17c8c6883d4e8b86ac8aba79d39e880f8869c5"
+ integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==
+
watchpack@^2.4.0, watchpack@^2.4.1:
version "2.4.2"
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da"
@@ -6046,6 +6536,24 @@ word-wrap@^1.2.3:
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
+"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrap-ansi@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
+ integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
+ dependencies:
+ ansi-styles "^6.1.0"
+ string-width "^5.0.1"
+ strip-ansi "^7.0.1"
+
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
@@ -6086,6 +6594,11 @@ yaml@^2.1.1:
resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b"
integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==
+yaml@^2.3.4:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.1.tgz#1870aa02b631f7e8328b93f8bc574fac5d6c4d79"
+ integrity sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==
+
yocto-queue@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
|