BlueprintSpec
The blueprint's content. Only envelopes is required — at minimum a blueprint bundles documents to render. From there, optional fields layer on capability:
- Add
inputsto declare data the caller must supply when running the blueprint. - Add
participantsto declare the parties involved. - Add
orchestrationto drive those participants through a signing flow.
Without orchestration, a blueprint is a document rendering engine — it generates documents from templates and (optionally) inputs, but doesn't trigger any signing. Add orchestration (typically with participants) to turn it into a full signing workflow.
customFields and functions are auxiliary: customFields carry runtime metadata; functions pin JSONata functions referenced by expressions inside the blueprint.
- envelopesType: array object[] · BlueprintEnvelope[]required
Required. Envelopes bundle documents that get rendered together (and, if orchestration is present, signed together).
An envelope bundles documents that get rendered (and, if orchestration is present, signed) together. Multiple envelopes split a single blueprint into independent signing sessions — each envelope generates its own emails to participants and tracks its own completion state.
- documentsType: array object[]required
Documents within this envelope. Each document specifies what to render — either through a template (
templateKey+templateVersion), directly from an uploaded file (fileId), or a template with a fileId override. At least one oftemplateKeyorfileIdmust be set per document. - keyType: stringrequired
Unique identifier for this envelope within the blueprint. Referenced by
action.envelopeKeyon participant steps. - subjectType: stringrequired
Subject line used in email notifications sent to participants for this envelope (e.g. "Your offer letter from Acme Corp"). Free-form text — what recipients see in their inbox.
- resolutionType: stringenum
Mode When the envelope's documents are materialized:
immediate(default) — documents render at workflow creation, using the inputs supplied at that point. Use when input data is fully known up front.just_in_time— documents render right before the participant signs, using whatever input data is current then. Use when earlier steps update the entity data that this envelope's templates consume.
values- immediate
- just
_in _time
- customType: array object[] · CustomFieldConfig[]
Fields Custom fields whose values are computed at run time and carried alongside the blueprint output.
Caller-extensible field carried alongside the blueprint at run time. Unlike
inputs(data the caller supplies) or template fields (placed on documents), custom fields are arbitrary key/value metadata — useful for tagging workflows with reference IDs, deal numbers, or computed flags that downstream systems consume.- keyType: stringrequired
Unique identifier for this custom field. Used as the property name when the value is exposed downstream.
- nameType: stringrequired
Human-readable label shown in Studio.
- value
Value for the custom field (can be literal or JSONata expression)
- Type: string
Value for the custom field (can be literal or JSONata expression)
- functionsType: array object[]
JSONata functions referenced by expressions inside the blueprint. Each entry pins a specific function key + version, with an optional
aliasused at call sites (defaults tofunctionKeywhen not specified). Aliases let you decouple call-site names from resource keys so you can rename or swap functions without rewriting every expression.- functionType: string
Key requiredResource key of the JSONata function being referenced.
- functionType: string
Version requiredSpecific version of the function being pinned (semver like
1.0.0ordraftwhile iterating). - aliasType: string
Pattern: ^[a-z][a-zA-Z0-9]*$Optional name used in JSONata expressions to invoke this function as
$<alias>(...). Defaults tofunctionKeywhen not specified.
- inputsType: array object[] · Input[]
Optional. Entity inputs the caller must supply when running this blueprint. Omit if the blueprint's templates need no caller-supplied data.
- keyType: stringrequired
Unique identifier for this input
- requiredrequired
Whether this entity slot must be populated (boolean literal or JSONata expression)
- Type: boolean
Whether this entity slot must be populated (boolean literal or JSONata expression)
- schemaType: string
Key requiredKey of the schema that defines this entity's structure
- schemaType: string
Version requiredSchema version. Either a semantic version (e.g.
1.2.0) ordraftwhile the parent blueprint is itself a draft. - descriptionType: string
Description of what this input represents
- nameType: string
Human-readable name for this input
- orchestrationType: object
Optional. Root step of the signing flow. Just two primitives:
participant— one task assigned to a participant. SetparticipantKeyandaction.group— a container that runschildreneithersequentially or inparallel, with optionalcompletion(all/any/quorum).
Groups nest — that's the entire composition mechanism. From these two primitives plus nesting you can model any signing flow:
- Linear chain —
group:sequentialof participants: A signs, then B, then C. - Parallel sign-off —
group:parallelof participants: board members sign concurrently. - Phased approvals —
group:sequentialwhose children aregroup:parallels: each phase opens after the previous one completes; signers within a phase work in parallel. - Quorum —
group:parallelwithcompletion: quorum,quorum: 2: first 2 of 3 approvers wins; the third is skipped. - Conditional branches —
includeIfon any step gates the path on a JSONata expression evaluated at run time.
onCompleteon any step adds validation or entity-data updates when the step finishes — useful for chaining state forward (e.g. write the manager's signed-off salary into the next phase's inputs).Omit
orchestrationentirely to use the blueprint as a document rendering engine with no signing flow.- keyType: stringrequired
Unique identifier for this step within the orchestration.
- typeType: stringenumrequired
groupfor a container that runs children;participantfor a single signer task.values- group
- participant
- actionType: object
What the participant does at this step (participant steps only).
- childrenType: array object[] · BlueprintStep[]
Nested steps (group steps only). Recursive — each child is itself a
BlueprintStep.A step in the blueprint's orchestration tree — either a
participant(one task assigned to a participant) or agroup(a container of nested children). - completionType: stringenum
When the group is considered complete (group steps only):
all(default) — every child must complete before the group is done.any— the group completes as soon as any one child completes; remaining children no longer block.quorum— the group completes as soon as at least N children complete, where N is set in thequorumfield below.
values- all
- any
- quorum
- executionType: stringenum
How children execute (group steps only).
sequentialruns them in order;parallelruns them concurrently.values- sequential
- parallel
- includeType: string
If Optional JSONata expression evaluated at run time. If it returns false, this step is skipped.
- nameType: string
Optional human-readable label shown in Studio and in audit/event logs. The
keyis the machine-readable handle. - onType: object
Complete Optional hooks that run when this step completes.
- participantType: string
Key Participant whose action this step represents (participant steps only). Must match a key in
spec.participants. - quorumType: integermin:1
The number of children that must complete to satisfy the group. Required when
completionisquorum(ignored otherwise). Example:quorum: 2with 3 children means the group completes as soon as any 2 of them complete.
- participantsType: array object[] · BlueprintParticipant[]
Optional. Roles involved in the blueprint. Each participant's name/email may be bound dynamically from inputs via JSONata expressions. Omit for pure document-rendering blueprints (no signing).
A party involved in the blueprint.
keyandnamedefine the role slot ("Hiring Manager", "Candidate");participantNameandparticipantEmailresolve to the actual person at run time, either as literals or via JSONata expressions that derive them from inputs.- keyType: stringrequired
Unique identifier for this participant within the blueprint.
- nameType: stringrequired
Human-readable role label shown in Studio and audit trails (e.g. "Hiring Manager"). Distinct from the resolved person's name — that comes from
participantName. - participant
Email requiredResolved email of the actual person filling this participant slot at run time. Either a literal string or a JSONata expression that derives the email from inputs (e.g.
{ "expression": "candidate.email" }). Required — a participant whose email doesn't resolve at run time would otherwise be silently dropped from the workflow.- Type: string
Resolved email of the actual person filling this participant slot at run time. Either a literal string or a JSONata expression that derives the email from inputs (e.g.
{ "expression": "candidate.email" }). Required — a participant whose email doesn't resolve at run time would otherwise be silently dropped from the workflow.
- participant
Name requiredResolved name of the actual person filling this participant slot at run time. Either a literal string or a JSONata expression that derives the name from inputs (e.g.
{ "expression": "candidate.fullName" }). Required — a participant whose name doesn't resolve at run time would otherwise be silently dropped from the workflow.- Type: string
Resolved name of the actual person filling this participant slot at run time. Either a literal string or a JSONata expression that derives the name from inputs (e.g.
{ "expression": "candidate.fullName" }). Required — a participant whose name doesn't resolve at run time would otherwise be silently dropped from the workflow.
- roleType: string
Category Optional category for grouping or filtering participants (e.g. "Signer", "Reviewer").
