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 } }
Three of the endpoints. Every list is paginated, every key is scoped, every limit is in the response headers.

sync · meta_ads · act_1094…

Replay
    Pulling incrementally since the last checkpoint…
    A replay of a Meta Ads sync: the resources it walks, in the order it walks them. The counts are illustrative.

    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
    Read the API overview

    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
    See pricing

    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

    datelevelentity_idbreakdown_setspendimpressionsclickspurchase
    2026-09-16ad1204…placement184.2251204140237

    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.

    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.

    How the account grade works
    B+78.7 / 100
    Strong
    • 67.7%

      Reach per post

    • 6.8%

      Engaged, of reached

    • 14.2

      Link taps / 1k

    Three steps, then it runs itself

    1. 01

      Connect

      Your customer authorizes their own Instagram or ad account through Meta. No password is ever shared with you or with us.

    2. 02

      Sync

      Pullsy backfills the history, then keeps it current every hour — retrying, checkpointing and reporting what it did.

    3. 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.

    Starter

    ₹1,499/seat/month

    • 3 connections
    • Hourly synchronization
    • 90 days of history
    • API access
    Get started

    Growth

    Popular

    ₹3,999/seat/month

    • 20 connections
    • Hourly synchronization
    • Full historical data
    • API access
    Get started

    Pro

    ₹11,999/seat/month

    • 100 connections
    • 30-minute synchronization
    • Full historical data
    • Higher API limits
    Get started

    Full comparison, trial limits and billing questions

    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.