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

Funnels

Step-by-step conversion funnels with drop-off between stages. REST endpoints, parameters, and response schemas for the SourceLoop attribution API.

Endpoint Method Path Permission
Get funnel Stage-to-stage conversion GET /v1/funnels metrics:read

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

Get funnel

Stage-to-stage conversion

GET /v1/funnels

Requires metrics:read

How many entities entered each stage of a funnel, and the drop-off between them. Pass `stages` in the order they happen; GET /v1/pipelines lists the stage vocabulary this workspace uses.

Counted over the WHOLE population, including people the tracker never saw: imported contacts, deals closed over the phone, customers who predate the script. That is why these rates are lower than a session-based funnel, and why they are the honest ones.

These are not a cohort. Somebody counted at a late stage may have entered the first one before the window, so a step rate above 100% is possible.

To credit a stage to the marketing that produced it, use GET /v1/metrics with `stages` and an attribution model instead.

curl -s -X GET "https://app.sourceloop.ai/api/v1/funnels?website=acme.com&period=last%2030%20days&stages=lead%2Cmql%2Ccustomer" \
  -H "Authorization: Bearer $SOURCELOOP_API_KEY"
const res = await fetch(
  "https://app.sourceloop.ai/api/v1/funnels?website=acme.com&period=last%2030%20days&stages=lead%2Cmql%2Ccustomer",
  {
    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/funnels?website=acme.com&period=last%2030%20days&stages=lead%2Cmql%2Ccustomer",
    headers={"Authorization": f"Bearer {os.environ['SOURCELOOP_API_KEY']}"},
)
data = res.json()

Query parameters

websitestring

Website domain, e.g. acme.com. Required only when the key covers more than one.

periodstring

Plain-language period: "last 30 days", "yesterday", "July 2026", or "2026-07-01..2026-07-31". Ignored when from/to are given.

Example last 30 days

stagesstringrequired

Comma-separated stage keys, in funnel order.

Example lead,mql,customer

Responses

  • 200 One row per stage
  • 400 Something was wrong with the request or the credential.
  • 429 Too many requests for this workspace in the current minute. 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