Appearance
RFIs
Reference for the 11 CryptoComply MCP tools in the RFIs family.
Tools in this group
rfi_createrfi_follow_uprfi_listrfi_proposal_acceptrfi_proposal_accept_allrfi_proposal_listrfi_proposal_rejectrfi_remindrfi_resendrfi_retrieverfi_revoke
rfi_create
Read-only: no.
Send a Request-For-Information to a client: a unique public link is generated and emailed asking them to provide specific fields and/or document types.
Only fields visible AND externally-requestable in the profile's group can be requested. Unknown names are dropped as long as at least one valid field is given — but a list where EVERY name is unknown falls back to requesting the whole offerable set, so pass real keys. Discover them via group_field_schema_get for the profile's group (org custom fields included; create a new one with custom_field_create) — the same offerable set an intake form can ask.
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 creates the RFI and queues the email. On success: {status: "ok", rfi_id, profile_id, unique_link}.
Parameters
organization_id(int, required) — Organization scope.profile_id(int, required) — Profile id to send the RFI to.request_text(str, required) — Body of the request — shown to the client in the email.requested_fields(list[str] | None, optional) — Profile-field names to request (e.g. ['date_of_birth', 'address']) — must be offerable keys fromgroup_field_schema_getfor this profile's group; org custom fields included. Optional.requested_documents(list[str] | None, optional) — ProfileAttachmentType codes (e.g. ['IDENTIFICATION', 'PROOF_OF_ADDRESS']). Optional.additional_recipients(list[str] | None, optional) — Extra emails to CC on the request. Optional.custom_questions(list[str] | None, optional) — Ad-hoc free-text questions to ask this contact (e.g. 'How did you acquire your holdings?'). Each becomes a required text field on the public form. Max 500 chars per question. Optional.confirm_token(str | None, optional) — Token from a prior dry-run call. Omit on the first call.
rfi_follow_up
Read-only: no.
Send a follow-up RFI: open a new request round for the same profile, linked to a prior RFI as its parent. Use after a client responded but more information is still needed.
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 creates the follow-up and queues the email. On success: {status: "ok", rfi_id, profile_id, unique_link}.
Parameters
organization_id(int, required) — Organization scope.profile_id(int, required) — Profile id the parent RFI belongs to.rfi_id(int, required) — Parent RFI id this follow-up continues (from rfi_list).request_text(str, required) — Body of the follow-up request — shown to the client.requested_fields(list[str] | None, optional) — Profile-field names to request. Optional.requested_documents(list[str] | None, optional) — ProfileAttachmentType codes to request. Optional.additional_recipients(list[str] | None, optional) — Extra emails to CC on the request. Optional.custom_questions(list[str] | None, optional) — Ad-hoc free-text questions to ask this contact — ideal for follow-up rounds probing a prior response. Each becomes a required text field on the public form. Max 500 chars per question. Optional.confirm_token(str | None, optional) — Token from a prior dry-run call. Omit on the first call.
rfi_list
Read-only: yes.
List Request-For-Information records sent for a profile, most recent first. Status is derived: sent (not opened), opened (client clicked the link), or responded (client submitted the form) — it does not surface revoked or expired links, which still read as sent/opened. Use when the analyst wants to see what KYC info has been asked of a client.
Parameters
organization_id(int, required) — Organization scope.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.
rfi_proposal_accept
Read-only: no.
Accept one staged RFI item, applying the client's submitted value to the profile — writing a field, creating a wallet / related party, or attaching a document (a QUESTION item only acknowledges the answer on the audit trail). This is the compliance decision that lands RFI data; only accepted items ever touch the 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 it. On success: {status: "ok", proposal_id, item_status}.
Parameters
organization_id(int, required) — Organization scope.profile_id(int, required) — Profile id the RFI belongs to.rfi_id(int, required) — RFI id (from rfi_list.results[].id).proposal_id(int, required) — Staged item id (from rfi_proposal_list).confirm_token(str | None, optional) — Token from a prior dry-run call. Omit on the first call.
rfi_proposal_accept_all
Read-only: no.
Accept every PENDING staged item on an RFI in one call — applies all of the client's submitted answers to the profile at once. Use after reviewing the items with rfi_proposal_list; reject any you don't want first, then accept the rest 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 them. On success: {status: "ok", rfi_id, accepted_count}.
Parameters
organization_id(int, required) — Organization scope.profile_id(int, required) — Profile id the RFI belongs to.rfi_id(int, required) — RFI id (from rfi_list.results[].id).confirm_token(str | None, optional) — Token from a prior dry-run call. Omit on the first call.
rfi_proposal_list
Read-only: yes.
List the staged items from an RFI's responses awaiting adjudication (the "limbo"). When a client submits an RFI, the answers do NOT touch the profile — each becomes a PENDING item here that must be accepted (which applies it) or rejected. Filter by status for PENDING work, ACCEPTED, or REJECTED.
Each row is {id, item_type, field_key, proposed_value, previous_value, status, rationale, decided_at, created_at}. item_type is FIELD / WALLET / UBO / CONTROL_PERSON / ATTACHMENT / QUESTION. Compare proposed_value with the profile's live value via profile_retrieve, then adjudicate with rfi_proposal_accept / rfi_proposal_reject / rfi_proposal_accept_all.
Parameters
organization_id(int, required) — Organization scope.profile_id(int, required) — Profile id the RFI belongs to.rfi_id(int, required) — RFI id (from rfi_list.results[].id).status(Optional, optional) — Filter by adjudication status. Omit for all.limit(int, optional) — Max results (1-100).offset(int, optional) — Results to skip for pagination.
rfi_proposal_reject
Read-only: no.
Reject one staged RFI item with a rationale — the client's submitted value is NOT applied to the profile; the item is kept as evidence. Use when the answer is wrong, incomplete, or a false match.
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 rejects it. On success: {status: "ok", proposal_id, item_status}.
Parameters
organization_id(int, required) — Organization scope.profile_id(int, required) — Profile id the RFI belongs to.rfi_id(int, required) — RFI id (from rfi_list.results[].id).proposal_id(int, required) — Staged item id (from rfi_proposal_list).rationale(str, optional) — Why the item is rejected (recorded on the audit trail).confirm_token(str | None, optional) — Token from a prior dry-run call. Omit on the first call.
rfi_remind
Read-only: no.
Remind an RFI: re-send the existing link as a reminder. The link and expiry are unchanged (unlike resend), only a reminder email goes out. Rejected once the client responded, or if the link was revoked or has expired.
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 the reminder.
Parameters
organization_id(int, required) — Organization scope.profile_id(int, required) — Profile id the RFI belongs to.rfi_id(int, required) — RFI id (from rfi_list.results[].id).confirm_token(str | None, optional) — Token from a prior dry-run call. Omit on the first call.
rfi_resend
Read-only: no.
Resend an RFI: issue a fresh public link and re-send the email. Any previously shared link stops working (410 Gone) and the expiry resets. Rejected once the client has already responded, or if the link was revoked (a resend must not silently undo a revoke — use a new RFI instead).
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 rotates the link and emails it.
Parameters
organization_id(int, required) — Organization scope.profile_id(int, required) — Profile id the RFI belongs to.rfi_id(int, required) — RFI id (from rfi_list.results[].id).confirm_token(str | None, optional) — Token from a prior dry-run call. Omit on the first call.
rfi_retrieve
Read-only: yes.
Get full details of one RFI: request body, requested fields/documents, ad-hoc custom_questions, recipient(s), and the client's response payload (field answers + additional information) when present.
Parameters
organization_id(int, required) — Organization scope.profile_id(int, required) — Profile id the RFI belongs to.rfi_id(int, required) — RFI id (from rfi_list.results[].id).
rfi_revoke
Read-only: no.
Revoke an RFI's public link so it returns 410 Gone — use when a request was sent to the wrong contact or is no longer needed. Rejected once the client has already responded.
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 the link.
Parameters
organization_id(int, required) — Organization scope.profile_id(int, required) — Profile id the RFI belongs to.rfi_id(int, required) — RFI id (from rfi_list.results[].id).reason(str, optional) — Optional reason recorded on the revocation.confirm_token(str | None, optional) — Token from a prior dry-run call. Omit on the first call.