hellosign-ruby-sdk 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +18 -0
- data/.rspec +2 -0
- data/.travis.yml +15 -0
- data/Gemfile +13 -0
- data/Guardfile +14 -0
- data/LICENSE.txt +22 -0
- data/README.md +58 -0
- data/Rakefile +16 -0
- data/hellosign-ruby-sdk.gemspec +27 -0
- data/lib/hello_sign.rb +32 -0
- data/lib/hello_sign/api.rb +7 -0
- data/lib/hello_sign/api/account.rb +69 -0
- data/lib/hello_sign/api/embedded.rb +27 -0
- data/lib/hello_sign/api/oauth.rb +63 -0
- data/lib/hello_sign/api/signature_request.rb +286 -0
- data/lib/hello_sign/api/team.rb +88 -0
- data/lib/hello_sign/api/template.rb +77 -0
- data/lib/hello_sign/api/unclaimed_draft.rb +127 -0
- data/lib/hello_sign/client.rb +211 -0
- data/lib/hello_sign/configuration.rb +56 -0
- data/lib/hello_sign/error.rb +48 -0
- data/lib/hello_sign/resource.rb +8 -0
- data/lib/hello_sign/resource/account.rb +24 -0
- data/lib/hello_sign/resource/base_resource.rb +60 -0
- data/lib/hello_sign/resource/embedded.rb +24 -0
- data/lib/hello_sign/resource/resource_array.rb +33 -0
- data/lib/hello_sign/resource/signature_request.rb +25 -0
- data/lib/hello_sign/resource/team.rb +24 -0
- data/lib/hello_sign/resource/template.rb +25 -0
- data/lib/hello_sign/resource/unclaimed_draft.rb +25 -0
- data/lib/hello_sign/version.rb +3 -0
- data/spec/fixtures/account.json +1 -0
- data/spec/fixtures/embedded.json +6 -0
- data/spec/fixtures/error.json +6 -0
- data/spec/fixtures/file.json +0 -0
- data/spec/fixtures/signature_request.json +2 -0
- data/spec/fixtures/signature_requests.json +14 -0
- data/spec/fixtures/team.json +19 -0
- data/spec/fixtures/template.json +1 -0
- data/spec/fixtures/templates.json +11 -0
- data/spec/fixtures/token.json +14 -0
- data/spec/fixtures/unclaimed_draft.json +6 -0
- data/spec/hello_sign/api/account_spec.rb +36 -0
- data/spec/hello_sign/api/embedded_spec.rb +19 -0
- data/spec/hello_sign/api/oauth_spec.rb +28 -0
- data/spec/hello_sign/api/signature_request_spec.rb +126 -0
- data/spec/hello_sign/api/team_spec.rb +94 -0
- data/spec/hello_sign/api/template_spec.rb +67 -0
- data/spec/hello_sign/api/unclaimed_draft_spec.rb +35 -0
- data/spec/hello_sign/client_spec.rb +132 -0
- data/spec/hello_sign/resource/base_resource_spec.rb +50 -0
- data/spec/hello_sign_spec.rb +35 -0
- data/spec/spec_helper.rb +78 -0
- metadata +216 -0
@@ -0,0 +1,56 @@
|
|
1
|
+
module HelloSign
|
2
|
+
|
3
|
+
|
4
|
+
#
|
5
|
+
# Define config attributes and default values for HelloSign module
|
6
|
+
#
|
7
|
+
# @author [hellosign]
|
8
|
+
#
|
9
|
+
module Configuration
|
10
|
+
DEFAULT_ENDPOINT = 'https://api.hellosign.com'
|
11
|
+
DEFAULT_API_VERSION = '/v3'
|
12
|
+
DEFAULT_OAUTH_ENDPOINT = "https://www.hellosign.com"
|
13
|
+
VALID_OPTIONS_KEYS = [:end_point, :oauth_end_point, :api_version, :user_agent, :client_id, :client_secret, :email_address, :password, :api_key, :auth_token, :log_level, :logging]
|
14
|
+
|
15
|
+
|
16
|
+
DEFAULT_USER_AGENT = "hellosign-ruby-sdk #{HelloSign::VERSION}"
|
17
|
+
|
18
|
+
attr_accessor *VALID_OPTIONS_KEYS
|
19
|
+
|
20
|
+
# Sets all configuration options to their default values
|
21
|
+
# when this module is extended.
|
22
|
+
#
|
23
|
+
# @param base [Object] new module or class extend thid module
|
24
|
+
def self.extended(base)
|
25
|
+
base.reset
|
26
|
+
end
|
27
|
+
|
28
|
+
# Convenience method to allow configuration options to be set in a block.
|
29
|
+
def configure
|
30
|
+
yield self
|
31
|
+
end
|
32
|
+
|
33
|
+
# Creates a hash of options
|
34
|
+
def options
|
35
|
+
VALID_OPTIONS_KEYS.inject({}) do |option, key|
|
36
|
+
option.merge!(key => send(key))
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Resets all configuration options to the defaults.
|
41
|
+
def reset
|
42
|
+
self.email_address = nil
|
43
|
+
self.client_id = nil
|
44
|
+
self.client_secret = nil
|
45
|
+
self.auth_token = nil
|
46
|
+
self.password = nil
|
47
|
+
self.api_key = nil
|
48
|
+
self.end_point = DEFAULT_ENDPOINT
|
49
|
+
self.oauth_end_point = DEFAULT_OAUTH_ENDPOINT
|
50
|
+
self.api_version = DEFAULT_API_VERSION
|
51
|
+
self.user_agent = DEFAULT_USER_AGENT
|
52
|
+
self.log_level = 3
|
53
|
+
self.logging = true
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module HelloSign
|
2
|
+
module Error
|
3
|
+
# Custom error class for rescuing from all HelloSign errors.
|
4
|
+
class Error < StandardError; end
|
5
|
+
|
6
|
+
# Raise when attributes are missing.
|
7
|
+
class MissingAttributes < Error; end
|
8
|
+
|
9
|
+
# Raised when API endpoint credentials not configured.
|
10
|
+
class MissingCredentials < Error; end
|
11
|
+
|
12
|
+
# Raised when impossible to parse response body.
|
13
|
+
class Parsing < Error; end
|
14
|
+
|
15
|
+
# Raised when API endpoint returns the HTTP status code 400.
|
16
|
+
class BadRequest < Error; end
|
17
|
+
|
18
|
+
# Raised when API endpoint returns the HTTP status code 401.
|
19
|
+
class Unauthorized < Error; end
|
20
|
+
|
21
|
+
# Raised when API endpoint returns the HTTP status code 403.
|
22
|
+
class Forbidden < Error; end
|
23
|
+
|
24
|
+
# Raised when API endpoint returns the HTTP status code 404.
|
25
|
+
class NotFound < Error; end
|
26
|
+
|
27
|
+
# Raised when API endpoint returns the HTTP status code 405.
|
28
|
+
class MethodNotAllowed < Error; end
|
29
|
+
|
30
|
+
# Raised when API endpoint returns the HTTP status code 409.
|
31
|
+
class Conflict < Error; end
|
32
|
+
|
33
|
+
# Raised when API endpoint returns the HTTP status code 410.
|
34
|
+
class Gone < Error; end
|
35
|
+
|
36
|
+
# Raised when API endpoint returns the HTTP status code 500.
|
37
|
+
class InternalServerError < Error; end
|
38
|
+
|
39
|
+
# Raised when API endpoint returns the HTTP status code 502.
|
40
|
+
class BadGateway < Error; end
|
41
|
+
|
42
|
+
# Raised when API endpoint returns the HTTP status code 503.
|
43
|
+
class ServiceUnavailable < Error; end
|
44
|
+
|
45
|
+
# Raised when API endpoint returns the HTTP status code 503.
|
46
|
+
class NotSupportedType < Error; end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
require 'hello_sign/resource/base_resource'
|
2
|
+
require 'hello_sign/resource/resource_array'
|
3
|
+
require 'hello_sign/resource/account'
|
4
|
+
require 'hello_sign/resource/embedded'
|
5
|
+
require 'hello_sign/resource/template'
|
6
|
+
require 'hello_sign/resource/signature_request'
|
7
|
+
require 'hello_sign/resource/team'
|
8
|
+
require 'hello_sign/resource/unclaimed_draft'
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module HelloSign
|
2
|
+
module Resource
|
3
|
+
|
4
|
+
#
|
5
|
+
# Contains information about an account and its settings.
|
6
|
+
# Take a look at our {https://www.hellosign.com/api/reference#Account account resource document}
|
7
|
+
# for more information about this.
|
8
|
+
#
|
9
|
+
# @author [hellosign]
|
10
|
+
#
|
11
|
+
class Account < BaseResource
|
12
|
+
|
13
|
+
#
|
14
|
+
# Create a new Account from a hash. If key defined then account data with be the value of hash[key], otherwise the hash itself
|
15
|
+
# @param hash [Hash] account's data
|
16
|
+
# @param key [String] (account) key of the hash, point to where account data is. If nil then the hash itself
|
17
|
+
#
|
18
|
+
# @return [HelloSign::Resource:Account] a Account resource
|
19
|
+
def initialize(hash, key='account')
|
20
|
+
super
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module HelloSign
|
2
|
+
module Resource
|
3
|
+
|
4
|
+
#
|
5
|
+
# Store the value of a hash. Use missing_method to create method to access it like an object
|
6
|
+
#
|
7
|
+
# @author [hellosign]
|
8
|
+
#
|
9
|
+
class BaseResource
|
10
|
+
|
11
|
+
|
12
|
+
#
|
13
|
+
# recursively convert hash data into BaseResource.
|
14
|
+
#
|
15
|
+
# @param hash [Hash] data of the resource
|
16
|
+
# @param key [String] (nil) key of the hash, point to where resource data is. If nil then the hash itself
|
17
|
+
#
|
18
|
+
# @return [HelloSign::Resource::BaseResource] a new BaseResource
|
19
|
+
def initialize(hash, key=nil)
|
20
|
+
@raw_data = key ? hash[key] : hash
|
21
|
+
@data = @raw_data.inject({}) do |data, (key,value)|
|
22
|
+
data[key.to_s] = if value.is_a? Hash
|
23
|
+
value = BaseResource.new(value)
|
24
|
+
elsif ((value.is_a? Array) && (value[0].is_a? Hash))
|
25
|
+
value = value.map {|v| BaseResource.new(v)}
|
26
|
+
else
|
27
|
+
value
|
28
|
+
end
|
29
|
+
data
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
#
|
35
|
+
# Magic method, give class dynamic methods based on hash keys.
|
36
|
+
#
|
37
|
+
# If initialized hash has a key which matches the method name, return value of that key.
|
38
|
+
#
|
39
|
+
# Otherwise, return nil
|
40
|
+
#
|
41
|
+
# @param method [Symbol] Method's name
|
42
|
+
#
|
43
|
+
# @example
|
44
|
+
# resource = BaseResource.new :email_address => "me@example.com"
|
45
|
+
# resource.email_address # => "me@example.com"
|
46
|
+
# resource.not_in_hash_keys # => nil
|
47
|
+
def method_missing(method)
|
48
|
+
@data.key?(method.to_s) ? @data[method.to_s] : nil
|
49
|
+
end
|
50
|
+
|
51
|
+
#
|
52
|
+
# raw response data from the server in json
|
53
|
+
#
|
54
|
+
# @return [type] [description]
|
55
|
+
def data
|
56
|
+
@raw_data
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module HelloSign
|
2
|
+
module Resource
|
3
|
+
|
4
|
+
#
|
5
|
+
# An object that contains necessary information to set up embedded signing.
|
6
|
+
# Take a look at our {https://www.hellosign.com/api/reference#Embedded account resource document}
|
7
|
+
# for more information about this.
|
8
|
+
#
|
9
|
+
# @author [hellosign]
|
10
|
+
#
|
11
|
+
class Embedded < BaseResource
|
12
|
+
|
13
|
+
#
|
14
|
+
# create a new Embedded resource from a hash. If a key is defined then embedded data with be the value of hash[key], otherwise the hash itself
|
15
|
+
# @param hash [Hash] embedded's data
|
16
|
+
# @param key [String] (embedded) key of the hash, point to where embedded data is. If nil then the hash itself
|
17
|
+
#
|
18
|
+
# @return [HelloSign::Resource:Embedded] a Embedded resource
|
19
|
+
def initialize(hash, key='embedded')
|
20
|
+
super
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'pry'
|
2
|
+
module HelloSign
|
3
|
+
module Resource
|
4
|
+
|
5
|
+
#
|
6
|
+
# Stores an array of HelloSign BaseResource with paging information
|
7
|
+
#
|
8
|
+
# @author [hellosign]
|
9
|
+
#
|
10
|
+
class ResourceArray < Array
|
11
|
+
attr_reader :page, :num_pages, :num_results, :page_size
|
12
|
+
|
13
|
+
|
14
|
+
#
|
15
|
+
# create a new ResourceArray from a hash
|
16
|
+
#
|
17
|
+
# @param hash [Hash] data of the array
|
18
|
+
# @param key [String] key of the hash, point to where resource array data is
|
19
|
+
# @param resource_class [Class] a Resource Class object inherited from BaseResource. Use the created array item from hash[key]
|
20
|
+
#
|
21
|
+
# @return [type] [description]
|
22
|
+
def initialize(hash, key, resource_class)
|
23
|
+
@page = hash['list_info']['page']
|
24
|
+
@num_pages = hash['list_info']['num_pages']
|
25
|
+
@num_results = hash['list_info']['num_results']
|
26
|
+
@page_size = hash['list_info']['page_size']
|
27
|
+
hash[key] && hash[key].each do |resouce|
|
28
|
+
self << resource_class.new(resouce, nil)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module HelloSign
|
2
|
+
module Resource
|
3
|
+
|
4
|
+
#
|
5
|
+
# Contains information regarding documents that need to be signed
|
6
|
+
# Take a look at our {https://www.hellosign.com/api/reference#SignatureRequest signature request resource document}
|
7
|
+
# for more information about this.
|
8
|
+
#
|
9
|
+
# @author [hellosign]
|
10
|
+
#
|
11
|
+
class SignatureRequest < BaseResource
|
12
|
+
|
13
|
+
#
|
14
|
+
# create a new SignatureRequest from a hash. If a key is defined then account data with be the value of hash[key], otherwise the hash itself
|
15
|
+
# @param hash [Hash] signature request's data
|
16
|
+
# @param key [String] (signature_request) key of the hash, point to where signature request data is. If nil then the hash itself
|
17
|
+
#
|
18
|
+
#
|
19
|
+
# @return [HelloSign::Resource::SignatureRequest] a SignatureRequest resource
|
20
|
+
def initialize(hash, key='signature_request')
|
21
|
+
super
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module HelloSign
|
2
|
+
module Resource
|
3
|
+
|
4
|
+
#
|
5
|
+
# Contains information about an team and its members.
|
6
|
+
# Take a look at our {https://www.hellosign.com/api/reference#Team team resource document}
|
7
|
+
# for more information about this.
|
8
|
+
#
|
9
|
+
# @author [hellosign]
|
10
|
+
#
|
11
|
+
class Team < BaseResource
|
12
|
+
|
13
|
+
#
|
14
|
+
# create a new Team from a hash. If a key is defined then team data with be the value of hash[key], otherwise the hash itself
|
15
|
+
# @param hash [Hash] team's data
|
16
|
+
# @param key [String] (team) key of the hash, point to where team data is. If nil then the hash itself
|
17
|
+
#
|
18
|
+
# @return [HelloSign::Resource:Team] a Team resource
|
19
|
+
def initialize(hash, key='team')
|
20
|
+
super
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module HelloSign
|
2
|
+
module Resource
|
3
|
+
|
4
|
+
#
|
5
|
+
# Contains information about the templates you and your team have created
|
6
|
+
#
|
7
|
+
# Take a look at our {https://www.hellosign.com/api/reference#Template Template resource document}
|
8
|
+
# for more information about this.
|
9
|
+
#
|
10
|
+
# @author [hellosign]
|
11
|
+
#
|
12
|
+
class Template < BaseResource
|
13
|
+
|
14
|
+
#
|
15
|
+
# create a new Template from a hash. If a key is defined then template data will be the value of hash[key], otherwise the hash itself
|
16
|
+
# @param hash [Hash] template's data
|
17
|
+
# @param key [String] (template) key of the hash, point to where template data is. If nil then the hash itself
|
18
|
+
#
|
19
|
+
# @return [HelloSign::Resource:Team] a Team resource
|
20
|
+
def initialize(hash, key='template')
|
21
|
+
super
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module HelloSign
|
2
|
+
module Resource
|
3
|
+
|
4
|
+
#
|
5
|
+
# A group of documents that a user can take ownership of by going to the claim URL
|
6
|
+
# Take a look at our {https://www.hellosign.com/api/reference#UnclaimedDraft unclaimed draft resource document}
|
7
|
+
# for more information about this.
|
8
|
+
#
|
9
|
+
# @author [hellosign]
|
10
|
+
#
|
11
|
+
class UnclaimedDraft < BaseResource
|
12
|
+
|
13
|
+
#
|
14
|
+
# create a new UnclaimedDraft from a hash. If a key is defined then unclaimed draft data with be the value of hash[key], otherwise the hash itself
|
15
|
+
# @param hash [Hash] unclaimed draft's data
|
16
|
+
# @param key [String] (unclaimed_draft) key of the hash, point to where unclaimed draft data is. If nil then the hash itself
|
17
|
+
#
|
18
|
+
# @return [HelloSign::Resource:Team] a Team resource
|
19
|
+
def initialize(hash, key='unclaimed_draft')
|
20
|
+
super
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
{"account": {"account_id":"123456789", "email_address":"test@example.com", "is_paid_hs":false, "is_paid_hf":false, "quotas":{"templates_left":0, "documents_left":0, "api_signature_requests_left":0}, "callback_url":"https://example.com", "role_code":""}}
|
File without changes
|
@@ -0,0 +1,2 @@
|
|
1
|
+
{"signature_request":{"signature_request_id":"1", "title":"title", "original_title":"original_title", "subject":"subject", "message":"message", "test_mode":false, "is_complete":true, "has_error":false, "custom_fields":[],
|
2
|
+
"response_data":[{"name":"name", "value":"value", "type":"signature", "api_id":"api_id", "signature_id":"signature_id"}], "signing_url":"https://example.com/signing_url", "signing_redirect_url":"https://example.com/signing_redirect_url", "final_copy_uri":"/v3/final_copy_url", "files_url":"https://example.com/file_url", "details_url":"https://example.com/details_url", "requester_email_address":"requester_email_address@example.com", "signatures":[{"signature_id":"signature_id", "has_pin":false, "signer_email_address":"signer_email_address@example.com", "signer_name":"signer_name", "order":1, "status_code":"signed", "signed_at":1393389891, "last_viewed_at":1393389853, "last_reminded_at":1393389852}], "cc_email_addresses":[]}}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
{
|
2
|
+
"list_info": {
|
3
|
+
"page": 1,
|
4
|
+
"num_pages": 1,
|
5
|
+
"num_results": 1,
|
6
|
+
"page_size": 20
|
7
|
+
},
|
8
|
+
"signature_requests":[
|
9
|
+
{
|
10
|
+
"signature_request_id":"1", "title":"title", "original_title":"original_title", "subject":"subject", "message":"message", "test_mode":false, "is_complete":true, "has_error":false, "custom_fields":[],
|
11
|
+
"response_data":[{"name":"name", "value":"value", "type":"signature", "api_id":"api_id", "signature_id":"signature_id"}], "signing_url":"https://example.com/signing_url", "signing_redirect_url":"https://example.com/signing_redirect_url", "final_copy_uri":"/v3/final_copy_url", "files_url":"https://example.com/file_url", "details_url":"https://example.com/details_url", "requester_email_address":"requester_email_address@example.com", "signatures":[{"signature_id":"signature_id", "has_pin":false, "signer_email_address":"signer_email_address@example.com", "signer_name":"signer_name", "order":1, "status_code":"signed", "signed_at":1393389891, "last_viewed_at":1393389853, "last_reminded_at":1393389852}], "cc_email_addresses":[]
|
12
|
+
}
|
13
|
+
]
|
14
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
{
|
2
|
+
"team": {
|
3
|
+
"name": "Team HelloSign",
|
4
|
+
"accounts": [
|
5
|
+
{
|
6
|
+
"account_id": "5008b25c7f67153e57d5a357b1687968068fb465",
|
7
|
+
"email_address": "me@example.com",
|
8
|
+
"role_code": "a"
|
9
|
+
},
|
10
|
+
{
|
11
|
+
"account_id": "d3d3d7b98d80b67d07740df7cdfd1f49fa8e2b82",
|
12
|
+
"email_address": "teammate@example.com",
|
13
|
+
"role_code": "m"
|
14
|
+
}
|
15
|
+
],
|
16
|
+
"invited_accounts": [
|
17
|
+
]
|
18
|
+
}
|
19
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"template":{"template_id":"a364138e0d8ae6393aa425a8ec64715580f3748b","title":"bitcoin","message":"Hello, bitcoin pdf here","is_creator":true,"can_edit":true,"signer_roles":[{"name":"Client","order":null}],"cc_roles":[],"documents":[{"index":"0","name":"bitcoin.pdf","custom_fields":[],"form_fields":[{"name":"","type":"signature","signer":"1","x":501,"y":7498,"width":120,"height":30,"required":true,"api_id":"a1ca72_9"}]}],"custom_fields":[],"named_form_fields":[{"name":"","type":"signature","signer":"1","x":501,"y":7498,"width":120,"height":30,"required":true,"api_id":"a1ca72_9"}],"accounts":[{"account_id":"a82bbf8a2fb928f239e2bd59df50e23b82b3eedd","email_address":"testuser@example.com","is_paid_hs":false,"is_paid_hf":false,"quotas":{"templates_left":0,"documents_left":3,"api_signature_requests_left":0}}]}}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
{
|
2
|
+
"list_info": {
|
3
|
+
"page": 1,
|
4
|
+
"num_pages": 1,
|
5
|
+
"num_results": 1,
|
6
|
+
"page_size": 20
|
7
|
+
},
|
8
|
+
"templates":[
|
9
|
+
{"template_id":"a364138e0d8ae6393aa425a8ec64715580f3748b","title":"bitcoin","message":"Hello, bitcoin pdf here","is_creator":true,"can_edit":true,"signer_roles":[{"name":"Client","order":null}],"cc_roles":[],"documents":[{"index":"0","name":"bitcoin.pdf","custom_fields":[],"form_fields":[{"name":"","type":"signature","signer":"1","x":501,"y":7498,"width":120,"height":30,"required":true,"api_id":"a1ca72_9"}]}],"custom_fields":[],"named_form_fields":[{"name":"","type":"signature","signer":"1","x":501,"y":7498,"width":120,"height":30,"required":true,"api_id":"a1ca72_9"}],"accounts":[{"account_id":"a82bbf8a2fb928f239e2bd59df50e23b82b3eedd","email_address":"testuser@example.com","is_paid_hs":false,"is_paid_hf":false,"quotas":{"templates_left":0,"documents_left":3,"api_signature_requests_left":0}}]}
|
10
|
+
]
|
11
|
+
}
|