210 × 297 mm
Contracts
Freelance services agreement
An A4 freelance services agreement layout with a parties block, numbered clauses and lettered points rendered from data, a milestone fee schedule with payment dates, a separate signature page and a header and footer with the document reference and page numbers. Sample wording only, not legal advice.
Opens Dynamic Document API with this template preloaded in a free workspace.
Template language features
- Loops
- Conditionals
- Macros
- Filters
- Currency formatting
- Date formatting
- Page breaks
- Repeating table headers
- Header & footer
- Page numbers
Filters such as format_currency and qrcode are described in the template language reference.
Variables
Derived from the sample data: 8 top-level fields, 46 paths in total. Send the same shape as data.
| Path | Type | Example |
|---|---|---|
| document | object | |
| document.title | string | "Freelance Services Agreement" |
| document.reference | string | "FSA-2026-031" |
| document.version | string | "1.2" |
| document.date | date | "2026-09-14" |
| document.governing_law | string | "England and Wales" |
| document.sample_notice | string | "This template is provided for demonstration on…" |
| client | object | |
| client.name | string | "Wickerbay Studios Ltd" |
| client.description | string | "a company registered in England and Wales with…" |
| client.address | string | "4th Floor, Pennant House ⏎ 22 Weaver Street ⏎ …" |
| client.contact_name | string | "Imogen Castellow" |
| client.contact_title | string | "Head of Production" |
| client.email | string | "imogen.castellow@wickerbay.example.com" |
| contractor | object | |
| contractor.name | string | "Idris Pellegrino-Shaw" |
| contractor.description | string | "a sole trader trading as Pellegrino Motion" |
| contractor.address | string | "Studio 11, Foundry Yard ⏎ 8 Mill Lane ⏎ Stockp…" |
| contractor.contact_name | string | "Idris Pellegrino-Shaw" |
| contractor.contact_title | string | "Animator and director" |
| contractor.email | string | "hello@pellegrinomotion.example.net" |
| project | object | |
| project.name | string | "Explainer animation series" |
| project.summary | string | "Scripts, storyboards and animation for three 6…" |
| project.start_date | date | "2026-10-01" |
| project.duration_weeks | number | 11 |
| fees | object | |
| fees.currency | string | "GBP" |
| fees.payment_terms_days | number | 14 |
| fees.day_rate | number | 450 |
| fees.vat_note | string | "The Contractor is not registered for VAT, so n…" |
| fee_schedule | array<object> · 4 | |
| fee_schedule[].milestone | string | "Kick-off and scripts" |
| fee_schedule[].deliverable | string | "Approved scripts for all three videos" |
| fee_schedule[].due | date | "2026-10-16" |
| fee_schedule[].amount | number | 1800 |
| clauses | array<object> · 10 | |
| clauses[].title | string | "Services" |
| clauses[].subclauses | array<object> · 3 | |
| clauses[].subclauses[].text | string | "The Contractor will provide the work described…" |
| clauses[].show_fee_schedule? | boolean | true |
| signatories | array<object> · 2 | |
| signatories[].party | string | "For the Client" |
| signatories[].organisation | string | "Wickerbay Studios Ltd" |
| signatories[].name | string | "Imogen Castellow" |
| signatories[].title | string | "Head of Production" |
Sample data
Fictional records used for previews. Replace them with your own data when you call the API.
{
"document": {
"title": "Freelance Services Agreement",
"reference": "FSA-2026-031",
"version": "1.2",
"date": "2026-09-14",
"governing_law": "England and Wales",
"sample_notice": "This template is provided for demonstration only. It is not legal advice and has not been reviewed for any jurisdiction. Have any agreement you plan to use checked by a qualified adviser."
},
"client": {
"name": "Wickerbay Studios Ltd",
"description": "a company registered in England and Wales with company number 01234567",
"address": "4th Floor, Pennant House\n22 Weaver Street\nManchester M4 6AB\nUnited Kingdom",
"contact_name": "Imogen Castellow",
"contact_title": "Head of Production",
"email": "imogen.castellow@wickerbay.example.com"
},
"contractor": {
"name": "Idris Pellegrino-Shaw",
"description": "a sole trader trading as Pellegrino Motion",
"address": "Studio 11, Foundry Yard\n8 Mill Lane\nStockport SK1 3QT\nUnited Kingdom",
"contact_name": "Idris Pellegrino-Shaw",
"contact_title": "Animator and director",
"email": "hello@pellegrinomotion.example.net"
},
"project": {
"name": "Explainer animation series",
"summary": "Scripts, storyboards and animation for three 60-second explainer videos about the Client's scheduling product, with burned-in subtitles and six short cut-downs for social media.",
"start_date": "2026-10-01",
"duration_weeks": 11
},
"fees": {
"currency": "GBP",
"payment_terms_days": 14,
"day_rate": 450.0,
"vat_note": "The Contractor is not registered for VAT, so no VAT is added to these fees."
},
"fee_schedule": [
{ "milestone": "Kick-off and scripts", "deliverable": "Approved scripts for all three videos", "due": "2026-10-16", "amount": 1800.0 },
{ "milestone": "Storyboards and style frames", "deliverable": "Storyboards plus two style frames per video", "due": "2026-11-06", "amount": 2400.0 },
{ "milestone": "Animation, first cut", "deliverable": "First cut of each video, ready for review", "due": "2026-12-03", "amount": 3600.0 },
{ "milestone": "Final delivery", "deliverable": "Final masters, subtitle files and six cut-downs", "due": "2026-12-17", "amount": 2200.0 }
],
"clauses": [
{
"title": "Services",
"subclauses": [
{ "text": "The Contractor will provide the work described in the project summary and the fee schedule (the \"Services\")." },
{ "text": "The Contractor decides how, where and when the Services are carried out, as long as each deliverable is supplied by the due date in the fee schedule." },
{ "text": "The Client will supply the information, brand assets and feedback that the Contractor reasonably needs, and will name one person who can give approvals." }
]
},
{
"title": "Timing",
"subclauses": [
{ "text": "This agreement starts on the start date and continues until the final deliverable has been accepted and paid for, unless it ends earlier under clause 9." },
{ "text": "If feedback or approvals from the Client arrive later than agreed, any due date that depends on them moves back by the same number of working days." }
]
},
{
"title": "Fees and payment",
"show_fee_schedule": true,
"subclauses": [
{ "text": "The Client will pay the fees in the fee schedule below. The Contractor will invoice each milestone once its deliverable has been supplied." },
{ "text": "Each invoice is payable within {payment_days} days of receipt, by bank transfer to the account shown on the invoice." },
{ "text": "Extra work outside the Services is charged at {day_rate} for each day or part day, but only if both parties have agreed it in writing first." },
{ "text": "While an invoice is more than {payment_days} days overdue, the Contractor may pause work after giving the Client written notice." }
]
},
{
"title": "Expenses",
"subclauses": [
{ "text": "Expenses are payable only if the Client approved them in writing before they were incurred." },
{ "text": "Approved expenses are charged at cost, with receipts, on the next milestone invoice." }
]
},
{
"title": "Changes and feedback",
"subclauses": [
{ "text": "Either party may ask for a change to the Services. A change takes effect only once both parties have agreed in writing how it affects the fees and due dates." },
{ "text": "Each deliverable includes up to two rounds of combined feedback from the Client. Further rounds are handled as a change request." }
]
},
{
"title": "Intellectual property",
"subclauses": [
{ "text": "Once a deliverable has been paid for in full, the copyright in that deliverable belongs to the Client." },
{ "text": "The Contractor keeps ownership of its own tools, templates and methods that existed before this agreement, and gives the Client a permanent, non-exclusive licence to use any of them that form part of the deliverables." },
{ "text": "Unless the Client objects in writing, the Contractor may show the final deliverables in its portfolio after the Client has published them." }
]
},
{
"title": "Confidentiality",
"subclauses": [
{ "text": "Each party will keep the other party's confidential information private and use it only for this agreement." },
{
"text": "Clause 7.1 does not apply to information that:",
"points": [
"is or becomes public, other than through a breach of this agreement;",
"the receiving party already held lawfully before this agreement; or",
"must be disclosed by law or by a court, in which case the other party is told first where the law allows it."
]
}
]
},
{
"title": "Status and responsibility",
"subclauses": [
{ "text": "The Contractor is an independent contractor, not an employee, and is responsible for its own tax, insurance and equipment." },
{ "text": "Neither party is responsible for the other party's indirect losses. Each party's total responsibility under this agreement is capped at the total fees in the fee schedule." }
]
},
{
"title": "Ending the agreement",
"subclauses": [
{ "text": "Either party may end this agreement by giving the other two weeks' written notice." },
{ "text": "Either party may end this agreement straight away by written notice if the other party seriously breaks it and does not put things right within ten working days of being asked to." },
{
"text": "When this agreement ends:",
"points": [
"the Client pays for work completed up to the end date, including a fair share of the milestone in progress;",
"each party returns or deletes the other party's confidential information; and",
"clauses 6, 7 and 8 continue to apply."
]
}
]
},
{
"title": "General",
"subclauses": [
{ "text": "Notices under this agreement are sent by email to the addresses in the parties section." },
{ "text": "This document, including the fee schedule, is the whole agreement between the parties about the Services." },
{ "text": "This agreement is governed by the law of {governing_law}." }
]
}
],
"signatories": [
{ "party": "For the Client", "organisation": "Wickerbay Studios Ltd", "name": "Imogen Castellow", "title": "Head of Production" },
{ "party": "For the Contractor", "organisation": "Pellegrino Motion", "name": "Idris Pellegrino-Shaw", "title": "Sole trader" }
]
}Source
The body markup with Jinja, the stylesheet placed in <head> and the header and footer settings.
{#- Freelance services agreement. Sample wording only, not legal advice.
Clause text may contain {payment_days}, {day_rate} and {governing_law}; the fill() macro swaps in values from data. -#}
{%- set locale = "en-GB" -%}
{%- set currency = fees.currency -%}
{%- set total_fees = fee_schedule | sum_by("amount") -%}
{%- set end_date = project.start_date | date_add(days=project.duration_weeks * 7) -%}
{%- set letters = "abcdefghijklmnopqrstuvwxyz" -%}
{%- macro fill(text) -%}
{{ text | replace("{payment_days}", fees.payment_terms_days | string) | replace("{day_rate}", fees.day_rate | format_currency(currency, locale)) | replace("{governing_law}", document.governing_law) }}
{%- endmacro -%}
{%- macro party(role, p) -%}
<div class="party">
<p class="eyebrow">{{ role }}</p>
<p class="party-name">{{ p.name }}</p>
<p class="party-desc">{{ p.description }}</p>
<p class="party-address">{{ p.address | nl2br }}</p>
<p class="party-contact">{{ p.contact_name }}, {{ p.contact_title }}<br>{{ p.email }}</p>
</div>
{%- endmacro %}
<header class="title-page">
<p class="eyebrow">Agreement · {{ document.reference }}</p>
<h1>{{ document.title }}</h1>
<p class="meta">Dated {{ document.date | format_date("long", locale) }} · Version {{ document.version }}</p>
</header>
<aside class="sample-notice">
<strong>Sample wording, not legal advice.</strong> {{ document.sample_notice }}
</aside>
<section class="parties">
<p class="between">This agreement is made between</p>
<div class="party-grid">
{{ party("The Client", client) }}
<span class="and">and</span>
{{ party("The Contractor", contractor) }}
</div>
</section>
<section class="project">
<div>
<p class="eyebrow">Project</p>
<p class="project-name">{{ project.name }}</p>
<p>{{ project.summary }}</p>
</div>
<dl>
<dt>Start date</dt><dd>{{ project.start_date | format_date("long", locale) }}</dd>
<dt>Planned end</dt><dd>{{ end_date | format_date("long", locale) }} ({{ project.duration_weeks }} weeks)</dd>
<dt>Total fees</dt><dd>{{ total_fees | format_currency(currency, locale) }}</dd>
</dl>
</section>
<section class="clauses">
{%- for clause in clauses %}
{%- set clause_no = loop.index %}
<section class="clause">
<h2><span class="no">{{ clause_no }}.</span>{{ clause.title }}</h2>
{%- for sub in clause.subclauses %}
<div class="sub">
<span class="no">{{ clause_no }}.{{ loop.index }}</span>
<div class="text">
{{ fill(sub.text) }}
{%- if sub.points %}
<ol class="points">
{%- for point in sub.points %}
<li><span class="letter">({{ letters[loop.index0] }})</span>{{ fill(point) }}</li>
{%- endfor %}
</ol>
{%- endif %}
</div>
</div>
{%- endfor %}
{%- if clause.show_fee_schedule %}
<table class="fees">
<caption>Fee schedule</caption>
<thead>
<tr>
<th class="idx" scope="col">#</th>
<th scope="col">Milestone and deliverable</th>
<th scope="col">Due</th>
<th scope="col">Payable by</th>
<th class="num" scope="col">Fee</th>
</tr>
</thead>
<tbody>
{%- for row in fee_schedule %}
<tr>
<td class="idx">{{ loop.index }}</td>
<td><strong>{{ row.milestone }}</strong><span class="deliverable">{{ row.deliverable }}</span></td>
<td class="date">{{ row.due | format_date("medium", locale) }}</td>
<td class="date">{{ row.due | date_add(days=fees.payment_terms_days) | format_date("medium", locale) }}</td>
<td class="num">{{ row.amount | format_currency(currency, locale) }}</td>
</tr>
{%- endfor %}
</tbody>
<tfoot>
<tr>
<td class="blank"></td>
<th scope="row" colspan="3">Total fees{% if fees.vat_note %}<span class="deliverable">{{ fees.vat_note }}</span>{% endif %}</th>
<td class="num">{{ total_fees | format_currency(currency, locale) }}</td>
</tr>
</tfoot>
</table>
{%- endif %}
</section>
{%- endfor %}
</section>
{{ page_break() }}
<section class="signature-page">
<p class="eyebrow">{{ document.reference }} · Execution</p>
<h2 class="sign-title">Signatures</h2>
<p class="sign-intro">Signed by the parties, or their authorised representatives, on the dates written below. Each party keeps one signed copy.</p>
<div class="signatures">
{%- for signer in signatories %}
<div class="signature">
<p class="eyebrow">{{ signer.party }}</p>
<p class="org">{{ signer.organisation }}</p>
<div class="line tall"><span>Signature</span></div>
<div class="line"><span>Name</span><em>{{ signer.name }}</em></div>
<div class="line"><span>Role</span><em>{{ signer.title }}</em></div>
<div class="line"><span>Date</span></div>
</div>
{%- endfor %}
</div>
<section class="key-details">
<p class="eyebrow">Key details</p>
<table>
<tr><th scope="row">Reference</th><td>{{ document.reference }}, version {{ document.version }}</td></tr>
<tr><th scope="row">Parties</th><td>{{ client.name }} and {{ contractor.name }}</td></tr>
<tr><th scope="row">Project</th><td>{{ project.name }}</td></tr>
<tr><th scope="row">Period</th><td>{{ project.start_date | format_date("long", locale) }} to {{ end_date | format_date("long", locale) }}</td></tr>
<tr><th scope="row">Fees</th><td>{{ total_fees | format_currency(currency, locale) }} across {{ fee_schedule | length }} milestones, payable within {{ fees.payment_terms_days }} days of invoice</td></tr>
<tr><th scope="row">Governing law</th><td>{{ document.governing_law }}</td></tr>
</table>
</section>
<p class="closing-notice">{{ document.sample_notice }}</p>
</section><title>{{ document.title }} {{ document.reference }}</title>
<style>
:root {
--ink: #1e2533;
--navy: #1f2d4a;
--muted: #5d6474;
--rule: #d9d4c7;
--gold: #a8844a;
--paper: #f8f5ee;
}
* { box-sizing: border-box; }
html { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
body {
margin: 0;
color: var(--ink);
font-family: "Noto Serif", "Liberation Serif", Georgia, serif;
font-size: 9.6pt;
line-height: 1.55;
}
p { margin: 0; }
.eyebrow {
margin-bottom: 1mm;
font-family: "Source Sans 3", "Liberation Sans", Arial, sans-serif;
font-size: 7.4pt;
font-weight: 600;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--gold);
}
/* Title */
.title-page { padding-bottom: 5mm; border-bottom: 0.6mm solid var(--navy); }
.title-page h1 {
margin: 1mm 0 2mm;
font-family: "Merriweather", "Liberation Serif", Georgia, serif;
font-size: 23pt;
font-weight: 700;
line-height: 1.15;
color: var(--navy);
}
.meta { font-family: "Source Sans 3", "Liberation Sans", Arial, sans-serif; font-size: 9pt; color: var(--muted); }
.sample-notice {
margin: 5mm 0 6mm;
padding: 3mm 4mm;
border-left: 1mm solid var(--gold);
background: var(--paper);
font-family: "Source Sans 3", "Liberation Sans", Arial, sans-serif;
font-size: 8.6pt;
line-height: 1.45;
color: #4a4538;
}
.sample-notice strong { color: var(--ink); }
/* Parties */
.between { margin-bottom: 2.5mm; font-style: italic; color: var(--muted); }
.party-grid { display: grid; grid-template-columns: 1fr 10mm 1fr; align-items: start; }
.and { padding-top: 12mm; font-style: italic; color: var(--muted); text-align: center; }
.party { padding: 3.5mm 4mm; border: 0.3mm solid var(--rule); border-radius: 1.5mm; }
.party-name {
font-family: "Merriweather", "Liberation Serif", Georgia, serif;
font-size: 11pt;
font-weight: 700;
line-height: 1.3;
color: var(--navy);
}
.party-desc { margin-bottom: 1.5mm; font-size: 8.6pt; font-style: italic; color: var(--muted); }
.party-address, .party-contact { font-family: "Source Sans 3", "Liberation Sans", Arial, sans-serif; font-size: 8.8pt; line-height: 1.4; }
.party-contact { margin-top: 1.5mm; color: var(--muted); }
.project {
display: grid;
grid-template-columns: 1fr 62mm;
gap: 8mm;
margin: 6mm 0 7mm;
padding: 4mm 0;
border-top: 0.25mm solid var(--rule);
border-bottom: 0.25mm solid var(--rule);
break-inside: avoid;
page-break-inside: avoid;
}
.project-name { font-weight: 700; color: var(--navy); }
.project dl {
display: grid;
grid-template-columns: auto 1fr;
gap: 1mm 3mm;
margin: 0;
font-family: "Source Sans 3", "Liberation Sans", Arial, sans-serif;
font-size: 8.8pt;
}
.project dt { color: var(--muted); }
.project dd { margin: 0; font-weight: 600; }
/* Clauses */
.clause { margin-bottom: 4.5mm; }
.clause h2 {
display: grid;
grid-template-columns: 11mm 1fr;
margin: 0 0 1.5mm;
font-family: "Merriweather", "Liberation Serif", Georgia, serif;
font-size: 10.6pt;
font-weight: 700;
color: var(--navy);
break-after: avoid;
page-break-after: avoid;
}
.sub { display: grid; grid-template-columns: 11mm 1fr; margin-bottom: 1.6mm; break-inside: avoid; page-break-inside: avoid; }
.no { font-family: "Source Sans 3", "Liberation Sans", Arial, sans-serif; font-weight: 600; color: var(--gold); font-variant-numeric: tabular-nums; }
.clause h2 .no { color: var(--navy); }
.sub .no { padding-top: 0.2mm; font-size: 9pt; }
.points { margin: 1mm 0 0; padding: 0; list-style: none; }
.points li { display: grid; grid-template-columns: 7mm 1fr; margin-bottom: 0.8mm; }
.letter { color: var(--muted); }
table.fees {
width: calc(100% - 11mm);
margin: 3mm 0 1mm 11mm;
border-collapse: collapse;
font-family: "Source Sans 3", "Liberation Sans", Arial, sans-serif;
font-size: 8.8pt;
line-height: 1.35;
}
table.fees caption {
padding-bottom: 1.5mm;
font-size: 7.4pt;
font-weight: 600;
letter-spacing: 0.14em;
text-align: left;
text-transform: uppercase;
color: var(--gold);
}
table.fees thead { display: table-header-group; }
table.fees thead th {
padding: 1.6mm 2mm;
border-top: 0.4mm solid var(--navy);
border-bottom: 0.25mm solid var(--navy);
font-size: 7.4pt;
font-weight: 600;
letter-spacing: 0.06em;
text-align: left;
text-transform: uppercase;
color: var(--muted);
}
table.fees td, table.fees tfoot th { padding: 2mm; border-bottom: 0.2mm solid var(--rule); vertical-align: top; }
table.fees tr { break-inside: avoid; page-break-inside: avoid; }
table.fees .idx { width: 7mm; color: var(--muted); }
table.fees .date { white-space: nowrap; }
table.fees .num { text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums; }
table.fees .deliverable { display: block; color: var(--muted); }
table.fees tfoot td, table.fees tfoot th { border-top: 0.4mm solid var(--navy); border-bottom: none; font-weight: 700; }
table.fees tfoot th { text-align: left; }
/* Empty cells paint white inside their padding, so the tagged PDF keeps them in the table structure (PDF/UA)
without painting over the row edges. */
table.fees .blank { background: #ffffff content-box; }
table.fees tfoot .deliverable { font-weight: 400; }
/* Signature page */
.signature-page { padding-top: 2mm; }
.sign-title {
margin: 1mm 0 2mm;
font-family: "Merriweather", "Liberation Serif", Georgia, serif;
font-size: 18pt;
color: var(--navy);
}
.sign-intro { max-width: 140mm; color: var(--muted); }
.signatures { display: grid; grid-template-columns: 1fr 1fr; gap: 12mm; margin: 10mm 0 12mm; }
.signature { padding: 5mm; border: 0.3mm solid var(--rule); border-top: 1mm solid var(--navy); break-inside: avoid; page-break-inside: avoid; }
.org { margin-bottom: 4mm; font-weight: 700; color: var(--navy); }
.line {
display: flex;
align-items: flex-end;
gap: 3mm;
height: 11mm;
border-bottom: 0.3mm solid var(--ink);
font-family: "Source Sans 3", "Liberation Sans", Arial, sans-serif;
}
.line.tall { height: 20mm; }
.line span { width: 15mm; padding-bottom: 1mm; font-size: 7.4pt; letter-spacing: 0.08em; text-transform: uppercase; color: var(--muted); }
.line em { padding-bottom: 1mm; font-size: 9.6pt; font-style: normal; }
.key-details { break-inside: avoid; page-break-inside: avoid; }
.key-details table {
width: 100%;
border-collapse: collapse;
font-family: "Source Sans 3", "Liberation Sans", Arial, sans-serif;
font-size: 9pt;
}
.key-details th, .key-details td { padding: 2mm 0; border-bottom: 0.2mm solid var(--rule); text-align: left; vertical-align: top; }
.key-details th { width: 38mm; font-weight: 600; color: var(--muted); }
.closing-notice {
margin-top: 10mm;
font-family: "Source Sans 3", "Liberation Sans", Arial, sans-serif;
font-size: 8pt;
font-style: italic;
color: var(--muted);
}
</style>Render it with the API
After adding the template to your workspace, render it by ID and pass your data. Arrays are shortened here.
curl -X POST https://api-eu.dynamicdocumentapi.com/v1/renders \
-H "Authorization: Bearer $DYNAMIC_DOCUMENT_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"input": {
"type": "template",
"template_id": "tpl_01J9ZK3M7Q8V5W2X4Y6Z8A0B1C"
},
"data": {
"document": {
"title": "Freelance Services Agreement",
"reference": "FSA-2026-031",
"version": "1.2",
"date": "2026-09-14",
"governing_law": "England and Wales",
"sample_notice": "This template is provided for demonstration only. It is not legal advice and has not been reviewed for any jurisdiction. Have any agreement you plan to use checked by a qualified adviser."
},
"client": {
"name": "Wickerbay Studios Ltd",
"description": "a company registered in England and Wales with company number 01234567",
"address": "4th Floor, Pennant House\n22 Weaver Street\nManchester M4 6AB\nUnited Kingdom",
"contact_name": "Imogen Castellow",
"contact_title": "Head of Production",
"email": "imogen.castellow@wickerbay.example.com"
},
"contractor": {
"name": "Idris Pellegrino-Shaw",
"description": "a sole trader trading as Pellegrino Motion",
"address": "Studio 11, Foundry Yard\n8 Mill Lane\nStockport SK1 3QT\nUnited Kingdom",
"contact_name": "Idris Pellegrino-Shaw",
"contact_title": "Animator and director",
"email": "hello@pellegrinomotion.example.net"
},
"project": {
"name": "Explainer animation series",
"summary": "Scripts, storyboards and animation for three 60-second explainer videos about the Client'\''s scheduling product, with burned-in subtitles and six short cut-downs for social media.",
"start_date": "2026-10-01",
"duration_weeks": 11
},
"fees": {
"currency": "GBP",
"payment_terms_days": 14,
"day_rate": 450,
"vat_note": "The Contractor is not registered for VAT, so no VAT is added to these fees."
},
"fee_schedule": [
{
"milestone": "Kick-off and scripts",
"deliverable": "Approved scripts for all three videos",
"due": "2026-10-16",
"amount": 1800
},
{
"milestone": "Storyboards and style frames",
"deliverable": "Storyboards plus two style frames per video",
"due": "2026-11-06",
"amount": 2400
}
],
"clauses": [
{
"title": "Services",
"subclauses": [
{
"text": "The Contractor will provide the work described in the project summary and the fee schedule (the \"Services\")."
},
{
"text": "The Contractor decides how, where and when the Services are carried out, as long as each deliverable is supplied by the due date in the fee schedule."
}
]
},
{
"title": "Timing",
"subclauses": [
{
"text": "This agreement starts on the start date and continues until the final deliverable has been accepted and paid for, unless it ends earlier under clause 9."
},
{
"text": "If feedback or approvals from the Client arrive later than agreed, any due date that depends on them moves back by the same number of working days."
}
]
}
],
"signatories": [
{
"party": "For the Client",
"organisation": "Wickerbay Studios Ltd",
"name": "Imogen Castellow",
"title": "Head of Production"
},
{
"party": "For the Contractor",
"organisation": "Pellegrino Motion",
"name": "Idris Pellegrino-Shaw",
"title": "Sole trader"
}
]
},
"output": {
"format": "pdf",
"filename": "contract-freelance-services.pdf"
}
}'const response = await fetch("https://api-eu.dynamicdocumentapi.com/v1/renders", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.DYNAMIC_DOCUMENT_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"input": {
"type": "template",
"template_id": "tpl_01J9ZK3M7Q8V5W2X4Y6Z8A0B1C"
},
"data": {
"document": {
"title": "Freelance Services Agreement",
"reference": "FSA-2026-031",
"version": "1.2",
"date": "2026-09-14",
"governing_law": "England and Wales",
"sample_notice": "This template is provided for demonstration only. It is not legal advice and has not been reviewed for any jurisdiction. Have any agreement you plan to use checked by a qualified adviser."
},
"client": {
"name": "Wickerbay Studios Ltd",
"description": "a company registered in England and Wales with company number 01234567",
"address": "4th Floor, Pennant House\n22 Weaver Street\nManchester M4 6AB\nUnited Kingdom",
"contact_name": "Imogen Castellow",
"contact_title": "Head of Production",
"email": "imogen.castellow@wickerbay.example.com"
},
"contractor": {
"name": "Idris Pellegrino-Shaw",
"description": "a sole trader trading as Pellegrino Motion",
"address": "Studio 11, Foundry Yard\n8 Mill Lane\nStockport SK1 3QT\nUnited Kingdom",
"contact_name": "Idris Pellegrino-Shaw",
"contact_title": "Animator and director",
"email": "hello@pellegrinomotion.example.net"
},
"project": {
"name": "Explainer animation series",
"summary": "Scripts, storyboards and animation for three 60-second explainer videos about the Client's scheduling product, with burned-in subtitles and six short cut-downs for social media.",
"start_date": "2026-10-01",
"duration_weeks": 11
},
"fees": {
"currency": "GBP",
"payment_terms_days": 14,
"day_rate": 450,
"vat_note": "The Contractor is not registered for VAT, so no VAT is added to these fees."
},
"fee_schedule": [
{
"milestone": "Kick-off and scripts",
"deliverable": "Approved scripts for all three videos",
"due": "2026-10-16",
"amount": 1800
},
{
"milestone": "Storyboards and style frames",
"deliverable": "Storyboards plus two style frames per video",
"due": "2026-11-06",
"amount": 2400
}
],
"clauses": [
{
"title": "Services",
"subclauses": [
{
"text": "The Contractor will provide the work described in the project summary and the fee schedule (the \"Services\")."
},
{
"text": "The Contractor decides how, where and when the Services are carried out, as long as each deliverable is supplied by the due date in the fee schedule."
}
]
},
{
"title": "Timing",
"subclauses": [
{
"text": "This agreement starts on the start date and continues until the final deliverable has been accepted and paid for, unless it ends earlier under clause 9."
},
{
"text": "If feedback or approvals from the Client arrive later than agreed, any due date that depends on them moves back by the same number of working days."
}
]
}
],
"signatories": [
{
"party": "For the Client",
"organisation": "Wickerbay Studios Ltd",
"name": "Imogen Castellow",
"title": "Head of Production"
},
{
"party": "For the Contractor",
"organisation": "Pellegrino Motion",
"name": "Idris Pellegrino-Shaw",
"title": "Sole trader"
}
]
},
"output": {
"format": "pdf",
"filename": "contract-freelance-services.pdf"
}
}),
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const result = await response.json();
console.log(result);import os
import uuid
import requests
response = requests.post(
"https://api-eu.dynamicdocumentapi.com/v1/renders",
headers={
"Authorization": f"Bearer {os.environ['DYNAMIC_DOCUMENT_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"input": {
"type": "template",
"template_id": "tpl_01J9ZK3M7Q8V5W2X4Y6Z8A0B1C",
},
"data": {
"document": {
"title": "Freelance Services Agreement",
"reference": "FSA-2026-031",
"version": "1.2",
"date": "2026-09-14",
"governing_law": "England and Wales",
"sample_notice": "This template is provided for demonstration only. It is not legal advice and has not been reviewed for any jurisdiction. Have any agreement you plan to use checked by a qualified adviser.",
},
"client": {
"name": "Wickerbay Studios Ltd",
"description": "a company registered in England and Wales with company number 01234567",
"address": "4th Floor, Pennant House\n22 Weaver Street\nManchester M4 6AB\nUnited Kingdom",
"contact_name": "Imogen Castellow",
"contact_title": "Head of Production",
"email": "imogen.castellow@wickerbay.example.com",
},
"contractor": {
"name": "Idris Pellegrino-Shaw",
"description": "a sole trader trading as Pellegrino Motion",
"address": "Studio 11, Foundry Yard\n8 Mill Lane\nStockport SK1 3QT\nUnited Kingdom",
"contact_name": "Idris Pellegrino-Shaw",
"contact_title": "Animator and director",
"email": "hello@pellegrinomotion.example.net",
},
"project": {
"name": "Explainer animation series",
"summary": "Scripts, storyboards and animation for three 60-second explainer videos about the Client's scheduling product, with burned-in subtitles and six short cut-downs for social media.",
"start_date": "2026-10-01",
"duration_weeks": 11,
},
"fees": {
"currency": "GBP",
"payment_terms_days": 14,
"day_rate": 450,
"vat_note": "The Contractor is not registered for VAT, so no VAT is added to these fees.",
},
"fee_schedule": [
{
"milestone": "Kick-off and scripts",
"deliverable": "Approved scripts for all three videos",
"due": "2026-10-16",
"amount": 1800,
},
{
"milestone": "Storyboards and style frames",
"deliverable": "Storyboards plus two style frames per video",
"due": "2026-11-06",
"amount": 2400,
},
],
"clauses": [
{
"title": "Services",
"subclauses": [
{
"text": "The Contractor will provide the work described in the project summary and the fee schedule (the \"Services\").",
},
{
"text": "The Contractor decides how, where and when the Services are carried out, as long as each deliverable is supplied by the due date in the fee schedule.",
},
],
},
{
"title": "Timing",
"subclauses": [
{
"text": "This agreement starts on the start date and continues until the final deliverable has been accepted and paid for, unless it ends earlier under clause 9.",
},
{
"text": "If feedback or approvals from the Client arrive later than agreed, any due date that depends on them moves back by the same number of working days.",
},
],
},
],
"signatories": [
{
"party": "For the Client",
"organisation": "Wickerbay Studios Ltd",
"name": "Imogen Castellow",
"title": "Head of Production",
},
{
"party": "For the Contractor",
"organisation": "Pellegrino Motion",
"name": "Idris Pellegrino-Shaw",
"title": "Sole trader",
},
],
},
"output": {
"format": "pdf",
"filename": "contract-freelance-services.pdf",
},
},
timeout=90,
)
response.raise_for_status()
print(response.json())