Docs
Dashboard
On this page

    Analytics

    50 endpoints. Each needs an API key or OAuth token with the scope shown; the key already names its store, so paths start at /v1/store. Generated from the live contract; also in openapi.json.

    KPIs, daily series, top products, methods, countries, funnel

    GET/v1/store/analytics

    Or name the store: GET /v1/stores/{storeId}/analytics

    analytics:readgetAnalytics

    Parameters

    • range"7d" | "30d" | "90d"query

    Response AnalyticsOverview

    • rangeAnalyticsRangerequired
    • currencyCurrencyCoderequired
    • fromIsoDaterequired
    • toIsoDaterequired
    • kpisobjectrequired
      • revenueMinorKpirequired
      • ordersKpirequired
      • visitorsKpirequired
      • conversionBpsKpirequired
      • averageOrderMinorKpirequired
      • newCustomersKpirequired
      • refundsMinorKpirequired
      • medianDeliveryMsKpirequired
    • seriesobject[]required
      • dateIsoDaterequired
      • revenueMinorMinorUnitsrequired
      • ordersintegerrequired
      • visitorsintegerrequired
    • topProductsobject[]required
      • productIdProductIdrequired
      • namestringrequired
      • unitsSoldintegerrequired
      • revenueMinorMinorUnitsrequired
    • paymentMethodsobject[]required
      • methodPaymentMethodrequired
      • ordersintegerrequired
      • revenueMinorMinorUnitsrequired
    • countriesobject[]required
      • countryCountryCoderequired
      • ordersintegerrequired
      • revenueMinorMinorUnitsrequired
    • funnelobjectrequired
      • visitorsintegerrequired
      • productViewsintegerrequired
      • addedToCartintegerrequired
      • checkoutsintegerrequired
      • paidintegerrequired
    • timezonestringrequired
    • trafficobjectrequired
      • sessionsintegerrequired
      • convertedSessionsintegerrequired
      • source"pipeline" | "visits"required

    Example

    curl "https://api.shopfa.st/v1/store/analytics" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics', {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "GET",
        "https://api.shopfa.st/v1/store/analytics",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/analytics", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Home KPIs, series, funnel and top lists for any date preset

    GET/v1/store/analytics/overview

    Or name the store: GET /v1/stores/{storeId}/analytics/overview

    analytics:readgetGrowthOverview

    Parameters

    • range"today" | "yesterday" | "7d" | "30d" | "90d" | "this_month" | "last_month" | "6mo" | "ytd" | "365d" | "custom"query
    • fromstring | nullquery
    • tostring | nullquery
    • bucket"hour" | "day" | "week" | "month" | nullquery

    Response GrowthOverview

    • rangeGrowthRangerequired
    • fromIsoDaterequired
    • toIsoDaterequired
    • periodAnalyticsPeriodrequired
    • currencyCurrencyCoderequired
    • kpisobjectrequired
      • revenueMinorobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • ordersobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • visitorsobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • conversionBpsobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • averageOrderMinorobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • newCustomersobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • refundsMinorobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • medianDeliveryMsobjectrequired
        • valuenumberrequired
        • previousnumberrequired
    • seriesobject[]required
      • dateIsoDaterequired
      • hourinteger | nullrequired
      • revenueMinorMinorUnitsrequired
      • ordersintegerrequired
      • visitorsintegerrequired
    • topProductsobject[]required
      • productIdProductIdrequired
      • namestringrequired
      • unitsSoldintegerrequired
      • revenueMinorMinorUnitsrequired
    • paymentMethodsobject[]required
      • methodPaymentMethodrequired
      • ordersintegerrequired
      • revenueMinorMinorUnitsrequired
    • countriesobject[]required
      • countryCountryCoderequired
      • ordersintegerrequired
      • revenueMinorMinorUnitsrequired
    • funnelobjectrequired
      • visitorsintegerrequired
      • productViewsintegerrequired
      • addedToCartintegerrequired
      • checkoutsintegerrequired
      • paidintegerrequired

    Example

    curl "https://api.shopfa.st/v1/store/analytics/overview" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/overview', {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "GET",
        "https://api.shopfa.st/v1/store/analytics/overview",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/analytics/overview", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Gross to net, refunds, disputes, methods and hours

    GET/v1/store/analytics/sales

    Or name the store: GET /v1/stores/{storeId}/analytics/sales

    analytics:readgetSalesAnalytics

    Parameters

    • range"today" | "yesterday" | "7d" | "30d" | "90d" | "this_month" | "last_month" | "6mo" | "ytd" | "365d" | "custom"query
    • fromstring | nullquery
    • tostring | nullquery
    • bucket"hour" | "day" | "week" | "month" | nullquery

    Response SalesAnalytics

    • rangeGrowthRangerequired
    • fromIsoDaterequired
    • toIsoDaterequired
    • periodAnalyticsPeriodrequired
    • currencyCurrencyCoderequired
    • totalsobjectrequired
      • grossMinorobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • discountsMinorobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • netMinorobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • taxMinorobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • feesMinorobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • sellerNetMinorobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • ordersobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • unitsSoldobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • averageOrderMinorobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • refundsMinorobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • refundsobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • disputesMinorobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • disputesobjectrequired
        • valuenumberrequired
        • previousnumberrequired
    • dailyobject[]required
      • dateIsoDaterequired
      • hourinteger | nullrequired
      • ordersintegerrequired
      • unitsintegerrequired
      • grossMinorMinorUnitsrequired
      • netMinorMinorUnitsrequired
      • refundsMinorMinorUnitsrequired
      • feesMinorMinorUnitsrequired
    • byStatusobject[]required
      • statusOrderStatusrequired
      • ordersintegerrequired
      • totalMinorMinorUnitsrequired
    • byMethodobject[]required
      • methodPaymentMethodrequired
      • ordersintegerrequired
      • netMinorMinorUnitsrequired
    • byHourobject[]required
      • hourintegerrequired
      • ordersintegerrequired

    Example

    curl "https://api.shopfa.st/v1/store/analytics/sales" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/sales', {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "GET",
        "https://api.shopfa.st/v1/store/analytics/sales",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/analytics/sales", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Per-product units, revenue, refunds and ratings

    GET/v1/store/analytics/products

    Or name the store: GET /v1/stores/{storeId}/analytics/products

    analytics:readgetProductAnalytics

    Parameters

    • range"today" | "yesterday" | "7d" | "30d" | "90d" | "this_month" | "last_month" | "6mo" | "ytd" | "365d" | "custom"query
    • fromstring | nullquery
    • tostring | nullquery
    • bucket"hour" | "day" | "week" | "month" | nullquery

    Response ProductAnalytics

    • rangeGrowthRangerequired
    • fromIsoDaterequired
    • toIsoDaterequired
    • periodAnalyticsPeriodrequired
    • currencyCurrencyCoderequired
    • bucketsBucketKey[]required
    • productsobject[]required
      • productIdProductIdrequired
      • namestringrequired
      • typeProductTyperequired
      • imageUrlstringrequired
      • ordersintegerrequired
      • unitsintegerrequired
      • revenueMinorMinorUnitsrequired
      • previousRevenueMinorMinorUnitsrequired
      • refundsintegerrequired
      • refundRateBpsBpsrequired
      • ratingnumberrequired
      • reviewsintegerrequired
      • shareBpsBpsrequired
      • dailyinteger[]required
    • byTypeobject[]required
      • typeProductTyperequired
      • unitsintegerrequired
      • revenueMinorMinorUnitsrequired

    Example

    curl "https://api.shopfa.st/v1/store/analytics/products" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/products', {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "GET",
        "https://api.shopfa.st/v1/store/analytics/products",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/analytics/products", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    New and returning customers, lifetime value, top buyers

    GET/v1/store/analytics/customers

    Or name the store: GET /v1/stores/{storeId}/analytics/customers

    analytics:readgetCustomerAnalytics

    Parameters

    • range"today" | "yesterday" | "7d" | "30d" | "90d" | "this_month" | "last_month" | "6mo" | "ytd" | "365d" | "custom"query
    • fromstring | nullquery
    • tostring | nullquery
    • bucket"hour" | "day" | "week" | "month" | nullquery
    • customerstring | nullquery
    • topSort"customer" | "country" | "orders" | "spent"query
    • topDir"asc" | "desc"query
    • countrystring | nullquery
    • countriesSort"country" | "customers" | "revenue"query
    • countriesDir"asc" | "desc"query

    Response CustomerAnalytics

    • rangeGrowthRangerequired
    • fromIsoDaterequired
    • toIsoDaterequired
    • periodAnalyticsPeriodrequired
    • currencyCurrencyCoderequired
    • totalsobjectrequired
      • customersobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • newCustomersobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • returningCustomersobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • repeatRateBpsobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • averageLifetimeMinorobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • ordersPerCustomerobjectrequired
        • valuenumberrequired
        • previousnumberrequired
    • dailyobject[]required
      • dateIsoDaterequired
      • hourinteger | nullrequired
      • newCustomersintegerrequired
      • returningCustomersintegerrequired
    • segmentsCustomerCountsrequired
    • topCustomersobject[]required
      • customerIdCustomerIdrequired
      • namestringrequired
      • emailstringrequired
      • ordersintegerrequired
      • spentMinorMinorUnitsrequired
      • countrystringrequired
    • countriesobject[]required
      • countrystringrequired
      • customersintegerrequired
      • revenueMinorMinorUnitsrequired

    Example

    curl "https://api.shopfa.st/v1/store/analytics/customers" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/customers', {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "GET",
        "https://api.shopfa.st/v1/store/analytics/customers",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/analytics/customers", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Visitors, the funnel, sources, referrers and landing pages

    GET/v1/store/analytics/traffic

    Or name the store: GET /v1/stores/{storeId}/analytics/traffic

    analytics:readgetTrafficAnalytics

    Parameters

    • range"today" | "yesterday" | "7d" | "30d" | "90d" | "this_month" | "last_month" | "6mo" | "ytd" | "365d" | "custom"query
    • fromstring | nullquery
    • tostring | nullquery
    • bucket"hour" | "day" | "week" | "month" | nullquery

    Response TrafficAnalytics

    • rangeGrowthRangerequired
    • fromIsoDaterequired
    • toIsoDaterequired
    • periodAnalyticsPeriodrequired
    • currencyCurrencyCoderequired
    • totalsobjectrequired
      • visitorsobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • visitsobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • pageViewsobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • productViewsobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • checkoutsobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • ordersobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • conversionBpsobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • checkoutRateBpsobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • bounceRateBpsobjectrequired
        • valuenumberrequired
        • previousnumberrequired
      • pagesPerVisitorobjectrequired
        • valuenumberrequired
        • previousnumberrequired
    • funnelobjectrequired
      • visitorsintegerrequired
      • productViewersintegerrequired
      • cartAddersintegerrequired
      • checkoutStartersintegerrequired
      • ordersintegerrequired
    • dailyobject[]required
      • dateIsoDaterequired
      • hourinteger | nullrequired
      • visitorsintegerrequired
      • pageViewsintegerrequired
      • productViewsintegerrequired
      • checkoutsintegerrequired
      • ordersintegerrequired
    • sourcesobject[]required
      • sourcestringrequired
      • mediumstringrequired
      • visitsintegerrequired
      • ordersintegerrequired
      • revenueMinorMinorUnitsrequired
      • conversionBpsBpsrequired
    • referrersobject[]required
      • hoststringrequired
      • visitsintegerrequired
    6 more fields
    • landingPagesobject[]required
      • pathstringrequired
      • visitsintegerrequired
    • pagesobject[]required
      • pathstringrequired
      • viewsintegerrequired
      • entriesintegerrequired
    • devicesobject[]required
      • deviceVisitorDevicerequired
      • visitorsintegerrequired
    • browsersobject[]required
      • namestringrequired
      • visitorsintegerrequired
    • systemsobject[]required
      • namestringrequired
      • visitorsintegerrequired
    • countriesobject[]required
      • countrystringrequired
      • visitorsintegerrequired
      • ordersintegerrequired
      • revenueMinorMinorUnitsrequired

    Example

    curl "https://api.shopfa.st/v1/store/analytics/traffic" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/traffic', {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "GET",
        "https://api.shopfa.st/v1/store/analytics/traffic",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/analytics/traffic", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    UTM campaigns, promotions and affiliates

    GET/v1/store/analytics/campaigns

    Or name the store: GET /v1/stores/{storeId}/analytics/campaigns

    analytics:readgetCampaignAnalytics

    Parameters

    • range"today" | "yesterday" | "7d" | "30d" | "90d" | "this_month" | "last_month" | "6mo" | "ytd" | "365d" | "custom"query
    • fromstring | nullquery
    • tostring | nullquery
    • bucket"hour" | "day" | "week" | "month" | nullquery
    • detailsstring | nullquery
    • detailsSort"campaign" | "term" | "content" | "visitors" | "orders" | "revenue"query
    • detailsDir"asc" | "desc"query

    Response CampaignAnalytics

    • rangeGrowthRangerequired
    • fromIsoDaterequired
    • toIsoDaterequired
    • periodAnalyticsPeriodrequired
    • currencyCurrencyCoderequired
    • utmobject[]required
      • campaignstringrequired
      • sourcestringrequired
      • mediumstringrequired
      • visitsintegerrequired
      • ordersintegerrequired
      • revenueMinorMinorUnitsrequired
      • conversionBpsBpsrequired
    • utmDetailsobject[]required
      • campaignstringrequired
      • termstringrequired
      • contentstringrequired
      • visitorsintegerrequired
      • ordersintegerrequired
      • revenueMinorMinorUnitsrequired
    • promotionsobject[]required
      • idPromotionIdrequired
      • namestringrequired
      • statePromotionStaterequired
      • percentOffBpsBpsrequired
      • ordersintegerrequired
      • revenueMinorMinorUnitsrequired
      • savingsMinorMinorUnitsrequired
    • affiliatesobject[]required
      • idAffiliateIdrequired
      • namestringrequired
      • codestringrequired
      • clicksintegerrequired
      • ordersintegerrequired
      • revenueMinorMinorUnitsrequired
      • commissionMinorMinorUnitsrequired
    • totalsobjectrequired
      • attributedOrdersintegerrequired
      • attributedRevenueMinorMinorUnitsrequired
      • attributedShareBpsBpsrequired

    Example

    curl "https://api.shopfa.st/v1/store/analytics/campaigns" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/campaigns', {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "GET",
        "https://api.shopfa.st/v1/store/analytics/campaigns",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/analytics/campaigns", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    One analytics tab as CSV

    GET/v1/store/analytics/export

    Or name the store: GET /v1/stores/{storeId}/analytics/export

    analytics:readexportAnalytics

    Parameters

    • range"today" | "yesterday" | "7d" | "30d" | "90d" | "this_month" | "last_month" | "6mo" | "ytd" | "365d" | "custom"query
    • fromstring | nullquery
    • tostring | nullquery
    • bucket"hour" | "day" | "week" | "month" | nullquery
    • tab"overview" | "sales" | "products" | "customers" | "traffic" | "campaigns"queryrequired

    Response GrowthCsv

    • filenamestringrequired
    • csvstringrequired
    • rowsintegerrequired

    Example

    curl "https://api.shopfa.st/v1/store/analytics/export" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/export', {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "GET",
        "https://api.shopfa.st/v1/store/analytics/export",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/analytics/export", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Breakdowns, pivots and time series over sessions, with filters, a segment and the period before

    POST/v1/store/analytics/query

    Or name the store: POST /v1/stores/{storeId}/analytics/query

    analytics:writerole: analytics:readqueryAnalytics

    Body

    • periodobjectrequired
      • range"today" | "yesterday" | "7d" | "30d" | "90d" | "this_month" | "last_month" | "6mo" | "ytd" | "365d" | "custom"
      • fromstring | null
      • tostring | null
      • bucket"hour" | "day" | "week" | "month" | null
    • compareboolean
    • segmentIdasg_… | null
    • filtersobject[]
      • dimension"channel" | "source" | "medium" | "campaign" | "term" | "content" | "source_medium" | "referrer" | "landing" | "exit" | "country" | "region" | "city" | "device" | "browser" | "os" | "language" | "screen" | "visitor_type" | "consent" | "affiliate"required
      • op"is" | "is_not" | "contains" | "not_contains" | "starts_with"required
      • valuesstring[]required
    • queriesobject[]required
      • idstringrequired
      • dimension"channel" | "source" | "medium" | "campaign" | "term" | "content" | "source_medium" | "referrer" | "landing" | "exit" | "country" | "region" | "city" | "device" | "browser" | "os" | "language" | "screen" | "visitor_type" | "consent" | "affiliate" | nullrequired
      • pivot"channel" | "source" | "medium" | "campaign" | "term" | "content" | "source_medium" | "referrer" | "landing" | "exit" | "country" | "region" | "city" | "device" | "browser" | "os" | "language" | "screen" | "visitor_type" | "consent" | "affiliate" | null
      • metrics"visitors" | "sessions" | "new_visitors" | "pageviews" | "bounce_rate" | "avg_duration" | "pages_per_session" | "engaged_sessions" | "cart_adds" | "checkouts" | "conversions" | "conversion_rate" | "orders" | "revenue" | "revenue_per_visitor" | "aov"[]required
      • filtersobject[]
        • dimension"channel" | "source" | "medium" | "campaign" | "term" | "content" | "source_medium" | "referrer" | "landing" | "exit" | "country" | "region" | "city" | "device" | "browser" | "os" | "language" | "screen" | "visitor_type" | "consent" | "affiliate"required
        • op"is" | "is_not" | "contains" | "not_contains" | "starts_with"required
        • valuesstring[]required
      • sort"visitors" | "sessions" | "new_visitors" | "pageviews" | "bounce_rate" | "avg_duration" | "pages_per_session" | "engaged_sessions" | "cart_adds" | "checkouts" | "conversions" | "conversion_rate" | "orders" | "revenue" | "revenue_per_visitor" | "aov" | "dimension" | null
      • sortDir"asc" | "desc"
      • searchstring | null
      • limitinteger
      • seriesboolean

    Response AnalyticsQueryResult

    • periodAnalyticsPeriodrequired
    • currencyCurrencyCoderequired
    • resultsReportResult[]required
    • annotationsAnnotation[]required
    • msintegerrequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/analytics/query" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "period": {},
      "compare": true,
      "segmentId": null,
      "filters": [],
      "queries": [
        {
          "id": "string",
          "dimension": "channel",
          "metrics": [
            "visitors"
          ]
        }
      ]
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/query', {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "period": {},
        "compare": true,
        "segmentId": null,
        "filters": [],
        "queries": [
          {
            "id": "string",
            "dimension": "channel",
            "metrics": [
              "visitors"
            ]
          }
        ]
      }),
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "POST",
        "https://api.shopfa.st/v1/store/analytics/query",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "period": {},
          "compare": True,
          "segmentId": None,
          "filters": [],
          "queries": [
            {
              "id": "string",
              "dimension": "channel",
              "metrics": [
                "visitors"
              ]
            }
          ]
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/analytics/query", strings.NewReader(`{
      "period": {},
      "compare": true,
      "segmentId": null,
      "filters": [],
      "queries": [
        {
          "id": "string",
          "dimension": "channel",
          "metrics": [
            "visitors"
          ]
        }
      ]
    }`))
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    req.Header.Set("Content-Type", "application/json")
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    The same queries as CSV or JSON

    POST/v1/store/analytics/query/export

    Or name the store: POST /v1/stores/{storeId}/analytics/query/export

    analytics:writerole: analytics:readexportAnalyticsQuery

    Body

    • periodobjectrequired
      • range"today" | "yesterday" | "7d" | "30d" | "90d" | "this_month" | "last_month" | "6mo" | "ytd" | "365d" | "custom"
      • fromstring | null
      • tostring | null
      • bucket"hour" | "day" | "week" | "month" | null
    • compareboolean
    • segmentIdasg_… | null
    • filtersobject[]
      • dimension"channel" | "source" | "medium" | "campaign" | "term" | "content" | "source_medium" | "referrer" | "landing" | "exit" | "country" | "region" | "city" | "device" | "browser" | "os" | "language" | "screen" | "visitor_type" | "consent" | "affiliate"required
      • op"is" | "is_not" | "contains" | "not_contains" | "starts_with"required
      • valuesstring[]required
    • queriesobject[]required
      • idstringrequired
      • dimension"channel" | "source" | "medium" | "campaign" | "term" | "content" | "source_medium" | "referrer" | "landing" | "exit" | "country" | "region" | "city" | "device" | "browser" | "os" | "language" | "screen" | "visitor_type" | "consent" | "affiliate" | nullrequired
      • pivot"channel" | "source" | "medium" | "campaign" | "term" | "content" | "source_medium" | "referrer" | "landing" | "exit" | "country" | "region" | "city" | "device" | "browser" | "os" | "language" | "screen" | "visitor_type" | "consent" | "affiliate" | null
      • metrics"visitors" | "sessions" | "new_visitors" | "pageviews" | "bounce_rate" | "avg_duration" | "pages_per_session" | "engaged_sessions" | "cart_adds" | "checkouts" | "conversions" | "conversion_rate" | "orders" | "revenue" | "revenue_per_visitor" | "aov"[]required
      • filtersobject[]
        • dimension"channel" | "source" | "medium" | "campaign" | "term" | "content" | "source_medium" | "referrer" | "landing" | "exit" | "country" | "region" | "city" | "device" | "browser" | "os" | "language" | "screen" | "visitor_type" | "consent" | "affiliate"required
        • op"is" | "is_not" | "contains" | "not_contains" | "starts_with"required
        • valuesstring[]required
      • sort"visitors" | "sessions" | "new_visitors" | "pageviews" | "bounce_rate" | "avg_duration" | "pages_per_session" | "engaged_sessions" | "cart_adds" | "checkouts" | "conversions" | "conversion_rate" | "orders" | "revenue" | "revenue_per_visitor" | "aov" | "dimension" | null
      • sortDir"asc" | "desc"
      • searchstring | null
      • limitinteger
      • seriesboolean
    • format"csv" | "json"
    • namestring

    Response AnalyticsExport

    • filenamestringrequired
    • mime"text/csv" | "application/json"required
    • contentstringrequired
    • rowsintegerrequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/analytics/query/export" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "period": {},
      "compare": true,
      "segmentId": null,
      "filters": [],
      "queries": [
        {
          "id": "string",
          "dimension": "channel",
          "metrics": [
            "visitors"
          ]
        }
      ],
      "format": "csv",
      "name": "report"
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/query/export', {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "period": {},
        "compare": true,
        "segmentId": null,
        "filters": [],
        "queries": [
          {
            "id": "string",
            "dimension": "channel",
            "metrics": [
              "visitors"
            ]
          }
        ],
        "format": "csv",
        "name": "report"
      }),
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "POST",
        "https://api.shopfa.st/v1/store/analytics/query/export",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "period": {},
          "compare": True,
          "segmentId": None,
          "filters": [],
          "queries": [
            {
              "id": "string",
              "dimension": "channel",
              "metrics": [
                "visitors"
              ]
            }
          ],
          "format": "csv",
          "name": "report"
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/analytics/query/export", strings.NewReader(`{
      "period": {},
      "compare": true,
      "segmentId": null,
      "filters": [],
      "queries": [
        {
          "id": "string",
          "dimension": "channel",
          "metrics": [
            "visitors"
          ]
        }
      ],
      "format": "csv",
      "name": "report"
    }`))
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    req.Header.Set("Content-Type", "application/json")
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Visitors right now and the last 30 minutes

    GET/v1/store/analytics/realtime

    Or name the store: GET /v1/stores/{storeId}/analytics/realtime

    analytics:readrole: analytics:readgetAnalyticsRealtime

    Response RealtimeReport

    • atTimestamprequired
    • activeNowintegerrequired
    • activeLast30integerrequired
    • perMinuteobject[]required
      • minuteTimestamprequired
      • visitorsintegerrequired
      • pageviewsintegerrequired
    • pagesobject[]required
      • pathstringrequired
      • visitorsintegerrequired
    • sourcesobject[]required
      • channelChannelrequired
      • sourcestringrequired
      • visitorsintegerrequired
    • countriesobject[]required
      • countrystringrequired
      • visitorsintegerrequired
    • devicesobject[]required
      • devicestringrequired
      • visitorsintegerrequired
    • eventsobject[]required
      • nameAnalyticsEventNamerequired
      • pathstringrequired
      • countrystringrequired
      • devicestringrequired
      • atTimestamprequired
      • valueMinorinteger | nullrequired
    • botHitsLastHourintegerrequired
    • currencyCurrencyCoderequired

    Example

    curl "https://api.shopfa.st/v1/store/analytics/realtime" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/realtime', {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "GET",
        "https://api.shopfa.st/v1/store/analytics/realtime",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/analytics/realtime", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Pages, landing and exit pages, time on page and scroll depth

    GET/v1/store/analytics/pages

    Or name the store: GET /v1/stores/{storeId}/analytics/pages

    analytics:readrole: analytics:readgetPagesReport

    Parameters

    • range"today" | "yesterday" | "7d" | "30d" | "90d" | "this_month" | "last_month" | "6mo" | "ytd" | "365d" | "custom"query
    • fromstring | nullquery
    • tostring | nullquery
    • bucket"hour" | "day" | "week" | "month" | nullquery
    • pathstring | nullquery
    • pagesSort"path" | "views" | "visitors" | "entries" | "exit_rate" | "time" | "scroll"query
    • pagesDir"asc" | "desc"query
    • landingSort"path" | "sessions" | "bounce_rate" | "conversion_rate" | "revenue"query
    • landingDir"asc" | "desc"query
    • exitsSort"path" | "exits" | "exit_rate"query
    • exitsDir"asc" | "desc"query

    Response PagesReport

    • periodAnalyticsPeriodrequired
    • currencyCurrencyCoderequired
    • totalsobjectrequired
      • viewsintegerrequired
      • previousViewsintegerrequired
      • avgTimeMsintegerrequired
      • avgScrollPctintegerrequired
      • uniquePathsintegerrequired
    • pagesPageRow[]required
    • landingobject[]required
      • pathstringrequired
      • sessionsintegerrequired
      • bounceRateBpsintegerrequired
      • conversionsintegerrequired
      • conversionRateBpsintegerrequired
      • revenueMinorintegerrequired
    • exitsobject[]required
      • pathstringrequired
      • exitsintegerrequired
      • viewsintegerrequired
      • exitRateBpsintegerrequired
    • scrollobject[]required
      • depthintegerrequired
      • leavesintegerrequired
      • shareBpsintegerrequired
    • timeobject[]required
      • labelstringrequired
      • maxMsintegerrequired
      • leavesintegerrequired

    Example

    curl "https://api.shopfa.st/v1/store/analytics/pages" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/pages', {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "GET",
        "https://api.shopfa.st/v1/store/analytics/pages",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/analytics/pages", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Crawler traffic: verified, declared, spoofed and suspicious, by bot

    GET/v1/store/analytics/bots

    Or name the store: GET /v1/stores/{storeId}/analytics/bots

    analytics:readrole: analytics:readgetBotsReport

    Parameters

    • range"today" | "yesterday" | "7d" | "30d" | "90d" | "this_month" | "last_month" | "6mo" | "ytd" | "365d" | "custom"query
    • fromstring | nullquery
    • tostring | nullquery
    • bucket"hour" | "day" | "week" | "month" | nullquery
    • botstring | nullquery
    • category"search" | "ai_answers" | "ai_training" | "seo" | "social_preview" | "monitoring" | "feed" | "automation" | "other" | nullquery
    • verification"verified" | "spoofed" | "declared" | nullquery
    • botsSort"name" | "verification" | "hits" | "paths" | "last_seen"query
    • botsDir"asc" | "desc"query
    • device"desktop" | "mobile" | "tablet" | nullquery
    • suspiciousSort"who" | "sessions" | "pageviews" | "score"query
    • suspiciousDir"asc" | "desc"query

    Response BotsReport

    • periodAnalyticsPeriodrequired
    • totalsobjectrequired
      • hitsintegerrequired
      • humanHitsintegerrequired
      • botHitsintegerrequired
      • botShareBpsintegerrequired
      • previousBotHitsintegerrequired
      • verifiedintegerrequired
      • declaredintegerrequired
      • spoofedintegerrequired
      • suspiciousintegerrequired
    • byClassobject[]required
      • trafficTrafficClassrequired
      • hitsintegerrequired
    • categoriesobject[]required
      • categoryBotCategoryrequired
      • hitsintegerrequired
      • botsintegerrequired
    • botsobject[]required
      • namestringrequired
      • ownerstringrequired
      • categoryBotCategoryrequired
      • hitsintegerrequired
      • verifiedHitsintegerrequired
      • spoofedHitsintegerrequired
      • declaredHitsintegerrequired
      • pathsintegerrequired
      • lastSeenAtTimestamprequired
      • previousHitsintegerrequired
    • seriesobject[]required
      • dateIsoDaterequired
      • hourinteger | nullrequired
      • humanintegerrequired
      • verifiedintegerrequired
      • declaredintegerrequired
      • spoofedintegerrequired
      • suspiciousintegerrequired
    • pathsobject[]required
      • pathstringrequired
      • hitsintegerrequired
      • botsintegerrequired
    • suspiciousobject[]required
      • countrystringrequired
      • devicestringrequired
      • browserstringrequired
      • sessionsintegerrequired
      • pageviewsintegerrequired
      • avgScoreintegerrequired

    Example

    curl "https://api.shopfa.st/v1/store/analytics/bots" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/bots', {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "GET",
        "https://api.shopfa.st/v1/store/analytics/bots",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/analytics/bots", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Orders credited to channels, sources and campaigns under six models

    GET/v1/store/analytics/attribution

    Or name the store: GET /v1/stores/{storeId}/analytics/attribution

    analytics:readrole: analytics:readgetAttributionReport

    Parameters

    • range"today" | "yesterday" | "7d" | "30d" | "90d" | "this_month" | "last_month" | "6mo" | "ytd" | "365d" | "custom"query
    • fromstring | nullquery
    • tostring | nullquery
    • bucket"hour" | "day" | "week" | "month" | nullquery
    • dimension"channel" | "source" | "campaign" | "source_medium" | "affiliate" | "landing"query
    • lookbackDaysinteger | stringquery
    • qstring | nullquery
    • sort"key" | "first_touch" | "last_touch" | "last_non_direct" | "linear" | "position_based" | "time_decay"query
    • dir"asc" | "desc"query
    • by"revenue" | "conversions"query

    Response AttributionReport

    • periodAnalyticsPeriodrequired
    • currencyCurrencyCoderequired
    • dimensionAttributionDimensionrequired
    • lookbackDaysintegerrequired
    • modelsAttributionModel[]required
    • ordersintegerrequired
    • untrackedintegerrequired
    • revenueMinorintegerrequired
    • rowsobject[]required
      • keystringrequired
      • conversionsnumber[]required
      • revenueMinorinteger[]required
    • pathsobject[]required
      • pathChannel[]required
      • conversionsintegerrequired
      • revenueMinorintegerrequired
    • avgTouchesnumberrequired
    • avgHoursToConvertnumberrequired

    Example

    curl "https://api.shopfa.st/v1/store/analytics/attribution" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/attribution', {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "GET",
        "https://api.shopfa.st/v1/store/analytics/attribution",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/analytics/attribution", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Customer cohorts by first order, retention and lifetime value

    GET/v1/store/analytics/cohorts

    Or name the store: GET /v1/stores/{storeId}/analytics/cohorts

    analytics:readrole: analytics:readgetCohorts

    Parameters

    • granularity"week" | "month"query
    • metric"customers" | "orders" | "revenue"query
    • periodsinteger | stringquery
    • channelSort"key" | "customers" | "repeat_rate" | "orders_per_customer" | "ltv"query
    • channelDir"asc" | "desc"query
    • productSort"key" | "customers" | "repeat_rate" | "orders_per_customer" | "ltv"query
    • productDir"asc" | "desc"query
    • productstring | nullquery

    Response CohortReport

    • granularityCohortGranularityrequired
    • metricCohortMetricrequired
    • currencyCurrencyCoderequired
    • timezonestringrequired
    • cohortsobject[]required
      • startIsoDaterequired
      • sizeintegerrequired
      • valuesinteger[]required
    • ltvobject[]required
      • offsetintegerrequired
      • avgRevenueMinorintegerrequired
      • customersintegerrequired
    • byChannelobject[]required
      • keystringrequired
      • customersintegerrequired
      • ltvMinorintegerrequired
      • ordersPerCustomernumberrequired
      • repeatRateBpsintegerrequired
    • byProductobject[]required
      • keystringrequired
      • productIdProductId | nullrequired
      • customersintegerrequired
      • ltvMinorintegerrequired
      • ordersPerCustomernumberrequired
      • repeatRateBpsintegerrequired
    • totalsobjectrequired
      • customersintegerrequired
      • repeatRateBpsintegerrequired
      • ltvMinorintegerrequired
      • medianDaysToSecondOrderinteger | nullrequired

    Example

    curl "https://api.shopfa.st/v1/store/analytics/cohorts" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/cohorts', {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "GET",
        "https://api.shopfa.st/v1/store/analytics/cohorts",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/analytics/cohorts", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Product views to cart to orders, per product and type

    GET/v1/store/analytics/product-conversion

    Or name the store: GET /v1/stores/{storeId}/analytics/product-conversion

    analytics:readrole: analytics:readgetProductConversion

    Parameters

    • range"today" | "yesterday" | "7d" | "30d" | "90d" | "this_month" | "last_month" | "6mo" | "ytd" | "365d" | "custom"query
    • fromstring | nullquery
    • tostring | nullquery
    • bucket"hour" | "day" | "week" | "month" | nullquery
    • termstring | nullquery
    • searchesSort"term" | "searches" | "viewed"query
    • searchesDir"asc" | "desc"query

    Response ProductConversionReport

    • periodAnalyticsPeriodrequired
    • currencyCurrencyCoderequired
    • totalsobjectrequired
      • viewsintegerrequired
      • viewersintegerrequired
      • cartAddsintegerrequired
      • ordersintegerrequired
      • revenueMinorintegerrequired
      • viewToOrderBpsintegerrequired
    • productsProductConversionRow[]required
    • byTypeobject[]required
      • typeProductTyperequired
      • viewsintegerrequired
      • ordersintegerrequired
      • revenueMinorintegerrequired
      • viewToOrderBpsintegerrequired
    • searchesobject[]required
      • termstringrequired
      • searchesintegerrequired
      • productViewsintegerrequired

    Example

    curl "https://api.shopfa.st/v1/store/analytics/product-conversion" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/product-conversion', {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "GET",
        "https://api.shopfa.st/v1/store/analytics/product-conversion",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/analytics/product-conversion", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Ad spend with CPM, CPC, CPA and ROAS per campaign

    GET/v1/store/analytics/ads

    Or name the store: GET /v1/stores/{storeId}/analytics/ads

    analytics:readrole: analytics:readgetAdsReport

    Parameters

    • range"today" | "yesterday" | "7d" | "30d" | "90d" | "this_month" | "last_month" | "6mo" | "ytd" | "365d" | "custom"query
    • fromstring | nullquery
    • tostring | nullquery
    • bucket"hour" | "day" | "week" | "month" | nullquery
    • model"first_touch" | "last_touch" | "last_non_direct" | "linear" | "position_based" | "time_decay"query

    Response AdsReport

    • periodAnalyticsPeriodrequired
    • currencyCurrencyCoderequired
    • modelAttributionModelrequired
    • totalsobjectrequired
      • impressionsintegerrequired
      • clicksintegerrequired
      • spendMinorintegerrequired
      • previousSpendMinorintegerrequired
      • sessionsintegerrequired
      • conversionsnumberrequired
      • revenueMinorintegerrequired
      • previousRevenueMinorintegerrequired
      • ctrBpsintegerrequired
      • cpmMinorintegerrequired
      • cpcMinorintegerrequired
      • cpaMinorinteger | nullrequired
      • roasBpsinteger | nullrequired
    • campaignsAdCampaignRow[]required
    • platformsobject[]required
      • platformAdPlatformrequired
      • spendMinorintegerrequired
      • revenueMinorintegerrequired
      • roasBpsinteger | nullrequired
    • dailyobject[]required
      • dateIsoDaterequired
      • hourinteger | nullrequired
      • spendMinorintegerrequired
      • revenueMinorintegerrequired
      • impressionsintegerrequired
      • clicksintegerrequired
    • importsAdImport[]required
    • rowsAdSpendRow[]required

    Example

    curl "https://api.shopfa.st/v1/store/analytics/ads" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/ads', {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "GET",
        "https://api.shopfa.st/v1/store/analytics/ads",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/analytics/ads", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Add one day of spend for a campaign

    POST/v1/store/analytics/ads/spend

    Or name the store: POST /v1/stores/{storeId}/analytics/ads/spend

    analytics:writerole: analytics:writecreateAdSpend

    Body

    • daystringrequired
    • platform"google" | "meta" | "tiktok" | "x" | "reddit" | "microsoft" | "linkedin" | "pinterest" | "snapchat" | "youtube" | "discord" | "newsletter" | "other"required
    • campaignstringrequired
    • impressionsintegerrequired
    • clicksintegerrequired
    • spendMinorintegerrequired

    Response AdSpendRow

    • dayIsoDaterequired
    • platformAdPlatformrequired
    • campaignstringrequired
    • impressionsintegerrequired
    • clicksintegerrequired
    • spendMinorintegerrequired
    • idAdSpendIdrequired
    • currencyCurrencyCoderequired
    • importIdAdImportId | nullrequired
    • createdAtTimestamprequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/analytics/ads/spend" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "day": "string",
      "platform": "google",
      "campaign": "string",
      "impressions": 0,
      "clicks": 0,
      "spendMinor": 0
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/ads/spend', {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "day": "string",
        "platform": "google",
        "campaign": "string",
        "impressions": 0,
        "clicks": 0,
        "spendMinor": 0
      }),
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "POST",
        "https://api.shopfa.st/v1/store/analytics/ads/spend",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "day": "string",
          "platform": "google",
          "campaign": "string",
          "impressions": 0,
          "clicks": 0,
          "spendMinor": 0
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/analytics/ads/spend", strings.NewReader(`{
      "day": "string",
      "platform": "google",
      "campaign": "string",
      "impressions": 0,
      "clicks": 0,
      "spendMinor": 0
    }`))
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    req.Header.Set("Content-Type", "application/json")
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Remove a spend row

    DELETE/v1/store/analytics/ads/spend/{spendId}

    Or name the store: DELETE /v1/stores/{storeId}/analytics/ads/spend/{spendId}

    analytics:writerole: analytics:writedeleteAdSpend

    Parameters

    • spendIdads_…pathrequired

    Response Ok

    • okbooleanrequired

    Example

    curl -X DELETE "https://api.shopfa.st/v1/store/analytics/ads/spend/ads_0123456789abcdefghjk" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/ads/spend/ads_0123456789abcdefghjk', {
      method: 'DELETE',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "DELETE",
        "https://api.shopfa.st/v1/store/analytics/ads/spend/ads_0123456789abcdefghjk",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("DELETE", "https://api.shopfa.st/v1/store/analytics/ads/spend/ads_0123456789abcdefghjk", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Import spend from a CSV export of an ad platform

    POST/v1/store/analytics/ads/imports

    Or name the store: POST /v1/stores/{storeId}/analytics/ads/imports

    analytics:writerole: analytics:writeimportAdSpend

    Body

    • filenamestringrequired
    • csvstringrequired
    • platform"google" | "meta" | "tiktok" | "x" | "reddit" | "microsoft" | "linkedin" | "pinterest" | "snapchat" | "youtube" | "discord" | "newsletter" | "other"

    Response AdImportResult

    • importIdAdImportId | nullrequired
    • importedintegerrequired
    • skippedintegerrequired
    • errorsobject[]required
      • lineintegerrequired
      • messagestringrequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/analytics/ads/imports" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "filename": "string",
      "csv": "string",
      "platform": "other"
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/ads/imports', {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "filename": "string",
        "csv": "string",
        "platform": "other"
      }),
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "POST",
        "https://api.shopfa.st/v1/store/analytics/ads/imports",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "filename": "string",
          "csv": "string",
          "platform": "other"
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/analytics/ads/imports", strings.NewReader(`{
      "filename": "string",
      "csv": "string",
      "platform": "other"
    }`))
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    req.Header.Set("Content-Type", "application/json")
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Remove an import and its rows

    DELETE/v1/store/analytics/ads/imports/{importId}

    Or name the store: DELETE /v1/stores/{storeId}/analytics/ads/imports/{importId}

    analytics:writerole: analytics:writedeleteAdImport

    Parameters

    • importIdadi_…pathrequired

    Response Ok

    • okbooleanrequired

    Example

    curl -X DELETE "https://api.shopfa.st/v1/store/analytics/ads/imports/adi_0123456789abcdefghjk" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/ads/imports/adi_0123456789abcdefghjk', {
      method: 'DELETE',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "DELETE",
        "https://api.shopfa.st/v1/store/analytics/ads/imports/adi_0123456789abcdefghjk",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("DELETE", "https://api.shopfa.st/v1/store/analytics/ads/imports/adi_0123456789abcdefghjk", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Run a funnel definition over the period

    POST/v1/store/analytics/funnels/run

    Or name the store: POST /v1/stores/{storeId}/analytics/funnels/run

    analytics:writerole: analytics:readrunFunnel

    Body

    • periodobjectrequired
      • range"today" | "yesterday" | "7d" | "30d" | "90d" | "this_month" | "last_month" | "6mo" | "ytd" | "365d" | "custom"
      • fromstring | null
      • tostring | null
      • bucket"hour" | "day" | "week" | "month" | null
    • compareboolean
    • definitionobjectrequired
      • stepsobject[]required
        • event"page_view" | "product_view" | "add_to_cart" | "begin_checkout" | "payment_attempt" | "purchase" | "signup" | "search" | "outbound_click" | "custom"required
        • labelstringrequired
        • filtersobject[]
      • windowMinutesintegerrequired
      • scope"session" | "visitor"required
      • segmentobject[]
        • dimension"channel" | "source" | "medium" | "campaign" | "term" | "content" | "source_medium" | "referrer" | "landing" | "exit" | "country" | "region" | "city" | "device" | "browser" | "os" | "language" | "screen" | "visitor_type" | "consent" | "affiliate"required
        • op"is" | "is_not" | "contains" | "not_contains" | "starts_with"required
        • valuesstring[]required
      • breakdown"channel" | "source" | "medium" | "campaign" | "term" | "content" | "source_medium" | "referrer" | "landing" | "exit" | "country" | "region" | "city" | "device" | "browser" | "os" | "language" | "screen" | "visitor_type" | "consent" | "affiliate" | null

    Response FunnelResult

    • periodAnalyticsPeriodrequired
    • stepsobject[]required
      • labelstringrequired
      • eventFunnelEventNamerequired
      • entitiesintegerrequired
      • conversionBpsintegerrequired
      • stepBpsintegerrequired
      • dropOffintegerrequired
      • medianMsFromPreviousinteger | nullrequired
    • previousinteger[] | nullrequired
    • breakdownobject[]required
      • keystringrequired
      • stepsinteger[]required
    • entitiesintegerrequired
    • convertedintegerrequired
    • overallBpsintegerrequired
    • msintegerrequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/analytics/funnels/run" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "period": {},
      "compare": true,
      "definition": {
        "steps": [
          {
            "event": "page_view",
            "label": "string"
          }
        ],
        "windowMinutes": 1,
        "scope": "session"
      }
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/funnels/run', {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "period": {},
        "compare": true,
        "definition": {
          "steps": [
            {
              "event": "page_view",
              "label": "string"
            }
          ],
          "windowMinutes": 1,
          "scope": "session"
        }
      }),
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "POST",
        "https://api.shopfa.st/v1/store/analytics/funnels/run",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "period": {},
          "compare": True,
          "definition": {
            "steps": [
              {
                "event": "page_view",
                "label": "string"
              }
            ],
            "windowMinutes": 1,
            "scope": "session"
          }
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/analytics/funnels/run", strings.NewReader(`{
      "period": {},
      "compare": true,
      "definition": {
        "steps": [
          {
            "event": "page_view",
            "label": "string"
          }
        ],
        "windowMinutes": 1,
        "scope": "session"
      }
    }`))
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    req.Header.Set("Content-Type", "application/json")
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Saved funnels

    GET/v1/store/analytics/funnels

    Or name the store: GET /v1/stores/{storeId}/analytics/funnels

    analytics:readrole: analytics:readlistFunnels

    Response ListFunnelsResponse

    • itemsSavedFunnel[]required

    Example

    curl "https://api.shopfa.st/v1/store/analytics/funnels" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/funnels', {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "GET",
        "https://api.shopfa.st/v1/store/analytics/funnels",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/analytics/funnels", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Save a funnel (from the builder or a template)

    POST/v1/store/analytics/funnels

    Or name the store: POST /v1/stores/{storeId}/analytics/funnels

    analytics:writerole: analytics:writecreateFunnel

    Body

    • namestringrequired
    • descriptionstring
    • templateIdstring | null
    • definitionobjectrequired
      • stepsobject[]required
        • event"page_view" | "product_view" | "add_to_cart" | "begin_checkout" | "payment_attempt" | "purchase" | "signup" | "search" | "outbound_click" | "custom"required
        • labelstringrequired
        • filtersobject[]
      • windowMinutesintegerrequired
      • scope"session" | "visitor"required
      • segmentobject[]
        • dimension"channel" | "source" | "medium" | "campaign" | "term" | "content" | "source_medium" | "referrer" | "landing" | "exit" | "country" | "region" | "city" | "device" | "browser" | "os" | "language" | "screen" | "visitor_type" | "consent" | "affiliate"required
        • op"is" | "is_not" | "contains" | "not_contains" | "starts_with"required
        • valuesstring[]required
      • breakdown"channel" | "source" | "medium" | "campaign" | "term" | "content" | "source_medium" | "referrer" | "landing" | "exit" | "country" | "region" | "city" | "device" | "browser" | "os" | "language" | "screen" | "visitor_type" | "consent" | "affiliate" | null
    • pinnedboolean

    Response SavedFunnel

    • idFunnelIdrequired
    • namestringrequired
    • descriptionstringrequired
    • templateIdstringrequired
    • definitionFunnelDefinitionrequired
    • pinnedbooleanrequired
    • createdAtTimestamprequired
    • updatedAtTimestamprequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/analytics/funnels" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "name": "string",
      "description": "",
      "templateId": null,
      "definition": {
        "steps": [
          {
            "event": "page_view",
            "label": "string"
          }
        ],
        "windowMinutes": 1,
        "scope": "session"
      },
      "pinned": false
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/funnels', {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "name": "string",
        "description": "",
        "templateId": null,
        "definition": {
          "steps": [
            {
              "event": "page_view",
              "label": "string"
            }
          ],
          "windowMinutes": 1,
          "scope": "session"
        },
        "pinned": false
      }),
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "POST",
        "https://api.shopfa.st/v1/store/analytics/funnels",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "name": "string",
          "description": "",
          "templateId": None,
          "definition": {
            "steps": [
              {
                "event": "page_view",
                "label": "string"
              }
            ],
            "windowMinutes": 1,
            "scope": "session"
          },
          "pinned": False
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/analytics/funnels", strings.NewReader(`{
      "name": "string",
      "description": "",
      "templateId": null,
      "definition": {
        "steps": [
          {
            "event": "page_view",
            "label": "string"
          }
        ],
        "windowMinutes": 1,
        "scope": "session"
      },
      "pinned": false
    }`))
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    req.Header.Set("Content-Type", "application/json")
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Change a saved funnel

    PUT/v1/store/analytics/funnels/{funnelId}

    Or name the store: PUT /v1/stores/{storeId}/analytics/funnels/{funnelId}

    analytics:writerole: analytics:writeupdateFunnel

    Parameters

    • funnelIdafn_…pathrequired

    Body

    • namestringrequired
    • descriptionstring
    • templateIdstring | null
    • definitionobjectrequired
      • stepsobject[]required
        • event"page_view" | "product_view" | "add_to_cart" | "begin_checkout" | "payment_attempt" | "purchase" | "signup" | "search" | "outbound_click" | "custom"required
        • labelstringrequired
        • filtersobject[]
      • windowMinutesintegerrequired
      • scope"session" | "visitor"required
      • segmentobject[]
        • dimension"channel" | "source" | "medium" | "campaign" | "term" | "content" | "source_medium" | "referrer" | "landing" | "exit" | "country" | "region" | "city" | "device" | "browser" | "os" | "language" | "screen" | "visitor_type" | "consent" | "affiliate"required
        • op"is" | "is_not" | "contains" | "not_contains" | "starts_with"required
        • valuesstring[]required
      • breakdown"channel" | "source" | "medium" | "campaign" | "term" | "content" | "source_medium" | "referrer" | "landing" | "exit" | "country" | "region" | "city" | "device" | "browser" | "os" | "language" | "screen" | "visitor_type" | "consent" | "affiliate" | null
    • pinnedboolean

    Response SavedFunnel

    • idFunnelIdrequired
    • namestringrequired
    • descriptionstringrequired
    • templateIdstringrequired
    • definitionFunnelDefinitionrequired
    • pinnedbooleanrequired
    • createdAtTimestamprequired
    • updatedAtTimestamprequired

    Example

    curl -X PUT "https://api.shopfa.st/v1/store/analytics/funnels/afn_0123456789abcdefghjk" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "name": "string",
      "description": "",
      "templateId": null,
      "definition": {
        "steps": [
          {
            "event": "page_view",
            "label": "string"
          }
        ],
        "windowMinutes": 1,
        "scope": "session"
      },
      "pinned": false
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/funnels/afn_0123456789abcdefghjk', {
      method: 'PUT',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "name": "string",
        "description": "",
        "templateId": null,
        "definition": {
          "steps": [
            {
              "event": "page_view",
              "label": "string"
            }
          ],
          "windowMinutes": 1,
          "scope": "session"
        },
        "pinned": false
      }),
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "PUT",
        "https://api.shopfa.st/v1/store/analytics/funnels/afn_0123456789abcdefghjk",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "name": "string",
          "description": "",
          "templateId": None,
          "definition": {
            "steps": [
              {
                "event": "page_view",
                "label": "string"
              }
            ],
            "windowMinutes": 1,
            "scope": "session"
          },
          "pinned": False
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("PUT", "https://api.shopfa.st/v1/store/analytics/funnels/afn_0123456789abcdefghjk", strings.NewReader(`{
      "name": "string",
      "description": "",
      "templateId": null,
      "definition": {
        "steps": [
          {
            "event": "page_view",
            "label": "string"
          }
        ],
        "windowMinutes": 1,
        "scope": "session"
      },
      "pinned": false
    }`))
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    req.Header.Set("Content-Type", "application/json")
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Delete a saved funnel

    DELETE/v1/store/analytics/funnels/{funnelId}

    Or name the store: DELETE /v1/stores/{storeId}/analytics/funnels/{funnelId}

    analytics:writerole: analytics:writedeleteFunnel

    Parameters

    • funnelIdafn_…pathrequired

    Response Ok

    • okbooleanrequired

    Example

    curl -X DELETE "https://api.shopfa.st/v1/store/analytics/funnels/afn_0123456789abcdefghjk" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/funnels/afn_0123456789abcdefghjk', {
      method: 'DELETE',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "DELETE",
        "https://api.shopfa.st/v1/store/analytics/funnels/afn_0123456789abcdefghjk",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("DELETE", "https://api.shopfa.st/v1/store/analytics/funnels/afn_0123456789abcdefghjk", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Saved segments

    GET/v1/store/analytics/segments

    Or name the store: GET /v1/stores/{storeId}/analytics/segments

    analytics:readrole: analytics:readlistSegments

    Response ListSegmentsResponse

    • itemsSegment[]required

    Example

    curl "https://api.shopfa.st/v1/store/analytics/segments" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/segments', {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "GET",
        "https://api.shopfa.st/v1/store/analytics/segments",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/analytics/segments", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Save a segment

    POST/v1/store/analytics/segments

    Or name the store: POST /v1/stores/{storeId}/analytics/segments

    analytics:writerole: analytics:writecreateSegment

    Body

    • namestringrequired
    • descriptionstring
    • filtersobject[]required
      • dimension"channel" | "source" | "medium" | "campaign" | "term" | "content" | "source_medium" | "referrer" | "landing" | "exit" | "country" | "region" | "city" | "device" | "browser" | "os" | "language" | "screen" | "visitor_type" | "consent" | "affiliate"required
      • op"is" | "is_not" | "contains" | "not_contains" | "starts_with"required
      • valuesstring[]required

    Response Segment

    • idSegmentIdrequired
    • namestringrequired
    • descriptionstringrequired
    • filtersSessionFilter[]required
    • createdAtTimestamprequired
    • updatedAtTimestamprequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/analytics/segments" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "name": "string",
      "description": "",
      "filters": [
        {
          "dimension": "channel",
          "op": "is",
          "values": [
            "string"
          ]
        }
      ]
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/segments', {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "name": "string",
        "description": "",
        "filters": [
          {
            "dimension": "channel",
            "op": "is",
            "values": [
              "string"
            ]
          }
        ]
      }),
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "POST",
        "https://api.shopfa.st/v1/store/analytics/segments",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "name": "string",
          "description": "",
          "filters": [
            {
              "dimension": "channel",
              "op": "is",
              "values": [
                "string"
              ]
            }
          ]
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/analytics/segments", strings.NewReader(`{
      "name": "string",
      "description": "",
      "filters": [
        {
          "dimension": "channel",
          "op": "is",
          "values": [
            "string"
          ]
        }
      ]
    }`))
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    req.Header.Set("Content-Type", "application/json")
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Change a segment

    PUT/v1/store/analytics/segments/{segmentId}

    Or name the store: PUT /v1/stores/{storeId}/analytics/segments/{segmentId}

    analytics:writerole: analytics:writeupdateSegment

    Parameters

    • segmentIdasg_…pathrequired

    Body

    • namestringrequired
    • descriptionstring
    • filtersobject[]required
      • dimension"channel" | "source" | "medium" | "campaign" | "term" | "content" | "source_medium" | "referrer" | "landing" | "exit" | "country" | "region" | "city" | "device" | "browser" | "os" | "language" | "screen" | "visitor_type" | "consent" | "affiliate"required
      • op"is" | "is_not" | "contains" | "not_contains" | "starts_with"required
      • valuesstring[]required

    Response Segment

    • idSegmentIdrequired
    • namestringrequired
    • descriptionstringrequired
    • filtersSessionFilter[]required
    • createdAtTimestamprequired
    • updatedAtTimestamprequired

    Example

    curl -X PUT "https://api.shopfa.st/v1/store/analytics/segments/asg_0123456789abcdefghjk" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "name": "string",
      "description": "",
      "filters": [
        {
          "dimension": "channel",
          "op": "is",
          "values": [
            "string"
          ]
        }
      ]
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/segments/asg_0123456789abcdefghjk', {
      method: 'PUT',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "name": "string",
        "description": "",
        "filters": [
          {
            "dimension": "channel",
            "op": "is",
            "values": [
              "string"
            ]
          }
        ]
      }),
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "PUT",
        "https://api.shopfa.st/v1/store/analytics/segments/asg_0123456789abcdefghjk",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "name": "string",
          "description": "",
          "filters": [
            {
              "dimension": "channel",
              "op": "is",
              "values": [
                "string"
              ]
            }
          ]
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("PUT", "https://api.shopfa.st/v1/store/analytics/segments/asg_0123456789abcdefghjk", strings.NewReader(`{
      "name": "string",
      "description": "",
      "filters": [
        {
          "dimension": "channel",
          "op": "is",
          "values": [
            "string"
          ]
        }
      ]
    }`))
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    req.Header.Set("Content-Type", "application/json")
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Delete a segment

    DELETE/v1/store/analytics/segments/{segmentId}

    Or name the store: DELETE /v1/stores/{storeId}/analytics/segments/{segmentId}

    analytics:writerole: analytics:writedeleteSegment

    Parameters

    • segmentIdasg_…pathrequired

    Response Ok

    • okbooleanrequired

    Example

    curl -X DELETE "https://api.shopfa.st/v1/store/analytics/segments/asg_0123456789abcdefghjk" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/segments/asg_0123456789abcdefghjk', {
      method: 'DELETE',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "DELETE",
        "https://api.shopfa.st/v1/store/analytics/segments/asg_0123456789abcdefghjk",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("DELETE", "https://api.shopfa.st/v1/store/analytics/segments/asg_0123456789abcdefghjk", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Chart notes (launches, campaigns, outages)

    GET/v1/store/analytics/annotations

    Or name the store: GET /v1/stores/{storeId}/analytics/annotations

    analytics:readrole: analytics:readlistAnnotations

    Response ListAnnotationsResponse

    • itemsAnnotation[]required

    Example

    curl "https://api.shopfa.st/v1/store/analytics/annotations" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/annotations', {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "GET",
        "https://api.shopfa.st/v1/store/analytics/annotations",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/analytics/annotations", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Add a chart note

    POST/v1/store/analytics/annotations

    Or name the store: POST /v1/stores/{storeId}/analytics/annotations

    analytics:writerole: analytics:writecreateAnnotation

    Body

    • datestringrequired
    • titlestringrequired
    • bodystring
    • tone"neutral" | "accent" | "good" | "warn" | "danger"

    Response Annotation

    • idAnnotationIdrequired
    • dateIsoDaterequired
    • titlestringrequired
    • bodystringrequired
    • toneAnnotationTonerequired
    • createdAtTimestamprequired
    • createdBystringrequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/analytics/annotations" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "date": "string",
      "title": "string",
      "body": "",
      "tone": "accent"
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/annotations', {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "date": "string",
        "title": "string",
        "body": "",
        "tone": "accent"
      }),
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "POST",
        "https://api.shopfa.st/v1/store/analytics/annotations",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "date": "string",
          "title": "string",
          "body": "",
          "tone": "accent"
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/analytics/annotations", strings.NewReader(`{
      "date": "string",
      "title": "string",
      "body": "",
      "tone": "accent"
    }`))
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    req.Header.Set("Content-Type", "application/json")
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Change a chart note

    PUT/v1/store/analytics/annotations/{annotationId}

    Or name the store: PUT /v1/stores/{storeId}/analytics/annotations/{annotationId}

    analytics:writerole: analytics:writeupdateAnnotation

    Parameters

    • annotationIdano_…pathrequired

    Body

    • datestringrequired
    • titlestringrequired
    • bodystring
    • tone"neutral" | "accent" | "good" | "warn" | "danger"

    Response Annotation

    • idAnnotationIdrequired
    • dateIsoDaterequired
    • titlestringrequired
    • bodystringrequired
    • toneAnnotationTonerequired
    • createdAtTimestamprequired
    • createdBystringrequired

    Example

    curl -X PUT "https://api.shopfa.st/v1/store/analytics/annotations/ano_0123456789abcdefghjk" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "date": "string",
      "title": "string",
      "body": "",
      "tone": "accent"
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/annotations/ano_0123456789abcdefghjk', {
      method: 'PUT',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "date": "string",
        "title": "string",
        "body": "",
        "tone": "accent"
      }),
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "PUT",
        "https://api.shopfa.st/v1/store/analytics/annotations/ano_0123456789abcdefghjk",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "date": "string",
          "title": "string",
          "body": "",
          "tone": "accent"
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("PUT", "https://api.shopfa.st/v1/store/analytics/annotations/ano_0123456789abcdefghjk", strings.NewReader(`{
      "date": "string",
      "title": "string",
      "body": "",
      "tone": "accent"
    }`))
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    req.Header.Set("Content-Type", "application/json")
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Delete a chart note

    DELETE/v1/store/analytics/annotations/{annotationId}

    Or name the store: DELETE /v1/stores/{storeId}/analytics/annotations/{annotationId}

    analytics:writerole: analytics:writedeleteAnnotation

    Parameters

    • annotationIdano_…pathrequired

    Response Ok

    • okbooleanrequired

    Example

    curl -X DELETE "https://api.shopfa.st/v1/store/analytics/annotations/ano_0123456789abcdefghjk" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/annotations/ano_0123456789abcdefghjk', {
      method: 'DELETE',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "DELETE",
        "https://api.shopfa.st/v1/store/analytics/annotations/ano_0123456789abcdefghjk",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("DELETE", "https://api.shopfa.st/v1/store/analytics/annotations/ano_0123456789abcdefghjk", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Alert rules and what they found lately

    GET/v1/store/analytics/alerts

    Or name the store: GET /v1/stores/{storeId}/analytics/alerts

    analytics:readrole: analytics:readlistAlerts

    Response ListAlertsResponse

    • itemsAlert[]required
    • eventsAlertEvent[]required

    Example

    curl "https://api.shopfa.st/v1/store/analytics/alerts" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/alerts', {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "GET",
        "https://api.shopfa.st/v1/store/analytics/alerts",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/analytics/alerts", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Add an alert (anomaly or threshold, emailed)

    POST/v1/store/analytics/alerts

    Or name the store: POST /v1/stores/{storeId}/analytics/alerts

    analytics:writerole: analytics:writecreateAlert

    Body

    • namestringrequired
    • metric"visitors" | "sessions" | "pageviews" | "conversions" | "conversion_rate" | "orders" | "revenue" | "bounce_rate" | "bot_share"required
    • rule"anomaly" | "drops_below" | "rises_above" | "change_pct"required
    • thresholdnumberrequired
    • cadence"hourly" | "daily"required
    • filtersobject[]
      • dimension"channel" | "source" | "medium" | "campaign" | "term" | "content" | "source_medium" | "referrer" | "landing" | "exit" | "country" | "region" | "city" | "device" | "browser" | "os" | "language" | "screen" | "visitor_type" | "consent" | "affiliate"required
      • op"is" | "is_not" | "contains" | "not_contains" | "starts_with"required
      • valuesstring[]required
    • recipientsstring[]required
    • enabledboolean

    Response Alert

    • namestringrequired
    • metricAlertMetricrequired
    • ruleAlertRulerequired
    • thresholdnumberrequired
    • cadenceAlertCadencerequired
    • filtersSessionFilter[]required
    • recipientsEmail[]required
    • enabledbooleanrequired
    • idAlertIdrequired
    • lastCheckedAtTimestamp | nullrequired
    3 more fields
    • lastFiredAtTimestamp | nullrequired
    • lastValuenumberrequired
    • createdAtTimestamprequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/analytics/alerts" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "name": "string",
      "metric": "visitors",
      "rule": "anomaly",
      "threshold": 0,
      "cadence": "hourly",
      "filters": [],
      "recipients": [
        "[email protected]"
      ],
      "enabled": true
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/alerts', {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "name": "string",
        "metric": "visitors",
        "rule": "anomaly",
        "threshold": 0,
        "cadence": "hourly",
        "filters": [],
        "recipients": [
          "[email protected]"
        ],
        "enabled": true
      }),
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "POST",
        "https://api.shopfa.st/v1/store/analytics/alerts",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "name": "string",
          "metric": "visitors",
          "rule": "anomaly",
          "threshold": 0,
          "cadence": "hourly",
          "filters": [],
          "recipients": [
            "[email protected]"
          ],
          "enabled": True
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/analytics/alerts", strings.NewReader(`{
      "name": "string",
      "metric": "visitors",
      "rule": "anomaly",
      "threshold": 0,
      "cadence": "hourly",
      "filters": [],
      "recipients": [
        "[email protected]"
      ],
      "enabled": true
    }`))
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    req.Header.Set("Content-Type", "application/json")
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Change an alert

    PUT/v1/store/analytics/alerts/{alertId}

    Or name the store: PUT /v1/stores/{storeId}/analytics/alerts/{alertId}

    analytics:writerole: analytics:writeupdateAlert

    Parameters

    • alertIdalr_…pathrequired

    Body

    • namestringrequired
    • metric"visitors" | "sessions" | "pageviews" | "conversions" | "conversion_rate" | "orders" | "revenue" | "bounce_rate" | "bot_share"required
    • rule"anomaly" | "drops_below" | "rises_above" | "change_pct"required
    • thresholdnumberrequired
    • cadence"hourly" | "daily"required
    • filtersobject[]
      • dimension"channel" | "source" | "medium" | "campaign" | "term" | "content" | "source_medium" | "referrer" | "landing" | "exit" | "country" | "region" | "city" | "device" | "browser" | "os" | "language" | "screen" | "visitor_type" | "consent" | "affiliate"required
      • op"is" | "is_not" | "contains" | "not_contains" | "starts_with"required
      • valuesstring[]required
    • recipientsstring[]required
    • enabledboolean

    Response Alert

    • namestringrequired
    • metricAlertMetricrequired
    • ruleAlertRulerequired
    • thresholdnumberrequired
    • cadenceAlertCadencerequired
    • filtersSessionFilter[]required
    • recipientsEmail[]required
    • enabledbooleanrequired
    • idAlertIdrequired
    • lastCheckedAtTimestamp | nullrequired
    3 more fields
    • lastFiredAtTimestamp | nullrequired
    • lastValuenumberrequired
    • createdAtTimestamprequired

    Example

    curl -X PUT "https://api.shopfa.st/v1/store/analytics/alerts/alr_0123456789abcdefghjk" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "name": "string",
      "metric": "visitors",
      "rule": "anomaly",
      "threshold": 0,
      "cadence": "hourly",
      "filters": [],
      "recipients": [
        "[email protected]"
      ],
      "enabled": true
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/alerts/alr_0123456789abcdefghjk', {
      method: 'PUT',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "name": "string",
        "metric": "visitors",
        "rule": "anomaly",
        "threshold": 0,
        "cadence": "hourly",
        "filters": [],
        "recipients": [
          "[email protected]"
        ],
        "enabled": true
      }),
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "PUT",
        "https://api.shopfa.st/v1/store/analytics/alerts/alr_0123456789abcdefghjk",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "name": "string",
          "metric": "visitors",
          "rule": "anomaly",
          "threshold": 0,
          "cadence": "hourly",
          "filters": [],
          "recipients": [
            "[email protected]"
          ],
          "enabled": True
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("PUT", "https://api.shopfa.st/v1/store/analytics/alerts/alr_0123456789abcdefghjk", strings.NewReader(`{
      "name": "string",
      "metric": "visitors",
      "rule": "anomaly",
      "threshold": 0,
      "cadence": "hourly",
      "filters": [],
      "recipients": [
        "[email protected]"
      ],
      "enabled": true
    }`))
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    req.Header.Set("Content-Type", "application/json")
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Delete an alert

    DELETE/v1/store/analytics/alerts/{alertId}

    Or name the store: DELETE /v1/stores/{storeId}/analytics/alerts/{alertId}

    analytics:writerole: analytics:writedeleteAlert

    Parameters

    • alertIdalr_…pathrequired

    Response Ok

    • okbooleanrequired

    Example

    curl -X DELETE "https://api.shopfa.st/v1/store/analytics/alerts/alr_0123456789abcdefghjk" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/alerts/alr_0123456789abcdefghjk', {
      method: 'DELETE',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "DELETE",
        "https://api.shopfa.st/v1/store/analytics/alerts/alr_0123456789abcdefghjk",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("DELETE", "https://api.shopfa.st/v1/store/analytics/alerts/alr_0123456789abcdefghjk", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Evaluate an alert now (emails only if it fires)

    POST/v1/store/analytics/alerts/{alertId}/check

    Or name the store: POST /v1/stores/{storeId}/analytics/alerts/{alertId}/check

    analytics:writerole: analytics:writecheckAlert

    Parameters

    • alertIdalr_…pathrequired

    Response CheckAlertResponse

    • firedbooleanrequired
    • valuenumberrequired
    • expectednumberrequired
    • messagestringrequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/analytics/alerts/alr_0123456789abcdefghjk/check" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/alerts/alr_0123456789abcdefghjk/check', {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "POST",
        "https://api.shopfa.st/v1/store/analytics/alerts/alr_0123456789abcdefghjk/check",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/analytics/alerts/alr_0123456789abcdefghjk/check", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Reports emailed on a schedule

    GET/v1/store/analytics/reports

    Or name the store: GET /v1/stores/{storeId}/analytics/reports

    analytics:readrole: analytics:readlistScheduledReports

    Response ListScheduledReportsResponse

    • itemsScheduledReport[]required

    Example

    curl "https://api.shopfa.st/v1/store/analytics/reports" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/reports', {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "GET",
        "https://api.shopfa.st/v1/store/analytics/reports",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/analytics/reports", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Schedule a report

    POST/v1/store/analytics/reports

    Or name the store: POST /v1/stores/{storeId}/analytics/reports

    analytics:writerole: analytics:writecreateScheduledReport

    Body

    • namestringrequired
    • kind"overview" | "traffic" | "pages" | "geography" | "bots" | "ads" | "funnel" | "financial"required
    • funnelIdafn_… | null
    • cadence"daily" | "weekly" | "monthly"required
    • weekdayinteger
    • hourinteger
    • recipientsstring[]required
    • format"summary" | "csv"
    • enabledboolean

    Response ScheduledReport

    • namestringrequired
    • kindReportKindrequired
    • funnelIdFunnelId | nullrequired
    • cadenceReportCadencerequired
    • weekdayintegerrequired
    • hourintegerrequired
    • recipientsEmail[]required
    • format"summary" | "csv"required
    • enabledbooleanrequired
    • idScheduledReportIdrequired
    3 more fields
    • lastSentAtTimestamp | nullrequired
    • nextAtTimestamprequired
    • createdAtTimestamprequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/analytics/reports" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "name": "string",
      "kind": "overview",
      "funnelId": null,
      "cadence": "daily",
      "weekday": 1,
      "hour": 8,
      "recipients": [
        "[email protected]"
      ],
      "format": "summary",
      "enabled": true
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/reports', {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "name": "string",
        "kind": "overview",
        "funnelId": null,
        "cadence": "daily",
        "weekday": 1,
        "hour": 8,
        "recipients": [
          "[email protected]"
        ],
        "format": "summary",
        "enabled": true
      }),
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "POST",
        "https://api.shopfa.st/v1/store/analytics/reports",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "name": "string",
          "kind": "overview",
          "funnelId": None,
          "cadence": "daily",
          "weekday": 1,
          "hour": 8,
          "recipients": [
            "[email protected]"
          ],
          "format": "summary",
          "enabled": True
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/analytics/reports", strings.NewReader(`{
      "name": "string",
      "kind": "overview",
      "funnelId": null,
      "cadence": "daily",
      "weekday": 1,
      "hour": 8,
      "recipients": [
        "[email protected]"
      ],
      "format": "summary",
      "enabled": true
    }`))
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    req.Header.Set("Content-Type", "application/json")
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Change a scheduled report

    PUT/v1/store/analytics/reports/{reportId}

    Or name the store: PUT /v1/stores/{storeId}/analytics/reports/{reportId}

    analytics:writerole: analytics:writeupdateScheduledReport

    Parameters

    • reportIdsrp_…pathrequired

    Body

    • namestringrequired
    • kind"overview" | "traffic" | "pages" | "geography" | "bots" | "ads" | "funnel" | "financial"required
    • funnelIdafn_… | null
    • cadence"daily" | "weekly" | "monthly"required
    • weekdayinteger
    • hourinteger
    • recipientsstring[]required
    • format"summary" | "csv"
    • enabledboolean

    Response ScheduledReport

    • namestringrequired
    • kindReportKindrequired
    • funnelIdFunnelId | nullrequired
    • cadenceReportCadencerequired
    • weekdayintegerrequired
    • hourintegerrequired
    • recipientsEmail[]required
    • format"summary" | "csv"required
    • enabledbooleanrequired
    • idScheduledReportIdrequired
    3 more fields
    • lastSentAtTimestamp | nullrequired
    • nextAtTimestamprequired
    • createdAtTimestamprequired

    Example

    curl -X PUT "https://api.shopfa.st/v1/store/analytics/reports/srp_0123456789abcdefghjk" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "name": "string",
      "kind": "overview",
      "funnelId": null,
      "cadence": "daily",
      "weekday": 1,
      "hour": 8,
      "recipients": [
        "[email protected]"
      ],
      "format": "summary",
      "enabled": true
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/reports/srp_0123456789abcdefghjk', {
      method: 'PUT',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "name": "string",
        "kind": "overview",
        "funnelId": null,
        "cadence": "daily",
        "weekday": 1,
        "hour": 8,
        "recipients": [
          "[email protected]"
        ],
        "format": "summary",
        "enabled": true
      }),
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "PUT",
        "https://api.shopfa.st/v1/store/analytics/reports/srp_0123456789abcdefghjk",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "name": "string",
          "kind": "overview",
          "funnelId": None,
          "cadence": "daily",
          "weekday": 1,
          "hour": 8,
          "recipients": [
            "[email protected]"
          ],
          "format": "summary",
          "enabled": True
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("PUT", "https://api.shopfa.st/v1/store/analytics/reports/srp_0123456789abcdefghjk", strings.NewReader(`{
      "name": "string",
      "kind": "overview",
      "funnelId": null,
      "cadence": "daily",
      "weekday": 1,
      "hour": 8,
      "recipients": [
        "[email protected]"
      ],
      "format": "summary",
      "enabled": true
    }`))
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    req.Header.Set("Content-Type", "application/json")
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Stop a scheduled report

    DELETE/v1/store/analytics/reports/{reportId}

    Or name the store: DELETE /v1/stores/{storeId}/analytics/reports/{reportId}

    analytics:writerole: analytics:writedeleteScheduledReport

    Parameters

    • reportIdsrp_…pathrequired

    Response Ok

    • okbooleanrequired

    Example

    curl -X DELETE "https://api.shopfa.st/v1/store/analytics/reports/srp_0123456789abcdefghjk" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/reports/srp_0123456789abcdefghjk', {
      method: 'DELETE',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "DELETE",
        "https://api.shopfa.st/v1/store/analytics/reports/srp_0123456789abcdefghjk",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("DELETE", "https://api.shopfa.st/v1/store/analytics/reports/srp_0123456789abcdefghjk", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Send a scheduled report now

    POST/v1/store/analytics/reports/{reportId}/send

    Or name the store: POST /v1/stores/{storeId}/analytics/reports/{reportId}/send

    analytics:writerole: analytics:writesendScheduledReport

    Parameters

    • reportIdsrp_…pathrequired

    Response SendScheduledReportResponse

    • sentintegerrequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/analytics/reports/srp_0123456789abcdefghjk/send" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/reports/srp_0123456789abcdefghjk/send', {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "POST",
        "https://api.shopfa.st/v1/store/analytics/reports/srp_0123456789abcdefghjk/send",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/analytics/reports/srp_0123456789abcdefghjk/send", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Read-only share links

    GET/v1/store/analytics/shares

    Or name the store: GET /v1/stores/{storeId}/analytics/shares

    analytics:readrole: analytics:readlistShares

    Response ListSharesResponse

    • itemsReportShare[]required

    Example

    curl "https://api.shopfa.st/v1/store/analytics/shares" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/shares', {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "GET",
        "https://api.shopfa.st/v1/store/analytics/shares",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/analytics/shares", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Create a signed, read-only link to a report

    POST/v1/store/analytics/shares

    Or name the store: POST /v1/stores/{storeId}/analytics/shares

    analytics:writerole: analytics:writecreateShare

    Body

    • namestringrequired
    • kind"overview" | "traffic" | "pages" | "geography" | "bots" | "ads" | "funnel" | "financial"required
    • funnelIdafn_… | null
    • periodobjectrequired
      • range"today" | "yesterday" | "7d" | "30d" | "90d" | "this_month" | "last_month" | "6mo" | "ytd" | "365d" | "custom"
      • fromstring | null
      • tostring | null
      • bucket"hour" | "day" | "week" | "month" | null
    • expiresInDaysinteger | null

    Response ReportShare

    • idReportShareIdrequired
    • namestringrequired
    • kindReportKindrequired
    • funnelIdFunnelId | nullrequired
    • rangeGrowthRangerequired
    • fromIsoDate | nullrequired
    • toIsoDate | nullrequired
    • createdAtTimestamprequired
    • expiresAtTimestamp | nullrequired
    • revokedAtTimestamp | nullrequired
    3 more fields
    • viewsintegerrequired
    • lastViewedAtTimestamp | nullrequired
    • urlstringrequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/analytics/shares" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "name": "string",
      "kind": "overview",
      "funnelId": null,
      "period": {},
      "expiresInDays": 30
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/shares', {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "name": "string",
        "kind": "overview",
        "funnelId": null,
        "period": {},
        "expiresInDays": 30
      }),
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "POST",
        "https://api.shopfa.st/v1/store/analytics/shares",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "name": "string",
          "kind": "overview",
          "funnelId": None,
          "period": {},
          "expiresInDays": 30
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/analytics/shares", strings.NewReader(`{
      "name": "string",
      "kind": "overview",
      "funnelId": null,
      "period": {},
      "expiresInDays": 30
    }`))
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    req.Header.Set("Content-Type", "application/json")
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Turn a share link off

    DELETE/v1/store/analytics/shares/{shareId}

    Or name the store: DELETE /v1/stores/{storeId}/analytics/shares/{shareId}

    analytics:writerole: analytics:writerevokeShare

    Parameters

    • shareIdshr_…pathrequired

    Response Ok

    • okbooleanrequired

    Example

    curl -X DELETE "https://api.shopfa.st/v1/store/analytics/shares/shr_0123456789abcdefghjk" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/shares/shr_0123456789abcdefghjk', {
      method: 'DELETE',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "DELETE",
        "https://api.shopfa.st/v1/store/analytics/shares/shr_0123456789abcdefghjk",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("DELETE", "https://api.shopfa.st/v1/store/analytics/shares/shr_0123456789abcdefghjk", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Tracking settings and pipeline health

    GET/v1/store/analytics/settings

    Or name the store: GET /v1/stores/{storeId}/analytics/settings

    analytics:readrole: analytics:readgetAnalyticsSettings

    Response AnalyticsHealth

    • settingsAnalyticsSettingsrequired
    • last24hobject[]required
      • nameAnalyticsEventNamerequired
      • eventsintegerrequired
    • lastEventAtTimestamp | nullrequired
    • rollupsobjectrequired
      • daysintegerrequired
      • lastRolledAtTimestamp | nullrequired
      • oldestIsoDate | nullrequired
    • storageobjectrequired
      • eventsintegerrequired
      • sessionsintegerrequired
      • partitionsintegerrequired
    • consentobject[]required
      • consentConsentStaterequired
      • sessionsintegerrequired

    Example

    curl "https://api.shopfa.st/v1/store/analytics/settings" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/settings', {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "GET",
        "https://api.shopfa.st/v1/store/analytics/settings",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/analytics/settings", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Change consent mode, sessions and bot filtering

    PUT/v1/store/analytics/settings

    Or name the store: PUT /v1/stores/{storeId}/analytics/settings

    analytics:writerole: analytics:writeupdateAnalyticsSettings

    Body

    • consentMode"cookieless" | "consent" | "first_party" | "off"required
    • respectGpcbooleanrequired
    • sessionTimeoutMinintegerrequired
    • botFilter"standard" | "strict"required
    • excludedPathsstring[]required
    • defaultModel"first_touch" | "last_touch" | "last_non_direct" | "linear" | "position_based" | "time_decay"required
    • lookbackDaysintegerrequired

    Response AnalyticsHealth

    • settingsAnalyticsSettingsrequired
    • last24hobject[]required
      • nameAnalyticsEventNamerequired
      • eventsintegerrequired
    • lastEventAtTimestamp | nullrequired
    • rollupsobjectrequired
      • daysintegerrequired
      • lastRolledAtTimestamp | nullrequired
      • oldestIsoDate | nullrequired
    • storageobjectrequired
      • eventsintegerrequired
      • sessionsintegerrequired
      • partitionsintegerrequired
    • consentobject[]required
      • consentConsentStaterequired
      • sessionsintegerrequired

    Example

    curl -X PUT "https://api.shopfa.st/v1/store/analytics/settings" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "consentMode": "cookieless",
      "respectGpc": false,
      "sessionTimeoutMin": 5,
      "botFilter": "standard",
      "excludedPaths": [
        "string"
      ],
      "defaultModel": "first_touch",
      "lookbackDays": 1
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/settings', {
      method: 'PUT',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "consentMode": "cookieless",
        "respectGpc": false,
        "sessionTimeoutMin": 5,
        "botFilter": "standard",
        "excludedPaths": [
          "string"
        ],
        "defaultModel": "first_touch",
        "lookbackDays": 1
      }),
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "PUT",
        "https://api.shopfa.st/v1/store/analytics/settings",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "consentMode": "cookieless",
          "respectGpc": False,
          "sessionTimeoutMin": 5,
          "botFilter": "standard",
          "excludedPaths": [
            "string"
          ],
          "defaultModel": "first_touch",
          "lookbackDays": 1
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("PUT", "https://api.shopfa.st/v1/store/analytics/settings", strings.NewReader(`{
      "consentMode": "cookieless",
      "respectGpc": false,
      "sessionTimeoutMin": 5,
      "botFilter": "standard",
      "excludedPaths": [
        "string"
      ],
      "defaultModel": "first_touch",
      "lookbackDays": 1
    }`))
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    req.Header.Set("Content-Type", "application/json")
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Recurring revenue from auto-renewing subscriptions (MRR), retries and recoveries

    GET/v1/store/analytics/auto-renew

    Or name the store: GET /v1/stores/{storeId}/analytics/auto-renew

    analytics:readrole: analytics:readgetAutoRenewMetrics

    Response AutoRenewMetrics

    • currencyCurrencyCoderequired
    • mrrMinorMinorUnitsrequired
    • activeAutoRenewintegerrequired
    • autoRenewShareBpsintegerrequired
    • retryingintegerrequired
    • charged30dMinorMinorUnitsrequired
    • recovered30dMinorMinorUnitsrequired
    • failed30dintegerrequired
    • upcoming7dMinorMinorUnitsrequired
    • upcoming7dintegerrequired
    • allowedProductsintegerrequired

    Example

    curl "https://api.shopfa.st/v1/store/analytics/auto-renew" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/analytics/auto-renew', {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
      },
    });
    if (!res.ok) throw new Error((await res.json()).detail);
    const data = await res.json();
    import os, requests
    
    res = requests.request(
        "GET",
        "https://api.shopfa.st/v1/store/analytics/auto-renew",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/analytics/auto-renew", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Was this page helpful?