Skip to content

Profiles

Reference for the 39 CryptoComply MCP tools in the Profiles family.

Tools in this group

Read-only: no.

Link an existing blockchain address to a profile so the wallet shows up in the profile's portfolio and inherits the profile's screening cadence. The address must already exist in this organization (use blockchain_address_create first if it doesn't).

Two-step write tool. On success: {status: "ok", profile_id, address_id}.

Parameters

  • organization_id (int, required) — Organization both objects belong to.
  • profile_id (int, required) — Profile id (from profile_list).
  • address_id (int, required) — Blockchain address id (from blockchain_address_list).
  • confirm_token (str | None, optional) — Token from a prior dry-run call. Omit on the first call.

Read-only: no.

Remove the link between a blockchain address and a profile. The address itself stays in the organization — only the M2M edge is dropped. Re-screening cadence is recalculated on the address afterwards.

Two-step write tool. On success: {status: "ok", profile_id, address_id}.

Parameters

  • organization_id (int, required) — Organization both objects belong to.
  • profile_id (int, required) — Profile id.
  • address_id (int, required) — Blockchain address id.
  • confirm_token (str | None, optional) — Token from a prior dry-run call. Omit on the first call.

profile_analysis_snapshot

Read-only: yes.

Return a paginated snapshot of profiles in an organization, optionally joined with wallet / watchlist / adverse-media / RFI aggregates. This is the workhorse for org-wide diligence sweeps — one tool call gives the analyst the table they need (id, name, country, bio, contact + chosen aggregate signals) instead of calling profile_list and four bulk-summary tools.

Use profile_group_ids to scope to a subset of groups; review_status to filter (e.g. ['ES','UR'] for in-flight cases); include to choose which aggregate domains to join in. Without include the response is base profile fields only.

Returns the standard paginated envelope. Each row carries an AnalysisSnapshotRow with nested wallet / watchlist / adverse_media / rfi_status blocks only when requested.

Parameters

  • organization_id (Annotated[int, Field(description='Organization scope for the snapshot.')], required) — (no description)
  • profile_group_ids (Annotated[list[int] | None, Field(description='Optional list of profile_group IDs to restrict the result set.')], optional) — (no description)
  • review_status (Annotated[list[str] | None, Field(description='Optional list of review_status codes (PR/UR/RS/RR/ES/AP/DE) to filter.')], optional) — (no description)
  • include (Annotated[list[Literal['wallet', 'watchlist', 'adverse_media', 'rfi_status']] | None, Field(description='Aggregate domains to join in. Omit for base fields only.')], optional) — (no description)
  • limit (Annotated[int, Field(ge=1, le=100, description=LIMIT)], optional) — (no description)
  • offset (Annotated[int, Field(ge=0, description=OFFSET)], optional) — (no description)

profile_attachment_list

Read-only: yes.

List file attachments on a profile (passports, KYC docs, RFI responses, etc.). Each row carries a short-lived download URL so the analyst can open the file directly. Pair with profile_retrieve to inspect the underlying profile.

Returns {count, limit, offset, has_more, results: [ProfileAttachmentSummary]} where each row is {id, name, attachment_type, status, file_url, file_name, rfi_response_id, created_at}.

Parameters

  • organization_id (int, required) — Organization the profile belongs to.
  • profile_id (int, required) — Profile id.
  • attachment_type (str | None, optional) — Filter by document type (e.g. 'passport', 'utility_bill').
  • 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.

profile_attachment_notes_create

Read-only: no.

Add a note to a profile attachment. Single-step write — small impact. On success: {status: "ok", note_id, attachment_id}.

Parameters

  • organization_id (int, required) — Organization the attachment belongs to.
  • attachment_id (int, required) — Profile attachment id.
  • content (str, required) — Note body.

profile_attachment_notes_delete

Read-only: no.

Delete an attachment note. Single-step write. On success: {status: "ok", note_id, attachment_id}.

Parameters

  • organization_id (int, required) — Organization the attachment belongs to.
  • attachment_id (int, required) — Profile attachment id.
  • note_id (int, required) — Note id.

profile_attachment_notes_list

Read-only: yes.

List notes on a profile attachment. Returns {count, limit, offset, has_more, results} where each row is {id, content, created_by, created_at}.

Parameters

  • organization_id (int, required) — Organization the attachment belongs to.
  • attachment_id (int, required) — Profile attachment id (from profile_attachment_list).
  • 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.

profile_attachment_notes_update

Read-only: no.

Update the body of an attachment note. Single-step write. On success: {status: "ok", note_id, attachment_id}.

Parameters

  • organization_id (int, required) — Organization the attachment belongs to.
  • attachment_id (int, required) — Profile attachment id.
  • note_id (int, required) — Note id (from profile_attachment_notes_list).
  • content (str, required) — New note body.

profile_audit_log

Read-only: yes.

List BusinessLogEntry rows (create / update / delete / access) for a profile, most recent first. Each row carries the actor, the structured changes diff (previous → current), and the analyst's rationale when one was captured. Use when the user asks 'who changed what on this profile and why?'

Parameters

  • organization_id (int, required) — Organization the profile belongs to.
  • profile_id (int, required) — Profile id (from profile_list.results[].id).
  • 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.

profile_bulk_add_note

Read-only: no.

Create the same note on many profiles in one call. The note content is appended as-is to each profile's note timeline (HTML or plain text).

Two-step write tool. First call (no confirm_token) returns the count + content preview + a token. Second call (with token) applies and returns per-record results. No cross-profile atomicity.

Parameters

  • organization_id (Annotated[int, Field(description='Organization scope.')], required) — (no description)
  • profile_ids (Annotated[list[int], Field(min_length=1, max_length=500, description='Profile IDs to attach the note to.')], required) — (no description)
  • content (Annotated[str, Field(min_length=1, description='Note content (HTML or plain text).')], required) — (no description)
  • confirm_token (Annotated[str | None, Field(description=CONFIRM_TOKEN)], optional) — (no description)

profile_bulk_update_status

Read-only: no.

Transition many profiles to a target review status in one call. With auto_traverse=True (default) the server computes the shortest legal path through VALID_REVIEW_STATUS_TRANSITIONS for each profile — so you can ask for target_status='AP' on a profile currently in DE and the server traverses DE→UR→AP for you.

Two-step write tool. First call (no confirm_token) returns a grouped diff (by path) plus a confirm token. Second call (with token) applies the changes and returns per-record results.

Per-profile atomicity: each profile's full path runs in one transaction.atomic block; one profile failing doesn't roll back the others. No idempotency-key replay in v1 — re-running with the same args after a partial commit will skip profiles already at target.

Parameters

  • organization_id (Annotated[int, Field(description='Organization scope.')], required) — (no description)
  • profile_ids (Annotated[list[int], Field(min_length=1, max_length=100, description='Profile IDs to transition.')], required) — (no description)
  • target_status (Annotated[ReviewStatusLiteral, Field(description='Final status every profile should end up in.')], required) — (no description)
  • rationale_template (Annotated[str, Field(min_length=1, max_length=500, description='Rationale recorded on every transition step.')], required) — (no description)
  • auto_traverse (Annotated[bool, Field(description="If True, compute the shortest legal path per profile. If False, target must be a direct neighbor of each profile's current status.")], optional) — (no description)
  • confirm_token (Annotated[str | None, Field(description=CONFIRM_TOKEN)], optional) — (no description)

profile_create

Read-only: no.

Create a new compliance profile (individual or entity). Bounded field set: name + profile_group + the identifiers most relevant for screening. The full field surface (employment, addresses, IDs, etc.) lives in the UI; use profile_update after creation for follow-up edits.

Two-step write tool. The dry-run resolves the profile_group and country names so the analyst verifies before commit. The created profile starts in PENDING_REVIEW and an initial screening is queued automatically.

On success: {status: "ok", profile_id, profile_type, name}.

Parameters

  • organization_id (int, required) — Organization to create the profile under.
  • profile_type (Literal, required) — individual for natural persons, entity for legal entities.
  • name (str, required) — Display name of the profile.
  • profile_group_id (int, required) — Profile group id (from profile_group_list).
  • email (str, optional) — Contact email (used for RFIs).
  • citizenship_country_code (str | None, optional) — (Individual only) ISO alpha2/alpha3 citizenship country.
  • place_of_establishment_country_code (str | None, optional) — (Entity only) ISO alpha2/alpha3 jurisdiction of formation.
  • confirm_token (str | None, optional) — Token from a prior dry-run call. Omit on the first call.

profile_find_duplicate_clusters

Read-only: yes.

Find groups of ≥ min_cluster_size profiles sharing the same identifier. key chooses what to group on:

  • phone — normalised digit-only form via the normalize_phone_for_dedup SQL function (so '+1 (555) 1234' and '5551234' cluster).
  • email_domain — lower-cased domain after the '@'. Free-mail providers (gmail, yahoo, etc.) are suppressed.
  • bio_url — exact match after light canonicalisation (trim, lowercase scheme + host, strip trailing slash and fragment).

Each cluster row has key, key_value (the shared identifier), profile_count, and an array of member profiles. Returned as a flat list — no pagination since clusters per call are bounded by the org's data.

Parameters

  • organization_id (Annotated[int, Field(description='Organization scope.')], required) — (no description)
  • key (Annotated[Literal['phone', 'email_domain', 'bio_url'], Field(description='Identifier to group on.')], required) — (no description)
  • profile_group_id (Annotated[int | None, Field(description='Optional single profile_group to scope to.')], optional) — (no description)
  • min_cluster_size (Annotated[int, Field(ge=2, le=50, description='Minimum cluster size to surface (default 2).')], optional) — (no description)
  • max_clusters (Annotated[int, Field(ge=1, le=100, description='Hard cap on returned cluster rows (default / max 100).')], optional) — (no description)

profile_find_identity_signals

Read-only: yes.

Surface per-profile identity-credential anomalies. These are HEURISTICS — they produce false positives (especially on non-Western naming conventions). Each result carries a confidence (low/medium/high) and reason_code so the caller can filter.

Patterns:

  • email_handle_is_phone — handle is ≥10 digits, ≥80% numeric. High confidence.
  • email_handle_not_in_own_name — handle (≥4 chars) doesn't appear in own name. Low confidence (cultural bias).
  • generic_handle_on_company_domain — generic first-name handle on a non-free-mail domain that doesn't match own name. Medium confidence.
  • email_handle_matches_other_name — handle (≥4 chars) appears as substring of ANOTHER profile's name in the same org. Medium confidence. O(n²) — bounded by limit.

Returns a flat list of IdentitySignal rows.

Parameters

  • organization_id (Annotated[int, Field(description='Organization scope.')], required) — (no description)
  • pattern (Annotated[Literal['email_handle_not_in_own_name', 'email_handle_matches_other_name', 'email_handle_is_phone', 'generic_handle_on_company_domain'], Field(description='Which heuristic to run.')], required) — (no description)
  • profile_group_id (Annotated[int | None, Field(description='Optional single profile_group to scope to (required for >1000-profile orgs).')], optional) — (no description)
  • limit (Annotated[int, Field(ge=1, le=500, description='Hard cap on returned rows (default / max 500).')], optional) — (no description)

profile_find_undispatched_rfis

Read-only: yes.

Find profiles currently in 'RFI Sent' (RS) status whose latest RFI dispatch predates the current RS period — i.e. the status was set but no actual RFI was created since. Catches the drift where an analyst marks a profile RS manually without going through rfi_create.

Returns the standard paginated envelope. Each row carries id, name, review_status, review_status_set_at (when the current RS period began), last_lifetime_rfi_at (most recent RFI ever — may be null or stale), rfis_since_rs_count (always 0 by the predicate).

Parameters

  • organization_id (Annotated[int, Field(description='Organization scope.')], required) — (no description)
  • profile_group_id (Annotated[int | None, Field(description='Optional single profile_group to scope to.')], optional) — (no description)
  • limit (Annotated[int, Field(ge=1, le=100, description=LIMIT)], optional) — (no description)
  • offset (Annotated[int, Field(ge=0, description=OFFSET)], optional) — (no description)

profile_group_create

Read-only: no.

Create a new profile group. Spawns the 13 default ScreeningSchedule rows (one per screening_type x risk_rating combination), each defaulting to WEEKLY frequency. Tune those defaults later via the UI.

Two-step write tool. On success: {status: "ok", profile_group_id, name}.

Parameters

  • organization_id (int, required) — Organization to create the group under.
  • name (str, required) — Group name (unique per org).
  • description (str, optional) — Free-text description.
  • profile_screening_min_score (float | None, optional) — Minimum match score (0.0-1.0) for watchlist hits to materialise alerts.
  • confirm_token (str | None, optional) — Token from a prior dry-run call. Omit on the first call.

profile_group_list

Read-only: yes.

List profile groups for an organization. Profile groups bundle screening schedules, the minimum match score, and section visibility — every Profile belongs to one. Use to discover valid profile_group_id values for other tools and to read group-level configuration.

Parameters

  • organization_id (int, required) — Organization to list groups for.
  • 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.

profile_group_retrieve

Read-only: yes.

Get full details of one profile group: thresholds, section visibility, field configuration, and counts of profiles + blockchain addresses scoped to it.

Parameters

  • organization_id (int, required) — Organization the group belongs to.
  • profile_group_id (int, required) — Profile group id (from profile_group_list).

profile_group_update

Read-only: no.

Update profile group metadata (name, description, min screening score). Editing the 13-schedule frequency matrix stays in the UI for now.

All fields optional. Two-step write tool. On success: {status: "ok", profile_group_id, fields_updated}.

Parameters

  • organization_id (int, required) — Organization the group belongs to.
  • profile_group_id (int, required) — Profile group id.
  • name (str | None, optional) — New group name.
  • description (str | None, optional) — New description.
  • profile_screening_min_score (float | None, optional) — Minimum watchlist match score (0.0-1.0).
  • confirm_token (str | None, optional) — Token from a prior dry-run call. Omit on the first call.

profile_inquiry_list

Read-only: yes.

List watchlist / adverse-media screening hits (ProfileInquiry rows) on a profile, most recent first. Filter by resolution to find hits awaiting analyst review (omit resolution) or hits already triaged.

Parameters

  • organization_id (int, required) — Organization the profile belongs to.
  • profile_id (int, required) — Profile id whose inquiries to list.
  • resolution (Optional, optional) — Resolution code: TRUE_MATCH (confirmed match), FALSE_POSITIVE (cleared as not a match), NO_RESOLUTION (reset / awaiting review).
  • 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.

profile_inquiry_resolve

Read-only: no.

Resolve a watchlist / adverse-media hit on a profile as TRUE_MATCH, FALSE_POSITIVE, or NO_RESOLUTION (reset). The first transition off NO_RESOLUTION auto-moves the linked watchlist alert into Under Review.

Two-step write tool. On success: {status: "ok", inquiry_id, resolution}.

Parameters

  • organization_id (int, required) — Organization the profile belongs to.
  • profile_id (int, required) — Profile id the inquiry belongs to.
  • inquiry_id (int, required) — Inquiry id (from profile_inquiry_list).
  • resolution (Literal, required) — Resolution code: TRUE_MATCH (confirmed match), FALSE_POSITIVE (cleared as not a match), NO_RESOLUTION (reset / awaiting review).
  • confirm_token (str | None, optional) — Token from a prior dry-run call. Omit on the first call.

profile_inquiry_retrieve

Read-only: yes.

Get full details of one profile inquiry (watchlist / adverse-media hit) on a profile.

Returns {id, profile_id, inquired_name, result_name, record_type, resolution, created_at}.

Parameters

  • organization_id (Annotated[int, Field(description='Organization the inquiry belongs to.')], required) — (no description)
  • inquiry_id (Annotated[int, Field(description='Inquiry id.')], required) — (no description)

profile_list

Read-only: yes.

List compliance profiles (individuals and entities) for an organization. Use when the user asks about profiles, clients, customers, or 'who do we have 'in this org'. Combine filters to narrow scope before drilling in with profile_retrieve.

Returns {count, limit, offset, has_more, results: [ProfileSummary]} where each summary is {id, name, profile_type, risk, review_status, relationship_status, profile_group_name, last_status_change_at}.

Parameters

  • organization_id (int, required) — Organization to list profiles for.
  • risk (Optional, optional) — Filter by risk rating: Low, Medium, High, or Severe.
  • profile_type (Optional, optional) — Filter by profile type: individual or entity.
  • review_status (Optional, optional) — Review status code: PR (Pending Review), UR (Under Review), RS (RFI Sent), RR (RFI Responded - Pending Review), ES (Escalated), AP (Approved), DE (Declined).
  • profile_group_id (int | None, optional) — Filter by profile group id.
  • name (str | None, optional) — Case-insensitive name substring match.
  • has_open_items (bool | None, optional) — True = only profiles with at least one unresolved screening hit or open alert.
  • pep (bool | None, optional) — True = only profiles declared as PEPs. False = only non-PEPs. Omit for both.
  • country_code (str | None, optional) — ISO alpha2 or alpha3 country code (e.g. 'IR', 'CU', 'IRN'). For individuals matches citizenship; for entities matches place_of_establishment. Common compliance use: jurisdiction audits.
  • tag_ids (list[int] | None, optional) — Restrict to profiles tagged with ANY of these tag ids (from profile_tag_list).
  • updated_after (datetime.datetime | None, optional) — Only include profiles modified at or after this UTC timestamp.
  • created_after (datetime.datetime | None, optional) — Only include profiles created at or after this UTC timestamp.
  • created_before (datetime.datetime | None, optional) — Only include profiles created before this UTC timestamp.
  • 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.

profile_notes_create

Read-only: no.

Add a note to a profile.

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", note_id, profile_id}.

Parameters

  • organization_id (int, required) — Organization the profile belongs to.
  • profile_id (int, required) — Profile id to attach the note to.
  • content (str, required) — Note body.
  • confirm_token (str | None, optional) — Token from a prior dry-run call. Omit on the first call.

profile_notes_delete

Read-only: no.

Delete a profile note. Single-step write. On success: {status: "ok", note_id, profile_id}.

Parameters

  • organization_id (int, required) — Organization the profile note belongs to.
  • profile_id (int, required) — Profile id (for scope check).
  • note_id (int, required) — Note id (from profile_notes_list).

profile_notes_list

Read-only: yes.

List analyst notes attached to a profile, most recent first. Notes capture rationale, findings, or context the analyst wants in the audit trail. Use profile_notes_create to add one.

Returns {count, limit, offset, has_more, results: [ProfileNoteSummary]} where each row is {id, content, created_by, created_at}.

Parameters

  • organization_id (int, required) — Organization the profile belongs to.
  • profile_id (int, required) — Profile id.
  • 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.

profile_notes_update

Read-only: no.

Update the body of a profile note. Single-step write — no confirm dance. On success: {status: "ok", note_id, profile_id}.

Parameters

  • organization_id (int, required) — Organization the profile note belongs to.
  • profile_id (int, required) — Profile id (for scope check).
  • note_id (int, required) — Note id (from profile_notes_list).
  • content (str, required) — New note body.

Read-only: no.

Record a directed relationship from one profile to another: the source profile holds the named role(s) over the target. Standard compliance use: logging UBOs, control persons, and parent entities for an EntityProfile.

Two-step write tool. Both profiles must already exist in this organization. Per-pair uniqueness is enforced at the DB level — re-adding the same source/target pair fails; use profile_related_update to widen relation types.

On success: {status: "ok", related_profile_id, from_profile_id, to_profile_id, relation_types}.

Parameters

  • organization_id (int, required) — Organization both profiles belong to.
  • from_profile_id (int, required) — Source profile id (the role-holder).
  • to_profile_id (int, required) — Target profile id (the entity being related to).
  • relation_types (list, required) — Role(s) the source holds over the target. Multi-valued (a person can be both UBO and Control Person of the same entity).
  • confirm_token (str | None, optional) — Token from a prior dry-run call. Omit on the first call.

Read-only: yes.

List profiles related to a given profile (directed edges originating from it). Use when the analyst asks 'who is this profile connected to?' — common for UBO / control-person investigations.

Returns {count, limit, offset, has_more, results: [RelatedProfileSummary]} where each row is {id, to_profile_id, to_profile_name, to_profile_type, relation_types, created_at}.

Parameters

  • organization_id (int, required) — Organization the profile belongs to.
  • profile_id (int, required) — Profile id whose relationships to list.
  • 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.

Read-only: no.

Update the relation types on an existing related-profile edge. Pass the full intended type set — this replaces, not appends. Use to add (e.g.) CONTROL_PERSON to a row that previously only said ULTIMATE_BENEFICIAL_OWNER, or to retire a role by dropping it from the list.

Two-step write tool. On success: {status: "ok", related_profile_id, relation_types}.

Parameters

  • organization_id (int, required) — Organization the edge belongs to.
  • related_profile_id (int, required) — RelatedProfile id (from profile_related_list).
  • relation_types (list, required) — New full set of relation types (replaces the existing list).
  • confirm_token (str | None, optional) — Token from a prior dry-run call. Omit on the first call.

profile_retrieve

Read-only: yes.

Get full details of one profile. Returns either an IndividualProfileDetail (date_of_birth, citizenship, id_number, SSN, passport, …) or an EntityProfileDetail (place_of_establishment, unique_identification_number, high_risk_jurisdiction_footprint, …) — the profile_type field tells you which.

Parameters

  • organization_id (int, required) — Organization the profile belongs to.
  • profile_id (int, required) — Profile id (from profile_list.results[].id).

profile_review_transitions

Read-only: yes.

Get the review-status state machine for a profile: current status plus the set of statuses it can legally transition to next. Use before calling profile_update with review_status to avoid invalid-transition errors.

Parameters

  • organization_id (int, required) — Organization the profile belongs to.
  • profile_id (int, required) — Profile id (from profile_list.results[].id).

profile_risk_changes

Read-only: yes.

List risk-rating change history for a profile, most recent first. Each row carries from_risk → to_risk and the user who made the change.

Parameters

  • organization_id (int, required) — Organization the profile belongs to.
  • profile_id (int, required) — Profile id.
  • 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.

profile_screen

Read-only: no.

Trigger a fresh sanctions / PEP / adverse-media screening run for a profile. Queues a background screen_profile task that calls the configured vendor (OpenSanctions / WorldCheck / Castellum) and persists a new ProfileInquiry. Any threshold-crossing hits will spawn WatchlistAlert rows.

Two-step write tool — this call may be billed by the upstream vendor. The dry-run preview names the profile so the analyst confirms before paying. Use this after editing identity fields (name, DOB, citizenship, PEP declaration) on a profile to rescreen, or as part of periodic-review hygiene.

On success: {status: "ok", profile_id, task_id}. The task id is the Celery task handle — pair with profile_screening_status to poll progress.

Parameters

  • organization_id (int, required) — Organization the profile belongs to.
  • profile_id (int, required) — Profile id (from profile_list.results[].id).
  • confirm_token (str | None, optional) — Token from a prior dry-run call. Omit on the first call.

profile_screening_status

Read-only: yes.

Get the current screening progress for a profile, or {status: 'idle'} if no screening is running. Reflects the same cache key the frontend polls.

Parameters

  • organization_id (int, required) — Organization the profile belongs to.
  • profile_id (int, required) — Profile id.

profile_tag_assign

Read-only: no.

Bulk-modify profile tags. mode='add' (default) preserves existing tags and inserts new tag→profile rows. mode='remove' deletes the listed tag→profile rows. mode='replace' strips every existing tag from each profile, then assigns exactly tag_ids. Use after profile_tag_list to find tag_ids.

Two-step write tool. On success: {status: "ok", entities_updated, assignments_created, assignments_removed}.

Parameters

  • organization_id (int, required) — Organization scope for both profiles and tags.
  • profile_ids (list, required) — Profile ids that will be modified.
  • tag_ids (list, required) — Tag ids (from profile_tag_list) to add / remove / install.
  • mode (Literal, optional) — add: preserve existing tags; insert new tag→profile rows (default). remove: delete the listed tag→profile rows. replace: strip every existing tag from each profile, then assign exactly tag_ids.
  • confirm_token (str | None, optional) — Token from a prior dry-run call. Omit on the first call.

profile_tag_create

Read-only: no.

Create an org-scoped profile tag. Global tags are seeded via fixtures and cannot be created through this tool. Tag names are unique per organization.

Two-step write tool. On success: returns the created ProfileTagSummary.

Parameters

  • organization_id (int, required) — Organization that will own the tag.
  • name (str, required) — Display name. Unique within the org.
  • color (Literal, optional) — Visual color key.
  • description (str, optional) — What this tag represents.
  • confirm_token (str | None, optional) — Token from a prior dry-run call. Omit on the first call.

profile_tag_list

Read-only: yes.

List profile tags available to this organization (global tags + org-specific). Use to find tag_id values for filtering or bulk-assignment workflows.

Parameters

  • organization_id (int, required) — Organization to list tags for.
  • name_contains (str | None, optional) — Case-insensitive substring match on tag name.
  • 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.

profile_update

Read-only: no.

Update a profile's editable fields. Bounded subset of the underlying model — covers what an analyst commonly changes (PEP declaration, jurisdiction, review/relationship status, basic identity) without exposing every column.

All fields are optional: omit anything you don't want to touch.

Two-step write tool. Dry-run shows the diff so the analyst sees exactly which fields change. On success: {status: "ok", profile_id, fields_updated: [...]}.

Parameters

  • organization_id (int, required) — Organization the profile belongs to.
  • profile_id (int, required) — Profile id.
  • name (str | None, optional) — Display name.
  • email (str | None, optional) — Contact email.
  • review_status (Optional, optional) — Due-diligence workflow status: PR (Pending Review), UR (Under Review), RS (RFI Sent), RR (RFI Responded - Pending Review), ES (Escalated), AP (Approved), DE (Declined). Transition validation runs on the service side; an invalid transition returns 400.
  • relationship_status (Optional, optional) — Business-relationship lifecycle status: AC (Active) or IN (Inactive).
  • pep (bool | None, optional) — PEP declaration boolean.
  • pep_position (str | None, optional) — Title held by the PEP.
  • pep_country_code (str | None, optional) — ISO alpha2/alpha3 country of the PEP role.
  • date_of_birth (datetime.date | None, optional) — (Individual only) date of birth - ISO format e.g. 1990-05-12.
  • citizenship_country_code (str | None, optional) — (Individual only) ISO alpha2/alpha3 citizenship country.
  • country_of_residence_code (str | None, optional) — (Individual only) ISO alpha2/alpha3 country of residence.
  • place_of_establishment_country_code (str | None, optional) — (Entity only) ISO alpha2/alpha3 jurisdiction of formation.
  • date_of_establishment (datetime.date | None, optional) — (Entity only) date of legal formation.
  • screening_frequency (Optional, optional) — Override the profile's screening cadence: N=None, D=Daily, W=Weekly, M=Monthly, Q=Quarterly, Y=Yearly. Flips frequency_origin to MANUAL so the profile-group inheritance won't overwrite it on its next sync.
  • tag_ids (list[int] | None, optional) — Replace the profile's tag set with these tag ids (omit to leave tags alone).
  • rationale (str | None, optional) — Free-text reason for the edit. Required when your organization's audit policy lists the field being changed (see me.audit_config.profile_enforced_fields) and you do not have audit_configuration.bypass_rationale; the server returns {error: 'rationale_required', fields: [...]} otherwise.
  • confirm_token (str | None, optional) — Token from a prior dry-run call. Omit on the first call.