Human-in-the-loop for finance agents

Money moves when a person says so.

The approver signs off from their phone, the agent blocks until they do, and the record is kept without you building one.

How do I put a human approval step in front of an AI finance agent?

Pushary gives a finance agent one call that waits for a named approver. Put decisions.ask() in front of the payment run, the journal entry, or the write-off, and the agent holds until that person approves or declines. Nothing resolves on a timeout except denial, and every decision lands in a durable ledger you can export when someone asks who authorised it.

Where it stops

The calls that should not be automatic

executePaymentRun(batchId)
A batch payment is many irreversible actions in one call, which makes it the single worst thing to leave to a confidence threshold.
postJournalEntry(entry)
An entry posted to a closed or nearly closed period is the kind of correction that turns into a restatement conversation.
writeOffBalance(accountId, amount)
Writing off a receivable is a judgement about collectability, and the agent has the ageing report while the controller has the context.
changeVendorBankDetails(vendorId, iban)
This is the exact step invoice fraud targets, which is why the manual version already requires a second person to confirm out of band.

The integration

Two calls inside the step you already have

Wrap the action, not the whole agent. Everything the agent does that is safe keeps running without asking anyone.

pip install pusharytwo calls
from pushary import Pushary

px = Pushary(api_key=os.environ["PUSHARY_API_KEY"])

def run_payments(batch, approver_id):
    total = sum(p.amount for p in batch.payments)

    decision = px.decisions.ask(
        external_id=approver_id,
        type="confirm",
        question=(
            f"Release {len(batch.payments)} payments totalling "
            f"{total:,.2f} {batch.currency}? Largest: {batch.largest.payee}."
        ),
    )

    if not decision.approved:
        return hold_batch(batch, reason="not approved")
    return execute_payment_run(batch.id)

Who answers

The approver is usually not an engineer

The approver is a controller, a finance director, or a company owner, and the pattern they already follow is a second person confirming before money leaves. That habit predates any of this software, which is the useful part: nobody in finance needs convincing that the step should exist. What they push back on is a tool that makes the second person a bottleneck. Approvals that live in a portal get done in a batch once a day, and a payment run held for a day has real consequences for the people waiting to be paid. Pushary reaches the approver by the id you already have and returns their answer to the agent, so the control stays and the delay does not.

Finance already has approval workflows. Why would we add another?

You are not adding an approval workflow, you are giving the agent a way to use the one you have. Existing finance approvals assume a human initiated the transaction and a human will come back to a screen to release it. An agent that assembles the payment run itself has neither of those assumptions available. It needs a call it can wait on, a timeout that denies rather than proceeds, and a record that ties the release to a named person. Building that yourself means writing a poller, a durable wait, and an evidence store, and then keeping all three correct while the finance team changes who approves what. Pushary is that plumbing, and it defers to your existing approval matrix for who gets asked.

Worth reading: PCAOB auditing standards.

$99/ month, Partner plan

Embed it in your product. Your users never see a Pushary login or bill.

FAQ

Questions, answered

Put a person on the step that needs one.

Connect a user with one tap, ask a human with one call, and act on a fail-closed decision. Every decision is saved to a durable ledger you can audit.