{"record":{"id":"b00674216cdd17bf","repo":"docusealco/docuseal","slug":"defined-more-signing-parties-than-in-template","errorCode":null,"errorMessage":"Defined more signing parties than in template","messagePattern":"Defined more signing parties than in template","errorType":"validation","errorClass":"Submissions::CreateFromSubmitters::BaseError","httpStatus":422,"severity":"error","filePath":"lib/submissions/create_from_submitters.rb","lineNumber":80,"sourceCode":"                                                         'invite_via_field_uuid')\n\n          template_submitter['order'] = submitter_attrs['order'] if submitter_attrs['order'].present?\n\n          submission.template_submitters << template_submitter\n\n          is_order_sent = submitters_order == 'random' ||\n                          (template_submitter['order'] || submitter_attrs[:index] || index).zero?\n\n          build_submitter(submission:, attrs: submitter_attrs,\n                          uuid:, is_order_sent:, user:, params:,\n                          preferences: preferences.merge(submission_preferences))\n        end\n\n        maybe_set_dynamic_documents(submission)\n        maybe_set_template_fields(submission, attrs[:submitters], with_template:, new_fields:)\n\n        if submission.submitters.size > template.submitters.size\n          raise BaseError, 'Defined more signing parties than in template'\n        end\n\n        if template.preferences['validate_unique_submitters'] == true\n          submission_emails = submission.submitters.filter_map(&:email)\n\n          raise BaseError, 'Recipient emails should differ' if submission_emails.uniq.size != submission_emails.size\n        end\n\n        next if submission.submitters.blank?\n\n        maybe_add_invite_submitters(submission, template, attrs[:submitters])\n\n        assign_submitters_is_viewer(submission)\n\n        submission.template = nil unless with_template\n\n        submission.tap(&:save!)\n      end","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/docusealco/docuseal/blob/004a22c1c88109c7ba0b567df011a8cb13894001/lib/submissions/create_from_submitters.rb#L62-L98","documentation":"Submissions::CreateFromSubmitters raises BaseError 'Defined more signing parties than in template' (lib/submissions/create_from_submitters.rb:80) when the built submission ends with more Submitter records than the template defines parties. After each entry is matched to a template party (or several parties merged via roles:), the code guards the invariant that a submission cannot gain parties the template does not have.","triggerScenarios":"POST /api/submissions with a submitters array longer than template.submitters where every entry matches a different party by index/role/uuid (e.g. 3 entries against a 2-party template); duplicate entries each resolving to distinct template parties; combined with maybe_add_invite_submitters adding invite-linked parties that push the count over.","commonSituations":"Client apps looping over their own signer list without comparing against the template's party count; templates edited down (role removed) while the integration still sends the old number of signers; assuming unmatched extra entries are silently ignored.","solutions":["Cap your submitters array at template.submitters.size — fetch the template and count its parties before building the request.","If one person must sign for multiple roles, merge them into a single entry with roles: ['Role A', 'Role B'] so the party count stays within the template.","Re-pull the template after edits and regenerate the request payload; removed roles still counted client-side are the usual cause.","Rescue Submissions::CreateFromSubmitters::BaseError and report a 422 with the message so callers can fix their payload."],"exampleFix":"# before\nsubmitters_attrs = external_signers.map { |s| { role: s.role, email: s.email } } # may exceed parties\n\n# after\nmax = template.submitters.size\nsubmitters_attrs = external_signers.first(max).map { |s| { role: s.role, email: s.email } }","handlingStrategy":"validation","validationCode":"# Guard before calling: never send more parties than the template defines\nparty_count = template.submitters.size\nraise ArgumentError, \"at most #{party_count} submitters allowed\" if submitter_entries.size > party_count","typeGuard":null,"tryCatchPattern":"begin\n  Submissions::CreateFromSubmitters.call(template:, user:, submissions_attrs:, source:, submitters_order:)\nrescue Submissions::CreateFromSubmitters::BaseError => e\n  render json: { error: e.message }, status: :unprocessable_entity # 'Defined more signing parties than in template'\nend","preventionTips":["Derive the signers list from template.submitters.size, never from your own roster length.","Use roles: ['A', 'B'] on one entry when one person covers multiple parties.","Re-check the template party count after any template edit before reusing stored payloads.","Treat this error as a client payload bug (422), not a server failure."],"tags":["docuseal","submissions","template-parties","params-validation"],"backgroundTag":"submission-validation-failed","analyzedSha":"004a22c1c88109c7ba0b567df011a8cb13894001","analyzedAt":"2026-08-21T13:38:23.343Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}