{"components":{"parameters":{"BlockedDomainID":{"in":"path","name":"id","required":true,"schema":{"type":"string"}},"BlockedIPID":{"in":"path","name":"id","required":true,"schema":{"type":"string"}},"Cursor":{"description":"Opaque pagination cursor.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},"DeliveryID":{"in":"path","name":"deliveryId","required":true,"schema":{"type":"string"}},"DeliveryStatus":{"description":"Filter deliveries by status.","in":"query","name":"status","required":false,"schema":{"enum":["pending","delivered","failed","dead"],"type":"string"}},"FormID":{"in":"path","name":"id","required":true,"schema":{"type":"string"}},"IntegrationID":{"in":"path","name":"id","required":true,"schema":{"type":"string"}},"Limit":{"in":"query","name":"limit","required":false,"schema":{"default":25,"maximum":100,"minimum":1,"type":"integer"}},"SubmissionID":{"in":"path","name":"sid","required":true,"schema":{"type":"string"}},"SuppressionID":{"in":"path","name":"id","required":true,"schema":{"type":"string"}},"WebhookID":{"in":"path","name":"id","required":true,"schema":{"type":"string"}}},"responses":{"BadRequest":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad request."},"Conflict":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict."},"InternalError":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error."},"NotFound":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found."},"ServiceUnavailable":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Service dependency is not ready."},"TooManyRequests":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded. The `Retry-After` response header holds the number of seconds to wait before retrying.\n"},"Unauthorized":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized."}},"schemas":{"ActiveCampaignCustomFieldMapping":{"additionalProperties":false,"properties":{"field_id":{"example":"7","type":"string"},"title":{"description":"Optional display label; it is not sent to ActiveCampaign.","example":"Lead source","type":"string"},"value":{"description":"Submission field, template token, or literal value.","example":"{{formName}}","type":"string"}},"required":["field_id","value"],"type":"object"},"ActiveCampaignIntegrationConfig":{"additionalProperties":false,"description":"ActiveCampaign requires `connection.kind=api_key`, `api_url`, and `api_key`; every configuration field below is optional.","properties":{"contact_mapping":{"additionalProperties":{"type":"string"},"description":"ActiveCampaign contact property to submission-field/template mapping.","example":{"firstName":"{{field:first_name}}","lastName":"{{field:last_name}}","phone":"{{field:phone}}"},"type":"object"},"custom_field_mappings":{"description":"ActiveCampaign custom-field values to set after the contact is synced.","items":{"$ref":"#/components/schemas/ActiveCampaignCustomFieldMapping"},"type":"array"},"email_field":{"default":"{{field:email}}","description":"Submission field or template used as the contact email.","type":"string"},"list_id":{"description":"List ID to subscribe the synced contact to.","example":"12","type":"string"},"tag_ids":{"description":"Existing ActiveCampaign tag IDs to attach to the contact.","example":["3","8"],"items":{"type":"string"},"type":"array"}},"title":"ActiveCampaign configuration","type":"object"},"AddBlockedDomainRequest":{"additionalProperties":false,"properties":{"domain":{"type":"string"}},"required":["domain"],"type":"object"},"AddBlockedIPRequest":{"additionalProperties":false,"properties":{"network":{"type":"string"}},"required":["network"],"type":"object"},"ApiKeyIdentity":{"additionalProperties":false,"properties":{"key":{"additionalProperties":false,"properties":{"id":{"type":"string"},"key_prefix":{"type":"string"},"name":{"type":"string"},"scope":{"$ref":"#/components/schemas/ApiKeyScope"}},"required":["id","name","scope","key_prefix"],"type":"object"},"tenant":{"additionalProperties":false,"properties":{"id":{"type":"string"},"name":{"type":"string"},"plan":{"description":"Workspace plan, e.g. free, pro, team, enterprise.","type":"string"}},"required":["id","name","plan"],"type":"object"}},"required":["key","tenant"],"type":"object"},"ApiKeyScope":{"description":"Access level of an API key. `read` allows GET requests only; `full` allows every method on the API-key-accessible surface. Defaults to `read` when omitted at creation.\n","enum":["read","full"],"type":"string"},"Autoresponder":{"additionalProperties":false,"properties":{"body_format":{"enum":["html","text"],"type":"string"},"body_tmpl":{"type":"string"},"created_at":{"type":"string"},"enabled":{"type":"boolean"},"form_id":{"type":"string"},"from_name":{"type":"string"},"id":{"type":"string"},"locale_mode":{"enum":["form","submitter"],"type":"string"},"reply_to_field":{"type":"string"},"subject_tmpl":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","form_id","enabled","from_name","reply_to_field","subject_tmpl","body_tmpl","body_format","locale_mode","created_at","updated_at"],"type":"object"},"AutoresponderResponse":{"additionalProperties":false,"properties":{"autoresponder":{"allOf":[{"$ref":"#/components/schemas/Autoresponder"}],"nullable":true}},"type":"object"},"BlockedDomain":{"additionalProperties":false,"properties":{"created_at":{"type":"string"},"domain":{"type":"string"},"form_id":{"nullable":true,"type":"string"},"id":{"type":"string"}},"required":["id","domain","created_at"],"type":"object"},"BlockedDomainList":{"additionalProperties":false,"properties":{"domains":{"items":{"$ref":"#/components/schemas/BlockedDomain"},"type":"array"}},"required":["domains"],"type":"object"},"BlockedIP":{"additionalProperties":false,"properties":{"created_at":{"type":"string"},"form_id":{"nullable":true,"type":"string"},"id":{"type":"string"},"network":{"type":"string"}},"required":["id","network","created_at"],"type":"object"},"BlockedIPList":{"additionalProperties":false,"properties":{"ips":{"items":{"$ref":"#/components/schemas/BlockedIP"},"type":"array"}},"required":["ips"],"type":"object"},"BulkSubmissionAction":{"enum":["mark_spam","mark_verified","mark_received","archive","delete","restore","redeliver"],"type":"string"},"BulkSubmissionActionRequest":{"additionalProperties":false,"properties":{"action":{"$ref":"#/components/schemas/BulkSubmissionAction"},"ids":{"items":{"type":"string"},"maxItems":500,"minItems":1,"type":"array"}},"required":["ids","action"],"type":"object"},"BulkSubmissionActionResponse":{"additionalProperties":false,"properties":{"updated":{"format":"int64","type":"integer"}},"required":["updated"],"type":"object"},"CaptchaConfig":{"additionalProperties":false,"properties":{"enabled":{"type":"boolean"},"provider":{"type":"string"},"site_key":{"type":"string"}},"required":["enabled","provider","site_key"],"type":"object"},"CreateFormKeyRequest":{"additionalProperties":false,"properties":{"mode":{"enum":["public","protected"],"type":"string"},"name":{"maxLength":120,"minLength":1,"type":"string"}},"required":["name"],"type":"object"},"CreateFormKeyResponse":{"allOf":[{"$ref":"#/components/schemas/FormKey"},{"additionalProperties":false,"properties":{"key":{"type":"string"}},"required":["key"],"type":"object"}]},"CreateFormRequest":{"additionalProperties":false,"properties":{"access_mode":{"enum":["public","protected"],"type":"string"},"emoji":{"maxLength":32,"minLength":1,"type":"string"},"external_key":{"type":"string"},"name":{"maxLength":120,"minLength":1,"type":"string"}},"required":["name"],"type":"object"},"CreateIntegrationRequest":{"additionalProperties":false,"properties":{"config":{"$ref":"#/components/schemas/IntegrationConfigInput"},"connection":{"$ref":"#/components/schemas/IntegrationConnectionInput"},"enabled":{"default":true,"type":"boolean"},"label":{"description":"Display name shown on the integrations page.","type":"string"},"type":{"$ref":"#/components/schemas/IntegrationType"}},"required":["type"],"type":"object"},"CreateIntegrationResponse":{"additionalProperties":false,"properties":{"integration":{"$ref":"#/components/schemas/NativeIntegration"},"next_action":{"$ref":"#/components/schemas/IntegrationNextAction"},"status":{"enum":["connected","authorization_required"],"type":"string"}},"required":["status","integration"],"type":"object"},"CreateWebhookRequest":{"additionalProperties":false,"properties":{"description":{"nullable":true,"type":"string"},"url":{"format":"uri","type":"string"}},"required":["url"],"type":"object"},"CreateWebhookResponse":{"additionalProperties":false,"properties":{"endpoint":{"$ref":"#/components/schemas/WebhookEndpoint"},"secret":{"type":"string"}},"required":["endpoint","secret"],"type":"object"},"DataRequestEraseRequest":{"additionalProperties":false,"properties":{"submitter_email":{"format":"email","type":"string"}},"required":["submitter_email"],"type":"object"},"DataRequestEraseResponse":{"additionalProperties":false,"properties":{"erased":{"format":"int64","type":"integer"}},"required":["erased"],"type":"object"},"DiscordIntegrationConfig":{"additionalProperties":false,"description":"Discord requires no configuration fields; browser authorization selects the server and channel.","properties":{"message_template":{"description":"Message sent for each submission. Supports `{{formName}}`, `{{fields}}`, `{{fields:quote}}`, and `{{field:name}}` tokens.","example":"New submission from {{formName}}\n{{fields}}","type":"string"}},"title":"Discord configuration","type":"object"},"EmailHygienePolicy":{"additionalProperties":false,"properties":{"block_disposable":{"type":"boolean"},"mode":{"enum":["flag","block"],"type":"string"},"require_mx":{"type":"boolean"}},"required":["mode","require_mx","block_disposable"],"type":"object"},"EmailHygieneResponse":{"additionalProperties":false,"properties":{"policy":{"allOf":[{"$ref":"#/components/schemas/EmailHygienePolicy"}],"nullable":true}},"type":"object"},"EmailSettings":{"additionalProperties":false,"description":"Email notification behavior for this form.","properties":{"notify_spam":{"default":false,"description":"Also send owner notification emails for submissions classified as spam.\n","type":"boolean"}},"type":"object"},"Error":{"additionalProperties":false,"properties":{"error":{"additionalProperties":false,"properties":{"code":{"type":"string"},"field":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"type":"object"}},"required":["error"],"type":"object"},"Form":{"allOf":[{"$ref":"#/components/schemas/FormSummary"},{"additionalProperties":false,"properties":{"allowed_origins":{"items":{"type":"string"},"type":"array"},"notify_bcc_emails":{"items":{"type":"string"},"type":"array"},"notify_cc_emails":{"items":{"type":"string"},"type":"array"},"notify_emails":{"items":{"type":"string"},"type":"array"},"notify_routing_aliases":{"items":{"$ref":"#/components/schemas/NotificationRoutingAlias"},"type":"array"},"notify_subject":{"nullable":true,"type":"string"},"settings":{"$ref":"#/components/schemas/FormSettings"},"updated_at":{"type":"string"}},"required":["settings","notify_emails","notify_cc_emails","notify_bcc_emails","notify_routing_aliases","allowed_origins","updated_at"],"type":"object"}]},"FormAnalyticsCountry":{"additionalProperties":false,"properties":{"count":{"format":"int64","type":"integer"},"country_code":{"maxLength":2,"minLength":2,"type":"string"}},"required":["country_code","count"],"type":"object"},"FormAnalyticsPoint":{"additionalProperties":false,"properties":{"count":{"format":"int64","type":"integer"},"date":{"format":"date","type":"string"},"spam_count":{"format":"int64","type":"integer"},"verified_count":{"format":"int64","type":"integer"}},"required":["date","count","verified_count","spam_count"],"type":"object"},"FormAnalyticsSource":{"additionalProperties":false,"properties":{"count":{"format":"int64","type":"integer"},"referrer":{"nullable":true,"type":"string"},"source":{"type":"string"},"source_type":{"enum":["utm","referrer","unknown"],"type":"string"},"utm_campaign":{"nullable":true,"type":"string"},"utm_source":{"nullable":true,"type":"string"}},"required":["source","source_type","count","utm_source","utm_campaign","referrer"],"type":"object"},"FormAnalyticsStats":{"additionalProperties":false,"properties":{"countries":{"items":{"$ref":"#/components/schemas/FormAnalyticsCountry"},"type":"array"},"days":{"type":"integer"},"period":{"type":"string"},"points":{"items":{"$ref":"#/components/schemas/FormAnalyticsPoint"},"type":"array"},"previous_spam_count":{"format":"int64","type":"integer"},"previous_total":{"format":"int64","type":"integer"},"previous_verified_count":{"format":"int64","type":"integer"},"sources":{"items":{"$ref":"#/components/schemas/FormAnalyticsSource"},"type":"array"},"spam_count":{"format":"int64","type":"integer"},"total":{"format":"int64","type":"integer"},"verified_count":{"format":"int64","type":"integer"}},"required":["period","days","total","verified_count","spam_count","previous_total","previous_verified_count","previous_spam_count","points","sources","countries"],"type":"object"},"FormKey":{"additionalProperties":false,"properties":{"created_at":{"type":"string"},"id":{"type":"string"},"key_prefix":{"type":"string"},"last_used_at":{"nullable":true,"type":"string"},"mode":{"enum":["public","protected"],"type":"string"},"name":{"type":"string"},"revoked_at":{"nullable":true,"type":"string"},"scopes":{"items":{"type":"string"},"type":"array"}},"required":["id","name","key_prefix","mode","scopes","created_at"],"type":"object"},"FormSettings":{"additionalProperties":true,"description":"Per-form behavior settings. Send only the sections you want to change; omitted sections keep their stored values. Unknown extra top-level keys are preserved for forward compatibility. CAPTCHA and email hygiene are managed through their dedicated endpoints (`/v1/forms/{id}/captcha`, `/v1/forms/{id}/email-hygiene`) and may appear here read-only.\n","properties":{"email":{"$ref":"#/components/schemas/EmailSettings"},"privacy":{"$ref":"#/components/schemas/PrivacySettings"},"rate_limit":{"$ref":"#/components/schemas/RateLimitSettings"},"response":{"$ref":"#/components/schemas/SubmissionResponseSettings"},"retention":{"$ref":"#/components/schemas/RetentionSettings"},"spam":{"$ref":"#/components/schemas/SpamSettings"}},"type":"object"},"FormSummary":{"additionalProperties":false,"properties":{"access_mode":{"enum":["public","protected"],"type":"string"},"created_at":{"type":"string"},"emoji":{"type":"string"},"external_key":{"nullable":true,"type":"string"},"id":{"type":"string"},"is_active":{"type":"boolean"},"name":{"type":"string"},"public_slug":{"type":"string"},"submission_count":{"format":"int64","type":"integer"},"unread_submission_count":{"format":"int64","type":"integer"}},"required":["id","name","emoji","public_slug","access_mode","is_active","created_at","submission_count","unread_submission_count"],"type":"object"},"FormUsageItem":{"additionalProperties":false,"properties":{"count":{"format":"int64","type":"integer"},"form_id":{"type":"string"},"form_name":{"type":"string"},"last_submission_at":{"format":"date-time","nullable":true,"type":"string"}},"required":["form_id","form_name","count","last_submission_at"],"type":"object"},"FormUsagePoint":{"additionalProperties":false,"properties":{"count":{"format":"int64","type":"integer"},"date":{"format":"date","type":"string"},"form_id":{"type":"string"},"spam_count":{"format":"int64","type":"integer"}},"required":["date","form_id","count","spam_count"],"type":"object"},"FormUsageStats":{"additionalProperties":false,"properties":{"forms":{"items":{"$ref":"#/components/schemas/FormUsageItem"},"type":"array"},"period":{"format":"date","type":"string"},"points":{"items":{"$ref":"#/components/schemas/FormUsagePoint"},"type":"array"},"total":{"format":"int64","type":"integer"}},"required":["period","total","forms","points"],"type":"object"},"FormcarryIntegrationConfig":{"additionalProperties":false,"description":"Temporary 14-day forwarding bridge to an existing Formcarry form.","properties":{"endpoint_id":{"description":"Final ID from the existing `https://formcarry.com/s/{endpoint_id}` URL.","example":"AbC123xy","pattern":"^[A-Za-z0-9_-]{3,200}$","type":"string"}},"required":["endpoint_id"],"title":"Formcarry migration configuration","type":"object"},"FormspreeIntegrationConfig":{"additionalProperties":false,"description":"Temporary 14-day forwarding bridge to an existing Formspree form.","properties":{"endpoint_id":{"description":"Final ID from the existing `https://formspree.io/f/{endpoint_id}` URL.","example":"xpzgabcd","pattern":"^[A-Za-z0-9_-]{3,200}$","type":"string"}},"required":["endpoint_id"],"title":"Formspree migration configuration","type":"object"},"GoogleSheetsIntegrationConfig":{"additionalProperties":false,"description":"Omit `spreadsheet_id` to create a new spreadsheet during browser authorization.","properties":{"columns":{"description":"Ordered columns. Supports submission metadata, `fields.name`, or a direct form-field name.","example":["submitted_at","submission_id","fields.email","fields.message"],"items":{"type":"string"},"type":"array"},"sheet_name":{"default":"Submissions","description":"Worksheet tab receiving appended rows.","type":"string"},"spreadsheet_id":{"description":"Existing Google spreadsheet ID. A new spreadsheet is created when omitted.","example":"1AbCDefGhijkLmNopQRstuVwxyz","type":"string"}},"title":"Google Sheets configuration","type":"object"},"IntegrationAPIKeyConnection":{"additionalProperties":false,"properties":{"api_key":{"example":"ac_live_example","type":"string","writeOnly":true},"api_url":{"example":"https://example.api-us1.com","format":"uri","type":"string"},"kind":{"enum":["api_key"],"type":"string"}},"required":["kind","api_url","api_key"],"type":"object"},"IntegrationAccessKeyConnection":{"additionalProperties":false,"properties":{"access_key":{"example":"migration_example_key","type":"string","writeOnly":true},"kind":{"enum":["access_key"],"type":"string"}},"required":["kind","access_key"],"type":"object"},"IntegrationConfigInput":{"anyOf":[{"$ref":"#/components/schemas/SlackIntegrationConfig"},{"$ref":"#/components/schemas/DiscordIntegrationConfig"},{"$ref":"#/components/schemas/GoogleSheetsIntegrationConfig"},{"$ref":"#/components/schemas/ActiveCampaignIntegrationConfig"},{"$ref":"#/components/schemas/MailchimpIntegrationConfig"},{"$ref":"#/components/schemas/FormspreeIntegrationConfig"},{"$ref":"#/components/schemas/FormcarryIntegrationConfig"},{"$ref":"#/components/schemas/Web3FormsIntegrationConfig"}],"description":"Select the configuration schema matching the integration `type`."},"IntegrationConnectionInput":{"description":"Credentials for providers that do not use browser authorization. Omit this property for Slack, Discord, Google Sheets, and Mailchimp.\n","oneOf":[{"$ref":"#/components/schemas/IntegrationAPIKeyConnection"},{"$ref":"#/components/schemas/IntegrationAccessKeyConnection"}]},"IntegrationDelivery":{"additionalProperties":false,"properties":{"attempts":{"type":"integer"},"created_at":{"type":"string"},"delivered_at":{"nullable":true,"type":"string"},"event_id":{"type":"string"},"event_type":{"type":"string"},"id":{"type":"string"},"integration_id":{"type":"string"},"last_attempt_at":{"nullable":true,"type":"string"},"last_error":{"nullable":true,"type":"string"},"last_status_code":{"nullable":true,"type":"integer"},"next_attempt_at":{"nullable":true,"type":"string"},"status":{"type":"string"},"submission_id":{"nullable":true,"type":"string"}},"required":["id","integration_id","event_id","event_type","status","attempts","created_at"],"type":"object"},"IntegrationDeliveryAttempt":{"additionalProperties":false,"properties":{"attempt_no":{"type":"integer"},"created_at":{"type":"string"},"error":{"nullable":true,"type":"string"},"id":{"type":"string"},"response_excerpt":{"nullable":true,"type":"string"},"response_ms":{"nullable":true,"type":"integer"},"status_code":{"nullable":true,"type":"integer"}},"required":["id","attempt_no","created_at"],"type":"object"},"IntegrationDeliveryDetail":{"additionalProperties":false,"properties":{"attempts":{"items":{"$ref":"#/components/schemas/IntegrationDeliveryAttempt"},"type":"array"},"delivery":{"$ref":"#/components/schemas/IntegrationDelivery"},"payload":{"additionalProperties":true,"type":"object"}},"required":["delivery","payload","attempts"],"type":"object"},"IntegrationDeliveryList":{"additionalProperties":false,"properties":{"deliveries":{"items":{"$ref":"#/components/schemas/IntegrationDelivery"},"type":"array"},"next_cursor":{"nullable":true,"type":"string"}},"required":["deliveries"],"type":"object"},"IntegrationNextAction":{"additionalProperties":false,"properties":{"expires_at":{"format":"date-time","type":"string"},"type":{"enum":["open_url"],"type":"string"},"url":{"description":"Open this URL in a browser to authorize the provider.","format":"uri","type":"string"}},"required":["type","url","expires_at"],"type":"object"},"IntegrationType":{"description":"Native integration provider. The create operation handles the provider's connection method and returns an authorization URL when a human must approve access in a browser.\n","enum":["slack","discord","google_sheets","activecampaign","mailchimp","formspree","web3forms","formcarry"],"type":"string"},"MailchimpIntegrationConfig":{"additionalProperties":false,"description":"Omit `audience_id` to use the first audience returned after browser authorization.","properties":{"audience_id":{"description":"Mailchimp audience/list ID receiving the subscriber.","example":"a1b2c3","type":"string"},"email_field":{"default":"{{field:email}}","description":"Submission field or template used as the subscriber email.","type":"string"},"merge_fields":{"additionalProperties":{"type":"string"},"description":"Mailchimp merge tag to submission-field/template mapping.","example":{"FNAME":"{{field:first_name}}","SOURCE":"{{formName}}"},"type":"object"},"status_if_new":{"default":"pending","description":"Subscription status used only when the address is not already in the audience.","enum":["pending","subscribed","transactional"],"type":"string"},"tags":{"description":"Mailchimp tag names to attach to the audience member.","example":["Website lead"],"items":{"type":"string"},"type":"array"}},"title":"Mailchimp configuration","type":"object"},"NativeIntegration":{"additionalProperties":false,"properties":{"config":{"additionalProperties":true,"type":"object"},"created_at":{"type":"string"},"enabled":{"type":"boolean"},"form_id":{"type":"string"},"id":{"type":"string"},"label":{"type":"string"},"last_delivery_at":{"nullable":true,"type":"string"},"last_status":{"additionalProperties":true,"type":"object"},"status":{"enum":["active","paused","error","needs_reauth"],"type":"string"},"type":{"$ref":"#/components/schemas/IntegrationType"},"updated_at":{"type":"string"}},"required":["id","form_id","type","label","enabled","config","status","last_status","created_at","updated_at"],"type":"object"},"NotificationRoutingAlias":{"additionalProperties":false,"properties":{"alias":{"maxLength":64,"minLength":1,"pattern":"^[a-z0-9][a-z0-9_-]{0,63}$","type":"string"},"bcc_emails":{"items":{"type":"string"},"maxItems":10,"type":"array"},"cc_emails":{"items":{"type":"string"},"maxItems":10,"type":"array"},"to_emails":{"items":{"type":"string"},"maxItems":10,"type":"array"}},"required":["alias","to_emails","cc_emails","bcc_emails"],"type":"object"},"PrivacySettings":{"additionalProperties":false,"description":"Field-level privacy controls applied when a submission is stored.","properties":{"do_not_store_fields":{"description":"Field names dropped entirely before storage.","items":{"maxLength":120,"minLength":1,"type":"string"},"maxItems":100,"type":"array"},"redact_fields":{"description":"Field names whose values are replaced with \"[redacted]\" before storage.\n","items":{"maxLength":120,"minLength":1,"type":"string"},"maxItems":100,"type":"array"}},"type":"object"},"RateLimitSettings":{"additionalProperties":false,"description":"Per-submitter rate limits on the public submission endpoint. Two windows apply at once: a strict window (limit per window_seconds) and a burst cap (burst per burst_window_seconds). Omitted or zero values fall back to the defaults shown.\n","properties":{"burst":{"default":20,"description":"Submissions allowed per submitter within burst_window_seconds.","minimum":1,"type":"integer"},"burst_window_seconds":{"default":600,"description":"Length of the burst window, in seconds.","minimum":1,"type":"integer"},"disabled":{"default":false,"description":"Turn off rate limiting for this form entirely.","type":"boolean"},"limit":{"default":1,"description":"Submissions allowed per submitter within window_seconds.","minimum":1,"type":"integer"},"window_seconds":{"default":30,"description":"Length of the strict window, in seconds.","minimum":1,"type":"integer"}},"type":"object"},"RedeliverResponse":{"additionalProperties":false,"properties":{"enqueued":{"type":"integer"}},"required":["enqueued"],"type":"object"},"RetentionSettings":{"additionalProperties":false,"description":"How long submissions are kept before automatic deletion.","properties":{"days":{"description":"Custom retention window in days. Allowed values: 30, 60, 90, 180, 365. Set null to clear the custom window and use the plan default (30 days on Free, 365 on paid plans).\n","enum":[30,60,90,180,365],"nullable":true,"type":"integer"}},"type":"object"},"RotateWebhookSecretResponse":{"additionalProperties":false,"properties":{"overlap_until":{"type":"string"},"secret":{"type":"string"},"secret_prefix":{"type":"string"}},"required":["secret","secret_prefix","overlap_until"],"type":"object"},"SetCaptchaRequest":{"additionalProperties":false,"properties":{"enabled":{"type":"boolean"},"min_score":{"type":"number"},"provider":{"enum":["turnstile","hcaptcha","recaptcha_v2","recaptcha_v3"],"type":"string"},"secret":{"type":"string"},"site_key":{"type":"string"}},"required":["enabled","provider","site_key","secret"],"type":"object"},"SetEmailHygieneRequest":{"additionalProperties":false,"properties":{"block_disposable":{"type":"boolean"},"mode":{"enum":["flag","block"],"type":"string"},"require_mx":{"type":"boolean"}},"required":["mode"],"type":"object"},"SlackIntegrationConfig":{"additionalProperties":false,"description":"Slack requires no configuration fields; browser authorization selects the workspace and channel.","properties":{"message_template":{"description":"Message sent for each submission. Supports `{{formName}}`, `{{fields}}`, `{{fields:quote}}`, and `{{field:name}}` tokens.","example":"New lead for {{formName}}: {{field:email}}","type":"string"}},"title":"Slack configuration","type":"object"},"SpamSettings":{"additionalProperties":false,"description":"Spam scoring configuration for incoming submissions.","properties":{"blocked_keywords":{"description":"Case-insensitive substrings; a submission containing any of them is always marked as spam.\n","items":{"maxLength":80,"minLength":1,"type":"string"},"maxItems":200,"type":"array"},"enabled":{"default":true,"description":"Whether spam scoring runs on new submissions. Only an explicit false disables it.\n","type":"boolean"},"strictness":{"default":"medium","description":"How aggressively submissions are quarantined as spam: low quarantines only near-certain spam, high quarantines anything suspicious.\n","enum":["low","medium","high"],"type":"string"}},"type":"object"},"Submission":{"additionalProperties":false,"properties":{"accept_language":{"nullable":true,"type":"string"},"created_at":{"type":"string"},"deleted_at":{"nullable":true,"type":"string"},"fields":{"additionalProperties":true,"type":"object"},"files":{"items":{"$ref":"#/components/schemas/SubmissionFile"},"type":"array"},"id":{"type":"string"},"locked":{"type":"boolean"},"locked_reason":{"nullable":true,"type":"string"},"origin":{"nullable":true,"type":"string"},"referer":{"nullable":true,"type":"string"},"spam_score":{"format":"float","nullable":true,"type":"number"},"starred":{"type":"boolean"},"status":{"$ref":"#/components/schemas/SubmissionStatus"},"submitter_email":{"nullable":true,"type":"string"},"submitter_ip":{"nullable":true,"type":"string"},"user_agent":{"nullable":true,"type":"string"}},"required":["id","created_at","status","deleted_at","starred","locked","locked_reason","fields","files"],"type":"object"},"SubmissionErrorResponseTarget":{"additionalProperties":false,"properties":{"redirect_url":{"description":"Absolute http(s) URL. Required when type is redirect; dropped otherwise.","format":"uri","type":"string"},"type":{"default":"hosted_page","enum":["hosted_page","redirect","same_as_success"],"type":"string"}},"type":"object"},"SubmissionFile":{"additionalProperties":false,"properties":{"content_type":{"type":"string"},"created_at":{"type":"string"},"field_name":{"type":"string"},"finalized_at":{"nullable":true,"type":"string"},"id":{"type":"string"},"original_name":{"type":"string"},"size_bytes":{"format":"int64","type":"integer"},"status":{"enum":["pending","finalized","rejected"],"type":"string"}},"required":["id","field_name","original_name","content_type","size_bytes","status","created_at","finalized_at"],"type":"object"},"SubmissionListResponse":{"additionalProperties":false,"properties":{"items":{"items":{"$ref":"#/components/schemas/SubmissionSummary"},"type":"array"},"next_cursor":{"nullable":true,"type":"string"}},"required":["items","next_cursor"],"type":"object"},"SubmissionResponseSettings":{"additionalProperties":false,"properties":{"error":{"$ref":"#/components/schemas/SubmissionErrorResponseTarget"},"success":{"$ref":"#/components/schemas/SubmissionSuccessResponseTarget"}},"type":"object"},"SubmissionStats":{"additionalProperties":false,"properties":{"days":{"type":"integer"},"points":{"items":{"$ref":"#/components/schemas/SubmissionStatsPoint"},"type":"array"},"total":{"format":"int64","type":"integer"}},"required":["days","total","points"],"type":"object"},"SubmissionStatsPoint":{"additionalProperties":false,"properties":{"count":{"format":"int64","type":"integer"},"date":{"format":"date","type":"string"}},"required":["date","count"],"type":"object"},"SubmissionStatus":{"enum":["received","spam","verified","archived"],"type":"string"},"SubmissionStatusFilter":{"enum":["all","received","spam","verified","archived","trash"],"type":"string"},"SubmissionSuccessResponseTarget":{"additionalProperties":false,"properties":{"redirect_url":{"description":"Absolute http(s) URL. Required when type is redirect; dropped otherwise.","format":"uri","type":"string"},"type":{"default":"hosted_page","enum":["hosted_page","redirect"],"type":"string"}},"type":"object"},"SubmissionSummary":{"additionalProperties":false,"properties":{"created_at":{"type":"string"},"deleted_at":{"nullable":true,"type":"string"},"files":{"items":{"$ref":"#/components/schemas/SubmissionFile"},"type":"array"},"id":{"type":"string"},"locked":{"type":"boolean"},"locked_reason":{"nullable":true,"type":"string"},"preview":{"additionalProperties":true,"type":"object"},"spam_score":{"format":"float","nullable":true,"type":"number"},"starred":{"type":"boolean"},"status":{"$ref":"#/components/schemas/SubmissionStatus"},"submitter_email":{"nullable":true,"type":"string"},"submitter_ip":{"nullable":true,"type":"string"}},"required":["id","created_at","status","deleted_at","starred","locked","locked_reason","preview","files"],"type":"object"},"SuppressionEntry":{"additionalProperties":false,"properties":{"created_at":{"type":"string"},"email":{"type":"string"},"global":{"type":"boolean"},"id":{"type":"string"},"reason":{"type":"string"},"source":{"type":"string"}},"required":["id","email","reason","source","global","created_at"],"type":"object"},"SuppressionList":{"additionalProperties":false,"properties":{"entries":{"items":{"$ref":"#/components/schemas/SuppressionEntry"},"type":"array"},"next_cursor":{"nullable":true,"type":"string"}},"required":["entries"],"type":"object"},"TestAutoresponderRequest":{"additionalProperties":false,"properties":{"sample":{"additionalProperties":true,"type":"object"},"to":{"format":"email","type":"string"}},"required":["to"],"type":"object"},"TestAutoresponderResponse":{"additionalProperties":false,"properties":{"recipient":{"type":"string"},"sent":{"type":"boolean"}},"required":["sent","recipient"],"type":"object"},"TestIntegrationResponse":{"additionalProperties":false,"properties":{"delivery_id":{"type":"string"},"enqueued":{"type":"boolean"},"event_id":{"type":"string"},"event_type":{"enum":["submission.created"],"type":"string"},"test":{"type":"boolean"}},"required":["delivery_id","enqueued","event_id","event_type","test"],"type":"object"},"TestWebhookResponse":{"additionalProperties":false,"properties":{"event_id":{"type":"string"},"event_type":{"enum":["submission.created"],"type":"string"},"status_code":{"type":"integer"},"test":{"type":"boolean"}},"required":["status_code","event_id","event_type","test"],"type":"object"},"UpdateFormRequest":{"additionalProperties":false,"properties":{"access_mode":{"enum":["public","protected"],"type":"string"},"allowed_origins":{"items":{"type":"string"},"type":"array"},"emoji":{"maxLength":32,"minLength":1,"type":"string"},"external_key":{"type":"string"},"is_active":{"type":"boolean"},"name":{"maxLength":120,"minLength":1,"type":"string"},"notify_bcc_emails":{"items":{"type":"string"},"type":"array"},"notify_cc_emails":{"items":{"type":"string"},"type":"array"},"notify_emails":{"items":{"type":"string"},"type":"array"},"notify_routing_aliases":{"items":{"$ref":"#/components/schemas/NotificationRoutingAlias"},"type":"array"},"notify_subject":{"nullable":true,"type":"string"},"settings":{"$ref":"#/components/schemas/FormSettings"}},"type":"object"},"UpdateIntegrationRequest":{"additionalProperties":false,"properties":{"config":{"$ref":"#/components/schemas/IntegrationConfigInput"},"enabled":{"type":"boolean"},"label":{"type":"string"}},"type":"object"},"UpdateSubmissionRequest":{"additionalProperties":false,"properties":{"starred":{"type":"boolean"},"status":{"$ref":"#/components/schemas/SubmissionStatus"}},"type":"object"},"UpdateWebhookRequest":{"additionalProperties":false,"properties":{"description":{"nullable":true,"type":"string"},"enabled":{"type":"boolean"},"url":{"format":"uri","type":"string"}},"type":"object"},"UploadPresignFile":{"additionalProperties":false,"properties":{"content_type":{"type":"string"},"field":{"description":"The form field this file belongs to.","type":"string"},"filename":{"type":"string"},"size":{"description":"Claimed byte size; enforced at presign and corrected at finalize.","format":"int64","type":"integer"}},"required":["field","filename","content_type","size"],"type":"object"},"UploadPresignRequest":{"additionalProperties":false,"properties":{"files":{"items":{"$ref":"#/components/schemas/UploadPresignFile"},"minItems":1,"type":"array"}},"required":["files"],"type":"object"},"UploadPresignResponse":{"additionalProperties":false,"properties":{"uploads":{"items":{"$ref":"#/components/schemas/UploadSlot"},"type":"array"}},"required":["uploads"],"type":"object"},"UploadSlot":{"additionalProperties":false,"properties":{"expires_in":{"type":"integer"},"field":{"type":"string"},"headers":{"additionalProperties":{"type":"string"},"type":"object"},"key":{"description":"R2 object key to reference under _uploads on submission.","type":"string"},"max_bytes":{"format":"int64","type":"integer"},"method":{"type":"string"},"url":{"format":"uri","type":"string"}},"required":["field","key","url","method","headers","expires_in","max_bytes"],"type":"object"},"UpsertAutoresponderRequest":{"additionalProperties":false,"properties":{"body_format":{"enum":["html","text"],"type":"string"},"body_tmpl":{"type":"string"},"enabled":{"type":"boolean"},"from_name":{"type":"string"},"locale_mode":{"enum":["form","submitter"],"type":"string"},"reply_to_field":{"type":"string"},"subject_tmpl":{"type":"string"}},"required":["from_name","subject_tmpl","body_tmpl"],"type":"object"},"Usage":{"additionalProperties":false,"properties":{"limit":{"type":"integer"},"notified_100":{"type":"boolean"},"notified_80":{"type":"boolean"},"period":{"format":"date","type":"string"},"plan":{"type":"string"},"ratio":{"format":"double","type":"number"},"submissions":{"format":"int64","type":"integer"},"tenant_id":{"type":"string"},"throttled":{"type":"boolean"}},"required":["tenant_id","period","plan","submissions","limit","ratio","throttled","notified_80","notified_100"],"type":"object"},"Web3FormsIntegrationConfig":{"additionalProperties":false,"description":"Requires `connection.kind=access_key` and `access_key`. No configuration fields are accepted.","title":"Web3Forms migration configuration","type":"object"},"WebhookDelivery":{"additionalProperties":false,"properties":{"attempts":{"type":"integer"},"created_at":{"type":"string"},"delivered_at":{"nullable":true,"type":"string"},"endpoint_id":{"type":"string"},"event_id":{"type":"string"},"event_type":{"type":"string"},"id":{"type":"string"},"last_attempt_at":{"nullable":true,"type":"string"},"last_error":{"nullable":true,"type":"string"},"last_status_code":{"nullable":true,"type":"integer"},"next_attempt_at":{"nullable":true,"type":"string"},"status":{"type":"string"},"submission_id":{"nullable":true,"type":"string"}},"required":["id","endpoint_id","event_id","event_type","status","attempts","created_at"],"type":"object"},"WebhookDeliveryAttempt":{"additionalProperties":false,"properties":{"attempt_no":{"type":"integer"},"created_at":{"type":"string"},"error":{"nullable":true,"type":"string"},"id":{"type":"string"},"response_excerpt":{"nullable":true,"type":"string"},"response_ms":{"nullable":true,"type":"integer"},"status_code":{"nullable":true,"type":"integer"}},"required":["id","attempt_no","created_at"],"type":"object"},"WebhookDeliveryDetail":{"additionalProperties":false,"properties":{"attempts":{"items":{"$ref":"#/components/schemas/WebhookDeliveryAttempt"},"type":"array"},"delivery":{"$ref":"#/components/schemas/WebhookDelivery"}},"required":["delivery","attempts"],"type":"object"},"WebhookDeliveryList":{"additionalProperties":false,"properties":{"deliveries":{"items":{"$ref":"#/components/schemas/WebhookDelivery"},"type":"array"},"next_cursor":{"nullable":true,"type":"string"}},"required":["deliveries"],"type":"object"},"WebhookEndpoint":{"additionalProperties":false,"properties":{"created_at":{"type":"string"},"description":{"nullable":true,"type":"string"},"enabled":{"type":"boolean"},"events":{"items":{"type":"string"},"type":"array"},"form_id":{"type":"string"},"id":{"type":"string"},"secret_prefix":{"nullable":true,"type":"string"},"updated_at":{"type":"string"},"url":{"format":"uri","type":"string"}},"required":["id","form_id","url","enabled","events","created_at","updated_at"],"type":"object"}},"securitySchemes":{"bearerAuth":{"bearerFormat":"fp_sk_live","description":"Bearer authentication accepts either an organization API key (`fp_sk_live_...`, created on the dashboard's API Keys page) or a dashboard session token. API keys with scope `read` may only perform GET requests; scope `full` allows all methods. Account, billing, and API key management endpoints require a dashboard session and reject API keys with code `session_required`.\n","scheme":"bearer","type":"http"}}},"info":{"contact":{"name":"Form Plume support","url":"https://formplume.com/contact-us"},"description":"Everything you can do in the Form Plume dashboard, you can do over the API. There's also an [MCP server](https://formplume.com/docs/api/mcp) available if you prefer.","license":{"name":"Apache-2.0","url":"https://www.apache.org/licenses/LICENSE-2.0"},"termsOfService":"https://formplume.com/terms-of-service","title":"Form Plume API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/v1/api-keys/current":{"get":{"description":"Identity endpoint for API keys: returns the key's id, name, and scope plus the workspace it belongs to. Call it to verify a key works and to discover the workspace context. Only meaningful with an `Authorization: Bearer fp_sk_...` API key; dashboard sessions get a 400 with code `not_api_key`.\n","operationId":"getCurrentApiKey","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyIdentity"}}},"description":"The authenticated key and its workspace."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Get current API key","tags":["API keys"]}},"/v1/blocked-domains/{id}":{"delete":{"operationId":"deleteBlockedDomain","parameters":[{"$ref":"#/components/parameters/BlockedDomainID"}],"responses":{"204":{"description":"Blocked domain removed."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Delete blocked domain","tags":["Spam protection"]}},"/v1/blocked-ips/{id}":{"delete":{"operationId":"deleteBlockedIP","parameters":[{"$ref":"#/components/parameters/BlockedIPID"}],"responses":{"204":{"description":"Blocked IP removed."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Delete blocked IP","tags":["Spam protection"]}},"/v1/email/suppression":{"get":{"operationId":"listEmailSuppression","parameters":[{"$ref":"#/components/parameters/Cursor"},{"$ref":"#/components/parameters/Limit"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressionList"}}},"description":"Suppressed recipients, newest first."},"401":{"$ref":"#/components/responses/Unauthorized"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"List email suppression","tags":["Email"]}},"/v1/email/suppression/{id}":{"delete":{"operationId":"deleteEmailSuppression","parameters":[{"$ref":"#/components/parameters/SuppressionID"}],"responses":{"204":{"description":"Suppression removed."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Delete email suppression","tags":["Email"]}},"/v1/forms":{"get":{"operationId":"listForms","parameters":[{"description":"Filter to the form carrying this config-as-code key.","in":"query","name":"external_key","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/FormSummary"},"type":"array"}}},"description":"Forms in the active tenant."},"401":{"$ref":"#/components/responses/Unauthorized"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"List forms","tags":["Forms"]},"post":{"operationId":"createForm","parameters":null,"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFormRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Form"}}},"description":"Created form."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Create form","tags":["Forms"]}},"/v1/forms/{id}":{"delete":{"operationId":"deleteForm","parameters":[{"$ref":"#/components/parameters/FormID"}],"responses":{"204":{"description":"Form deactivated."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Delete form","tags":["Forms"]},"get":{"operationId":"getForm","parameters":[{"$ref":"#/components/parameters/FormID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Form"}}},"description":"Form details."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Get form","tags":["Forms"]},"patch":{"operationId":"updateForm","parameters":[{"$ref":"#/components/parameters/FormID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFormRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Form"}}},"description":"Updated form."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Update form","tags":["Forms"]}},"/v1/forms/{id}/analytics":{"get":{"operationId":"getFormAnalytics","parameters":[{"$ref":"#/components/parameters/FormID"},{"description":"Rolling window to show: 7d, 30d, 90d, or all.","in":"query","name":"period","required":false,"schema":{"default":"30d","type":"string"}},{"description":"IANA timezone used for daily chart buckets.","in":"query","name":"time_zone","required":false,"schema":{"default":"UTC","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormAnalyticsStats"}}},"description":"Form analytics for the selected rolling period."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Get form analytics","tags":["Analytics"]}},"/v1/forms/{id}/autoresponder":{"get":{"operationId":"getAutoresponder","parameters":[{"$ref":"#/components/parameters/FormID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoresponderResponse"}}},"description":"The form's autoresponder, or null when none is configured."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Get autoresponder","tags":["Autoresponders"]},"put":{"operationId":"upsertAutoresponder","parameters":[{"$ref":"#/components/parameters/FormID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertAutoresponderRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Autoresponder"}}},"description":"The saved autoresponder."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The template references an unknown variable."},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Upsert autoresponder","tags":["Autoresponders"]}},"/v1/forms/{id}/autoresponder/test":{"post":{"operationId":"testAutoresponder","parameters":[{"$ref":"#/components/parameters/FormID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestAutoresponderRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestAutoresponderResponse"}}},"description":"Preview sent."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Test autoresponder","tags":["Autoresponders"]}},"/v1/forms/{id}/blocked-domains":{"get":{"operationId":"listBlockedDomains","parameters":[{"$ref":"#/components/parameters/FormID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockedDomainList"}}},"description":"Blocked email domains for the form (and tenant-wide)."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"List blocked domains","tags":["Spam protection"]},"post":{"operationId":"addBlockedDomain","parameters":[{"$ref":"#/components/parameters/FormID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddBlockedDomainRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockedDomain"}}},"description":"The blocked domain."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Add blocked domain","tags":["Spam protection"]}},"/v1/forms/{id}/blocked-ips":{"get":{"operationId":"listBlockedIPs","parameters":[{"$ref":"#/components/parameters/FormID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockedIPList"}}},"description":"Blocked IPs and CIDR ranges for the form."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"List blocked IPs","tags":["Spam protection"]},"post":{"operationId":"addBlockedIP","parameters":[{"$ref":"#/components/parameters/FormID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddBlockedIPRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockedIP"}}},"description":"The blocked IP or CIDR range."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Add blocked IP","tags":["Spam protection"]}},"/v1/forms/{id}/captcha":{"get":{"operationId":"getCaptcha","parameters":[{"$ref":"#/components/parameters/FormID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaptchaConfig"}}},"description":"The form's CAPTCHA configuration without the secret."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Get CAPTCHA","tags":["Spam protection"]},"put":{"operationId":"setCaptcha","parameters":[{"$ref":"#/components/parameters/FormID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCaptchaRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaptchaConfig"}}},"description":"The saved CAPTCHA configuration without the secret."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Set CAPTCHA","tags":["Spam protection"]}},"/v1/forms/{id}/data-requests/erase":{"post":{"operationId":"eraseSubmitterData","parameters":[{"$ref":"#/components/parameters/FormID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataRequestEraseRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataRequestEraseResponse"}}},"description":"Number of matching submissions erased."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Erase submitter data","tags":["Submissions"]}},"/v1/forms/{id}/data-requests/export":{"get":{"operationId":"exportSubmitterData","parameters":[{"$ref":"#/components/parameters/FormID"},{"in":"query","name":"submitter_email","required":true,"schema":{"format":"email","type":"string"}}],"responses":{"200":{"content":{"text/csv":{"schema":{"type":"string"}}},"description":"CSV export for submissions matching the submitter email."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Export submitter data","tags":["Submissions"]}},"/v1/forms/{id}/email-hygiene":{"get":{"operationId":"getEmailHygiene","parameters":[{"$ref":"#/components/parameters/FormID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailHygieneResponse"}}},"description":"The form's email-hygiene policy, or null when unset."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Get email hygiene","tags":["Spam protection"]},"put":{"operationId":"setEmailHygiene","parameters":[{"$ref":"#/components/parameters/FormID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetEmailHygieneRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailHygienePolicy"}}},"description":"The saved policy."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Set email hygiene","tags":["Spam protection"]}},"/v1/forms/{id}/integrations":{"get":{"operationId":"listIntegrations","parameters":[{"$ref":"#/components/parameters/FormID"}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NativeIntegration"},"type":"array"}}},"description":"Native integrations for the form."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"List integrations","tags":["Integrations"]},"post":{"description":"Creates an integration using one provider-agnostic request. Providers that require browser authorization return an `open_url` next action; open that URL and the integration is activated by the callback. Credential-based providers are validated and connected immediately.\n","operationId":"createIntegration","parameters":[{"$ref":"#/components/parameters/FormID"}],"requestBody":{"content":{"application/json":{"examples":{"api_key":{"summary":"Connect ActiveCampaign","value":{"config":{"list_id":"12"},"connection":{"api_key":"ac_live_example","api_url":"https://example.api-us1.com","kind":"api_key"},"label":"Sales contacts","type":"activecampaign"}},"browser_authorization":{"summary":"Connect Mailchimp","value":{"config":{"audience_id":"4f921a","status_if_new":"pending"},"label":"Newsletter audience","type":"mailchimp"}}},"schema":{"$ref":"#/components/schemas/CreateIntegrationRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"examples":{"authorization_required":{"summary":"Open the provider authorization page","value":{"integration":{"config":{"audience_id":"4f921a","status_if_new":"pending"},"created_at":"2026-07-13T15:20:00Z","enabled":true,"form_id":"form_01JQ8FZKQ32J9R8V6N5W4M3T2S","id":"int_01JQ8G2YV4D3W9P6M5A7K1N2R0","label":"Newsletter audience","last_delivery_at":null,"last_status":{},"status":"needs_reauth","type":"mailchimp","updated_at":"2026-07-13T15:20:00Z"},"next_action":{"expires_at":"2026-07-13T15:35:00Z","type":"open_url","url":"https://login.mailchimp.com/oauth2/authorize?response_type=code\u0026client_id=formplume\u0026state=signed_example"},"status":"authorization_required"}},"connected":{"summary":"Credential-based provider connected","value":{"integration":{"config":{"api_url":"https://example.api-us1.com","list_id":"12"},"created_at":"2026-07-13T15:20:00Z","enabled":true,"form_id":"form_01JQ8FZKQ32J9R8V6N5W4M3T2S","id":"int_01JQ8G7QF2X5H3B9C6N4M8K1P0","label":"Sales contacts","last_delivery_at":null,"last_status":{},"status":"active","type":"activecampaign","updated_at":"2026-07-13T15:20:00Z"},"status":"connected"}}},"schema":{"$ref":"#/components/schemas/CreateIntegrationResponse"}}},"description":"Integration created. Follow `next_action` when browser authorization is required."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Create integration","tags":["Integrations"]}},"/v1/forms/{id}/keys":{"get":{"operationId":"listFormKeys","parameters":[{"$ref":"#/components/parameters/FormID"}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/FormKey"},"type":"array"}}},"description":"API keys for the form."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"List form keys","tags":["Form access keys"]},"post":{"operationId":"createFormKey","parameters":[{"$ref":"#/components/parameters/FormID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFormKeyRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFormKeyResponse"}}},"description":"Created API key. The plaintext key is returned once."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Create form key","tags":["Form access keys"]}},"/v1/forms/{id}/keys/{kid}/revoke":{"post":{"operationId":"revokeFormKey","parameters":[{"$ref":"#/components/parameters/FormID"},{"in":"path","name":"kid","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"API key revoked."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Revoke form key","tags":["Form access keys"]}},"/v1/forms/{id}/submissions":{"get":{"operationId":"listSubmissions","parameters":[{"$ref":"#/components/parameters/FormID"},{"$ref":"#/components/parameters/Cursor"},{"$ref":"#/components/parameters/Limit"},{"in":"query","name":"status","required":false,"schema":{"$ref":"#/components/schemas/SubmissionStatusFilter"}},{"in":"query","name":"q","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionListResponse"}}},"description":"Paginated submissions for the form."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"List submissions","tags":["Submissions"]}},"/v1/forms/{id}/submissions/bulk":{"post":{"operationId":"bulkUpdateSubmissions","parameters":[{"$ref":"#/components/parameters/FormID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkSubmissionActionRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkSubmissionActionResponse"}}},"description":"Bulk update result."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Bulk update submissions","tags":["Submissions"]}},"/v1/forms/{id}/submissions/export":{"get":{"operationId":"exportSubmissions","parameters":[{"$ref":"#/components/parameters/FormID"},{"in":"query","name":"format","required":false,"schema":{"default":"csv","enum":["csv"],"type":"string"}},{"in":"query","name":"status","required":false,"schema":{"$ref":"#/components/schemas/SubmissionStatusFilter"}},{"in":"query","name":"q","required":false,"schema":{"type":"string"}},{"in":"query","name":"from","required":false,"schema":{"format":"date-time","type":"string"}},{"in":"query","name":"to","required":false,"schema":{"format":"date-time","type":"string"}}],"responses":{"200":{"content":{"text/csv":{"schema":{"type":"string"}}},"description":"CSV export."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Export submissions","tags":["Submissions"]}},"/v1/forms/{id}/submissions/{sid}":{"delete":{"operationId":"deleteSubmission","parameters":[{"$ref":"#/components/parameters/FormID"},{"$ref":"#/components/parameters/SubmissionID"}],"responses":{"204":{"description":"Submission moved to trash."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Delete submission","tags":["Submissions"]},"get":{"operationId":"getSubmission","parameters":[{"$ref":"#/components/parameters/FormID"},{"$ref":"#/components/parameters/SubmissionID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Submission"}}},"description":"Submission detail."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Get submission","tags":["Submissions"]},"patch":{"operationId":"updateSubmission","parameters":[{"$ref":"#/components/parameters/FormID"},{"$ref":"#/components/parameters/SubmissionID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSubmissionRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Submission"}}},"description":"Updated submission."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Update submission","tags":["Submissions"]}},"/v1/forms/{id}/uploads/presign":{"post":{"description":"Returns presigned PUT URLs so the browser uploads file bytes directly to R2, bypassing our API. Authenticated by a dashboard session, a protected form key, or open for a public form (mirrors the ingest auth model), so no global session is required. The path segment accepts either the form UUID (dashboard) or its public slug (the public SDK flow).\n","operationId":"createUploadPresign","parameters":[{"description":"Form UUID or public slug.","in":"path","name":"id","required":true,"schema":{"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadPresignRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadPresignResponse"}}},"description":"Upload slots issued."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Storage quota exceeded for the plan."},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Form is inactive."},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"A file is too large or there are too many files."},"415":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"A file's content type is not allowed."},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"security":[],"summary":"Create upload presign","tags":["Forms"]}},"/v1/forms/{id}/webhooks":{"get":{"operationId":"listWebhooks","parameters":[{"$ref":"#/components/parameters/FormID"}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/WebhookEndpoint"},"type":"array"}}},"description":"Webhook endpoints for the form."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"List webhooks","tags":["Webhooks"]},"post":{"operationId":"createWebhook","parameters":[{"$ref":"#/components/parameters/FormID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookResponse"}}},"description":"Created webhook endpoint. The plaintext secret is returned once."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Create webhook","tags":["Webhooks"]}},"/v1/integrations/deliveries/{deliveryId}":{"get":{"operationId":"getIntegrationDelivery","parameters":[{"$ref":"#/components/parameters/DeliveryID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationDeliveryDetail"}}},"description":"Native integration delivery and its per-attempt log."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Get integration delivery","tags":["Integrations"]}},"/v1/integrations/deliveries/{deliveryId}/redeliver":{"post":{"operationId":"redeliverIntegrationDelivery","parameters":[{"$ref":"#/components/parameters/DeliveryID"}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeliverResponse"}}},"description":"Delivery re-enqueued with the same event ID."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Redeliver integration delivery","tags":["Integrations"]}},"/v1/integrations/{id}":{"delete":{"operationId":"deleteIntegration","parameters":[{"$ref":"#/components/parameters/IntegrationID"}],"responses":{"204":{"description":"Native integration deleted."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Delete integration","tags":["Integrations"]},"patch":{"operationId":"updateIntegration","parameters":[{"$ref":"#/components/parameters/IntegrationID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateIntegrationRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NativeIntegration"}}},"description":"Updated native integration."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Update integration","tags":["Integrations"]}},"/v1/integrations/{id}/deliveries":{"get":{"operationId":"listIntegrationDeliveries","parameters":[{"$ref":"#/components/parameters/IntegrationID"},{"$ref":"#/components/parameters/DeliveryStatus"},{"$ref":"#/components/parameters/Cursor"},{"$ref":"#/components/parameters/Limit"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationDeliveryList"}}},"description":"Native integration deliveries, newest first."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"List integration deliveries","tags":["Integrations"]}},"/v1/integrations/{id}/deliveries/redeliver-failed":{"post":{"operationId":"redeliverFailedIntegrationDeliveries","parameters":[{"$ref":"#/components/parameters/IntegrationID"}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeliverResponse"}}},"description":"Dead deliveries re-enqueued, keeping their original event IDs."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Redeliver failed integration deliveries","tags":["Integrations"]}},"/v1/integrations/{id}/test":{"post":{"operationId":"testIntegration","parameters":[{"$ref":"#/components/parameters/IntegrationID"}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestIntegrationResponse"}}},"description":"Native integration test delivery enqueued."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Test integration","tags":["Integrations"]}},"/v1/stats/forms":{"get":{"operationId":"getFormUsageStats","parameters":[{"in":"query","name":"period","required":false,"schema":{"default":"current","enum":["current","all"],"type":"string"}},{"description":"IANA timezone used for daily chart buckets.","in":"query","name":"time_zone","required":false,"schema":{"default":"UTC","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormUsageStats"}}},"description":"Per-form submission counts for the current usage period or all time."},"401":{"$ref":"#/components/responses/Unauthorized"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Get form usage stats","tags":["Analytics"]}},"/v1/stats/submissions":{"get":{"operationId":"getSubmissionStats","parameters":[{"in":"query","name":"days","required":false,"schema":{"default":30,"maximum":90,"minimum":1,"type":"integer"}},{"description":"IANA timezone used for daily chart buckets.","in":"query","name":"time_zone","required":false,"schema":{"default":"UTC","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionStats"}}},"description":"Daily submission counts over a rolling window ending today in the requested timezone."},"401":{"$ref":"#/components/responses/Unauthorized"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Get submission stats","tags":["Submissions"]}},"/v1/submissions/{id}/files/{fileId}/download":{"get":{"operationId":"downloadSubmissionFile","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"fileId","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"Redirect to a short-lived presigned R2 GET URL.","headers":{"Location":{"schema":{"format":"uri","type":"string"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}},"summary":"Download submission file","tags":["Files"]}},"/v1/usage":{"get":{"operationId":"getUsage","parameters":null,"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usage"}}},"description":"Current monthly usage for the active tenant."},"401":{"$ref":"#/components/responses/Unauthorized"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Get usage","tags":["Analytics"]}},"/v1/webhooks/deliveries/{deliveryId}":{"get":{"operationId":"getWebhookDelivery","parameters":[{"$ref":"#/components/parameters/DeliveryID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDeliveryDetail"}}},"description":"Webhook delivery and its per-attempt log."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Get webhook delivery","tags":["Webhooks"]}},"/v1/webhooks/deliveries/{deliveryId}/redeliver":{"post":{"operationId":"redeliverWebhookDelivery","parameters":[{"$ref":"#/components/parameters/DeliveryID"}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeliverResponse"}}},"description":"Delivery re-enqueued with the same event ID."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Redeliver webhook delivery","tags":["Webhooks"]}},"/v1/webhooks/{id}":{"delete":{"operationId":"deleteWebhook","parameters":[{"$ref":"#/components/parameters/WebhookID"}],"responses":{"204":{"description":"Webhook endpoint deleted."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Delete webhook","tags":["Webhooks"]},"patch":{"operationId":"updateWebhook","parameters":[{"$ref":"#/components/parameters/WebhookID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpoint"}}},"description":"Updated webhook endpoint."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Update webhook","tags":["Webhooks"]}},"/v1/webhooks/{id}/deliveries":{"get":{"operationId":"listWebhookDeliveries","parameters":[{"$ref":"#/components/parameters/WebhookID"},{"$ref":"#/components/parameters/DeliveryStatus"},{"$ref":"#/components/parameters/Cursor"},{"$ref":"#/components/parameters/Limit"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDeliveryList"}}},"description":"Webhook deliveries for the endpoint, newest first."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"List webhook deliveries","tags":["Webhooks"]}},"/v1/webhooks/{id}/deliveries/redeliver-failed":{"post":{"operationId":"redeliverFailedWebhookDeliveries","parameters":[{"$ref":"#/components/parameters/WebhookID"}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeliverResponse"}}},"description":"Dead deliveries re-enqueued, keeping their original event IDs."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Redeliver failed webhook deliveries","tags":["Webhooks"]}},"/v1/webhooks/{id}/secret/rotate":{"post":{"operationId":"rotateWebhookSecret","parameters":[{"$ref":"#/components/parameters/WebhookID"}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RotateWebhookSecretResponse"}}},"description":"Rotated webhook secret. The plaintext secret is returned once."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Rotate webhook secret","tags":["Webhooks"]}},"/v1/webhooks/{id}/test":{"post":{"operationId":"testWebhook","parameters":[{"$ref":"#/components/parameters/WebhookID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestWebhookResponse"}}},"description":"Signed test event sent."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Test webhook","tags":["Webhooks"]}}},"security":[{"bearerAuth":[]}],"servers":[{"description":"Current origin","url":"/"}],"tags":[{"description":"Create and manage forms.","name":"Forms"},{"description":"Read, update, export, and erase form submissions.","name":"Submissions"},{"description":"Keys that protect individual form submission endpoints.","name":"Form access keys"},{"description":"Signed webhook endpoints and delivery history.","name":"Webhooks"},{"description":"Native integrations, OAuth, tests, and deliveries.","name":"Integrations"},{"description":"Automatic email replies sent after submissions.","name":"Autoresponders"},{"description":"CAPTCHA, email hygiene, and form blocklists.","name":"Spam protection"},{"description":"Email suppression and provider events.","name":"Email"},{"description":"Submission trends, per-form statistics, and usage.","name":"Analytics"},{"description":"Organization API keys used to access the management API.","name":"API keys"},{"description":"Presigned uploads and protected submission downloads.","name":"Files"}]}