Sharing & embedding templates
Copy a public fill link, embed the form on your site via iframe, or drive it through the API.
Every template in Crove has three ways to reach a respondent. You pick the one that fits how your users already work.
- Public link — the fastest path. Paste the URL in an email, a Slack message, a QR code. Anyone who opens it starts filling immediately.
- Embed — drop the form inside a page on your own site. Useful for intake forms, contact pages, and gated sign-ups where you don't want to send the respondent off to a different domain.
- API — have your own backend create documents from this template. Useful when the respondent lookup is already in your system (ATS, CRM, LMS) and you just need to kick off signing.
All three open from the same place: the Share & embed… item in the template's row menu on the Templates list. The Share dialog shows each channel as its own section — you scroll, you don't tab — and surfaces the current link state (public fill on/off, password, expiry, max responses) at the top so you know what a respondent will hit before you hand the link out. A Link settings button opens the same deeper controls the template editor uses, so you can flip password or expiry on without leaving the Share dialog.
Public link
The public fill URL is shaped like:
https://crove.app/fill/template/<TEMPLATE_ID>Anyone with this URL can fill the form — no login required. The link is safe to paste anywhere, but if you want to restrict who can start a fill, open the template's Public link settings and turn on any of:
- Password gate — respondent has to type a shared password before the form renders.
- Expiry date — the link stops working after a fixed date or after N successful submissions.
- Signing order — when the template has multiple roles, only the first role gets the public link; downstream roles are emailed when it's their turn.
Embed (iframe)
The Share dialog gives you a ready-made iframe snippet. Three presets:
- Default — 600×800. Fits inline with most page content without scroll hijacking.
- Wide — 800×1000. Use when the form has lots of fields or side-by-side columns.
- Full width — 100% width, 900px tall. Lets the form stretch inside a landing-page hero.
The snippet looks like this:
<iframe
src="https://crove.app/fill/template/<TEMPLATE_ID>"
width="600"
height="800"
frameborder="0"
allow="clipboard-write"
style="border:1px solid #e5e7eb; border-radius:8px;"
>
</iframe>The embedded form scrolls internally. If you need the parent page to resize
with the form, drop the iframe inside a container with max-height: 100vh.
Pre-filling fields from the URL
Any ?key=value query-string pair on the public fill URL whose key
matches a template variable pre-fills that field on open. The Share dialog
includes a builder for this — add variable/value rows and copy the result:
https://crove.app/fill/template/<TEMPLATE_ID>?name=Jane&company=AcmeOnly known variable names are applied — unknown keys are silently dropped server-side, so passing UTM or tracking params is harmless. Values over 2,000 characters per key are rejected. Use this for:
- Email campaigns where the CRM already knows the respondent's name
- Embedded marketing pages that already captured the visitor's email
- QR codes at an event booth that carry the booth identifier
- Internal tools handing off to Crove with a prefilled record ID
Branding the fill page
The Link settings dialog has a Brand logo uploader and a Custom thank-you message field. Both are per-template.
- Brand logo — PNG, JPG, or SVG up to 2 MB. Renders above the form name on the public fill page, capped at ~64 px tall so it never dominates the layout. Useful when you embed the form in a page that doesn't already wrap it in your own chrome.
- Custom thank-you message — up to 1,000 characters of plain text shown in the submission-confirmation panel. Newlines are preserved. Leave empty to keep the default “Thank you for completing this document” copy.
The logo lives under public/templates/<id>/logos/… in S3 and is
served without a presigned URL — that's deliberate so iframe
embeds can load it without additional CORS plumbing. Replace anytime
from the same Link settings dialog; remove by clicking the Remove
button next to the preview.
When an embed won't load
If the iframe shows a blank area, it's almost always one of:
- Your site enforces a strict
Content-Security-Policy— addframe-src crove.app;to allow the frame. - The template's Public link is disabled. The Share modal copies a URL even when public fill is off — flip public fill on in the template's settings.
- Password gate is on. That's fine, the respondent just sees the password step first. If you don't want that friction in an embed, remove the password.
API
The API tab gives you a curl example to create a document from this template.
Replace <YOUR_API_KEY> with a key minted at
Settings → API Keys.
curl -X POST 'https://crove.app/api/external/v1/documents' \
-H 'Authorization: Bearer <YOUR_API_KEY>' \
-H 'Content-Type: application/json' \
-d '{
"templateId": "<TEMPLATE_ID>",
"name": "Acme Corp NDA — Jane Doe",
"signers": [
{ "email": "jane@acme.com", "role": "default" }
]
}'The response returns the new document ID and a respondent invite token you can drop into an email you control. Full reference for the rest of the API lives under API → Overview.
Which one should I use?
| Situation | Use |
|---|---|
| Email blast to a known list | Public link |
| Intake form on your marketing site | Embed |
| Respondent data already in your CRM / ATS | API |
| Multi-party contract where each signer comes from a different place | API for signer 1, Crove handles email for 2+ |
| Tradeshow QR code | Public link |
You can mix and match. Nothing prevents a template from being reachable via all three paths at the same time — the audit log records which channel a given response came from so you can see what's actually being used.