minari
minari.
Calls made and received in Minari, with AI summaries and objections.
setup & usage
create an API key in Minari (Settings → API & webhook), then paste it into oto.
429 comes back with the number of seconds until resetminari is an outbound call dialer: the team dials, minari records, transcribes, summarizes and detects objections. six tools:
minari_call(op="list", transcript_search="prix", start_date="…", end_date="…")minari_call(op="list", status=["meeting-booked"]) — ⚠️ meeting-booked is a filter-only value: a call row never carries it as its status, it carries the boolean meeting_bookedminari_call(op="get", call_id="…") — returns the record without the transcript (see the limits below)minari_call(op="transcript", call_id="…")minari_call(op="recording", call_id="…") — says whether it exists and its size, without pulling the audio; to let someone listen, use the call record's public_call_link, a page shareable without a key — null if external sharing is disabled for the company, so check before promising a linkminari_analytics(op="overview", start_date="…", end_date="…")minari_analytics(op="users", start_date="…", end_date="…")minari_analytics(op="objections")minari_analytics(op="lists", period="week", call_limit=3)minari_user() for the rep's id, then minari_list(op="create", name="…", assigned_to=…, contacts=[…])minari_contact(op="add", list_id="…", contacts=[…])industry field before the import" → minari_custom_field(op="create", field_id="industry", label="Industry")an imported contact requires at least one of firstName, lastName, email; it also accepts company, title, companyDomain, linkedinUrl, description, phoneNumber1…phoneNumber5, a note (5000 characters) and customFields declared beforehand.
this is the API's trap no. 1, and it is silent: minari_list and minari_contact see only the CSV import source. if your contacts come from HubSpot, Salesforce or another CRM sync, your lists do exist in Minari but will never appear through these tools — an empty result means "no CSV list", not "no list".
the all-sources view is minari_analytics(op="lists"): it is the one that answers "where are my lists at". calls and analytics, for their part, cover all sources.
three responses can blow up, and the connector bounds them while saying so rather than truncating silently:
minari_call(op="get") therefore removes it and returns transcript_utterances (the number of utterances); the text is obtained via op="transcript", the endpoint Minari split off precisely for thisop="transcript" stops at 200 utterances by default (max_utterances) and returns the real total plus a truncated flagminari_list(op="get") stops at 100 contacts by default (max_contacts) and returns total_contacts plus truncatedpagination: minari_call(op="list") and minari_list(op="list") return 50 rows per page, minari_analytics(op="lists") returns 10 — sizes fixed by Minari, not negotiable. every response carries a next_cursor.
⚠️ the cursor is a POSITION, not a query — it decodes to {"s": <start date>, "c": <call id>} and carries no filter. turning the page while passing ONLY the cursor therefore returns the rest of the entire log, unfiltered, without any error: you must pass the same filters alongside the cursor. the response reminds you in note every time a next page exists.
op="overview" and op="users" cover today when no dates are given; op="objections" covers the last 7 days. asking for "our numbers" without specifying a period therefore does not return "everything", but the current day — and the response always states in period the window actually used, to be read before concluding.
rates are percentages (0–100) and are null when their denominator is zero. analytics are day-granular.
two parameters of op="lists" are required because they define the vocabulary: period (the call counting window) and call_limit (the number of attempts after which a never-reached contact is considered exhausted). two different values give two different answers — they are two questions, not an inconsistency.
this connector was written from the OpenAPI 3.1 published by Minari (api.minari.ai/docs/openapi.json) and its usage guide for agents, without a probe against a real account (2026-08-31). everything above is therefore a reading of the contract, not a measurement.
the first real test is the "test the connection" button on this card: it reads the company's members, which proves the key authenticates. it does not judge what it returns — an empty directory is not grounds for refusal, and the probe runs before saving: what it refuses would never be saved.
the public API allows neither triggering a call, nor editing an existing contact, nor managing users. these actions are done in Minari. webhooks (call.completed, call.meeting_booked, contact.updated) are also configured from Settings → API & webhook: there is no endpoint to create or list them, hence no tool here.
deleting a list (minari_list(op="delete")) or a custom field (minari_custom_field(op="delete")) is permanent and removes the list from the rep's call queue. removing contacts from a list without destroying it is minari_contact(op="remove").
this connector accepts multiple comptes: each stored credential becomes a named account (one name per compte), at your level, your team's or your org's.
_account="<name>" on the tool; list them: oto_identity(op='list', connector='minari') (scope='org' or scope='group' for the org's or team's)oto_identity(op='set', connector='minari', identity_id='<name>'); rename: op='rename' with new_name_account) and adding upoutils
usage
claude plugin marketplace add otomata-tech/oto-plugin — mcp + skill configured.pipx install oto-cli then oto minari …