Open source · self-hosted · alpha

Data handoffs
for AI agents

Padhoc moves data from one agent to another, and from agents into the systems they work with: your e-mail platform, your CRM, an ad account. You host it, so you decide what an agent may do with every file. Rows never enter the model.

A sealed file travels from one agent to another and waits at Padhoc until it is approved Agent Padhoc Agent
An approval request in the Padhoc console, with demo data

Your agent works with the shape of the data. The rows stay out of the model

Reports carry counts, distributions and five masked examples. Below 100 rows the agent gets only the count, and no query can be pointed at one person's address. To move a file, it passes on an ID.

  • Read-only queries on views you define
  • A person, or a rule a person set, approves the exact file and where it goes
  • Every file signed, every handoff in the audit log
What the agent gets backget_snapshot
{
  "number": 1042,
  "status": "sealed",
  "purpose": "marketing",
  "key": { "column": "email", "type": "email" },
  "rows": { "count": 2104, "invalid": 0, "duplicates": 0 },
  "fingerprint": "sha256:9f3a1c07e2b4…",
  "report": {
    "distributions": {
      "city": { "values": [
        { "value": "Amsterdam", "count": 688 },
        { "value": "Rotterdam", "count": 541 },
        …
      ] }
    },
    "examples": [{ "email": "j***@example.org", "city": "Amsterdam" }, …]
  }
}

Abridged. No rows, no download links

Three ways a file moves

You pick the route per destination. On every route the model sees identifiers and counts, never rows.

Agent to agentAvailable

Pass an ID, not the data

One agent seals a list and passes on its ID. Another agent reads the report and requests the delivery; a service picks the file up with a grant and checks the signature before it trusts a byte.

agent A→#1042→agent B
Agent to systemAvailable

The platform fetches it

After approval, Padhoc gives Brevo a link to the file or drops it in your bucket. Platforms that pull on a schedule, like Google's Data Manager, read the latest approved file from a feed address.

Padhoc→BrevoS3
Agent's own toolsNext

The agent carries it

After approval the agent gets a single-use grant. Its sandbox redeems it and calls the platform's API, for Meta, Klaviyo or ActiveCampaign. The model sees the grant and the counts.

grant→sandbox→Meta API

Browser use covers the one-time setup in a platform's interface, such as linking an ad account. When an upload happens there, the file goes from disk to the upload field, not through the model.

One handoff, call by call

Your agent talks to Padhoc over MCP: point any MCP client at /mcp with an agent token. This is the whole session for one list, from the request to Brevo's answer. Each step lands in the audit log.

An agent session, abridgedpadhoc · /mcp
1

Ask

The agent reads the catalog and previews a query. Padhoc checks the SQL, runs it read-only and answers with counts and masked examples. Nothing is stored.

Build an audience of active Dutch customers in the gold tier and deliver it to Brevo as ‘October newsletter’.

describe_sourcesource: "demo-store"
datasets
marketing_contacts
segments
active_customer · gold_tier · recent_signup
preview_querysource: "demo-store", purpose: "marketing"
SELECT email, first_name, city
FROM marketing_contacts
WHERE {{segment:active_customer}}
  AND {{segment:gold_tier}}
  AND country = 'NL'
estimated_rows
2104
city
Amsterdam 688 · Rotterdam 541 · Utrecht 463 …
examples
j***@example.org · J*** · Amsterdam, and 4 more

2,104 customers match, most of them in Amsterdam, Rotterdam and Utrecht. I'll seal this query.

2

Seal

The same query becomes a snapshot: read once, written as Parquet and signed. Change one byte and the fingerprint changes.

create_snapshotthe same source, purpose and query
number
1042
status
queued
get_snapshotsnapshot_id: "1042"
status
sealed
rows
2104, 0 invalid, 0 duplicates
fingerprint
sha256:9f3a1c07e2b4…
3

Approve

The agent asks for a delivery under a list name. Padhoc renders the file Brevo takes, and a logged-in person approves that exact file, or a rule a person set does. No tool can approve.

deliver_snapshotsnapshot_id: "1042", destination: "brevo", list_name: "October newsletter"
status
rendering

Snapshot #1042 is sealed and signed. The delivery to Brevo is waiting for your approval in Padhoc.

A person approves #1042 for BrevoIn the Padhoc console, outside this chat

4

Hand off

Padhoc hands Brevo the approved file and records Brevo's answer. The agent only reads the outcome.

get_deliverydelivery_id: "0b6c4e1a-…"
status
delivered
result
brevo_list_id 37 · rows 2104

Done. Brevo has a new list, “padhoc-1042-October newsletter”, with 2,104 contacts.

What entered the model: counts, masked examples and IDs0 rows

You decide what an agent may do

Padhoc runs on your infrastructure, so the rules are yours. They hold whatever the agent is told, because they live in the system and not in the prompt.

An agent can

  • Query the views and columns you published
  • Preview counts, distributions and masked examples
  • Seal snapshots for the purposes its token allows
  • Request delivery to destinations an admin activated
  • Propose a destination for an admin to reviewNext
  • Carry an approved file with a single-use grant, if its token allows itNext

An agent cannot

  • See a row in its context
  • Approve a delivery or set an approval rule
  • Send data to an address it made up
  • Activate a destination
  • Change a sealed file
  • Export a column you marked as internal
Enforced by your database

A read-only role on views

The views are the policy: consent filters and allowed columns live there, so a query can't forget them.

Enforced by Padhoc

Catalog, checks and approvals

One SELECT on released datasets, token scopes per source and purpose, and human approval unless you set an auto-approval rule.

Enforced by storage

Sealed, signed, expiring

Files are never overwritten and every byte is in the fingerprint. The data expires; the proof of who was on the list stays.

Wherever a list drives an action

E-mail audiences come first. The same handoff works for any list of people or records that feeds a decision.

Agents

Agent-to-agent handoff

One agent builds the list and another acts on it. They pass a snapshot ID between them, and the data stays put.

any key

Marketing

E-mail campaigns

Your agent builds an audience and hands it to Brevo or Resend as a fresh list, with proof of who was on it and why.

key: email

Segments that stay current

Your agent saves a segment and refreshes it on its own schedule. Every refresh is a sealed file; a rule you set lets small changes through and sends the rest to a person.

any key

Ad audiencesNext

Hand Meta or Google a hashed audience once it is approved, so you can show later which list fed which campaign.

key: email, phone

Audience research

Ask how big a segment is, how it splits by country or tier, and how it overlaps with another. No row leaves the database.

counts only

Holdout groups

Split an audience with a fixed rule and seal both halves. Months later you still know who got the campaign and who did not.

key: id

Agencies and partners

Share the minimum dataset through a grant that expires, with a log of who fetched it and when.

any key

Operations

Required notices

Outage, recall, price change or data breach: record exactly who was affected at the moment you sent the notice.

key: email, phone

Vouchers and payouts

Hand finance a frozen, approved list of accounts, so the list that was approved is the list that gets paid.

key: id

Data

Reproducible datasets

Rerun an analysis or a model evaluation on exactly the same rows, with a fingerprint to prove it.

key: id

On the roadmap

Agent-carried deliveries with single-use grants, files rendered per destination and hashed for ad platforms, skills for Meta, Klaviyo and ActiveCampaign, and delta files for platforms with add and remove APIs.

Open source, hosted by you

Run Padhoc next to your data, in PostgreSQL or behind Trino in your lakehouse: one Docker Compose stack with the API, the console, the MCP server, a worker, Postgres and S3-compatible storage. Keys stay in your environment, and only approved files leave it. A demo database is included.

Server and console
AGPL-3.0
Snapshot spec and SDKs
Apache-2.0
Documentation
CC-BY-4.0
pip install padhoc npm i @padhoc/sdk
Quickstart
# clone and start the stack
git clone https://github.com/padhoc/padhoc && cd padhoc
docker compose -f deploy/docker-compose.yml up -d --build

# create the first admin, then seed the demo workspace
docker compose -f deploy/docker-compose.yml logs api | grep -A2 "one-time link"
docker compose -f deploy/docker-compose.yml run --rm seed

open http://localhost:8000
Then ask your agent “Build an audience of active Dutch customers in the gold tier and deliver it to Brevo as ‘October newsletter’.”

Give your agents a place to hand off data

Run the demo store, let your agent build a list, approve it, and watch it move