Update project
update_projectUse to patch website settings. Nested email sets notification templates: email.subject, email.from_name, email.intro, email.footer_mode (furrow | minimal | off), email.include_meta. Optional branding updates the team (mode furrow | off | agency on yearly only; ignored on free except furrow). Set uploads_enabled and upload_allowed_types here — forms inherit them. Email templates support {{project.name}}, {{project.slug}}, {{form.name}}, {{form.slug}}, {{count}} (1-based clean submissions on this form, including the current one), and any submission field such as {{name}} or {{email}}. Use a fallback with {{name | "New submission"}}. Missing fields render empty and never error. Do not pass HTML; Furrow renders one owned layout. Plans are capacity, not a feature ladder. Free: one workspace, 100 clean submissions/month pooled on the team, 3 active (non-archived) projects, 30-day submission retention, and email.footer_mode / branding.mode stay furrow. Yearly ($199/year): extra workspaces, 10,000 submissions/month, unlimited projects, 730-day retention, branding.mode furrow | off | agency. Expansion packs are $99/year each and add 5,000 submissions/month on a yearly account. MCP, webhooks, snippets, inheritance, Turnstile, and email templates stay available on free. Spam, honeypot, and rejected posts do not count. Use create_upgrade_link to hand a human a Stripe Checkout (or Customer Portal) URL. Pass product=expansion on a yearly team to add a pack. File inputs use multipart POST (name="resume[]" for multiple). Enable uploads on the project first. Downloads are the project inbox at files_url, with the form slug as a folder — never put that URL in a public snippet. Null Turnstile or webhook fields clear them. Do not use this to create forms. Updating project keys changes resolved settings on existing forms unless a form override is set.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New project display name. | |
| No | Notification email template for the project: subject, from_name, intro, footer_mode, include_meta. | ||
| branding | No | Per-project branding override for notification emails and hosted pages. | |
| from_name | No | Legacy From display name. Prefer email.from_name. | |
| project_id | Yes | Project (website) id from list_projects, create_project, or bootstrap_site. | |
| webhook_url | No | Public https endpoint that receives a signed JSON POST per clean submission. Null disables it. | |
| notify_emails | No | Replace the notification recipients (max 10). | |
| honeypot_field | No | Name of the hidden honeypot input the snippet emits. Defaults to _gotcha. | |
| webhook_secret | No | HMAC-SHA256 secret for the X-Furrow-Signature header. Omit to have one generated and returned. | |
| allowed_domains | No | Replace the allowed hostnames. Empty array accepts any origin. | |
| uploads_enabled | No | Accept multipart file fields on this project's forms. | |
| turnstile_secret | No | Cloudflare Turnstile secret used to verify tokens server-side. Null removes it. | |
| upload_max_files | No | Max files per submission (up to 20). | |
| rate_limit_per_ip | No | Max submissions per IP within rate_limit_window_s. | |
| require_turnstile | No | Reject submissions that lack a valid Turnstile token. | |
| turnstile_site_key | No | Cloudflare Turnstile site key for the frontend widget. Null removes it. | |
| rate_limit_window_s | No | Rate-limit window in seconds (max 86400). | |
| default_redirect_url | No | Where classic HTML posts redirect after success. Null returns JSON/inline success instead. | |
| upload_allowed_types | No | Allowed upload MIME types, e.g. application/pdf or image/*. | |
| upload_max_file_bytes | No | Max bytes per file (up to 25 MB). | |
| upload_max_total_bytes | No | Max total upload bytes per submission (up to 50 MB). |