Authoring, testing, and now publishing Fin Procedures — one of the most powerful things you can do with Fin — is fully code-first as of CLI 0.10 / 0.11 (fin procedures publish shipped, verified live end-to-end). Still looking forward to more updates to unlock the other areas — and the REST API just got massive updates too (a full Data Connectors API, Fin Agent orchestration, Office Hours & more) that unlock even more.
Fin Attributes are conversation attributes, and fin fin attributes manages them as
conversation.*, with is_classification_attribute, is_enabled and
classify_on_close on the object. An upload creates them, updates them in place, and switches
Fin on. The catch: both switches default to false on create, so an attribute uploaded without them
exists, looks normal, and never fills in — and the stock Issue Type and Product Area on our sandbox were
shipped switched off.
Also this month: REST can create conversation attributes too
(POST /conversations/attributes at Intercom-Version: Unstable), but that object
has no classification fields. Attribute types are frozen at creation, descriptions cap at 255
characters (option descriptions, the classifier's instructions, don't), and a workflow can set a
conversation attribute — as a rule command inside mid_path_action.
I've been pinging npm daily waiting for these — and here they are. 🙌 Huge thanks to the Fin CLI team for pushing these updates, and a special shout-out to Brian Scanlan for taking the time to meet with me and actually hear the feedback. This is what building in the open looks like.
The crew tracking Intercom + Fin as code. New CLI & API unlocks drop fast — drop your email and I'll ping you the moment the next one lands (and loop you into the Slack).
Half the confusion on this board comes from three separate things all getting called “the API”. They are different surfaces with different contents and different ways of being selected — and a capability is often present on one and unreachable on another. Read the matrix below with these three in mind.
Fin’s own objects: procedures, guidance, data-connector config, audiences, monitors,
simulations. This is what the fin verbs actually speak. Gated by a per-workspace
backend flag, not by API version — when it is off you get
403 Fin SDK is not enabled no matter what else you do.
fin api /fin-sdk/…The rest of Intercom: conversations, contacts, articles, tickets, tags, calls, and — as of the 2.16 graduation — data connectors, office hours and macros. Version is pinned per app in the Developer Hub; the header only matters if you are sending it yourself.
fin api — but only at
your workspace’s default versionThe waiting room. Same host, same paths — a preview tier holding things not yet in a
numbered version: Reporting Data Export, Fin Agent orchestration, custom object instances,
incident.* webhooks. Surfaces graduate out of here into a stable version
(macros and office hours both did), so a card marked “Unstable-only” can quietly become stable.
INTERCOM_API_BASE_URL, with no token handling.fin api. It is a CLI
passthrough — gh api for Intercom — not “the Fin API”. It signs the request with your
stored token and sends it at whatever version your workspace defaults to. On 0.13.0 it still has no
--version or header flag (fin api --help lists none), which is the whole of
#33: anything living above your default version, or on Unstable, is curl-reachable and not natively CLI-reachable. Workaround: the CLI honours INTERCOM_API_BASE_URL, so pointing it at a small loopback proxy that injects Intercom-Version gives fin api any version — while the CLI keeps doing its own keychain auth. The tell is the error text —
Requested resource is not available in current API version means the route exists
and you are pointed at the wrong version, not that the capability is missing.The headline before the detail: what the CLI already nails, and the three things still standing between it and a deploy pipeline you would trust unattended.
publish / pause / versions (0.10.0) closed the loop — author → test → set live, verified end-to-end, without opening the dashboard.fin articles create · update · delete with -F body=@file.md and -f state=published. A docs repo can drive the Help Center in one line.simulations generate / run / result is real CI-style regression testing from the terminal — it caught the 0.9.0 regression for us. fin setup still provisions a whole workspace in one command.fin api, and call transcripts + audio are pullable via /calls — including human-answered calls, back to Jan 2025.upload id:new 200s but yields a hollow shell, and the SDK paths layer is not the builder graph. Three of the ten jobs below are blocked on this one thing.get --version <id> with a space is swallowed by the CLI’s global version flag — no request is sent, it prints 0.13.0 and exits 0 (#82). Procedures and workflows alike; --version=<id> works. Nothing reports what a token may do, so a 403 is indistinguishable from a 404 (#78). A missing verb blocks you; a wrong answer misleads you.Six stages of shipping a Fin change. The publish gate just fell for Procedures (0.10.0) — author → test → ship, all as code; workflow authoring is the stage that’s still artisanal. Each stage’s bar shows how much is green. Click a stage for the detail.
Where each job actually runs. The old “REST / Unstable” column has been split in two, because those are different surfaces and welding them together hid exactly the case this board keeps hitting — a capability that is live on one and unreachable on the other. Three things to read off it: the Dashboard column is still the only one green all the way down, MCP is green on exactly one row (Help Center content), and the Fin SDK API column and the REST 2.16 column barely overlap — Fin’s own objects and the rest of Intercom really are two different estates.
Beyond Fin: the rest of the estate we review, configure and roll out. Two areas already prove the “ship-as-code” pattern works — the platform just hasn’t extended it everywhere. “Not yet audited” marks the live rollout backlog, not a known gap.
create/update_article; fin setup even seeds them.list / get (a 55-workflow inventory in one call) + enable / disable. Authoring the graph is UI-only, though (see blockers).POST /tickets creates (validation-confirmed); types & states are readable.POST /messages (email / in-app, admin→user).sla_applied) — 404 on default + Unstable.upload id:new 200s but yields a hollow shell (blank visual builder, runs empty); the SDK paths layer ≠ the builder graph, and upload silently mangles channels→web.The rest of this board is organised by surface. This one is organised by outcome — real engagements we run, what ships as code today, and the single thing each blocked one is waiting on.
apply/publish, a workflow-graph API) replaces the browser hack with something deterministic and CI-safe.The REST API moved as hard as the CLI — a big graduation into stable 2.16, plus new Preview surfaces. Several of these close gaps this board has flagged for months. Caveat: the CLI can’t select an API version yet (#33), so most are curl-reachable today, not CLI-reachable — bump your workspace’s Developer-Hub default to 2.16 to reach them.
The newest intercom.com/changes features — 10 from Aug 11–Sep 2 2026 (swept 2026-09-02) on top of the Jul 21–Aug 3 batch — each checked against CLI / REST / Unstable / MCP. ★ marks the ones that matter most for code-first. Sorted by impact · ★ = matters most for code-first · verdicts are “we couldn’t find a code path,” not “impossible” — pointers to anything we missed are welcome. Click a row for detail.
fin fin attributes returns Fin Attributes as conversation.* with is_classification_attribute, is_enabled and classify_on_close, and an upload flips them (read back). Both default to false on create. Attributes card → ok; matrix row updated.POST /conversations/attributes at Intercom-Version: Unstable) — we had only tested /data_attributes, which genuinely rejects them. Audiences likewise create and update via type: audience uploads. The Unstable tier is no longer marked CLI-unreachable: a loopback proxy on INTERCOM_API_BASE_URL gives fin api any version, and business hours was re-verified reachable through it. The Articles card no longer calls article CRUD the MCP’s only write, since add_internal_note shipped. Guidance gains the spam-detection category, the URL-matching limit, and the session-only Optimize advisor. New matrix row: Author attributes./fin-sdk/, gated by a per-workspace backend flag, no version header), the stable REST API (version pinned per app in the Developer Hub) and the Unstable / Preview tier (header-selected, CLI-unreachable) — plus the one that isn’t an API at all, fin api, which is a passthrough riding your workspace default. The capability matrix’s “REST / Unstable” column has been split into two, which forced a re-grade: connectors and articles are green on REST 2.16 (they were wrongly “–”), and Reports’ amber now sits on Unstable alone where it belongs. Macros added to the matrix and the card corrected — macros graduated into stable 2.16 (read-only: GET /macros, GET /macros/{id}; no write on 2.16 or Preview), so the old “Unstable-only” grade understated it. Live-probed on CLI 0.13.0: the call returns Requested resource is not available in current API version — route exists, wrong version, no flag to fix it (#33 re-verified: fin api --help still offers no version or header option). The matrix is also responsive now — below 760px each activity becomes its own card with one labelled line per surface instead of a seven-column horizontal scroll; above it the Activity column stays pinned while the surfaces scroll. A board about capability confusion should not itself conflate the surfaces.--version=. An earlier v2.4 note said workflows get --version returns the current workflow. Re-tested: the fault is argument parsing, not the server. With a space, --version <vid> is consumed by the CLI’s own global version flag — no HTTP request is made at all (--verbose shows no request line), the process prints 0.13.0 and exits 0. This hits procedures and workflows equally; procedures are not exempt. With an equals sign, --version=<vid> calls /fin-sdk/{procedures|workflows}/<id>/versions/<vid> and returns the genuine stored version — byte-identical to REST. What misled us: the version: field in the response always reports the current id, even from REST, so it can’t confirm which version you got — diff the content instead. Logged as #82.collected_data is the only readable trace, Preview); real-time incident detection (Operator — the first Operator output with an API hook: incident.* webhooks on Unstable); the HubSpot / Marketo Fin-for-Sales connectors (connector CRUD-able via 2.16, the template flow is UI). Graded against the API / CLI surface + the Unstable changelog; live-tests pending where noted. Also: hosted MCP gained submit_mcp_feedback (14 tools; still no Fin SDK).intercom internal-articles — full list / get / create / update / delete for the private knowledge Fin reads, plus internal-articles folders list / get / articles for the folder tree (previously raw-api-only) → Fin’s internal KB is now code-authorable. Re-graded the Articles card + added a ★ What’s-new entry. 0.13.0: new workspaces from auth signup now opt into a narrower public-fin-cli capability instead of the broad internal Fin SDK (existing workspaces unaffected) — Intercom formalizing a public CLI surface. Installed 0.13.0, auth intact. Wishlist retest sweep for 0.12/0.13 in progress./calls on a pure human-phone workspace (no Fin Voice): human-answered calls are transcribed and recorded too — the transcript arrives on the plain transcription_url, with fin_transcription_url null. And the archive is a backfill, not GA-forward: ~49.6k calls reaching back to Jan 2025, oldest one still returning a full transcript. Three gotchas now on the Voice card: transcription_url is populated even for missed/voicemail calls that return {} (presence ≠ content), per_page caps at 25 so a piped default read looks complete at 25 rows, and two speaker schemas coexist (2025 spk_0/spk_1 vs 2026 [Teammate N]/[User]). Corrects the earlier "Intercom does not transcribe human-answered calls" note — if you have told a client that, re-check their workspace.fin procedures publish · pause · versions + upload --verify — Fin Procedures now build → test → SHIP as code (verified live end-to-end). Re-graded the Publish stage + Fin-procedures card green. The REST API leveled up too: stable 2.16 added a full Data Connectors API (CRUD + execution logs) & Office Hours; Preview added Fin Agent orchestration — new “API unlocks” section. Added a note + follow-the-updates signup, a Developer-Hub scopes callout, and the “artisanal” framing for the workflow-authoring frontier. Watershed — the CLI + API both moved hard in one week.POST /fin-sdk/enable) — not support-gated (distinct from the still-gated SDK state-change/publish flag). Re-verified in the 0.9.0 CLI source./calls (list + transcript + WAV audio) and News are real code surfaces — earlier “no API” calls had been tested on workspaces where the feature was OFF; re-verified on enabled workspaces. Re-graded Author green→amber (workflow authoring is UI-only). New insight: feature-gated endpoints must be tested where the feature is enabled — and a whole tier (office hours, custom objects, news, macros) is writable only in the Unstable API the CLI can’t send.list/get + enable/disable work, but authoring a runnable workflow is UI-only (upload = hollow shell). Added per-tool granular coverage and a Claude in Chrome stopgap note. New insight — re-auditing each "works as code" claim for crucial UI-only sub-parts.sla_applied); only SLA-policy config is UI-only — a genuine gap, not plan-gating. New verification across workspaces + Unstable.POST /messages). Endpoint missed on the first pass.fin api.@intercom/cli 0.13.0 · Prepared by Nathan Sudds (Activelabs) · client-anonymized