GraphQL · Growth Intelligence

GetAccounts

Fetch a paginated, filtered, and sorted list of accounts enriched with acquisition, activation, monetization, engagement, expansion, and firmographic data. Use this endpoint to power customer health dashboards, segment-based automations, and CRM exports. filters[].key and sort.key must use paths recognized by the growth-intelligence account list registry (see accountFieldByGraphQLKey in public-api-events).

API details

Property Value
Endpoint POST /growth-intelligence
Protocol GraphQL over HTTP
Authentication x-api-key header
Content-Type application/json
Operation query GetAccounts
Response format JSON

Account fields

Filter & sort reference

Use this table when choosing filters[].key and sort.key. It lists every path on Account (and nested objects) and whether the growth-intelligence account list allows it for filtering or sorting (see accountFieldByGraphQLKey in public-api-events). Paths with Filter or Sort set to No are still valid in GraphQL selections (for example acquisition.abuseRuleResult, activation.*) but cannot be used as filters[].key or sort.key until the registry exposes them. Invalid keys produce a GraphQL error.

Category Path Filter Sort Type Description Example
BasiccreatedAt
Created At
YesYesString!ISO timestamp of account creation"2024-01-15T10:30:00Z"
Basicdomain
Domain
YesYesString!Primary domain"acme.com"
Basicid
ID
YesNoString!Unique account identifier"acc_1234abcd"
Basicname
Name
YesYesString!Account display name"Acme Corp"
Basicsource
Source
NoNo[String!]!Data sources the account was ingested from (e.g. hubspot, stripe)["hubspot", "stripe"]
Acquisitionacquisition.abuseRuleResult
Abuse Rule Result
NoNo[AbuseRuleResult!]!Per-rule abuse check results[{ "passed": true, "ruleId": "r1", "ruleName": "Domain check", "description": "..." }]
Acquisitionacquisition.abuseStatus
Abuse Status
YesYesString!Abuse classification result (clean, suspicious, blocked)"clean"
Acquisitionacquisition.initialUtmCampaign
Initial UTM Campaign
YesYesString!First recorded UTM campaign"brand_q1"
Acquisitionacquisition.initialUtmContent
Initial UTM Content
YesYesString!First recorded UTM content variant"hero-cta"
Acquisitionacquisition.initialUtmMedium
Initial UTM Medium
YesYesString!First recorded UTM medium"cpc"
Acquisitionacquisition.initialUtmSource
Initial UTM Source
YesYesString!First recorded UTM source"google"
Acquisitionacquisition.initialUtmTerm
Initial UTM Term
YesYesString!First recorded UTM keyword term"product analytics"
Acquisitionacquisition.timeToSignupDays
Time to Signup (Days)
YesYesInt!Days from first touch to signup7
Acquisitionacquisition.touchpointsToSignup
Touchpoints to Signup
YesYesInt!Marketing touchpoints before signup5
Activationactivation.activatedOn
Activated On
NoNoStringISO timestamp of activation"2024-02-01T08:00:00Z"
Activationactivation.championUser
Champion User
NoNoStringEmail of the account champion"alice@acme.com"
Activationactivation.completionPercentage
Completion %
NoNoFloat!Percentage of journey steps completed85.0
Activationactivation.currentStep
Current Step
NoNoString!Name of the current journey step"invite_team"
Activationactivation.isDefault
Is Default
NoNoBoolean!Whether this is the default journeytrue
Activationactivation.journeyName
Journey Name
NoNoString!Name of the activation journey"Core Onboarding"
Activationactivation.lastUpdated
Last Updated
NoNoString!ISO timestamp of last activation update"2024-02-05T12:00:00Z"
Activationactivation.status
Status
NoNoString!completed | in_progress | not_started"completed"
Activationactivation.timeSpent
Time Spent
NoNoFloatTime spent on the activation journey (days)10.5
Activationactivation.ttv
Time to Value
NoNoFloatDays from signup to first value milestone14.0
Monetizationmonetization.arr
ARR
YesYesFloat!Annual recurring revenue3588.0
Monetizationmonetization.billingStatus
Billing Status
YesYesString!active | past_due | cancelled | trialing"active"
Monetizationmonetization.currency
Currency
NoNoString!Billing currency code (display only)"USD"
Monetizationmonetization.mrr
MRR
YesYesFloat!Monthly recurring revenue299.0
Monetizationmonetization.nextDueDate
Next Due Date
YesYesString!Next billing due date (ISO timestamp)"2024-03-01T00:00:00Z"
Monetizationmonetization.plan
Plan
YesYesString!Current subscription plan name"pro"
Engagementengagement.activityCount
Activity Count
YesYesInt!Total events in the current period1430
Engagementengagement.activityTrend
Activity Trend
YesYesFloat!Ratio of current vs prior period activity. >1 = growth1.46
Engagementengagement.dailyActiveUsers
Daily Active Users
YesYesInt!Average DAU over the last 30 days5
Engagementengagement.isActive
Is Active
YesYesBoolean!Whether account had activity in the last 30 daystrue
Engagementengagement.lastActiveAt
Last Active At
NoNoString!ISO timestamp of last recorded activity"2024-01-20T15:45:00Z"
Engagementengagement.monthlyActiveUsers
Monthly Active Users
YesYesInt!MAU for the current month20
Engagementengagement.previousActivityCount
Previous Activity Count
NoNoInt!Total events in the prior period980
Engagementengagement.status
Status
YesYesString!Computed tier: Healthy | At Risk | Critical | New | Inactive"Healthy"
Engagementengagement.stickinessMonthly
Monthly Stickiness
YesYesFloat!DAU/MAU ratio (0–1)0.55
Engagementengagement.stickinessWeekly
Weekly Stickiness
YesYesFloat!DAU/WAU ratio (0–1). Higher = more habitual usage0.72
Engagementengagement.weeklyActiveUsers
Weekly Active Users
YesYesInt!WAU for the current week12
Expansionexpansion.contractionMrrMovement
Contraction MRR Movement
YesYesFloat!Projected MRR loss from contraction signals-50.0
Expansionexpansion.contractionSignalCount
Contraction Signal Count
YesYesInt!Number of negative contraction signals detected1
Expansionexpansion.contractionTypes
Contraction Types
YesNo[String!]!Signal types indicating churn risk (e.g. usage_drop)["usage_drop", "support_spike"]
Expansionexpansion.expansionMrrMovement
Expansion MRR Movement
YesYesFloat!Projected MRR increase from expansion signals150.0
Expansionexpansion.expansionSignalCount
Expansion Signal Count
YesYesInt!Number of positive expansion signals detected3
Expansionexpansion.expansionTypes
Expansion Types
YesNo[String!]!Signal types driving expansion (e.g. seat_growth, usage_spike)["seat_growth", "feature_adoption"]
Firmographicsfirmographics.annualRevenue
Annual Revenue
YesYesString!Estimated annual revenue"5000000"
Firmographicsfirmographics.city
City
YesYesString!City"San Francisco"
Firmographicsfirmographics.country
Country
YesYesString!Country name"United States"
Firmographicsfirmographics.countryCode
Country Code
YesYesString!ISO 2-letter country code"US"
Firmographicsfirmographics.crunchbaseHandle
Crunchbase Handle
YesNoString!Crunchbase profile handle"acme-corp"
Firmographicsfirmographics.description
Description
YesNoString!Short company description"Cloud-native analytics platform"
Firmographicsfirmographics.domain
Domain (Enriched)
YesYesString!Enrichment-resolved primary domain"acme.com"
Firmographicsfirmographics.domainAliases
Domain Aliases
YesNoString!Known domain aliases (comma-separated)"acme.co,acme.io"
Firmographicsfirmographics.emailAddresses
Email Addresses
YesNoString!Known company email addresses"hello@acme.com"
Firmographicsfirmographics.emailProvider
Email Provider
YesYesString!Company email provider"google"
Firmographicsfirmographics.employeeCount
Employee Count
YesYesString!Headcount (numeric string)"150"
Firmographicsfirmographics.employeeCountRange
Employee Count Range
NoNoString!Headcount range bucket (display only)"101-250"
Firmographicsfirmographics.facebookHandle
Facebook Handle
YesNoString!Facebook page handle"acmecorp"
Firmographicsfirmographics.founderYear
Founding Year
YesYesString!Year company was founded"2015"
Firmographicsfirmographics.industry
Industry
YesYesString!Industry classification"Technology"
Firmographicsfirmographics.industryGroup
Industry Group
YesYesString!Industry group"Technology"
Firmographicsfirmographics.legalName
Legal Name
YesYesString!Legal entity name"Acme Corporation LLC"
Firmographicsfirmographics.linkedinHandle
LinkedIn Handle
YesNoString!LinkedIn company handle"acme-corp"
Firmographicsfirmographics.location
Location
YesYesString!Full location string"San Francisco, CA, US"
Firmographicsfirmographics.logo
Logo
NoNoString!Company logo URL"https://logo.clearbit.com/acme.com"
Firmographicsfirmographics.marketCap
Market Cap
YesYesString!Market capitalization"1000000000"
Firmographicsfirmographics.name
Name (Enriched)
YesYesString!Company name from enrichment data"Acme Corporation"
Firmographicsfirmographics.phone
Phone
YesNoString!Company phone number"+1-415-555-0100"
Firmographicsfirmographics.phoneNumbers
Phone Numbers
YesNoString!All known company phone numbers"+1-415-555-0100,+1-800-555-0100"
Firmographicsfirmographics.postalCode
Postal Code
YesNoString!Postal / ZIP code"94105"
Firmographicsfirmographics.raised
Funding Raised
YesYesString!Total funding raised"10000000"
Firmographicsfirmographics.sector
Sector
YesYesString!Business sector"Software"
Firmographicsfirmographics.state
State
YesYesString!State / province"California"
Firmographicsfirmographics.stateCode
State Code
YesYesString!State / province abbreviation"CA"
Firmographicsfirmographics.streetAddress
Street Address
YesNoString!Full street address"123 Main St"
Firmographicsfirmographics.streetName
Street Name
YesNoString!Street name"Main St"
Firmographicsfirmographics.streetNumber
Street Number
YesNoString!Street number"123"
Firmographicsfirmographics.subIndustry
Sub-Industry
YesYesString!Sub-industry classification"SaaS"
Firmographicsfirmographics.tags
Tags
YesNoString!Comma-separated company tags"b2b,saas,analytics"
Firmographicsfirmographics.tech
Tech Stack
YesNoString!Technology stack (comma-separated)"React,Node.js,Postgres"
Firmographicsfirmographics.techCategories
Tech Categories
YesNoString!Technology category tags"frontend,database,cloud"
Firmographicsfirmographics.timeZone
Time Zone
YesYesString!Company IANA time zone"America/Los_Angeles"
Firmographicsfirmographics.trafficRank
Traffic Rank
YesYesString!Alexa/similar web traffic rank"45210"
Firmographicsfirmographics.twitterHandle
Twitter Handle
YesNoString!Twitter/X handle"@acmecorp"
Firmographicsfirmographics.type
Company Type
YesYesString!private | public | nonprofit | government"private"

Input: GetAccountsRequest

All three input fields are optional — omit them to retrieve the first page of all accounts. Combine filters, sort, and pagination to build segmentation queries.

filters · optional · array

An array of filter objects. All filters are ANDed together: an account must satisfy every filter to appear in results. Each filter has three fields:

{
  "key": "<dot-notation field path>",
  "operator": "equals | not_equals | greater_than | less_than | greater_than_or_equal | less_than_or_equal",
  "value": "<string value>"
}

The value is always a string; it is coerced server-side. Use keys from the Account fields table where Filter is Yes. Paths with Filter No are still queryable in GraphQL but cannot be used as filters[].key.

Operators

Operator Symbol Description Example
equals = Exact match key: "monetization.plan", value: "pro"
not_equals Excludes the given value key: "engagement.status", value: "Churned"
greater_than > Numeric or date comparison (exclusive) key: "monetization.mrr", value: "500"
less_than < Numeric or date comparison (exclusive) key: "monetization.mrr", value: "100"
greater_than_or_equal Numeric or date comparison (inclusive) key: "monetization.arr", value: "1200"
less_than_or_equal Numeric or date comparison (inclusive) key: "engagement.monthlyActiveUsers", value: "50"

sort · optional · object

Sort by exactly one field per request. sort.key must be a path whose Sort column is Yes in the Account fields table (same rules as accountFieldByGraphQLKey).

{
  "key": "<dot-notation path — Sort = Yes in Account fields table>",
  "direction": "asc" | "desc"
}

Tip: Sort by monetization.mrr desc to see highest-revenue accounts first, or engagement.activityTrend asc to surface accounts with declining activity. Only paths with Sort = Yes in the Account fields table are valid sort keys.

pagination · optional · object

Cursor-free page-based pagination. Defaults to page 1, size 10 if omitted.

{
  "number": 1,
  "size": 10
}
  • number — page number, starts at 1
  • size — records per page, max 100

To iterate all results, increment number until the returned account array is empty.

Example request

This example fetches Pro accounts with MRR above $200, ordered by highest MRR first, excluding accounts with a Churned engagement status.

GraphQL query

query GetAccounts($input: GetAccountsRequest!) {
  getAccounts(input: $input) {
    message
    account {
      id
      name
      domain
      source
      createdAt
      acquisition {
        abuseStatus
        touchpointsToSignup
        timeToSignupDays
        initialUtmSource
        abuseRuleResult {
          passed
          ruleId
          ruleName
          description
        }
      }
      monetization {
        plan
        billingStatus
        mrr
        currency
      }
      engagement {
        status
        isActive
        monthlyActiveUsers
        activityTrend
      }
      expansion {
        expansionSignalCount
        contractionSignalCount
      }
    }
  }
}

Variables (JSON)

{
  "input": {
    "filters": [
      {
        "key": "monetization.plan",
        "operator": "equals",
        "value": "pro"
      },
      {
        "key": "engagement.status",
        "operator": "not_equals",
        "value": "Churned"
      },
      {
        "key": "monetization.mrr",
        "operator": "greater_than",
        "value": "200"
      }
    ],
    "sort": {
      "key": "monetization.mrr",
      "direction": "desc"
    },
    "pagination": {
      "number": 1,
      "size": 25
    }
  }
}

cURL

Run this from your terminal to test the API (replace YOUR_API_KEY as needed).

curl --location 'https://api.app.thrivestack.ai/growth-intelligence' \
--header 'content-type: application/json' \
--header 'x-api-key: YOUR_API_KEY' \
--data '
{
  "query": "query GetAccounts($input: GetAccountsRequest!) { getAccounts(input: $input) { message account { id name domain source createdAt acquisition { abuseStatus touchpointsToSignup timeToSignupDays initialUtmSource abuseRuleResult { passed ruleId ruleName description } } monetization { plan billingStatus mrr currency } engagement { status isActive monthlyActiveUsers activityTrend } expansion { expansionSignalCount contractionSignalCount } } } }",
  "variables": {
    "input": {
      "filters": [
        {
          "key": "monetization.plan",
          "operator": "equals",
          "value": "pro"
        },
        {
          "key": "engagement.status",
          "operator": "not_equals",
          "value": "Churned"
        },
        {
          "key": "monetization.mrr",
          "operator": "greater_than",
          "value": "200"
        }
      ],
      "sort": {
        "key": "monetization.mrr",
        "direction": "desc"
      },
      "pagination": {
        "number": 1,
        "size": 25
      }
    }
  }
}
'

Example response

The response wraps matching accounts in data.getAccounts.account[]. The message field is optional in the schema and may be "success" or omitted depending on the server response.

{
  "data": {
    "getAccounts": {
      "message": "success",
      "account": [
        {
          "id": "acc_abc123",
          "name": "Acme Corp",
          "domain": "acme.com",
          "source": ["hubspot", "stripe"],
          "createdAt": "2024-01-15T10:30:00Z",
          "acquisition": {
            "abuseStatus": "clean",
            "touchpointsToSignup": 4,
            "timeToSignupDays": 2,
            "initialUtmSource": "google",
            "abuseRuleResult": [
              { "passed": true, "ruleId": "r_domain", "ruleName": "Domain check", "description": "Domain allowed" }
            ]
          },
          "monetization": {
            "plan": "pro",
            "billingStatus": "active",
            "mrr": 299.0,
            "currency": "USD"
          },
          "engagement": {
            "status": "Healthy",
            "isActive": true,
            "monthlyActiveUsers": 22,
            "activityTrend": 1.32
          },
          "expansion": {
            "expansionSignalCount": 2,
            "contractionSignalCount": 0
          }
        },
        {
          "id": "acc_def456",
          "name": "Globex Inc",
          "domain": "globex.io",
          "source": ["stripe"],
          "createdAt": "2024-02-01T14:00:00Z",
          "acquisition": {
            "abuseStatus": "clean",
            "touchpointsToSignup": 2,
            "timeToSignupDays": 0,
            "initialUtmSource": "direct",
            "abuseRuleResult": []
          },
          "monetization": {
            "plan": "pro",
            "billingStatus": "active",
            "mrr": 249.0,
            "currency": "EUR"
          },
          "engagement": {
            "status": "At Risk",
            "isActive": true,
            "monthlyActiveUsers": 4,
            "activityTrend": 0.61
          },
          "expansion": {
            "expansionSignalCount": 0,
            "contractionSignalCount": 1
          }
        }
      ]
    }
  }
}

Tips & best practices

  • Filter values are always strings — the server coerces them to the correct type. Pass "true" for booleans, "299.0" for numbers.
  • All filters are ANDed. To segment Pro accounts that are also healthy, add two separate filter objects rather than combining values.
  • Registry vs GraphQL. The Account fields table mirrors accountFieldByGraphQLKey for list filters/sort. You can still query response-only paths (for example activation, acquisition.abuseRuleResult) in GraphQL when you need them on the wire.
  • Request only the fields you need. Omitting heavy objects like firmographics or acquisition.abuseRuleResult meaningfully reduces response size.
  • Use engagement.status for at-risk detection. Values are Healthy, At Risk, Critical, New, and Inactive.
  • Expansion signals are additive. Filter on expansion.expansionSignalCount greater_than "0" for upsell candidates, and expansion.contractionSignalCount greater_than "0" for churn risk.