Skip to content New SourceLoop MCP: chat with your attribution data in Claude, ChatGPT & Cursor
SourceLoop
API reference

Changes

What changed since your last run. The incremental endpoint automations poll instead of refetching a window. Endpoints, parameters, and schemas.

Endpoint Method Path Permission
List changes What changed since your last run GET /v1/changes conversions:read

Base URL https://app.sourceloop.ai/api/v1

List changes

What changed since your last run

GET /v1/changes

Requires conversions:read

The endpoint automations are built on. Poll it with the cursor from your last run instead of refetching a window and diffing client-side.

Every change carries a `source`, so your job can skip its own writes rather than reacting to them and looping.

Oldest first. Every response carries `next_cursor` (an empty page returns the one you sent): store it and pass it on the next run to receive only newer changes. A change is served once it is 15 seconds old, so none is skipped. A first run starts from `since` (at most 90 days back).

curl -s -X GET "https://app.sourceloop.ai/api/v1/changes" \
  -H "Authorization: Bearer $SOURCELOOP_API_KEY"
const res = await fetch(
  "https://app.sourceloop.ai/api/v1/changes",
  {
    method: "GET",
    headers: {
      Authorization: `Bearer ${process.env.SOURCELOOP_API_KEY}`,
    },
  },
);

const data = await res.json();
import os, requests

res = requests.get(
    "https://app.sourceloop.ai/api/v1/changes",
    headers={"Authorization": f"Bearer {os.environ['SOURCELOOP_API_KEY']}"},
)
data = res.json()

Query parameters

sincestring (date-time)

Where a first run starts. Defaults to 24 hours ago. Ignored once you pass a cursor.

cursorstring

next_cursor from your previous call.

typesstring

Allowed values4

  • conversion.created
  • conversion.value_changed
  • stage.changed
  • deal.stage_changed

limitinteger

Default 100

Responses

  • 200 Changes
  • 400 Something was wrong with the request or the credential.
  • 429 Too many requests for this workspace in the current minute (`rate-limit-exceeded`), the monthly allowance used (`quota-exceeded`), or too many analytics queries running at once (`too-many-concurrent`). Wait Retry-After seconds and repeat the request unchanged.

Track every conversion to its true source

Capture and send full attribution data from every signup, lead, booking, and sale to your CRM and ad platforms, so you know exactly what's driving revenue.

Without SourceLoop

Untagged

Kayden Floyd

kayden@abc.com

  • SourceUnknown
  • MediumUnknown
  • CampaignUnknown
  • Landing pageUnknown
Journey
No touchpoints captured

With SourceLoop

Auto-tagged

Kayden Floyd

kayden@abc.com · Acme Co.

  • Channel Paid Social
  • CampaignFree_demo
  • Landing page/pricing
Journey
Synced to HubSpot Google Ads Meta