Pull your data.
Skip the plumbing.
Your customers connect their own Instagram and Meta Ads accounts. Pullsy pulls the history, keeps it current, and hands it back through one REST API in a schema that does not change when Meta’s does.
Built on the platforms’ own APIs, with the account owner’s consent. Nothing is scraped and no password is ever shared. The trial needs no card.
$ curl "…/api/v1/instagram/media?media_product_type=REELS" \
-H "Authorization: Bearer pk_live_…"
{ "data": [ { "external_media_id": "1800…",
"media_type": "VIDEO",
"published_at": "2026-09-08T10:12:00Z",
"like_count": 812,
"comments_count": 44 } ],
"pagination": { "page": 1, "limit": 50, "has_more": true } }sync · meta_ads · act_1094…
The same data, wanted for two different reasons
Developers want to stop maintaining an integration. Agencies want every client's numbers in one place. Pullsy is the same product either way — these are just the two doors.
I'm building a product
Ship the feature, not the integration
Your customers connect their own accounts. You call one REST API with a key you scope yourself, and get back a schema that does not change when Meta's does.
- OAuth, token refresh and re-auth handled — including the reconnect prompt when Meta invalidates a token
- One normalized schema across providers, versioned endpoints, cursor-free page/limit pagination
- Scoped API keys (data:read, sync:write, connections:write) with per-key rate limits in the response headers
I run accounts for clients
Every client's numbers, in one place, already current
Connect each client once. Pullsy keeps the history, separates the clients, and gives your team a dashboard that says plainly when something needs attention.
- A workspace per client, so one account's data can never appear under another
- Roles and per-seat billing — invite the strategist without handing over the ad account, and let clients view for free
- Connection health that names the problem, instead of a chart that quietly goes flat
Somebody has to write this loop. It does not have to be you.
Meta answers 20 separate questions about a single day, in a shape nobody would design on purpose — conversions nested in an array, numbers as strings, a field whose meaning changes with the level you asked at. Every team that touches this API writes the same normalizer, then maintains it.
20 readings of one day
{ "date_start": "2026-09-16",
"ad_id": "1204…",
"spend": "184.22",
"impressions": "51204",
"actions": [
{ "action_type": "purchase", "value": "37" },
{ "action_type": "link_click", "value": "1402" }
],
"publisher_platform": "instagram" }Meta will not combine most of its breakdowns with each other, so covering them means one request per split — each its own resource, checkpointing and retrying on its own.
one row, per entity, per day
| date | level | entity_id | breakdown_set | spend | impressions | clicks | purchase |
|---|---|---|---|---|---|---|---|
| 2026-09-16 | ad | 1204… | placement | 184.22 | 51204 | 1402 | 37 |
Typed, flat, and keyed — the conversions unpacked out of the nested array into columns you can filter. The same shape whether the source was Instagram or Meta Ads.
Never sum across the readings: each is a full accounting of the same days, so adding two together doubles the spend. The /summary endpoint totals them server-side so you never have to — how the Meta Ads connector works.
Two platforms, read completely
Not a thin wrapper over the three fields everybody returns. Each connector is built to the edge of what the platform will give you, and says plainly where that edge is.
Profiles, every post and reel, and the insights behind them — captured daily so the history exists whether or not you were watching.
Meta Ads
Campaigns, ad sets and ads with spend, delivery and conversions — split twenty ways, because one number for the day answers almost nothing.
Comment-to-DM — the keyword-in-a-comment, link-in-a-DM automation — is built and waiting on Meta’s App Review. Until it clears, here is what Instagram actually allows a tool like it to do.
And then it becomes something you can send
Reach, saves, link taps and story exits are the figures Instagram shows nobody but the account holder. Graded on seven pillars, they become a letter — behind a link that recomputes when a brand opens it and prints the sample it was drawn from.
67.7%
Reach per post
6.8%
Engaged, of reached
14.2
Link taps / 1k
Three steps, then it runs itself
01
Connect
Your customer authorizes their own Instagram or ad account through Meta. No password is ever shared with you or with us.
02
Sync
Pullsy backfills the history, then keeps it current every hour — retrying, checkpointing and reporting what it did.
03
Query
Read it from the REST API with a scoped key, or from the dashboard. Same data, same schema, either way.
Per seat, per month, in your currency
Owners and admins are billed seats; members who only view are free. Connections are the limit that scales with the plan.
Billed monthly in INR. Every organization starts with a 14-day free trial.
Owners and admins are billed seats. Members who only view are free.
Before you sign up
Is this scraping?
No. Every connector uses the platform's official API — Instagram Login for Business, and the Meta Marketing API — with the account owner's consent through the normal authorization flow. Nothing is scraped and no password is ever shared.
How fresh is the data?
Syncs run hourly on every plan, and every thirty minutes on Pro. You can also trigger a sync yourself from the dashboard or the API, and watch the job while it runs.
How far back does the history go?
Starter keeps ninety days. Growth and Pro keep the full history the platform will give us, which for most Meta Ads breakdowns is thirty-seven months and shorter for a few of them — the API tells you which window it answered for rather than guessing.
What counts as a connection?
One Instagram account, or one Meta ad account. Starter includes three, Growth twenty, Pro a hundred.
How does billing work?
Per seat, per month, in INR or USD — every owner and admin is one seat, so the bill follows the size of the team doing the work rather than a guess at it. Members only view, and are free: a creator or client can see their own numbers without adding to the bill. You pick the currency at signup and can change it until the first paid subscription starts.
What do I get during the free trial?
Fourteen days with one connection, up to three members and thirty days of history — enough to connect a real account and query real data. No card is asked for, and nothing charges automatically when it ends.
Who can see our data?
Your organization, and the sub-processors listed on the security page — the database, the hosts, the platforms the data comes from, and the payment and email providers. We do not sell data and we do not pool it across customers.
What happens if we cancel?
You can disconnect an account at any time, which wipes its stored credentials immediately while leaving the data you already pulled. Closing the workspace deletes the data with it.
Start pulling in about ten minutes
Connect one real account, run a sync, and query it. That is the whole evaluation — no call, no card.

