# Tented Help Center - [Introduction](https://docs.tented.ai/index.md): Welcome to Tented - the AI marketing automation platform - [Getting Started](https://docs.tented.ai/getting-started.md): Launch your first landing page and email campaign with Tented - [Creating Tents](https://docs.tented.ai/working-with-tents/creating-tents.md): Learn how to create AI-generated landing pages with your brand assets - [Viewing Tent Details](https://docs.tented.ai/working-with-tents/viewing-tent-details.md): Navigate and understand the tent details page - [Understanding the Tent Editor](https://docs.tented.ai/working-with-tents/understanding-tent-editor.md): Navigate and use the tent editor interface effectively - [Editing Tents](https://docs.tented.ai/working-with-tents/editing-tents.md): Advanced techniques for editing and iterating on your tents - [Reverting to Previous Generations](https://docs.tented.ai/working-with-tents/reverting-generations.md): How to revert to previous versions of your tent - [Generating Images with AI](https://docs.tented.ai/working-with-tents/generating-images.md): Ask Tented to create custom photos and graphics for your tents and emails — no stock library required - [Best Practices for AI Prompting](https://docs.tented.ai/working-with-tents/best-practices-prompting.md): Write effective prompts for better AI-generated results - [Previewing Tents](https://docs.tented.ai/working-with-tents/previewing-tents.md): Effectively preview and test your tents before publishing - [Publishing Tents](https://docs.tented.ai/working-with-tents/publishing-tents.md): Publish your tent and make it live on the web - [Viewing Form Submissions](https://docs.tented.ai/working-with-tents/viewing-form-submissions.md): View, manage, and export form submission data - [Form Automations](https://docs.tented.ai/working-with-tents/form-automations.md): Get notified — or trigger downstream systems — whenever your tent forms are submitted - [Form Spam Protection](https://docs.tented.ai/working-with-tents/form-spam-protection.md): Every Tented form is protected from bots automatically with Cloudflare Turnstile - [Tent Templates](https://docs.tented.ai/working-with-tents/tent-templates.md): Turn a tent you love into a reusable starting point for future pages - [Managing Tents](https://docs.tented.ai/working-with-tents/managing-tents.md): Rename, delete, clone, and manage your tents - [Managing Contacts](https://docs.tented.ai/people/managing-contacts.md): Build and manage your contact database in the People area - [Importing Contacts via CSV](https://docs.tented.ai/people/importing-contacts.md): Bring your whole contact list into Tented with a CSV import - [Standard & Custom Fields](https://docs.tented.ai/people/contact-fields.md): Understand the contact fields Tented gives you — and add your own - [Working with Lists](https://docs.tented.ai/people/working-with-lists.md): Organize contacts into static and dynamic lists to power your campaigns - [Setting Up Email](https://docs.tented.ai/email/email-setup.md): Verify your sending domain and sender details so you can start sending marketing email - [Creating Emails](https://docs.tented.ai/email/creating-emails.md): Generate beautiful, personalized marketing emails by chatting with AI - [Personalization Tokens](https://docs.tented.ai/email/personalization.md): Every token you can use to tailor emails to each recipient - [Email Templates](https://docs.tented.ai/email/email-templates.md): Give every email a consistent, on-brand starting point - [Sending Sample Emails](https://docs.tented.ai/email/sample-emails.md): Send a one-off test of any email or template to a real inbox before it goes to an audience - [Email Blasts](https://docs.tented.ai/email/email-blasts.md): Send a one-time email to an audience — scheduled, or right now - [A/B Testing](https://docs.tented.ai/email/ab-testing.md): Test up to five variations of a blast, then send the winner automatically - [Triggered Flows](https://docs.tented.ai/email/triggered-flows.md): Build automated, multi-step email journeys on a visual canvas - [Tracking Email Performance](https://docs.tented.ai/email/email-performance.md): See how an email performed across every blast and flow it was sent in - [Inviting New Users](https://docs.tented.ai/configuring-tented/inviting-new-users.md): Bring teammates into your Tented workspace - [Managing Users](https://docs.tented.ai/configuring-tented/managing-users.md): Manage your team from the Team Management page - [User Permissions](https://docs.tented.ai/configuring-tented/user-permissions.md): What Admins and Standard Users can do in a workspace - [User Settings](https://docs.tented.ai/configuring-tented/user-settings.md): Configure your personal profile and notification preferences - [Workspace Settings](https://docs.tented.ai/configuring-tented/workspace-settings.md): Configure your workspace settings and team preferences - [Switching Workspaces](https://docs.tented.ai/configuring-tented/switching-workspaces.md): Move between the Tented workspaces you belong to without signing out - [Workspace Analytics](https://docs.tented.ai/configuring-tented/analytics.md): Track tent traffic, email sends, and AI usage across your whole workspace - [API Keys & Usage](https://docs.tented.ai/configuring-tented/api-keys.md): Create and manage API keys, and monitor your API usage - [Custom Domains](https://docs.tented.ai/configuring-tented/custom-domains.md): Serve your published tents from your own branded domain - [Upgrading Your Plan](https://docs.tented.ai/billing-subscriptions/upgrading-plan.md): Compare Tented plans and upgrade when you're ready - [Managing Your Subscription](https://docs.tented.ai/billing-subscriptions/managing-subscription.md): Change plans, view invoices, and manage billing details - [AI Credits & the Add-on](https://docs.tented.ai/billing-subscriptions/ai-credits.md): How AI credits work, what they cost, and how to buy more - [Viewing Current Usage](https://docs.tented.ai/billing-subscriptions/viewing-usage.md): Track credits, email sends, and AI generations across your workspace - [Connecting Slack](https://docs.tented.ai/integrations/connecting-slack.md): Learn how to connect Slack to your Tented workspace for automated form submission notifications - [Connecting Microsoft Teams](https://docs.tented.ai/integrations/connecting-microsoft-teams.md): Learn how to connect Microsoft Teams to your Tented workspace for automated form submission notifications. - [Connecting Origami](https://docs.tented.ai/integrations/connecting-origami.md): Generate a personalized Tented page for every prospect in an Origami table and use the link in your Origami campaign emails - [Connecting Instantly](https://docs.tented.ai/integrations/connecting-instantly.md): Generate a personalized Tented page for every lead in an Instantly campaign or AI Sales Agent and use the link in your emails - [Receiving Form Submission Notifications by Email](https://docs.tented.ai/integrations/setting-up-email-notifications.md): Get form submissions in your inbox — per submission, or as a scheduled digest - [Webhooks](https://docs.tented.ai/integrations/webhooks.md): Send tent form submissions and flow events to your own endpoints - [Tented API Overview](https://docs.tented.ai/api-reference/introduction.md): Create, edit, publish, measure, and delete tents, plus manage contacts, through Tented's public API. - [Authentication](https://docs.tented.ai/api-reference/authentication.md): Authenticate to the Tented API with workspace-scoped bearer API keys. - [Usage Logs](https://docs.tented.ai/api-reference/usage-logs.md): Every API request is logged in the web app — inspect recent calls, response statuses, and credits consumed under Settings > API. - [Creating Tents](https://docs.tented.ai/api-reference/creating-tents.md): Create a tent generation job through the public API from a prompt or approved template, with optional branding, assets, and auto-publish. - [Editing Tents](https://docs.tented.ai/api-reference/editing-tents.md): Create a new generation for an existing tent through the public API. - [Uploading Assets](https://docs.tented.ai/api-reference/uploading-assets.md): Upload, list, retrieve, and delete files on tents, emails, email templates, and tent templates. - [Tent Templates](https://docs.tented.ai/api-reference/managing-tent-templates.md): Create, iterate, and approve reusable tent layouts through the public API. - [Publishing Tents](https://docs.tented.ai/api-reference/publishing-tents.md): Publish the latest completed generation of a tent through the public API. - [Unpublishing Tents](https://docs.tented.ai/api-reference/unpublishing-tents.md): Remove a tent from its public URL through the public API. - [Deleting Tents](https://docs.tented.ai/api-reference/deleting-tents.md): Delete a tent and its associated public assets through the public API. - [Creating Bulk Tents](https://docs.tented.ai/api-reference/creating-bulk-tents.md): Create up to 25 tents from one approved template in a single public API request. - [Retrieving Bulk Job Status](https://docs.tented.ai/api-reference/retrieving-bulk-job-status.md): Poll a bulk tent creation job until all accepted items complete, fail, or finish publishing. - [Retrieving Tent Status](https://docs.tented.ai/api-reference/retrieving-tent-status.md): Poll a tent until generation completes, fails, or finishes publishing. - [Creating Emails](https://docs.tented.ai/api-reference/creating-emails.md): Create an email from an AI prompt, an approved template, or a blank scaffold, then poll the generation and read the HTML through the public API. - [Editing Emails](https://docs.tented.ai/api-reference/editing-emails.md): Iterate on an email with AI, save HTML directly, update metadata, and manage the plain-text alternative through the public API. - [Approving & Managing Emails](https://docs.tented.ai/api-reference/approving-emails.md): Approve an email for sending, then list, retrieve, and delete emails through the public API. - [Email Templates](https://docs.tented.ai/api-reference/managing-email-templates.md): Create, generate, and approve reusable email templates through the public API. - [Managing Contacts](https://docs.tented.ai/api-reference/managing-contacts.md): Look up, create, update, and delete contacts through the public API in batches of up to 100 records. - [Dynamic & Static Lists](https://docs.tented.ai/api-reference/managing-contact-lists.md): Create static and dynamic contact lists, manage membership, and export members to CSV through the public API. - [Managing Contact Fields](https://docs.tented.ai/api-reference/managing-contact-fields.md): List, create, and archive custom contact field definitions, and discover the fields and operators available for segment rules. - [Importing Contacts](https://docs.tented.ai/api-reference/importing-contacts.md): Bulk-import contacts from a CSV file or inline JSON rows, with column mapping, dedupe control, and per-row results. - [Managing Email Blasts](https://docs.tented.ai/api-reference/managing-email-blasts.md): Create a blast, attach an audience and an approved email, then schedule or send it through the public API. - [Managing Triggered Flows](https://docs.tented.ai/api-reference/managing-triggered-flows.md): Build, activate, and monitor automated multi-step email journeys through the public API. - [Retrieving Tent Analytics](https://docs.tented.ai/api-reference/retrieving-tent-analytics.md): Read detailed analytics for a single tent by ID or alias through the public API. - [Retrieving Org Analytics](https://docs.tented.ai/api-reference/retrieving-org-analytics.md): Read aggregate analytics across all published tents in a workspace through the public API. - [Create a tent](https://docs.tented.ai/api-reference/tents/create-a-tent.md): Create a tent and queue its first generation from a prompt, an approved template, or both. Generation is asynchronous: poll `GET /v1/tents/{tentId}` for progress. Creating from a template without a prompt copies the template synchronously and returns `201`. - [Get tent status](https://docs.tented.ai/api-reference/tents/get-tent-status.md): Poll the generation status of a tent. While work is in progress the response carries `Retry-After: 10` — poll no more than every 10 seconds. When `auto_publish` was requested, the `publication` object reports the publish outcome. - [Edit a tent](https://docs.tented.ai/api-reference/tents/edit-a-tent.md): Queue a new generation for a tent that already has at least one generation. Asynchronous: poll `GET /v1/tents/{tentId}`. To create the first version, use `POST /v1/tents` instead. - [List tent assets](https://docs.tented.ai/api-reference/tents/list-tent-assets.md): List every asset attached to a tent. Each item includes a time-limited `download_url`. - [Upload an asset](https://docs.tented.ai/api-reference/tents/upload-an-asset.md): Upload one file (max 4 MB) to a tent as `multipart/form-data` with a single `file` field. Pass the literal tent ID `new` to create an idle tent and get back its `actual_tent_id` for use with `POST /v1/tents`. Supported types: images (PNG, JPEG, GIF, SVG, WebP, ICO, TIFF, AVIF), documents (PDF, Word,… - [Publish a tent](https://docs.tented.ai/api-reference/tents/publish-a-tent.md): Publish the latest completed generation of a tent. Re-publishing an already-live tent with no changes is a no-op. - [Unpublish a tent](https://docs.tented.ai/api-reference/tents/unpublish-a-tent.md): Take a published tent offline. The tent and its generation history are kept, and it can be republished at any time. - [Delete a tent](https://docs.tented.ai/api-reference/tents/delete-a-tent.md): Delete a tent and its published assets, alias reservations, form-submission delivery configs, and scheduled automations. The identifier may be the tent ID, its current published alias, or `__index__` for a tent published at the domain root. - [Create tents in bulk](https://docs.tented.ai/api-reference/tents/create-tents-in-bulk.md): Create up to 25 tents from one approved template in a single request. Admission supports partial success: valid items are accepted and queued, invalid ones are rejected item-by-item. Poll `GET /v1/bulk-jobs/{bulkJobId}` for progress. - [Get bulk job status](https://docs.tented.ai/api-reference/tents/get-bulk-job-status.md): Poll a bulk tent creation job for per-item progress, publication results, and credit accounting. - [Get a tent asset](https://docs.tented.ai/api-reference/tents/get-a-tent-asset.md): Retrieve one asset's metadata and a `download_url`. - [Delete a tent asset](https://docs.tented.ai/api-reference/tents/delete-a-tent-asset.md): Remove an asset from the tent and delete the underlying file. Idempotent from the caller's perspective; the stored object is cleaned up best-effort. - [Clone a tent](https://docs.tented.ai/api-reference/tents/clone-a-tent.md): Duplicate a tent — its latest content and assets — into a new idle tent. The clone starts unpublished; publish it separately. - [Get tent analytics](https://docs.tented.ai/api-reference/analytics/get-tent-analytics.md): Traffic analytics for a single published tent over the last 1–7 days. Note: this endpoint uses camelCase query parameters. - [Get workspace analytics](https://docs.tented.ai/api-reference/analytics/get-workspace-analytics.md): Aggregate traffic analytics across all published tents in the workspace, including a per-path breakdown. `tent_id` is the literal string `org` in the response. - [List or look up contacts](https://docs.tented.ai/api-reference/contacts/list-or-look-up-contacts.md): This endpoint has two modes. - [Create contacts](https://docs.tented.ai/api-reference/contacts/create-contacts.md): Create up to 100 contacts in one request. Each item needs an `email` and/or `phone`. Duplicates (matching a normalized email or phone) are rejected per-item with `error_code: conflict` and the `existing_contact`. Partial success is normal — check each item result. - [Delete contacts](https://docs.tented.ai/api-reference/contacts/delete-contacts.md): Delete up to 100 contacts in one request. Equivalent to `POST /v1/contacts/delete`, which exists for clients that cannot send a body with `DELETE`. - [Update contacts](https://docs.tented.ai/api-reference/contacts/update-contacts.md): Update up to 100 contacts in one request. Omitted fields stay unchanged; `null` clears nullable fields. A contact must always keep at least one valid email or phone. Changing an email/phone to one used by another contact is rejected per-item with `error_code: conflict`. - [Delete contacts (POST)](https://docs.tented.ai/api-reference/contacts/delete-contacts-post.md): Body-compatible alternative to `DELETE /v1/contacts` for clients that cannot send a request body with the `DELETE` method. - [Get a contact](https://docs.tented.ai/api-reference/contacts/get-a-contact.md): Retrieve a single contact by ID. The response is the contact object itself (no envelope) and includes `custom_fields`: the contact's custom field values keyed by field API name. - [Delete a contact](https://docs.tented.ai/api-reference/contacts/delete-a-contact.md): Delete a single contact by ID — the single-record equivalent of one `DELETE /v1/contacts` item, without the batch envelope. Returns `204` with no body on success. - [Update a contact](https://docs.tented.ai/api-reference/contacts/update-a-contact.md): Update a single contact by ID — the single-record equivalent of one `POST /v1/contacts/update` item, without the batch envelope. Only the fields present in the body are changed; nullable fields accept `null` to clear the stored value; unknown fields are rejected. A body with no updatable fields retu… - [Upsert contacts](https://docs.tented.ai/api-reference/contacts/upsert-contacts.md): Create or update up to 100 contacts in one request (note: this endpoint's batch limit is 100 items). Each item is matched against existing contacts by a single key: the normalized `email` when the item has a non-empty email, otherwise the normalized `phone`. A matched contact is updated with the ite… - [Search contacts by rules](https://docs.tented.ai/api-reference/contacts/search-contacts-by-rules.md): Return the contacts matching a segment rule tree — the same rule DSL used for dynamic lists, blast audiences, and flow rules. Rule trees use camelCase keys (`fieldDefinitionId`, `listId`, `timeWindow`), unlike the rest of the API. Trees may nest at most 5 levels deep and contain at most 100 nodes; `… - [List contact activities](https://docs.tented.ai/api-reference/contacts/list-contact-activities.md): Paginated activity timeline for a contact — creation and update events, email engagement (e.g. `email_sent`, `email_opened`, `email_clicked`), and unsubscribes — ordered by activity `timestamp`. Returns `404` if the contact does not exist. - [List emails](https://docs.tented.ai/api-reference/emails/list-emails.md): List emails with cursor pagination. Follow `next_cursor` until it is absent. - [Create an email](https://docs.tented.ai/api-reference/emails/create-an-email.md): Create an email. With a `prompt`, AI generation starts asynchronously (`202` — poll the returned generation). Without a prompt you get a blank draft (`201`), optionally seeded from an approved email template via `template_id`. Emails are reusable content assets: approve one, then attach it to blasts… - [Get an email](https://docs.tented.ai/api-reference/emails/get-an-email.md) - [Delete an email](https://docs.tented.ai/api-reference/emails/delete-an-email.md): Delete an email. Blocked with `409` while the email is scheduled in a blast (`email_in_scheduled_blast`) or used by an active flow (`email_in_active_flow`). - [Update email metadata](https://docs.tented.ai/api-reference/emails/update-email-metadata.md): Update name, subject, and sender fields. Omitted fields stay unchanged; `null` clears nullable fields. Updating `preview_text` rewrites the preheader in the current HTML in place without creating a new version. - [Get email HTML](https://docs.tented.ai/api-reference/emails/get-email-html.md): Returns the HTML of the latest completed version as `text/html` (not JSON). - [Get plain text](https://docs.tented.ai/api-reference/emails/get-plain-text.md): Returns the plain-text rendition of the latest version — auto-derived from the HTML unless overridden. - [Override plain text](https://docs.tented.ai/api-reference/emails/override-plain-text.md): Replace the auto-derived plain text with your own (up to 1 MB; an empty string clears the content). Requires a completed generation. If the HTML is iterated later, `stale_after_html_iteration` flips to `true` on the override. - [Reset plain text](https://docs.tented.ai/api-reference/emails/reset-plain-text.md): Remove the manual override and revert to plain text auto-derived from the current HTML. - [Iterate with AI](https://docs.tented.ai/api-reference/emails/iterate-with-ai.md): Queue an AI iteration on the email. Only one generation can run per email at a time — a second request fails with `409 generation_in_progress`. Poll the returned generation for completion. - [Save HTML directly](https://docs.tented.ai/api-reference/emails/save-html-directly.md): Replace the email’s HTML with your own code (up to 2 MB), creating a new version synchronously. Does not unapprove an approved email. Blocked while an AI generation is running. - [Approve an email](https://docs.tented.ai/api-reference/emails/approve-an-email.md): Mark the newest completed version as approved and usable by blasts and flows. Requires `subject`, `from_name`, `from_address`, and `reply_to_email` to be set (`400 email_missing_required_headers` otherwise). Pass `version` as an optimistic-concurrency precondition; a mismatch with the newest complet… - [Unapprove an email](https://docs.tented.ai/api-reference/emails/unapprove-an-email.md): Return the email to draft. Rejected while the email is scheduled in a blast (`email_in_scheduled_blast`) or used by an active flow (`email_in_active_flow`). - [Get generation status](https://docs.tented.ai/api-reference/emails/get-generation-status.md): Poll an AI generation. `completed` generations include the version produced and content paths; `failed` ones include `error_code` and `error_message`. - [Get generation HTML](https://docs.tented.ai/api-reference/emails/get-generation-html.md): Returns the HTML produced by one specific generation as `text/html`. - [Get generation plain text](https://docs.tented.ai/api-reference/emails/get-generation-plain-text.md) - [List email assets](https://docs.tented.ai/api-reference/emails/list-email-assets.md): List every asset attached to an email. Each item includes a `download_url`. - [Upload an email asset](https://docs.tented.ai/api-reference/emails/upload-an-email-asset.md): Upload one file (max 4 MB) to an email as `multipart/form-data` with a single `file` field. Reference the returned `asset_id` in `asset_ids` when iterating the email with AI. - [Get an email asset](https://docs.tented.ai/api-reference/emails/get-an-email-asset.md): Retrieve one asset's metadata and a `download_url`. - [Delete an email asset](https://docs.tented.ai/api-reference/emails/delete-an-email-asset.md): Remove an asset from the email and delete the underlying file. - [Clone an email](https://docs.tented.ai/api-reference/emails/clone-an-email.md): Duplicate an email — its content, versions, and assets — as a fresh draft attributed to the API principal. The clone is never approved, regardless of the source's state. - [List blasts](https://docs.tented.ai/api-reference/email-blasts/list-blasts.md) - [Create a blast](https://docs.tented.ai/api-reference/email-blasts/create-a-blast.md): Create a draft blast. Attach an audience and an email, then schedule it or send it immediately. - [Get a blast](https://docs.tented.ai/api-reference/email-blasts/get-a-blast.md): Retrieve a blast, including send/engagement counters and (for drafts) `approval_readiness`. - [Delete a blast](https://docs.tented.ai/api-reference/email-blasts/delete-a-blast.md): Delete a blast. Scheduled blasts must be unscheduled first; archived blasts cannot be deleted (`409 campaign_not_deletable`). - [Rename a blast](https://docs.tented.ai/api-reference/email-blasts/rename-a-blast.md) - [Set the audience](https://docs.tented.ai/api-reference/email-blasts/set-the-audience.md): Attach the audience, replacing any previous one. Use an existing list, an inline static list of contact IDs, or an inline dynamic segment defined by rules. Only editable while the blast is a draft (`409 campaign_not_editable` otherwise). - [Set the email](https://docs.tented.ai/api-reference/email-blasts/set-the-email.md): Attach the email to send — an existing email, or one created inline (from a template, your own HTML, or a blank scaffold). Only editable while the blast is a draft. - [Schedule a blast](https://docs.tented.ai/api-reference/email-blasts/schedule-a-blast.md): Schedule the send. The blast must be ready (approved email, audience, valid future time) — otherwise `400 campaign_not_ready` with an `approval_readiness` breakdown. - [Send a blast now](https://docs.tented.ai/api-reference/email-blasts/send-a-blast-now.md): Start the send immediately (asynchronous). Same readiness requirements as scheduling. - [Unschedule a blast](https://docs.tented.ai/api-reference/email-blasts/unschedule-a-blast.md): Cancel a scheduled send and return the blast to draft. - [Archive a blast](https://docs.tented.ai/api-reference/email-blasts/archive-a-blast.md): Archive a blast that is not mid-send. - [List recipients & engagement](https://docs.tented.ai/api-reference/email-blasts/list-recipients-&-engagement.md): List the contacts in an engagement category (recipients, opened, clicked, …) with per-contact event timestamps. - [Start a CSV export](https://docs.tented.ai/api-reference/email-blasts/start-a-csv-export.md): Start an async CSV export of one engagement category. Poll `GET /v1/email-blasts/{blastId}/contacts/export/{exportId}` until `completed`, then download from `download_url`. - [Get export status](https://docs.tented.ai/api-reference/email-blasts/get-export-status.md) - [List flows](https://docs.tented.ai/api-reference/triggered-flows/list-flows.md) - [Create a flow](https://docs.tented.ai/api-reference/triggered-flows/create-a-flow.md): Create a triggered flow, optionally with its triggers and step graph inline. Flows start as drafts; activate when ready. - [Get a flow](https://docs.tented.ai/api-reference/triggered-flows/get-a-flow.md) - [Delete a flow](https://docs.tented.ai/api-reference/triggered-flows/delete-a-flow.md): Delete a flow. Active flows must be paused first. - [Update a flow](https://docs.tented.ai/api-reference/triggered-flows/update-a-flow.md): Patch flow fields. `triggers` and `steps` are full replacements when provided. Setting `disqualification_rules` on an active flow immediately drops matching members. Structure is editable only while `draft` or `paused`. - [Replace triggers](https://docs.tented.ai/api-reference/triggered-flows/replace-triggers.md): Replace the full trigger list. - [Replace steps](https://docs.tented.ai/api-reference/triggered-flows/replace-steps.md): Replace the full step graph. Duplicate step IDs fail with `409 campaign_flow_duplicate_step_id`. - [Add a step](https://docs.tented.ai/api-reference/triggered-flows/add-a-step.md): Insert a single step without rewriting the rest of the graph. Position it with at most one of `position`, `before_step_id`, or `after_step_id`. Inserting does not rewire edges — update neighboring steps’ links separately if needed. - [Delete a step](https://docs.tented.ai/api-reference/triggered-flows/delete-a-step.md): Delete a step. If other steps still reference it, the call fails with `409 campaign_flow_step_referenced` unless you pass `repair_edges` with a replacement step (or `null` to detach the dangling edges). - [Update a step](https://docs.tented.ai/api-reference/triggered-flows/update-a-step.md): Merge a partial update into one step. Only provided fields change; `step_id` cannot be changed. - [Set a step’s email](https://docs.tented.ai/api-reference/triggered-flows/set-a-step’s-email.md): Attach the email for a `send_email` step — an existing email or one created inline (same body as setting a blast’s email). Inline emails start as drafts and must be approved before the flow can be activated. Fails with `400 campaign_flow_step_type_invalid` on non-email steps. - [Activate a flow](https://docs.tented.ai/api-reference/triggered-flows/activate-a-flow.md): Validate and activate the flow. Incomplete configuration (e.g. an unapproved email on a `send_email` step) fails with `400 campaign_flow_not_ready` and an `activation_readiness` breakdown. Triggers fire on new events only — no retroactive enrollment. - [Pause a flow](https://docs.tented.ai/api-reference/triggered-flows/pause-a-flow.md): Stop new enrollments and step execution without dropping members. Paused flows can be edited and re-activated. - [Archive a flow](https://docs.tented.ai/api-reference/triggered-flows/archive-a-flow.md): Archive a non-active flow. Pause an active flow first. - [Add a contact to a flow](https://docs.tented.ai/api-reference/triggered-flows/add-a-contact-to-a-flow.md): Manually enroll a contact into an active flow. Optional `dynamic_context` values are available in the run as `{{campaign.dynamic.}}` tokens. Fails with `409` if the contact is already in the flow (`campaign_flow_already_in_flow`), blocked by `no_reentry` (`campaign_flow_reentry_denied`), or the… - [Remove a contact from a flow](https://docs.tented.ai/api-reference/triggered-flows/remove-a-contact-from-a-flow.md): Drop the contact’s current run. Returns `204` when the contact was not in the flow. - [List flow members](https://docs.tented.ai/api-reference/triggered-flows/list-flow-members.md) - [Get a member run](https://docs.tented.ai/api-reference/triggered-flows/get-a-member-run.md): One member’s full run: current position, failure info, and a chronological timeline of events (entered, step executed, email sent/opened/clicked, dropped). - [Trigger a flow for a contact](https://docs.tented.ai/api-reference/triggered-flows/trigger-a-flow-for-a-contact.md): Fire the flow’s `tented_api` trigger for one contact, enrolling them with optional `tokens` stored as dynamic context and usable as `{{campaign.dynamic.}}` merge tokens. Identify the contact with exactly one of `contact_id`, `email`, or `phone` — `email` and `phone` are looked up against existi… - [Add a contact to a flow (campaign alias)](https://docs.tented.ai/api-reference/triggered-flows/add-a-contact-to-a-flow-campaign-alias.md): Alias for `POST /v1/email-flows/{flowId}/contacts/{contactId}` that addresses the flow by its campaign ID. Manually enrolls the contact into an active flow; this alias takes no request body, so use the email-flows route when you need `dynamic_context`. Fails with `409` if the contact is already in t… - [Remove a contact from a flow (campaign alias)](https://docs.tented.ai/api-reference/triggered-flows/remove-a-contact-from-a-flow-campaign-alias.md): Alias for `DELETE /v1/email-flows/{flowId}/contacts/{contactId}` that addresses the flow by its campaign ID. Drops the contact’s current run. Returns `204` when the contact was not in the flow. - [Start a contact import](https://docs.tented.ai/api-reference/contact-imports/start-a-contact-import.md): Create a contact import session. Two modes, selected by `source`: - [Preview an import](https://docs.tented.ai/api-reference/contact-imports/preview-an-import.md): Parse the session's CSV and return everything needed to build the mapping step: the detected column headers, proposed column-to-field mappings (deterministic header matching plus AI-assisted suggestions), the catalog of available target fields (importable standard fields and your active custom field… - [Execute an import](https://docs.tented.ai/api-reference/contact-imports/execute-an-import.md): Approve the final column mappings and start the import. The import runs asynchronously in chunks — this endpoint returns `202` with an `import_run_id`; poll `GET /v1/contacts/imports/{importRunId}` until `status` is `completed` or `failed`. - [Get an import run](https://docs.tented.ai/api-reference/contact-imports/get-an-import-run.md): Fetch the status and progress counters of an import run. Runs move through `queued` → `running` → `completed` or `failed`. Rows are processed in chunks; `processed_rows`, `created_count`, `updated_count`, `skipped_count`, and `error_count` update as chunks complete, so you can poll this endpoint for… - [List per-row results](https://docs.tented.ai/api-reference/contact-imports/list-per-row-results.md): Paginated per-row outcomes of an import run, ordered by row number. Each result records what happened to one CSV row — `created`, `updated`, `skipped`, or `failed` — with the affected contact ID and any field-level validation issues. Use the `status` filter to pull just the rows that need attention… - [Export results as CSV](https://docs.tented.ai/api-reference/contact-imports/export-results-as-csv.md): Download a CSV status report for an import run. The file has two sections: - [List contact fields](https://docs.tented.ai/api-reference/contact-fields/list-contact-fields.md): List the contact field definitions in your workspace: the built-in standard fields (`type: "standard"` — always active and read-only) followed by your custom fields (`type: "custom"`). Custom fields are either `org_managed` (created in the UI or via this API) or `integration_managed` (owned by a con… - [Create custom fields](https://docs.tented.ai/api-reference/contact-fields/create-custom-fields.md): Create one custom field (send a single object) or up to 50 in one request (send `{"items": [...]}`). Bulk creation is atomic — if any item collides, nothing is created. - [Update a custom field](https://docs.tented.ai/api-reference/contact-fields/update-a-custom-field.md): Update a custom field's display name, description, editability, default list visibility, or status. At least one property must be provided. - [Get rule metadata](https://docs.tented.ai/api-reference/contact-fields/get-rule-metadata.md): Metadata for building audience rule trees (used by `POST /v1/contacts/search` and dynamic contact lists): every filterable field — the standard contact fields plus your active custom fields — with its value type and the operators that apply to it, and a catalog of operator labels for display. - [List contact lists](https://docs.tented.ai/api-reference/contact-lists/list-contact-lists.md): Page through the workspace's contact lists, most recently updated first. Lists created inline for a blast are private to that blast and never appear here — they are reachable only by `list_id`. - [Create a contact list](https://docs.tented.ai/api-reference/contact-lists/create-a-contact-list.md): Create a contact list. Choose `static` (fixed membership) or `dynamic` (rule-driven) explicitly — the kind cannot be changed later. - [Get a contact list](https://docs.tented.ai/api-reference/contact-lists/get-a-contact-list.md) - [Delete a contact list](https://docs.tented.ai/api-reference/contact-lists/delete-a-contact-list.md): Delete a static or dynamic contact list. Contacts themselves are not deleted. - [Update a contact list](https://docs.tented.ai/api-reference/contact-lists/update-a-contact-list.md): Patch a contact list. `kind` is immutable; `rules` only apply to dynamic lists, and replacing them recomputes membership. - [List members](https://docs.tented.ai/api-reference/contact-lists/list-members.md): Page through the members of a list (static or dynamic). - [Add members](https://docs.tented.ai/api-reference/contact-lists/add-members.md): Bulk add members to a static list. Dynamic list membership is rule-driven and cannot be edited directly. - [Remove members](https://docs.tented.ai/api-reference/contact-lists/remove-members.md): Bulk remove members from a static list. Dynamic list membership is rule-driven and cannot be edited directly. - [Get live member counts](https://docs.tented.ai/api-reference/contact-lists/get-live-member-counts.md): Compute the list's current member count and how many of those members are blocked from marketing sends. Works for static and dynamic lists. - [Start a CSV export](https://docs.tented.ai/api-reference/contact-lists/start-a-csv-export.md): Start an async CSV export of the list's members. Poll `GET /v1/contact-lists/{listId}/export/{exportId}` until `completed`, then download from `download_url`. - [Get export status](https://docs.tented.ai/api-reference/contact-lists/get-export-status.md) - [List email templates](https://docs.tented.ai/api-reference/email-templates/list-email-templates.md): List email templates with cursor pagination. Follow `next_cursor` until it is absent. - [Create an email template](https://docs.tented.ai/api-reference/email-templates/create-an-email-template.md): Create an email template. With a `prompt`, AI generation starts asynchronously (`202` — poll the returned generation). Without one the template is created synchronously (`201`) — seeded from your `code` when provided, otherwise a blank scaffold branded from your workspace. Approve a template to let… - [Get an email template](https://docs.tented.ai/api-reference/email-templates/get-an-email-template.md) - [Delete an email template](https://docs.tented.ai/api-reference/email-templates/delete-an-email-template.md): Delete an email template and all of its versions. Unlike emails, deletion is never blocked — emails already seeded from the template keep their content and are unaffected. - [Update template metadata](https://docs.tented.ai/api-reference/email-templates/update-template-metadata.md): Update the name and the default sender fields copied onto emails seeded from this template. Omitted fields stay unchanged; `null` clears nullable fields. - [Get template HTML](https://docs.tented.ai/api-reference/email-templates/get-template-html.md): Returns the HTML of the latest completed version as `text/html` (not JSON). - [Get plain text](https://docs.tented.ai/api-reference/email-templates/get-plain-text.md): Returns the plain-text rendition of the latest version — auto-derived from the HTML unless overridden. - [Override plain text](https://docs.tented.ai/api-reference/email-templates/override-plain-text.md): Replace the auto-derived plain text with your own (up to 1 MB; an empty string clears the content). Requires a completed generation. If the HTML is iterated later, `stale_after_html_iteration` flips to `true` on the override. - [Reset plain text](https://docs.tented.ai/api-reference/email-templates/reset-plain-text.md): Remove the manual override and revert to plain text auto-derived from the current HTML. - [Iterate with AI](https://docs.tented.ai/api-reference/email-templates/iterate-with-ai.md): Queue an AI iteration on the template. Only one generation can run per template at a time — a second request fails with `409 generation_in_progress`. Poll the returned generation for completion. - [Save HTML directly](https://docs.tented.ai/api-reference/email-templates/save-html-directly.md): Replace the template’s HTML with your own code (up to 2 MB), creating a new version synchronously. Does not unapprove an approved template. Blocked while an AI generation is running. - [Approve an email template](https://docs.tented.ai/api-reference/email-templates/approve-an-email-template.md): Mark the newest completed version as approved and usable for seeding new emails via `POST /v1/emails` with `template_id`. Requires at least one completed generation (`409 template_not_ready`); unlike emails there is no required-sender-header gate — the default header fields are optional. Pass `versi… - [Unapprove an email template](https://docs.tented.ai/api-reference/email-templates/unapprove-an-email-template.md): Return the template to draft. Unlike emails, unapproval is never blocked — emails already seeded from the template are unaffected, but new emails can no longer be created from it until it is approved again. - [Get generation status](https://docs.tented.ai/api-reference/email-templates/get-generation-status.md): Poll an AI generation. `completed` generations include the version produced and content paths; `failed` ones include `error_code` and `error_message`. - [Get generation HTML](https://docs.tented.ai/api-reference/email-templates/get-generation-html.md): Returns the HTML produced by one specific generation as `text/html`. - [Get generation plain text](https://docs.tented.ai/api-reference/email-templates/get-generation-plain-text.md) - [List template assets](https://docs.tented.ai/api-reference/email-templates/list-template-assets.md): List every asset attached to an email template. Each item includes a `download_url`. - [Upload a template asset](https://docs.tented.ai/api-reference/email-templates/upload-a-template-asset.md): Upload one file (max 4 MB) to an email template as `multipart/form-data` with a single `file` field. Reference the returned `asset_id` in `asset_ids` when iterating the template with AI. - [Get a template asset](https://docs.tented.ai/api-reference/email-templates/get-a-template-asset.md): Retrieve one asset's metadata and a `download_url`. - [Delete a template asset](https://docs.tented.ai/api-reference/email-templates/delete-a-template-asset.md): Remove an asset from the email template and delete the underlying file. - [Clone an email template](https://docs.tented.ai/api-reference/email-templates/clone-an-email-template.md): Duplicate an email template — its content, versions, and assets — as a fresh draft attributed to the API principal. The clone is never approved. - [List tent templates](https://docs.tented.ai/api-reference/tent-templates/list-tent-templates.md): List tent templates with cursor pagination. Responses contain metadata only — fetch HTML via each template's `content_path`. Follow `next_cursor` until it is absent. - [Create a tent template](https://docs.tented.ai/api-reference/tent-templates/create-a-tent-template.md): Create a tent template from caller-supplied HTML. Seeds a completed v1 that the editor loads directly. Use `POST /v1/tent-templates/from-tent/{tentId}` to create from an existing tent, and `POST /v1/tent-templates/{templateId}/messages` to iterate with AI. - [Create a tent template from a tent](https://docs.tented.ai/api-reference/tent-templates/create-a-tent-template-from-a-tent.md): Create a tent template from an existing tent's latest completed render — its HTML and assets are copied into the new template. - [Get a tent template](https://docs.tented.ai/api-reference/tent-templates/get-a-tent-template.md) - [Delete a tent template](https://docs.tented.ai/api-reference/tent-templates/delete-a-tent-template.md): Delete a tent template and all of its versions. Tents already seeded from the template are unaffected. - [Get template HTML](https://docs.tented.ai/api-reference/tent-templates/get-template-html.md): Returns the HTML of the latest completed version as `text/html` (not JSON). - [Iterate with AI](https://docs.tented.ai/api-reference/tent-templates/iterate-with-ai.md): Queue an AI iteration on the template against its current HTML. Only one generation can run per template at a time — a second request fails with `409 generation_in_progress`. Returns `202` with `status: "generating"`; poll the returned generation for completion. - [Save HTML directly](https://docs.tented.ai/api-reference/tent-templates/save-html-directly.md): Replace the template's HTML with your own code (1 byte – 2 MB), creating a new version synchronously. Blocked while an AI generation is running. - [Approve a tent template](https://docs.tented.ai/api-reference/tent-templates/approve-a-tent-template.md): Mark the newest completed version as approved and usable to seed new tents. Requires at least one completed generation. Pass `version` as an optimistic-concurrency precondition; a mismatch with the newest completed version fails with `409 approval_version_stale`. Approval works while a generation is… - [Unapprove a tent template](https://docs.tented.ai/api-reference/tent-templates/unapprove-a-tent-template.md): Return the template to draft. Never blocked — tents already seeded from the template are unaffected, but new tents can no longer be seeded from it until it is approved again. - [Clone a tent template](https://docs.tented.ai/api-reference/tent-templates/clone-a-tent-template.md): Duplicate the template — its chat, generation history, and assets — as a fresh draft. - [Get generation status](https://docs.tented.ai/api-reference/tent-templates/get-generation-status.md): Poll an AI generation. `completed` generations include the version produced and a content path; `failed` ones include `error_code` and `error_message`. - [Get generation HTML](https://docs.tented.ai/api-reference/tent-templates/get-generation-html.md): Returns the HTML produced by one specific generation as `text/html`. - [List template assets](https://docs.tented.ai/api-reference/tent-templates/list-template-assets.md): List every asset attached to a tent template. Each item includes a `download_url`. - [Upload a template asset](https://docs.tented.ai/api-reference/tent-templates/upload-a-template-asset.md): Upload one file (max 4 MB) to a tent template as `multipart/form-data` with a single `file` field. Reference the returned `asset_id` in `asset_ids` when iterating the template with AI. - [Get a template asset](https://docs.tented.ai/api-reference/tent-templates/get-a-template-asset.md): Retrieve one asset's metadata and a `download_url`. - [Delete a template asset](https://docs.tented.ai/api-reference/tent-templates/delete-a-template-asset.md): Remove an asset from the tent template and delete the underlying file. ## OpenAPI Specs - [openapi](/api-reference/openapi.json)