Appearance
Intake
Reference for the 24 CryptoComply MCP tools in the Intake family.
Tools in this group
intake_form_apply_sourceintake_form_authoring_rulesintake_form_catalogintake_form_createintake_form_discard_draftintake_form_draft_editintake_form_draft_getintake_form_draft_updateintake_form_email_getintake_form_email_previewintake_form_email_updateintake_form_invitation_listintake_form_invitation_remindintake_form_invitation_resendintake_form_invitation_revokeintake_form_invitation_sendintake_form_listintake_form_publishintake_form_send_test_emailintake_form_settings_updateintake_form_style_getintake_form_style_updateintake_form_submission_listintake_form_template_list
intake_form_apply_source
Read-only: no.
Seed the form's draft from another existing form — the 'use another form as a template' override. Copies a sibling form's authored definition into this draft so you start from it instead of the blank group layout. The source must be a different form of the SAME target (profile vs address) in the same org, and every field/section it uses must be offered by this form's group — otherwise it returns a /source_form_id error: the source's group exposes a field this form's group hides. Edit further with intake_form_draft_update afterwards.
Applies immediately (the draft is private and recoverable via intake_form_discard_draft). expected_updated_at must be the updated_at from the latest intake_form_draft_get.
On success: {status: "ok", updated_at, draft_is_valid, summary}.
Parameters
organization_id(int, required) — Organization the intake form belongs to.form_id(int, required) — Intake form id (from intake_form_list.results[].id).source_form_id(int, required) — The form whose definition to copy into this draft (same org, same target).expected_updated_at(datetime, required) — Theupdated_atreturned by the latest intake_form_draft_get — the optimistic lock.
intake_form_authoring_rules
Read-only: yes.
The intake form authoring contract: definition shape, hard limits, condition rules, publish requirements, and every supported style key with what it visually controls. Served from the same constants the validator enforces, so it is always current — call it once before authoring or restyling instead of guessing.
When the user wants a custom theme, present style.keys and style.font_families to them and collect their hex colors before calling intake_form_style_update.
Parameters
organization_id(int, required) — Organization the intake form belongs to.
intake_form_catalog
Read-only: yes.
The fields a question on this form may link to, grouped by profile section — the form's group layout filtered to externally-requestable, visible fields (org custom fields included).
Call this before composing or editing a definition: every question's field must be one of these keys. Returns {version, profile_type, is_dual, sections, repeatable_sections, attachments, notes, group_selector, profile_type_selector}, where sections is [{key, label, fields: [{key, field_label, type, required?, choices?, offered_in?, is_custom}]}] (the scalar question fields; closed-choice fields carry choices: [{value, label}] — the valid keys a question's choice_labels may relabel), repeatable_sections the offerable related-party / wallet repeated bindings (each {key, label, target, relation, item_profile_type, default_max_entries, hard_max_entries, required_fields, fields: [child...]}, bind a repeated_section to one by its key; bind a UBO/related-party section to a relation-bearing binding, a wallet section to the wallets one), attachments the file-upload fields (link as a question; captured as a ProfileAttachment), notes the free-text note fields, group_selector an optional single per-submission profile-group picker (null unless the org's groups were supplied), and profile_type_selector the individual/entity picker whose linking makes the form dual.
Repeated-section children include synthetic fields the binding folds in: a per-row relation_type selector (on relation-selectable bindings, chooses each row's relationship), boolean fold flags (e.g. is_control_person, marking a UBO row as also a control person), and a free-text note. A child's offered_in (present only on a dual catalog) lists which profile branch(es) offer it.
Pass dual=true to force the union catalog (both individual and entity branches, every field carrying offered_in: ['individual'|'entity', ...]) even on a single-type draft — so you can discover the entity-branch fields BEFORE linking the profile-type selector. By default the catalog matches the saved draft (union once it links the selector, single-type otherwise). is_dual reports which catalog was built.
Parameters
organization_id(int, required) — Organization the intake form belongs to.form_id(int, required) — Intake form id (from intake_form_list.results[].id).dual(bool, optional) — Force the union (both-branch) catalog so you can author a dual form before linking the profile-type selector. Default false: the catalog matches the saved draft's duality.
intake_form_create
Read-only: no.
Create an intake form. target chooses what submissions create: PROFILE (default) ingests each submission into a subject profile plus its related parties and wallets; BLOCKCHAIN_ADDRESS ingests the submission's wallet rows as standalone blockchain addresses with no profile.
target and form_type are FIXED AT CREATION and cannot be changed afterward — choose them carefully here. The group and the profile-type / blockchain defaults CAN be changed later via intake_form_settings_update. To vary the landing group per submission instead of fixing one, link the group selector in the definition rather than relying on group.
By default the draft is seeded from the group's full field layout (one page per visible section, every offerable field as a question); pass template to seed a catalog-aware preset instead (see intake_form_template_list, PROFILE forms only), or source_form_id to clone an existing same-org form's definition (the new form inherits the source's target). template and source_form_id are mutually exclusive. Either way, edit it with intake_form_draft_update afterwards. Nothing is public until the first publish.
profile_type, group_id, and default_blockchain set the form's submission-level defaults (fallbacks). A value a default supplies needs no question, though you may still add one to let submitters choose per submission — their answer then wins over the default (see intake_form_authoring_rules.form_defaults).
Two-step write tool. First call without confirm_token returns a dry-run preview + a 60-second token; second call with the same arguments + confirm_token applies the change.
On success: {status: "ok", form_id, updated_at, summary}.
Parameters
organization_id(int, required) — Organization the intake form belongs to.name(str, required) — Form name shown in the org's form list.group_id(int, required) — Group whose field layout seeds the form (from group_list).profile_type(Literal, required) — Profile type submissions create.form_type(Literal, required) — OPEN: anyone with the link. INVITATION_ONLY: emailed single-use invitations.target(Literal, optional) — What submissions create: PROFILE (default) builds a profile + related parties + wallets; BLOCKCHAIN_ADDRESS builds standalone blockchain addresses (no profile). Immutable.template(Optional, optional) — Starter preset to seed the draft (from intake_form_template_list, PROFILE forms only). Omit for the full layout. Mutually exclusive with source_form_id.source_form_id(int | None, optional) — Clone this same-org form's definition into the new draft (the new form inherits its target). Mutually exclusive with template.default_blockchain(str | None, optional) — Fallback blockchain code (e.g. BTC, ETH, SOL) applied to any submitted wallet row that carries no chain of its own, so wallets need no blockchain question when they should all land on this default. Omit to use SOLANA.slug(str | None, optional) — The public Link segment (lowercase letters, numbers, and hyphens only), unique per platform. Omit to auto-generate an opaque one.confirm_token(str | None, optional) — Token from a prior dry-run call. Omit on the first call.
intake_form_discard_draft
Read-only: no.
Reset the form's draft to the last published definition, throwing away all draft changes (null draft if the form was never published).
Two-step write tool. First call without confirm_token returns a dry-run preview + a 60-second token; second call with the same arguments + confirm_token applies the change.
On success: {status: "ok", form_id}.
Parameters
organization_id(int, required) — Organization the intake form belongs to.form_id(int, required) — Intake form id (from intake_form_list.results[].id).confirm_token(str | None, optional) — Token from a prior dry-run call. Omit on the first call.
intake_form_draft_edit
Read-only: no.
Edit the form's draft by surgical operations instead of resending the whole definition — the preferred editor for anything but a from-scratch rewrite. You send only the change (which page, where, which fields by key); everything you don't name — the embedded logo, verbatim consent / legal HTML — is carried through untouched and never has to pass through you. Use this over intake_form_draft_update whenever the form already has content you'd otherwise have to reproduce (a long waiver, a privacy notice): reproducing it risks corrupting it, so don't.
operations is an ordered list applied atomically — if any operation is invalid the whole batch is rejected (a /operations/{index} pointer error) and the draft is unchanged. Read the current draft with intake_form_draft_get first to learn the page keys and question fields you'll target, and pass its updated_at as expected_updated_at (optimistic lock).
Operations (each an object with an op):
{op:'set_header', title?, description?, logo_url?, first_page_is_start?}— the form header.{op:'insert_page', page:{key, title?, description?, elements:[...]}, after?/before?/index?}— a page positioned by a sibling page key or index (appended by default).keymust be unique.{op:'update_page', key, set:{title?, description?, consent?, profile_type?, visible_if?}}— page meta.{op:'move_page', key, after?/before?/index?}·{op:'remove_page', key}.{op:'add_element', page, element:{...}, panel?, after?/before?/index?}— add a question / panel / repeated_section / content / form_field to a page (or into apanelon it). Element shape per intake_form_authoring_rules.{op:'update_element', page, target, panel?, set:{title?, description?, required?, ...}}— merge keys into an existing element;targetis the question'sfieldor the panel/section/form_field/content/consentkey.{op:'move_element', page, target, panel?, after?/before?/index?}·{op:'remove_element', page, target, panel?}.
Applies immediately (drafts are private and recoverable via intake_form_discard_draft; no confirm step). Validation of the result runs at save, returning /pages/... pointer errors like intake_form_draft_update. On success: {status: "ok", updated_at, draft_is_valid, summary}.
Parameters
organization_id(int, required) — Organization the intake form belongs to.form_id(int, required) — Intake form id (from intake_form_list.results[].id).operations(list, required) — Ordered edit operations (see the tool description); applied atomically.expected_updated_at(datetime, required) — Theupdated_atreturned by the latest intake_form_draft_get — the optimistic lock.
intake_form_draft_get
Read-only: yes.
The form's editable draft definition plus the publish state.
Always call this before intake_form_draft_update — the returned updated_at is the optimistic-lock token the update requires, and edits must be applied on top of this exact definition (modify it, don't rebuild from memory). draft_is_valid: false means the stored draft no longer compiles against the live catalog (e.g. a linked custom field was deleted); saving will surface pointer errors.
defaults reports the form's submission-level defaults {profile_type, blockchain, target, group} (group is {id, name} or null) — fallbacks a matching question overrides per submission. See intake_form_authoring_rules.form_defaults.
An embedded base64 logo appears as the sentinel 'data:image/embedded' — pass it back unchanged to keep the logo.
Parameters
organization_id(int, required) — Organization the intake form belongs to.form_id(int, required) — Intake form id (from intake_form_list.results[].id).
intake_form_draft_update
Read-only: no.
Replace the form's draft definition wholesale — send the COMPLETE document. Prefer intake_form_draft_edit for editing a form that already has content: this full-replace makes you reproduce everything you're NOT changing (a long consent/legal block, the embedded logo), which risks corrupting verbatim text. Reserve this tool for creating a definition from scratch or a wholesale rewrite where there is nothing to preserve.
It is the single edit primitive for every authoring operation: add/remove/reorder pages, questions, panels, repeated_sections, consent, content blocks, and submission-only form_fields (see intake_form_authoring_rules.form_only_blocks), retitle anything, set descriptions and required flags, set the form header (title/description/logo). Read the current draft with intake_form_draft_get, apply the user's changes to that exact definition, and send the whole modified document back.
Drafts are private until published and recoverable via intake_form_discard_draft, so this tool applies immediately (no confirm step). expected_updated_at must be the updated_at from the latest intake_form_draft_get — a stale value is rejected (someone else saved since), re-read and re-apply.
Validation failures return pointer errors like /pages/0/elements/2/field — fix the flagged element and retry. On success: {status: "ok", updated_at, draft_is_valid, summary}.
Parameters
organization_id(int, required) — Organization the intake form belongs to.form_id(int, required) — Intake form id (from intake_form_list.results[].id).definition(dict, required) — The complete definition to store (see intake_form_authoring_rules for the shape).expected_updated_at(datetime, required) — Theupdated_atreturned by the latest intake_form_draft_get — the optimistic lock.
intake_form_email_get
Read-only: yes.
The form's saved invitation-email template overrides plus the resolved (inherited) defaults per email type, so an edit can be applied without clobbering the types it doesn't touch.
Always call this before intake_form_email_update: that tool REPLACES the whole blob, so modify this email_template_overrides and send it all back. resolved is the explicit overrides only (org-default ← form-override) — what each type customizes, empty where it inherits. effective is the fully-resolved config per type with the built-in defaults filled in (subject, heading, colors, body_blocks) — use it to pre-fill / show the value a field will actually use. Returns {form_id, form_type, email_types, email_template_overrides, resolved, effective}.
Parameters
organization_id(int, required) — Organization the intake form belongs to.form_id(int, required) — Intake form id (from intake_form_list.results[].id).
intake_form_email_preview
Read-only: yes.
Render an invitation email to {subject, html, resolved, effective} with sample data, without saving — the same server-side render the recipient gets. Use it to check copy/branding before intake_form_email_update.
email_template_overrides is optional: omit it to preview what is currently saved, or pass a candidate blob to preview an unsaved edit. resolved is the explicit overrides only for the chosen email_type; effective is that config with the built-in defaults filled in (for pre-filling the editor).
Parameters
organization_id(int, required) — Organization the intake form belongs to.form_id(int, required) — Intake form id (from intake_form_list.results[].id).email_type(Literal, required) — Which email to render.email_template_overrides(dict[str, typing.Any] | None, optional) — Candidate override blob to preview. Omit to render the saved overrides.
intake_form_email_update
Read-only: no.
Replace the form's invitation-email template overrides. Applies immediately — no publish cycle.
email_template_overrides is keyed by email type — INVITATION_PRIVATE, INVITATION_PUBLIC, INVITATION_REMINDER — and each type's config is rendered into a locked CryptoComply shell:
subject,heading: plain text (single-line).body_blocks: ordered list of typed blocks — {type:'paragraph'|'callout', text} | {type:'rich_text', html} | {type:'button', label} (the button's link is system-generated).paragraph/callouttextaccepts inline markup — <strong>/<b>, <em>/<i>, <u>, <a href>, <br> — to bold or link words mid-sentence (a normal paragraph, not a box); disallowed tags are stripped.rich_textrenders its html inside a bordered card.bg_color,header_bg_color,header_band_color,footer_bg_color,accent_color,button_text_color: hex colors.button_text_colordefaults to whichever of black/white contrasts with the accent.footer_html: rich text replacing the footer.logo_url: the header logo — anhttps://storage.googleapis.com/...URL of an image we host (arbitrary hosts are rejected); empty string clears it.logo_width: its width in px (40-480, default 190). CC recipients are a form-level setting, not configured here.
Subject/heading/text may contain merge tags resolved at send time: , , , , , (reminder/private only). Unknown tags are left literal; rich text is sanitized and raw HTML is never executed. An empty config for a type inherits the org default, then the built-in template. Omit a type to leave it unchanged.
Two-step write tool. First call without confirm_token returns a dry-run preview + a 60-second token; second call with the same arguments + confirm_token applies the change.
On success: {status: "ok", form_id, email_template_overrides} (the stored, cleaned blob).
Parameters
organization_id(int, required) — Organization the intake form belongs to.form_id(int, required) — Intake form id (from intake_form_list.results[].id).email_template_overrides(dict, required) — Per-email-type override blob, e.g. {"INVITATION_PRIVATE": {"heading": "Welcome ", "accent_color": "#1a73e8"}}.confirm_token(str | None, optional) — Token from a prior dry-run call. Omit on the first call.
intake_form_invitation_list
Read-only: yes.
List a form's invitations (INVITATION_ONLY forms), newest first — the outreach funnel. Each row carries its lifecycle status (PENDING, SENT, ACCESSED, SUBMITTED, REVOKED, DELIVERY_FAILED), is_expired, reminder count, the open/submit timestamps, and submission_id once submitted.
OPEN forms create no invitations (their link is shared), so this is empty for them. Returns {count, limit, offset, has_more, results: [...]}.
Parameters
organization_id(int, required) — Organization the intake form belongs to.form_id(int, required) — Intake form id (from intake_form_list.results[].id).status(Optional, optional) — Filter by lifecycle status.email_contains(str | None, optional) — Case-insensitive substring match on email.sort_by(Literal, optional) — Sort order. Prefix with '-' for descending (e.g. '-created_at' for newest first).limit(int, optional) — Max results (1-100).offset(int, optional) — Results to skip for pagination.
intake_form_invitation_remind
Read-only: no.
Queue reminder emails for the given invitations (INVITATION_ONLY forms). Only invitations in SENT or ACCESSED state are eligible; the call is all-or-nothing — if any id is ineligible, revoked, submitted, expired, or from another form, nothing is sent and pointer errors come back.
Two-step write tool. First call without confirm_token returns a dry-run preview + a 60-second token; second call with the same arguments + confirm_token sends.
On success: {status: "ok", reminded}.
Parameters
organization_id(int, required) — Organization the intake form belongs to.form_id(int, required) — Intake form id (from intake_form_list.results[].id).invitation_ids(list, required) — Invitation ids (from intake_form_invitation_list).confirm_token(str | None, optional) — Token from a prior dry-run call. Omit on the first call.
intake_form_invitation_resend
Read-only: no.
Re-send the original invitation email for one invitation (INVITATION_ONLY forms) — e.g. the first send bounced or the recipient lost it. Only invitations still in SENT or ACCESSED state qualify; submitted/revoked/expired ones are rejected.
Two-step write tool. First call without confirm_token returns a dry-run preview + a 60-second token; second call with the same arguments + confirm_token re-sends.
On success: {status: "ok", invitation_id}.
Parameters
organization_id(int, required) — Organization the intake form belongs to.form_id(int, required) — Intake form id (from intake_form_list.results[].id).invitation_id(str, required) — Invitation id (from intake_form_invitation_list).confirm_token(str | None, optional) — Token from a prior dry-run call. Omit on the first call.
intake_form_invitation_revoke
Read-only: no.
Revoke one invitation (INVITATION_ONLY forms): its link stops working immediately. A submitted invitation cannot be revoked; revoking an already-revoked one is a no-op.
Two-step write tool. First call without confirm_token returns a dry-run preview + a 60-second token; second call with the same arguments + confirm_token revokes.
On success: {status: "ok", invitation_id}.
Parameters
organization_id(int, required) — Organization the intake form belongs to.form_id(int, required) — Intake form id (from intake_form_list.results[].id).invitation_id(str, required) — Invitation id (from intake_form_invitation_list).confirm_token(str | None, optional) — Token from a prior dry-run call. Omit on the first call.
intake_form_invitation_send
Read-only: no.
Send the form to recipients. For INVITATION_ONLY forms this creates single-use invitations and emails each; for OPEN forms it emails the shared public link (no invitation objects). Pass one or many {email, recipient_name?} recipients (recipient_name optional).
The form must be open (enabled and before any closes_at). Duplicate/invalid emails are reported as pointer errors without sending any.
Two-step write tool. First call without confirm_token returns a dry-run preview + a 60-second token; second call with the same arguments + confirm_token sends.
On success: {status: "ok", queued, invitation_ids} (invitation_ids null for OPEN forms).
Parameters
organization_id(int, required) — Organization the intake form belongs to.form_id(int, required) — Intake form id (from intake_form_list.results[].id).recipients(list, required) — Recipients, e.g. [{"email": "a@b.com", "recipient_name": "Alice"}].confirm_token(str | None, optional) — Token from a prior dry-run call. Omit on the first call.
intake_form_list
Read-only: yes.
List the organization's intake forms (public KYC onboarding forms), newest first.
has_unpublished_changes: true means the draft differs from what the public link serves. definition_published_at: null means the form was never published through the editor (a new form awaiting its first publish).
Returns {count, limit, offset, has_more, results: [{id, name, enabled, form_type, default_profile_type, group_id, has_unpublished_changes, definition_published_at, created_at, updated_at}]}.
Parameters
organization_id(int, required) — Organization the intake form belongs to.limit(int, optional) — Max results (1-100).offset(int, optional) — Results to skip for pagination.
intake_form_publish
Read-only: no.
Publish the form's draft: the public link starts serving this version immediately.
Two-step write tool. First call without confirm_token returns a dry-run preview + a 60-second token; second call with the same arguments + confirm_token applies the change. The dry run pre-validates the draft at publish strictness, so problems surface before the user confirms.
Once published, proactively offer intake_form_send_test_email so the user can verify the live email and form end-to-end — a test email's link ingests NO profile, so it is safe to click.
On success: {status: "ok", form_id, definition_published_at}.
Parameters
organization_id(int, required) — Organization the intake form belongs to.form_id(int, required) — Intake form id (from intake_form_list.results[].id).confirm_token(str | None, optional) — Token from a prior dry-run call. Omit on the first call.
intake_form_send_test_email
Read-only: no.
Send the form's live invitation email to YOURSELF (the requesting user's address) to preview the real template and delivery — the recipient is always you, never a third party.
The email carries a form link, but it is created as a TEST invitation: any submission made through it is flagged test and ingests NO profile (and no blockchain address) — so it is always safe to click and fill, on both OPEN and INVITATION_ONLY forms. Works even on an unpublished draft (the template test is independent of publishing); it fails only if the form is disabled or past closes_at. After a form is published, proactively offer this so the user can verify the live email and form without creating real data.
Scope: this verifies the live email (template + delivery) and that the form renders and captures answers — it does NOT exercise ingestion. A test submission stops before profile/address creation and screening, so it does not prove the profile or wallet lands correctly. To verify ingestion end-to-end (a real profile + blockchain address, e.g. that a wallet defaults to the form's blockchain), a real, non-test submission is required.
On success: {status: "ok", form_id, email}.
Parameters
organization_id(int, required) — Organization the intake form belongs to.form_id(int, required) — Intake form id (from intake_form_list.results[].id).
intake_form_settings_update
Read-only: no.
Update a form's settings (the editor's Settings tab): any of name, enabled (the public on/off switch — independent of publishing), slug (the public Link segment — lowercase letters, numbers, and hyphens only, unique per platform), invitation_ttl_days (1-365, INVITATION_ONLY only, not retroactive), closes_at (a hard cutoff; set clear_closes_at: true to remove it), email_subject / email_subject_reminder (the invitation/reminder subject lines), cc_emails (up to 10 addresses CC'd on every invitation/reminder this form sends), and the three submission-level defaults — group_id (reassign the fixed landing group; clear_group to remove it), default_profile_type, and default_blockchain (set a value, or clear it with clear_default_profile_type / clear_default_blockchain to require the matching question at publish — see intake_form_authoring_rules.form_defaults). Omit a field to leave it unchanged. Pass at least one.
All three defaults are editable after a form exists. target and form_type are the only immutable settings — fixed at creation and NOT editable here. When you reassign the group, the new group must offer every field the definition links (verified at publish, not here).
Two-step write tool. First call without confirm_token returns a dry-run preview + a 60-second token; second call with the same arguments + confirm_token applies the change.
On success: {status: "ok", form_id, updated_fields}.
Parameters
organization_id(int, required) — Organization the intake form belongs to.form_id(int, required) — Intake form id (from intake_form_list.results[].id).name(str | None, optional) — Form name in the org's list.enabled(bool | None, optional) — Public on/off switch. Disabling closes the link without unpublishing.slug(str | None, optional) — The public Link segment (lowercase letters, numbers, and hyphens only), unique per platform.invitation_ttl_days(int | None, optional) — Days an invitation stays valid (INVITATION_ONLY forms).email_subject(str | None, optional) — Invitation email subject line.email_subject_reminder(str | None, optional) — Reminder email subject line.cc_emails(list[str] | None, optional) — Addresses CC'd on every invitation/reminder (max 10).closes_at(datetime.datetime | None, optional) — Hard cutoff (UTC) after which the form stops accepting access.clear_closes_at(bool, optional) — True removes the existing closes_at deadline.default_profile_type(Optional, optional) — Fix the profile type submissions create. Clearing it requires the profile-type selector.clear_default_profile_type(bool, optional) — True removes the default profile type (form must then link the selector to publish).default_blockchain(str | None, optional) — Fallback chain (e.g. BTC, ETH, SOL) for wallet rows. Clearing it makes a blockchain question required.clear_default_blockchain(bool, optional) — True removes the default blockchain (wallet sections must then ask the chain).group_id(int | None, optional) — Reassign the form's fixed landing group (from group_list). The new group must offer every field the definition links (checked at publish).clear_group(bool, optional) — True removes the fixed group. Only valid when the definition links the group selector or the form is BLOCKCHAIN_ADDRESS-target; a profile form otherwise needs a group to land profiles.confirm_token(str | None, optional) — Token from a prior dry-run call. Omit on the first call.
intake_form_style_get
Read-only: yes.
The form's current survey style (theme) plus what every style key controls — read it before intake_form_style_update to see the live theme and edit from it.
Returns {form_id, survey_style, effective, defaults, keys, properties}: survey_style is the form's stored theme (only the keys the author set), effective is that theme with the house defaults filled in for every unset key (what the public page actually renders), defaults is the house baseline, keys documents what each style key visually controls, properties is the granular per-key metadata (control type, group, default, range/choices, SurveyJS variables), and combinations lists the keys best set together (e.g. a header band with a light title) — same as intake_form_authoring_rules.style.
Parameters
organization_id(int, required) — Organization the intake form belongs to.form_id(int, required) — Intake form id (from intake_form_list.results[].id).
intake_form_style_update
Read-only: no.
Replace the form's survey style (theme). Applies to the live public page immediately — no publish cycle.
Read the current theme first with intake_form_style_get (it also documents what each key controls and the allowed fonts) and edit from it. When theming to the user's brand, ask the user for their hex colors rather than inventing them. Omitted keys fall back to defaults; unknown keys are rejected with pointer errors.
Two-step write tool. First call without confirm_token returns a dry-run preview + a 60-second token; second call with the same arguments + confirm_token applies the change.
On success: {status: "ok", form_id, survey_style} (the stored style, defaults merged in).
Parameters
organization_id(int, required) — Organization the intake form belongs to.form_id(int, required) — Intake form id (from intake_form_list.results[].id).survey_style(dict, required) — Style object (see intake_form_authoring_rulesstyle), e.g. {"button": {"background": "#1ab394"}}.confirm_token(str | None, optional) — Token from a prior dry-run call. Omit on the first call.
intake_form_submission_list
Read-only: yes.
List a form's submissions (the raw answer JSON is omitted), newest first. Each row carries its processing status (R ready, P processing, F failed, S success), the primary_profile_id once a profile is created, the submitter's invitation_email for INVITATION_ONLY forms, and the timestamps.
Returns {count, limit, offset, has_more, results: [...]}.
Parameters
organization_id(int, required) — Organization the intake form belongs to.form_id(int, required) — Intake form id (from intake_form_list.results[].id).status(Optional, optional) — Filter by processing status.sort_by(Literal, optional) — Sort order. Prefix with '-' for descending (e.g. '-created_at' for newest first).limit(int, optional) — Max results (1-100).offset(int, optional) — Results to skip for pagination.
intake_form_template_list
Read-only: yes.
The starter templates available for a profile type — catalog-aware presets that seed a new form's draft (pass the chosen key as intake_form_create.template). Each template only ever includes sections and fields the form's group actually offers, so it never asks for something the group hides.
Returns {profile_type, templates: [{key, label, description, is_dual}]}. is_dual: true means the template seeds the profile-type selector and so produces a dual (individual+entity) form (see intake_form_authoring_rules.dual_forms). Omit template on create to seed the group's full layout instead.
Parameters
organization_id(int, required) — Organization the intake form belongs to.profile_type(Literal, required) — Profile type the form will create — templates differ by type.