origami
origami.
Origami workspaces — the containers of tables, documents and campaigns.
setup & usage
⚠ origami api key
create an API key in Origami (Settings → API keys; it starts with og_live_ — see the authentication docs), then paste it into oto.
blocked.missingChannels and nothing goes out▸ from leads to launching an email + LinkedIn campaign
origami keeps lead tables and has its agent draft then send multichannel campaigns.
origami_workspaces, origami_tables(op="list")origami_upload_csv(workspace_id, "leads.csv", csv_text) (dry_run=True shows the first rows)origami_tables(op="columns") to read the SLUGS, then origami_rows(op="upsert", rows=[{slug: value}], match_columns=["email"])origami_rows(op="list", max_pages=…) (follows nextCursor server-side)origami_campaign_create(table_id, instructions) then origami_run_get(agent_id, run_id) until status != "running"origami_campaign_launch(campaign_id, dry_run=False) — the default dry_run=True only previewsorigami_campaigns(op="stats" | "people"), origami_sequences(workspace_id=…)origami_campaign_pause, origami_campaign_resume, origami_campaign_delete(confirm=True)· what sends, what costs, what traps
dry_run=False; there is no recallorigami_campaign_create with block_prior_contacts=True (default) excludes anyone previously enrolled, EVEN in a deleted draft that was never sent — pass False only if those enrollments never sent to anyoneblock_prior_contacts / block_active_duplicates settings are REQUESTED, not guaranteed: Origami ignored them on campaigns created by the call. Re-read origami_campaigns(op="get") → settings after the run; restating them in plain words in instructions made them stick in practice; otherwise, toggle by hand in Origamiaucune_action can leave a "Ready to launch" draft in the Origami interface that is invisible to the API: retry ONCE, and have a human check the campaign list before retrying againenrich=False by default on upsert: enrichment spends credits, it must be requested explicitlyorigami_sequences(workspace_id=…) which follows nextCursor (pages of 50, max_pages=10 by default) and returns campaign_ids, the DISTINCT campaigns seen — a single page makes you think there is one where there are four; truncated: true = more remain, pass cursor againorigami_upload_csv returns table_id / table_slug at the top level (the id of the created table conditions the upsert and the campaign that follow) and error if Origami rejected the file⚙ 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.
_account="<name>" on the tool; list them: oto_identity(op='list', connector='origami') (scope='org' or scope='group' for the org's or team's)oto_identity(op='set', connector='origami', identity_id='<name>'); rename: op='rename' with new_name_account) and adding upoutils
chargement…
utilisation
claude code — installe le plugin oto —
claude plugin marketplace add otomata-tech/oto-plugin — mcp + skill configurés.cli —
pipx install oto-cli puis oto origami …