Skip to main content
Contact usGet Started
API & Webhooks · Microsoft-first

Your practice data, the moment it changes

Read the same clients, jobs and documents your firm works from — and get a signed webhook the second one moves. No overnight export. No staging spreadsheet. No second copy of the truth quietly disagreeing with the record your partners are reading.

Data stays in your tenant Scoped credentials per integration Retries, replay and a delivery log
event stream LISTENING
{
  "event": "engagement_letter.signed",
  "occurred_at": "2026‑08‑25T09:14:02Z",
  "data": {
    "engagement_id": "eng_…",
    "client_id": "cli_…"
  }
}
SIGNED DELIVERED
Your endpoint accepted it Job opened · folder set created 200 · 84ms

Built for the stack an accounting firm already runs

Microsoft 365
Live

Entra ID SSO, Outlook, Teams, SharePoint and Graph.

SharePoint
Live

Documents stay in your tenant. The API returns pointers.

Xero & QuickBooks
Live

The ledger stays where it is; billing runs through it.

Stripe & GoCardless
Live

Collection rails you choose. Payment events hit the record.

Gmail
Live

For practices that do not run on Microsoft 365.

Webhooks
API

Signed, retried, replayable. Subscribe to what matters.

REST & JSON
API

Cursor-paged collections, machine-readable errors.

Power Automate
Via API

No built-in connector. Reachable as a generic HTTP call.

Zapier
Via API

No published app. Wire it yourself against the endpoints.

US tax software
Not available

Drake, Lacerte, ProSeries and CCH Axcess do not connect.

0
Core resourcesClients, engagements, jobs, documents, invoices and people.
0
Delivery attemptsExponential backoff before an event is marked failed.
<0
Typical deliveryFrom the change on the record to your endpoint.
0
Copies of your dataDocuments and mail stay in the tenant you govern.

Figures describe intended behaviour of the API as designed. Exact limits are confirmed in the published reference.

Capabilities

Everything an integration needs, and nothing it has to work around

Reading data is the easy half. The hard half is knowing something changed, proving it arrived, and being able to say who read what — which is where most practice integrations quietly fail.

Subscribe to the change, not the schedule

A webhook fires when a letter is signed, a job moves stage or an invoice settles. Every payload is signed so you can verify the sender, carries an id you can de-duplicate on, and is retried on a backoff if your server has a bad minute.

deliveries · last hour
engagement_letter.signed200
job.stage_changed200
invoice.paidretry 2/6

Credentials per integration

Scoped least-privilege, revocable on their own, and attributed on every call — so “which system read this client?” has an answer.

jobs:readclients:writeinvoices:read

A delivery log a partner can read

Integration health lives in the product, not in your logging stack. When something is behind, the firm sees it without asking the person who built it — and can replay a failed delivery without waiting for the next retry.

ATTEMPTSRESPONSE CODESREPLAYEXPORT

Documents by reference

You get metadata and a pointer into your own SharePoint — never a second copy of a client file to secure and retain.

Cursor pagination

Collections page on a cursor rather than an offset, so a list cannot shift underneath you mid-read.

Errors you can branch on

A machine-readable code plus a human sentence. A 429 tells you exactly how long to wait instead of making you guess.

Versioned, with notice

Breaking changes ship behind a version. You are told before anything you depend on is retired.

Event flow

From a signature in the office to a job in your system

Five stops, no copies. The change happens on the record, the event carries it, and whatever your system does next is visible back inside FigsFlow rather than buried in a log only you can read.

01

Something changes

A client signs an engagement letter in the portal. A real action, on the record the firm works from.

02

The event is raised

Recorded once, with an id to de-duplicate on and a timestamp to order by — whether or not anyone is listening yet.

+12ms
03

Your endpoint is called

Signed so you can verify it. Retried on a backoff if you are down, and logged either way, so failure is never silent.

+840ms
04

Your system acts

Creates the folder set, updates the warehouse, posts to a channel — and reads back anything else over the same API.

+1.2s
05

The firm sees it landed

Delivery health is a screen in the product, so “the automation is behind” is noticed rather than reported.

live
Developer console

Two people, one console, different halves

A developer wants the request, the response and the reason it failed. A partner wants to know whether the thing that was supposed to happen happened. Both open the same screen.

Delivery health

Every attempt, its response code and how long it took. Replay a failed delivery by hand without waiting for the next retry.

Request explorer

Send a real call against your sandbox and read the response beside it — no local setup to get a first result.

Traffic and limits

Where your calls go, which resources are busiest, and how close a credential is running to its ceiling.

Access & scopes

Which integrations exist, what each can reach, when it was last used, and one button to revoke it.

deliveriesLAST 24H
Onboarding automationRetrying
engagement_letter.signedattempt 3 of 6 · next in 8m500
engagement_letter.signedattempt 1 · accepted200
Practice dashboardHealthy
job.stage_changed2m ago200
invoice.paid31m ago200
explorerSANDBOX
# illustrative — shapes confirmed in the published reference
curl "https://api.example/v1/jobs?stage=in_review" \
  -H "Authorization: Bearer <token>"
{
  "data": [
    { "id": "job_…", "stage": "in_review" }
  ],
  "has_more": false,
  "next_cursor": "cur_…"
}
trafficPER CREDENTIAL
clients6,140
jobs4,022
documents2,311
invoices1,004
Rate limit headroomComfortable
this hour34%
accessFIRM ADMIN
Practice dashboardActive
jobs:read · invoices:readlast used 2m agoOK
Onboarding automationActive
clients:write · engagements:readlast used 9m agoOK
Legacy export scriptUnused 94d
clients:readcandidate for revocationSTALE
Lifecycle

What integrating actually looks like

Not a six-month programme. Most firms are live on one useful job inside a fortnight, because the first integration should be small enough to prove and boring enough to trust.

Day one

Issue a credential

Scoped to exactly what the job needs. Sandbox first — nothing touches live client data while you are still reading the shapes.

Day two

Read something real

One GET against your own sandbox, in the explorer. If the shape does not fit what you are building, better to find out now than in week six.

Week one

Subscribe to one event

Pick the single step people forget. Make the handler idempotent, point it at staging, and watch the delivery log until it is dull.

Week two

Hand it to the firm

Put connection health on a screen an ops manager checks. An integration nobody watches is an integration nobody trusts.

Compare

Against the three things firms usually do instead

A scheduled export is genuinely fine for a monthly board pack. The question is what happens when somebody asks at 3pm on a Tuesday — and whether anyone would notice if the answer were wrong.

Capability
Scheduled export
Polling on a timer
FigsFlowAPI & webhooks
Current within seconds
Overnight at best
As often as you pay for
Pushed on change
Captures the transition, not just state
Snapshot only
Misses in-between moves
The event is the change
Can trigger downstream work
Too late to matter
Within the interval
Immediately
Survives your server being down
Next run, maybe
You control the loop
Retried on a backoff
Failure is visible to the firm
Silent
In your logs only
A screen in the product
Answers “which system read this?”
Usually a shared account
If you split credentials
Attributed per call
Costs nothing when idle
Runs on a schedule
Burns limit on nothing
Silent until something moves

Where a first-party integration already exists — Microsoft 365, Xero, QuickBooks Online, Stripe — use it instead. It is supported, maintained, and better than anything you would build against the API.

Reference

What you can read, write and listen for

Six core resources, each scoped separately for read and write. Pick one to see what it carries and which events it raises.

Clients

The party record every other object hangs from — the same one your team opens in the product, with contacts nested rather than split across a second endpoint.

  • Read and write. Create a client from your own onboarding form without anyone re-keying it.
  • Events: created, updated.
  • Filterable by owner, status and last activity.

Engagements

Scope and fee, linked to the letter that evidences them. Read-only on purpose: an engagement should be created by the process that prices and signs it.

  • Read only. Writes happen through proposals and letters, where approval applies.
  • Events: created, signed.
  • Links to the signed document and the jobs it released.

Jobs

Work in progress, with the stage the firm actually uses. The busiest resource for most integrations, and the one worth subscribing to first.

  • Read and write. Move a stage from your own tooling if that is where the work happens.
  • Events: opened, stage_changed, closed.
  • Filterable by stage, owner, deadline and client.

Documents

Metadata and a pointer into your own SharePoint — deliberately not file content. The API should not become a second place your client files live.

  • Read only. Bytes stay in the tenant your firm already governs.
  • Events: filed.
  • Returns the SharePoint location, not a copy of the file.

Invoices

Raised and settled, as the firm sees them. The ledger stays in Xero or QuickBooks — this is the practice-side view, not a replacement for your accounts system.

  • Read only. Billing runs through your connected ledger.
  • Events: raised, paid.
  • Useful for WIP dashboards and collection chasing.
GET/v1/clients
{
  "data": [{
    "id": "cli_…",
    "name": "Ridgeline Foods Inc.",
    "owner": "usr_…",
    "contacts": [{ "role": "primary" }]
  }],
  "has_more": false
}
EVENTengagement.signed
{
  "event": "engagement.signed",
  "data": {
    "engagement_id": "eng_…",
    "released_jobs": ["job_…"]
  }
}
POST/v1/jobs/:id/stage
# move a job from your own tooling
{
  "stage": "in_review",
  "note": "prepared, awaiting partner"
}
GET/v1/documents/:id
{
  "id": "doc_…",
  "kind": "engagement_letter",
  "location": {
    "provider": "sharepoint",
    "path": "/Clients/…/2026"
  }
}
EVENTinvoice.paid
{
  "event": "invoice.paid",
  "data": {
    "invoice_id": "inv_…",
    "settled_via": "stripe"
  }
}
Questions

The things developers ask first

No, and you should design for that. Deliveries are retried independently, so a retry of an earlier event can land after a later one. Sort on occurred_at and make your handler idempotent using the event id. We would rather state this plainly than let you discover it during a close.

Delivery is retried on an exponential backoff across six attempts before the event is marked failed. Nothing is discarded while attempts continue, every attempt is written to the delivery log, and you can replay any failed delivery by hand rather than waiting for the schedule.

No — by design. Documents return metadata and a pointer into your own SharePoint. Your firm already governs retention and access there, and duplicating client files into a second store would mean securing, retaining and eventually disposing of them twice.

It should not. Where a first-party connection exists — Microsoft 365, Xero, QuickBooks Online, Stripe, GoCardless, Gmail — it is maintained by us and will not drift when either side changes a field. The API is for the part no supported integration covers.

Not today. There is no published app or certified connector for either. Both can call the API as a generic HTTP request, but you are wiring and maintaining that yourself — so treat it as a custom integration rather than a supported one.

No. There is no app marketplace, partner directory or distribution mechanism. Credentials are issued to a firm, and what you build runs against your own firm’s data.

Breaking changes ship behind a version, and anything you depend on is announced before it is retired. Decide who in your firm watches for deprecation notices before you have forty integrations, not after.

Stop reconciling a copy of your own data

API access is opening with our founding-customer group. Tell us the one job you would automate first, and we will tell you honestly whether the API is the right tool for it — or whether a built-in connection already covers it.

Full reference documentation publishes with general availability.

API & webhooks Opening with the founding-customer group
Request API access

Start Smarter. Grow Faster.

From proposals to pricing, streamline every step with automation designed particularly for accountants, bookkeepers and tax advisers.

30-Minute Live Practice Walkthrough

Bring your messiest client to the demo

No scripted sales pitches. Just 30 minutes with a practice specialist walking through your firm’s real-world workflows and bottlenecks.

Rated 4.9/5 on G2 & Capterra 30-minute tailored session No credit card required
Live Practice Stream
Real-Time Sync
Apex Advisory LLC · Form 1120-S Auto-Captured
Website Intake & CRM Pipeline Provisioned
Engagement Letter & Scope E-Signed
Integrated E-Signatures Legally Binding Scope
SharePoint Vault & Jobs M365 Native
Firm SharePoint Tenant Jobs & Deadlines Active
Invoice #2026-884 · $4,500 Paid via ACH
Instant Bank Reconciliation 100% Collected
100% M365 Native
0 Re-keying
14 hrs Saved / Wk
Single Persistent Architecture · Zero Data Silos
SOC2 Type II & M365 Encrypted
Unified Spine

One Persistent Client Record

Eliminate 5 disconnected tools. One single truth from initial web inquiry to final tax archive.

Zero-Cloud Host

Your Microsoft 365 Tenant

Files, auth, and permissions remain inside your own SharePoint. Zero third-party file storage.

48-Hr Setup

Zero Migration Friction

Live in under 48 hours with white-glove onboarding tailored directly to your firm's pipeline.

Your privacy choices

We use cookies to improve site performance, remember preferences, and measure marketing effectiveness. You can accept all cookies, reject non-essential ones, or choose categories.