affinity

affinity

affinity.

Affinity persons, companies and opportunities.

ajouter à otoauth : —prefix : affinity_*

setup & usage

⚠ your Affinity API key

In Affinity, open Settings → Manage Apps and generate an API key, then paste it on the affinity connector. Reference: Affinity API keys.

  • API access needs an Affinity Scale, Advanced or Enterprise plan (not Essentials, not a trial)
  • the key acts as you: notes, list changes and new records are attributed to you, and you only see what you can see in Affinity. Set at the organization level, every member acts as the person who created the key
  • reading list rows and writing list columns need the role permission "Export data from Lists"; writing person/company fields needs "Edit Global Field Values"
  • byo-only: no shared platform key — it is your CRM
  • ▸ what you can do
  • "find Acme in Affinity" → affinity_entity(term="acme"), then affinity_entity(op="get", id=…) for its fields
  • "who on the team knows her best?" → affinity_entity(op="relationships", kind="person", id=…)
  • "show the deal pipeline" → affinity_list() to find the list, then affinity_list_entry(list_id=…)
  • "move these 10 deals to Due diligence" → affinity_list_entry(op="set_fields", list_id=…, items=[{entry_id, fields: {"Status": "Due diligence"}}, …], dry_run=true), then again without dry_run
  • "add this company to the Watchlist" → affinity_list_entry(op="add", list_id=…, entity_id=…)
  • "log a note on this call" → affinity_note(op="create", content=…, company_ids=[…])
  • "what did we exchange with them this quarter?" → affinity_interactions(kind="company", id=…, type="email", since="…")
  • · what trips people up
  • ⚠️ a row id (entry_id) is not the person/company id (entity_id): one company on three lists has three rows
  • ⚠️ updating a person's emails or a company's people replaces the whole set: pass the existing values too
  • removing a row from an opportunity list would delete the deal: the connector refuses it
  • creating a company whose domain already exists returns the existing one instead of a duplicate
  • email bodies are never available through the Affinity API, only subjects, participants and dates
  • just chatting in Claude? Affinity's own MCP server (https://mcp.affinity.co/mcp) covers more; this connector is for procedures and hosted agents
  • · usage limits

    900 requests per minute per user, and a monthly quota for the whole account (100,000 on Scale and Advanced, none on Enterprise) shared with every other Affinity integration, including Affinity's MCP server. Batch writes report the remaining monthly quota.

    ⚙ multiple comptes

    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.

  • the first one doesn't need a name; from the second on, each one carries its own (the first then takes the name "principal", renamable)
  • without specification, the agent takes the only stored compte, otherwise the one marked as default; otherwise the call is refused, naming the available comptes — never a random choice
  • target a compte for a call: _account="<name>" on the tool; list them: oto_identity(op='list', connector='affinity') (scope='org' or scope='group' for the org's or team's)
  • set the default: oto_identity(op='set', connector='affinity', identity_id='<name>'); rename: op='rename' with new_name
  • ⚠️ no tool walks through the comptes on its own: a total across several comptes is obtained by calling each one (_account) and adding up
  • outils

    chargement…

    utilisation

    claude code — installe le plugin oto — claude plugin marketplace add otomata-tech/oto-plugin — mcp + skill configurés.
    claude.ai — branche mcp.oto.cx/mcp en connecteur custom (guide)
    cli — pipx install oto-cli puis oto affinity …