MCP App Store
by KeenEthics
Business & Operations
Rings AI icon

Rings AI

by Rings AI

Overview

Rings AI lets authenticated users search relationship data, inspect people and companies, manage private lists, create notes and tasks, and update CRM records from ChatGPT using the same tenant permissions as Rings.

Tools

delete_delete_intro

ChatGPT
Returns 404 when the intro doesn't exist or was found in an email you can't access.

delete_delete_note

ChatGPT
Mirrors GraphQL deleteNote: only the note's owner or a ringmaster may delete it. Returns 204 on success, 404 when the note isn't visible to the caller's tenant, and 403 when the caller is neither the owner nor a ringmaster.

delete_delete_note_association

ChatGPT
Delegates to GraphQL removeAssociation with the association's target type + uuid (derived from the row). Returns 204 on success and 404 when the association doesn't exist or doesn't belong to the referenced note.

delete_delete_opportunities

ChatGPT
Removes the caller's tenant-scoped opportunities for the given UUIDs, cascades to their sub-opportunities (deleting a parent deletes every descendant in the same ring), then deletes any associations that reference the removed rows (as either the association parent or the associated entity). The cascade only ever touches rows and associations for UUIDs actually deleted from this tenant's ring, so a UUID belonging to another tenant can't have its associations wiped even if it's included in the request. UUIDs that don't resolve to a tenant-scoped opportunity are silently skipped (not an error) -- deleted_count reports how many opportunities were actually removed, including cascaded sub-opportunities. Always returns 200, even when deleted_count is 0. Returns 400 if more than 100 UUIDs are submitted in one request (the cap applies to the requested UUIDs, not the cascade).

delete_delete_opportunity_association

ChatGPT
Mirrors GraphQL removeEntityFromOpportunity. Returns 204 on success, 404 if the association doesn't exist or doesn't belong to the referenced opportunity.

delete_delete_task_association

ChatGPT
Returns 404 when the association doesn't exist or doesn't belong to the given task.

delete_delete_task_endpoint

ChatGPT
PERSONAL tasks can only be deleted by their creator; RING tasks can be deleted by any tenant member.

delete_remove_current_company

ChatGPT
current_company reads as null afterward. Returns 204 on success (including when the person had no current company to begin with), and 404 if the person UUID is not visible to your tenant.

delete_remove_entity_list_members

ChatGPT
Removes membership only — the companies or persons themselves are untouched. Idempotent: a UUID that isn't currently a member is omitted from the response's entity_uuids, which reports only the memberships this call removed. Returns 404 when the list doesn't exist for the API key's tenant, and 409 when the list's membership is rule-owned (a dynamic list whose members Rings updates automatically, which would restore the entity).

delete_remove_opportunity_associations_batch

ChatGPT
Use this instead of repeated DELETE /v1/opportunities/{uuid}/associations/{association_uuid} calls. Name each link by {opportunity_uuid, association_uuid}, or by {opportunity_uuid, entity_uuid, entity_type} when you know the linked record but not the association uuid. Results come back in input order with a status: REMOVED, NOT_FOUND (no such link on that opportunity — nothing deleted) or ERROR (error says why). One bad item never fails the others. Removing a pinned link does not pin another. Returns 400 for an empty list or more than 100 items.

feedback

ChatGPT
Report feedback after completing a task or encountering an error. Call this when: (1) a tool returns a 500 error, (2) results seem incorrect or incomplete, (3) you cannot determine which tool to use, or (4) the user wants to share feedback about their experience. Feedback is sent to Rings' analytics system for service improvement.

get_get_activity_body

ChatGPT
Delegates to the GraphQL emailBody resolver core (undecorated) so access control (grant ownership + explicit EmailAccessPermission) is enforced in exactly one place. Returns: - 404 when the activity / message can't be resolved for the caller - 403 when the caller has no active grant for the activity's owner

get_get_activity_thread

ChatGPT
Scoped to the caller's tenant (via tenant_uuid) to prevent cross-tenant thread spills. Only EMAIL activities are returned — calendar events share thread_id=None semantics and would muddy the result set. The response is metadata-only. Clients render a thread by fetching this list and then calling /activities/{id}/body for whichever messages they want to expand.

get_get_bulk_pathpower

ChatGPT
Parameters: - entity: person | company (required) - uuids: comma-separated list of entity UUIDs (max 100) Returns a score entry for every UUID in the input list. UUIDs with no PathPower data are included with score=null and strength_label=null. When score is present, strength_label is one of: weak, moderate, strong, very_strong (lowercase, underscore-separated PathPower bands).

get_get_company

ChatGPT
Get a company by UUID.

get_get_company_activities

ChatGPT
Returns a paginated list of emails and calendar meetings where any participant is associated with the company, ordered by date descending. Filter parameters: - type: email | meeting — omit to return both Pagination: - page: Page number (default: 1) - per_page: Results per page (default: 50)

get_get_company_activity_stats

ChatGPT
Returns activity counts (emails, meetings, total) across different time periods.

get_get_company_ai_summary

ChatGPT
Returns a cached/prior summary when available. Returns 404 when the entity is not found.

get_get_company_pathpower

ChatGPT
Returns a single aggregate score (0.0–1.0) measuring how strongly the tenant's team is connected to this company. This is a numeric strength indicator only — it does NOT return connection paths or introductions. For actual relationship paths ("who knows people at this company"), use GET /v1/companies/{company_uuid}/recommended-paths instead. Returns score=null (not 404) when no PathPower data exists. strength_label uses lowercase PathPower bands: weak, moderate, strong, very_strong (underscore-separated).

get_get_me

ChatGPT
Designed for MCP and AI agent clients that need to resolve "me", "my", or "I" into concrete UUIDs before calling other endpoints (e.g. fetching activity history or relationship data for the current user). Returns null fields when the API key is tenant-scoped with no user context.

get_get_meeting

ChatGPT
Get a single meeting by activity ID if the user is an internal participant.

get_get_note

ChatGPT
Reads the row via Note.by_uuid (tenant/ring scoped) and fetches the HTML body from S3. Missing S3 objects degrade to the stored DB excerpt rather than erroring — matches GraphQL parity.

get_get_opportunity

ChatGPT
Returns the complete opportunity including stage, type, owner, intro person, associated persons and companies, custom fields, days in current stage, notes/files count, and activity dates. Returns 404 if the opportunity is not visible in the tenant's ring.

get_get_opportunity_stage_history

ChatGPT
Each item records one move: from_stage -> to_stage, the timestamp it happened (entered_at), when the opportunity left that stage again (exited_at, null while it is still there), and how long it sat there (days_in_stage). The first transition of an opportunity has a null from_stage — that is the opportunity being created in its initial stage, not a move out of an unknown stage. Use this to answer pipeline-velocity questions ("how long did this deal spend in each stage", "where did it stall") that the point-in-time days_in_stage on GET /v1/opportunities/{uuid} can't. Stage names are resolved for stages that still exist in the tenant; a stage deleted since the transition returns its UUID with a null name. The full stage list for a type is available from GET /v1/opportunity-types/{type_uuid}/stages. Works for sub-opportunities as well as top-level ones. Returns 404 if the opportunity is not visible in the tenant's ring.

get_get_person

ChatGPT
Returns the full person record including: - strongest_relationships: top 2 internal team members with the strongest connection to this person (use for "who internally knows X" without needing recommended-paths) - pathpower: overall relationship strength score (0.0–1.0) - priority_management.rq: the canonical relationship quality score (0–3). Ignore rq_manual and rq_math — use rq as the single source of truth. - Secondary emails, phone numbers, entity list memberships, company affiliation. Returns 404 if the person is not visible in the tenant's Explorer view.

get_get_person_activities

ChatGPT
Returns a paginated list of emails and calendar meetings where the person was a participant, ordered by date descending. Each item includes participants, from/to addresses (for emails), start/end times (for meetings), and attachment counts. Filter parameters: - type: email | meeting — omit to return both Pagination: - page: Page number (default: 1) - per_page: Results per page (default: 50)

get_get_person_activity_stats

ChatGPT
Returns activity counts (emails, meetings, total) across different time periods.

get_get_person_ai_summary

ChatGPT
Returns a cached/prior summary when available. Returns 404 when the entity is not found.

get_get_person_pathpower

ChatGPT
Returns a single aggregate score (0.0–1.0) measuring how strongly the tenant's team is connected to this person. This is a numeric strength indicator only — it does NOT return connection paths or introductions. For actual relationship paths ("who knows this person", "introduce me to"), use GET /v1/persons/{person_uuid}/recommended-paths instead. Returns score=null (not 404) when no PathPower data exists. strength_label uses lowercase PathPower bands: weak, moderate, strong, very_strong (underscore-separated, not plain English labels).

get_get_task_endpoint

ChatGPT
Returns the full task including assignments. PERSONAL tasks are only returned for their creator; RING tasks are visible to any tenant member. Returns 404 when the task doesn't exist or isn't visible to the caller.

get_list_companies

ChatGPT
List companies.

get_list_company_custom_fields

ChatGPT
Company reads return custom field values in company_custom_fields, keyed by each field's key (e.g. sector_1697011571764_3), not its uuid. Use this to find out what each key means — its display name, type and, for selects, the allowed choices — and to find the key to write a value under. Definitions rarely change, so fetch them once rather than per company.

get_list_company_opportunities

ChatGPT
Same filtering, sorting, and pagination as GET /v1/opportunities, but scoped to opportunities that have the given company as an association.

get_list_entity_list_members

ChatGPT
Use GET /v1/companies?uuids=... or GET /v1/persons?uuids=... to hydrate the returned UUIDs into full records, depending on the list's kind (from GET /v1/lists). city, state and country filter members by where they are based — "who on this list is in LA" in one call, instead of paging every member and hydrating each one to check. They AND together. Members with no location on record are excluded when a location filter is set.

get_list_entity_lists

ChatGPT
Filter parameters (all optional): - name: Exact (case-sensitive) name match - search: Case-insensitive substring search on name - kind: PERSON or COMPANY

get_list_intro_options

ChatGPT
is_positive marks outcomes that count as a successful intro in /v1/intros/insights. Outcome and source type values here are what outcome and source_type accept on the other intro endpoints.

get_list_intros

ChatGPT
Not for finding who could make an intro; use recommended paths for that. Typical uses: how the firm met someone (entity_uuid + order=asc), every intro a person made for the firm (introducer_uuid), or intros still waiting on an outcome (has_outcome=false). Resolve names to UUIDs first with the lookup endpoints; there is no free-text search here.

get_list_meetings

ChatGPT
Only meetings where the user appears as an internal calendar participant (same scope as in-app meeting tools) are returned. Supports filtering by date range, participant person/company, and title search. Results are sorted by start time descending (most recent first).

get_list_my_relationships

ChatGPT
Backed by the per-user MR precompute (one parquet per user). This is the individual counterpart to GET /v1/relationships: it returns only the people the bound user knows, sorted by that user's own relationship_quality, and skips the team aggregation / overlay enrichment that the ring-wide endpoint does. Requires a user-bound API key (USER-scoped, or a tenant key with the x-rings-user-id header) — returns 400 otherwise. Returns an empty list when the user has no relationships yet.

get_list_notes

ChatGPT
Supports: - entity_uuid + entity_type: notes associated with that entity (either via the generic associations table or, for PERSON/COMPANY, the legacy rings_*_uuid columns). - search: full-text match over search_vector. - Standard pagination, sort_by, order. Body content is intentionally omitted from the list view; fetch individual notes to get the HTML. The excerpt field is always populated from the cheap DB column.

get_list_opportunities

ChatGPT
Returns a paginated list of opportunities visible to the tenant ring. Filter parameters (all optional): - name: Case-insensitive substring match on opportunity name - opportunity_type_uuid: Filter by opportunity type UUID (use GET /v1/opportunities to inspect type.uuid on existing records) - opportunity_stage_uuid: Filter by stage UUID Sort parameters: - sort_by: name | created_at | updated_at | value | weighted_value | probability | source_date | intro_date | last_activity_date - order: asc | desc (default: asc) Pagination: - page: Page number (default: 1) - per_page: Results per page (default: 50)

get_list_opportunities_grouped

ChatGPT
Answers "what is each stage of this pipeline worth" without paginating the opportunities themselves: one request returns count, value, and weighted value per group instead of one filtered list request per stage. Grouping: - group_by: STAGE | TYPE | OWNER | COMPANY | PERSON | ASSOCIATIONS - group_by_2: optional second dimension for a cross-tab. Only STAGE paired with OWNER is supported today; any other pairing returns 400. group_by=STAGE omits stages that hold no opportunities, and without a type filter a tenant can have more stages than one page holds, so check total. Filtering uses the same parameters as GET /v1/opportunities, so the same filters describe the same set of opportunities on both endpoints — except that the grouped rollup excludes opportunities sitting in a hidden stage (a stage toggled off in the stage editor), which the flat list still returns. For a pipeline breakdown, pass the parent opportunity's UUID as parent_uuid. Sorting: - sort_by: count | total_value | total_weighted_value | average_probability | group_label. Defaults to count, descending. - order: asc | desc Per group the response carries count, total_value, total_weighted_value, average_probability, and the children_* rollup of sub-opportunities. average_days_in_stage and stalled_count are only computed when include_stage_metrics=true, since computing them across the whole filtered set is slower. Two caveats worth knowing: - COMPANY, PERSON, and ASSOCIATIONS grouping fan a single opportunity out across every entity it is associated with, so per-group sums double-count and the children_* fields stay 0 to avoid compounding it. - total, page, and per_page describe groups, not opportunities, while total_value/total_weighted_value at the top level are deduplicated sums across the whole filtered set.

get_list_opportunity_custom_fields

ChatGPT
Use this to find the uuid of a field before setting it on create or update, including fields no opportunity has a value for yet. Each field has its uuid, key, display name, type and, for selects, the allowed choices. standard_key_to_uuid maps the 16 standard web-app column keys (e.g. targetSize) to this tenant's field uuids. Definitions rarely change, so fetch them once rather than on every opportunity read.

get_list_opportunity_stages

ChatGPT
Use this to discover a valid stage_uuid before creating an opportunity. Unlike grouping by stage, this lists every stage of the type, including ones no opportunity is in yet. A name can be in the PARENT set (the default) or the CHILD set, so check both before concluding it doesn't exist. A stage is only valid when paired with the type_uuid it belongs to.

get_list_opportunity_types

ChatGPT
Use this to turn a type name into a type_uuid, both before creating an opportunity and before filtering by opportunity_type_uuid. Match label/label_plural for top-level opportunities and sub_label/sub_label_plural for that type's sub-opportunities (e.g. "LPs"). A sub-label match is this type's uuid with hierarchy_type=CHILD. When the user also names the parent, resolve that parent with an opportunity lookup and pass its opportunity uuid as parent_uuid. Each item's pinning_config declares whether a person/company association is required for that type. To get the matching stage_uuid, call GET /v1/opportunity-types/{type_uuid}/stages.

get_list_person_custom_fields

ChatGPT
Person values are keyed by each field's id in custom_fields on GET /v1/persons and GET /v1/persons/{person_uuid}, and written through custom_fields on POST /v1/persons and PUT /v1/persons/{person_uuid}. type is one of CURRENCY, DECIMAL, PERCENTAGE, SINGLE_SELECTION, MULTI_SELECTION, TEXT, LONG_TEXT or DATE; selection fields list their options. Fields come back in the order the tenant arranged them.

get_list_person_opportunities

ChatGPT
Same filtering, sorting, and pagination as GET /v1/opportunities, but scoped to opportunities that have the given person as an association.

get_list_persons

ChatGPT
Returns a paginated list of people visible to the tenant. All filter parameters are optional — omitting all of them returns all persons. Filter parameters: - name: Case-insensitive substring match on person's display name - email: Exact match on primary email address - linkedin_url: Case-insensitive substring match on LinkedIn profile URL - modified_since: ISO 8601 timestamp — return only persons modified at or after this time (e.g. '2025-01-01T00:00:00Z') Sort parameters: - sort_by: name | last_activity_date (default: unsorted) - order: asc | desc (default: asc) Pagination: - page: Page number (default: 1) - per_page: Results per page, max 100 (default: 50)

get_list_ring_relationships

ChatGPT
Backed by the MRR precompute (refreshed every ~2h), so it can sort by relationship_quality (RQ) and PathPower — unlike the live persons list, which only sorts by name or last activity date. Each item is one external person with their embedded primary company, RQ, PathPower, priority signals, AI scores, entity lists and emails. Internal ring members are excluded. Returns 503 while the precompute has not been built for the tenant yet.

get_list_tasks

ChatGPT
Returns a paginated list of tasks visible to the caller. PERSONAL tasks created by other users are excluded. ARCHIVED tasks are excluded unless include_archived=true is passed. Filter parameters (all optional): - status: Filter by task status — must be DRAFT, ACTIVE, COMPLETED, or ARCHIVED - priority: Filter by priority — must be LOW, MEDIUM, or HIGH - assigned_to_uuid: Filter tasks assigned to a specific user UUID - created_by_uuid: Filter tasks created by a specific user UUID - associated_entity_uuid: Filter tasks linked to a specific entity UUID - search: Case-insensitive substring search on task title - include_archived: Set to true to include ARCHIVED tasks (default: false) Sort parameters: - sort_by: created_at | updated_at | due_date | priority (default: updated_at) - order: asc | desc (default: desc)

get_list_users

ChatGPT
Returns active users that can be used with the x-rings-user-id header to enable per-user context on supported endpoints.

get_lookup_company

ChatGPT
Lookup a company by domain, LinkedIn URL, or name.

get_lookup_person

ChatGPT
Searches across tenant-visible persons (including global records). At least one of email, linkedin_url, or domain must be provided. Returns up to limit matches (default 5, max 20), ranked so tenant-specific records appear before global ones. Parameters: - email: Exact email address match (primary or secondary emails) - linkedin_url: LinkedIn profile URL (e.g. 'https://linkedin.com/in/johndoe') - domain: Email domain to match — e.g. 'acme.com' matches 'alice@acme.com' - limit: Max results to return (default: 5, max: 20)

post_add_entity_list_members

ChatGPT
Each UUID joins with entity_kind = the list's own kind — a list is single-kind, so no per-entity kind is accepted. Idempotent: a UUID that is already a member is left untouched and omitted from the response's entity_uuids, which reports only the memberships this call created. Returns 404 when the list doesn't exist for the API key's tenant, and 409 when the list's membership is rule-owned (a dynamic list whose members Rings updates automatically, which would undo a manual edit).

post_add_note_association

ChatGPT
Delegates to GraphQL addAssociation with parent_entity_type=NOTE. Idempotent on duplicates: if the association already exists the existing row is returned (still status 201 for client simplicity — matches the opportunity association sub-endpoint).

post_add_opportunity_association

ChatGPT
Mirrors GraphQL addEntityToOpportunity: rejects with 404 when the opportunity or target entity doesn't exist for this tenant. Idempotent on duplicate associations — returns the existing association row rather than erroring.

post_add_opportunity_associations_batch

ChatGPT
Use this instead of repeated POST /v1/opportunities/{uuid}/associations calls whenever 2+ links are needed — e.g. attaching each sub-opportunity's company, or adding several people to one deal. Each item is {opportunity_uuid, entity_uuid, entity_type, context?}. Items are applied independently and returned in input order with a status: CREATED (new link), EXISTS (already linked — nothing written) or ERROR (error says why, e.g. opportunity or target not found). One bad item never fails the others. The first PERSON / COMPANY added to an opportunity with none pinned is auto-pinned, as in the single endpoint. Returns 400 for an empty list or more than 100 items.

post_add_task_association

ChatGPT
Links a person, company, note, file, or opportunity to the task. TASK-to-TASK links are not allowed. Returns 201 with the association record; if an identical association already exists the existing record is returned (idempotent). Returns 404 if the task is not visible to the caller. entity_type must be one of: PERSON, COMPANY, NOTE, FILE, OPPORTUNITY.

post_bulk_company_activity_stats

ChatGPT
Body: uuids (company UUIDs, max 100), plus the same optional periods group_by, and sort_by controls as the single-entity endpoint. results holds one entry per input UUID, in order. UUIDs with no data — including UUIDs outside the caller's tenant — come back with empty periods rather than failing the whole batch.

post_bulk_company_recommended_paths

ChatGPT
Body: uuids (company UUIDs, max 100) plus optional limit (top contacts per target, default 25, max 100), sort_by, and order. results holds one entry per input UUID, in order; each carries that target's total and its top contacts. Targets that are not found come back with empty items rather than failing the whole batch.

post_bulk_person_activity_stats

ChatGPT
Body: uuids (person UUIDs, max 100), plus the same optional periods and group_by controls as the single-entity endpoint. results holds one entry per input UUID, in order. UUIDs with no data — or that the identified user is not authorized to read — come back with empty periods rather than failing the whole batch.

post_bulk_person_recommended_paths

ChatGPT
Body: uuids (person UUIDs, max 100) plus optional limit (top contacts per target, default 25, max 100), sort_by, and order. results holds one entry per input UUID, in order; each carries that target's total and its top contacts. Targets that are not found come back with empty items rather than failing the whole batch.

post_create_company

ChatGPT
Dedupe: if the payload's linkedin_url or website matches an existing tenant-visible company (incl. Crunchbase / Rings Research globals), that record's UUID is reused so the tenant row converges onto the canonical entity instead of forking a duplicate. If no match is found, the downstream write generates a fresh UUID.

post_create_entity_list

ChatGPT
entity_uuids, if provided, are added as members at creation time (same entity_kind as the list's kind). List names are unique per tenant per kind — returns 409 if name is already in use for that kind.

post_create_note

ChatGPT
Thin wrapper over the GraphQL createNote resolver: full HTML content goes to S3 under the new note UUID, a plain-text excerpt is persisted on the DB row. associations are materialised via the shared create_associations path, silently ignoring entities that can't be resolved for the caller's tenant.

post_create_notes_batch

ChatGPT
associations and optional per-note idempotency. Each entry is created independently using the same path as POST /v1/notes (full body, excerpt, owner and inline associations). A single failing row comes back as status ERROR without sinking the rest of the batch; results are returned in input order. Supplying idempotency_key per note makes the import safely re-runnable: re-submitting the same key returns the existing note (status SKIPPED) instead of creating a duplicate. This is the note half of the bulk import flow — create the people first via POST /v1/persons/batch, then attach their notes here. A person/company created moments earlier may not yet be visible to this endpoint — newly written records become readable after a short sync delay. If a note's association can't be resolved, that note is NOT created and is returned with status ERROR and a retryable message — wait briefly for the entity to sync, then re-submit the same idempotency_key.

post_create_opportunities_batch

ChatGPT
Use this instead of repeated POST /v1/opportunities calls whenever 2+ records are created, e.g. importing deals from a spreadsheet or adding attendee sub-opportunities under an event. Each item takes the same fields as the single-record endpoint: name, type_uuid and stage_uuid required; associations, custom_fields, parent_uuid, owner_user_uuid and the rest optional. Resolve the type and stage once (GET /v1/opportunity-types and GET /v1/opportunity-types/{type_uuid}/stages) and companies/people with the lookup batch endpoints before calling this. Items are created in order, each on its own, and returned in input order with a status: CREATED with the new uuid, or ERROR with the message the single endpoint would have returned (e.g. "Unknown stage_uuid"). One bad item never fails the others and leaves no row behind. Never resend an item that came back CREATED; that makes a duplicate. A sub-opportunity needs an existing parent: create the parent first and pass its uuid as parent_uuid. A person or company created moments ago may come back as "Association target not found"; retry just those items shortly. Returns 400 for an empty list or more than 100 items.

post_create_opportunity

ChatGPT
Required fields: name, type_uuid, stage_uuid. If the user hasn't specified an opportunity type or stage, ask them before calling this endpoint. To discover valid type_uuid and stage_uuid values, call GET /v1/opportunities and inspect the type.uuid and stage.uuid fields on existing records. Optional: details, value, probability, source_date, intro_date, intro_person_uuid, owner_user_uuid, associations (to link persons/companies). Returns the new opportunity UUID and timestamps on success (201).

post_create_person

ChatGPT
All fields are optional. If the provided email matches an existing person in the tenant, the existing record is updated in place and its UUID is returned (deduplication by email). Returns the UUID and rings_updated_at timestamp on success.

post_create_persons_batch

ChatGPT
For each entry: if email or linkedin_url matches an existing tenant-visible person, that person is returned (status MATCHED) without a write; otherwise a new tenant-source record is created (status CREATED). This mirrors the matching of GET /v1/persons/lookup and the dedupe of POST /v1/persons — the per-item create runs the same upsert_person path, so a batch entry behaves exactly like a single create. Items are processed independently — a single failing row comes back as status ERROR without sinking the rest of the batch. Results are returned in input order. Duplicate identifiers within the same batch resolve to one record: a later row sharing an email/linkedin_url with an earlier row comes back MATCHED against the first row's UUID rather than creating a second person (an earlier create isn't yet visible to the matcher mid-batch). This is the bulk primitive for an import flow: look people up first (POST /v1/persons/lookup/batch), then create the unmatched remainder here, then attach notes (POST /v1/notes/batch).

post_create_task_endpoint

ChatGPT
Creates a task and optionally assigns it to users and associates it with entities (persons, companies, opportunities, etc.) in a single atomic operation. Returns the new task id on success. Enum values (case-sensitive, uppercase): - status: DRAFT | ACTIVE | COMPLETED | ARCHIVED (default: ACTIVE) - priority: LOW | MEDIUM | HIGH - visibility: RING (all tenant members) | PERSONAL (creator only, default: RING) - reminder_type: MINUTES | HOURS | DAYS | WEEKS (requires reminder_value)

post_log_intro

ChatGPT
Inbound (someone outside introduced something to the firm): pass introducer; introduced_to defaults to you. Outbound (the firm made an intro): pass introduced_to; introducer defaults to you. Every party must be an existing record. Returns 201 with the new intro, or 200 with duplicate: true and the existing intro when one with the same direction, date and parties is already logged, so retrying is safe. The response is the saved intro; do not re-fetch it to confirm.

post_lookup_companies_batch

ChatGPT
Each entry in queries is resolved independently using the same matching semantics as GET /v1/companies/lookup. Results are returned in the same order as the input.

post_lookup_persons_batch

ChatGPT
Each entry in queries is matched independently using the same semantics as GET /v1/persons/lookup (email, linkedin_url, or domain match). Results are returned in the same order as the input queries. Entries with no matching criteria return empty matches rather than an error.

post_search_notes

ChatGPT
Performs hybrid vector + full-text search and returns results grouped by source note with matching text snippets.

put_set_current_company

ChatGPT
Performs the same write as the app's "set current company" action, which current_company on person read endpoints is derived from. Replaces any existing primary affiliation for this tenant's ring outright -- this is not additive (a person has one current company per ring). Returns 404 if either the person or the company UUID is not visible to your tenant.

put_update_company

ChatGPT
Only fields provided in the request body are written; other attributes on the existing record are preserved. Returns 404 if the company is not visible in the tenant Explorer view.

put_update_entity_list

ChatGPT
Only the list's owner or a tenant ringmaster may update it (404 otherwise); membership is not affected. Only fields provided in the request body are written. Renaming a system-managed list is rejected with 409.

put_update_intro

ChatGPT
Common use: record what came of it, e.g. {"outcome": "Meeting held"}. Sending introducer, introduced or introduced_to replaces the parties in that role only. outcome: null sets the intro back to pending. Intros found in an email you can't access return 404.

put_update_note

ChatGPT
Only provided fields are written. If content is provided the S3 object is re-uploaded and the excerpt on the DB row is refreshed; omitting content leaves the stored HTML untouched. 404s when the note isn't visible for the caller's tenant.

put_update_opportunities_batch

ChatGPT
Use this instead of repeated PUT /v1/opportunities/{uuid} calls whenever 2+ records change — e.g. setting a different stage, value, next step or custom field on each sub-opportunity from a spreadsheet. Each item is {uuid, ...fields} and takes the same fields as the single-record endpoint; only the fields sent are written. Items are applied in order, each on its own, and returned in input order with a status: UPDATED, or ERROR with the message the single endpoint would have returned (e.g. "Opportunity not found", "Unknown stage_uuid"). One bad item never fails the others. Returns 400 for an empty list or more than 100 items.

put_update_opportunity

ChatGPT
Only fields present in the request body are written; other attributes on the existing record are preserved. Association edits go through the dedicated associations sub-resource (see below). Returns 404 if the opportunity is not visible under the tenant's ring.

put_update_person

ChatGPT
Fields omitted from the request body are left unchanged on the existing record. Returns 404 if the person UUID is not visible in the tenant's Explorer view. Returns the UUID and updated rings_updated_at timestamp on success.

put_update_task_endpoint

ChatGPT
Omitted fields are left unchanged on the existing record. To mark a task as done, set status="COMPLETED". To remove a due date, pass clear_due_date=true instead of setting due_date to null. To remove a reminder, pass clear_reminder=true. Enum values (case-sensitive, uppercase): - status: DRAFT | ACTIVE | COMPLETED | ARCHIVED - priority: LOW | MEDIUM | HIGH - visibility: RING | PERSONAL - reminder_type: MINUTES | HOURS | DAYS | WEEKS

Capabilities

WritesInteractive

Example Prompts

Click any prompt to copy it.

App Stats

86

Tools

3

Prompts

ChatGPT

Platforms

Category

CRM Records

Works with

ChatGPT

Data refreshed daily