Skip to content

CLI

The g8 CLI gives you terminal access to graph8’s developer tools — get framework-specific tracking snippets and progressive form templates directly from your terminal.

Personal vs Admin Credentials

For most users, CLI auth should come from your Profile.

Use CaseWhere to get credentialsWhat to use
Personal CLI usage on your machineProfile -> Developerg8 login (OAuth) or personal API key
Shared service account or org-wide automationSettings -> APIOrg API key

Installation

Terminal window
pip install g8-mcp-server

This installs the g8 command. Requires Python 3.10+.

Authentication

Three ways to authenticate:

Terminal window
g8 login

Opens your browser to sign in via OAuth. Once authenticated, a token is saved to ~/.g8/credentials.json and used automatically for all future commands. No API key needed.

API key

If you prefer using an API key, use your personal API key from Profile -> Developer. Admins can also use org keys from Settings -> API for shared integrations.

Store it locally:

Terminal window
g8 login --api-key

Prompts you to paste an API key, validates it, and saves it to ~/.g8/credentials.json.

Or set it as an environment variable:

Terminal window
export G8_API_KEY="your_api_key_here"

g8 logout

Remove stored credentials:

Terminal window
g8 logout

g8 whoami

Check your current authentication status:

Terminal window
g8 whoami
# Auth source: OAuth (~/.g8/credentials.json)
# Logged in as: thomas@graph8.com

Commands

g8 snippet

Get the graph8 tracking snippet for any supported framework. The snippet loads p.js — the graph8 tracking script — on every page.

Usage:

Terminal window
# Get snippet for a framework
g8 snippet --framework nextjs
# List all supported frameworks
g8 snippet --list
# Get snippet for a specific repo
g8 snippet --framework react --repo-id <repo-id>
# Output as JSON
g8 snippet --framework html --format json

Options:

OptionDescription
--frameworkTarget framework (required unless --list)
--listList all supported frameworks
--repo-idRepository ID for repo-specific config (optional)
--formatOutput format: text (default) or json

Supported Frameworks:

FrameworkRenderingDescription
htmlSSRHTML / Vanilla JS — script tag in <head>
reactCSRReact — useEffect component
nextjsSSRNext.js — next/script for App Router and Pages Router
vueCSRVue — onMounted composable
wordpressSSRWordPress — functions.php hook
webflowSSRWebflow — Custom Code in project settings
shopifySSRShopify — theme.liquid snippet

Example output:

Terminal window
$ g8 snippet --framework nextjs
graph8 Tracking Snippet — Next.js
Setup Steps:
1. App Router: add the Script to app/layout.tsx
2. Pages Router: add the Script to pages/_app.tsx
3. Use window.g8?.track() and window.g8?.identify() in client components
Code:
————————————————————————————————————————————————————————————
// app/layout.tsx (App Router)
import Script from 'next/script';
export default function RootLayout({ children }) {
return (
<html>
<head>
<Script
src="https://t.graph8.com/p.js"
data-write-key="your-write-key"
data-tracking-host="https://t.graph8.com"
strategy="afterInteractive"
/>
</head>
<body>{children}</body>
</html>
);
}
————————————————————————————————————————————————————————————
Tracking Methods:
identify: g8.identify("user-id", {email: "user@example.com", name: "Jane Doe"})
track: g8.track("event_name", {property: "value"})

Privacy Options

The generated snippet includes data-attributes you can add to control privacy behavior:

AttributeValuesDescription
data-privacy-dont-send"true"Disables cookies and event sending
data-privacy-user-ids"true"Disables storing user identifiers
data-privacy-ip-policy"keep", "stripLastOctet", "remove"Controls IP address handling
data-init-only"true"Initializes the script without sending a page event

Verifying the Snippet

After adding the snippet to your app:

  1. Open browser DevTools -> Network tab
  2. Look for requests to your tracking host (/p.js)
  3. In Console: window.g8 should be defined
  4. Call g8.track('test_event') — you should see a network request

g8 form

Get a progressive form template — an embeddable or popup form that collects data in stages across multiple visits.

Usage:

Terminal window
# Get an embedded form template
g8 form --framework react --variant embedded
# Get a popup form template
g8 form --framework nextjs --variant popup
# Custom field stages
g8 form --framework html --variant embedded \
--stages '[{"stage":1,"fields":[{"name":"email","type":"email","required":true}]}]'
# Output as JSON
g8 form --framework vue --variant popup --format json

Options:

OptionDescription
--frameworkTarget framework (required)
--variantForm variant: embedded or popup (required)
--repo-idRepository ID for repo-specific config (optional)
--stagesCustom field stages as JSON string (optional)
--formatOutput format: text (default) or json

Form Variants:

VariantBest for
embeddedInline forms within page content (signup sections, footers, sidebars)
popupModal/overlay forms triggered by buttons or page events

Progressive Form Stages

Forms collect data progressively across visits — asking for a little more each time. The default stages are:

StageFieldsPurpose
1work_emailInitial capture — lowest friction
2first_name, last_name, companyIdentity enrichment
3job_title, phoneQualification data

The form tracks which stage the visitor has completed using localStorage and shows the next stage on their return visit.

Custom stages: Pass a JSON array to --stages to override the defaults:

Terminal window
g8 form --framework react --variant embedded \
--stages '[
{"stage": 1, "fields": [
{"name": "email", "type": "email", "required": true}
]},
{"stage": 2, "fields": [
{"name": "name", "type": "text", "required": true},
{"name": "role", "type": "select", "required": false,
"options": ["Developer", "Manager", "Executive"]}
]}
]'

Data Flow

When a form is submitted, the data flows through graph8’s tracking pipeline:

  1. Form captures field values from the visitor
  2. g8.identify() sends the data to graph8’s CDP
  3. g8.track() records the form submission event
  4. Data appears in the contact profile in your graph8 workspace

Output Formats

FormatFlagDescription
Text--format text (default)Human-readable output with headers, code blocks, and setup steps
JSON--format jsonMachine-readable output — same structure as the MCP tool response

The JSON format is useful for piping into other tools or scripts:

Terminal window
g8 snippet --framework html --format json | jq '.snippet_code'

Workflow

The recommended order for integrating graph8 into your app:

  1. Install the tracking snippet — this is always the first step

    Terminal window
    g8 snippet --framework nextjs
  2. Add the snippet to your app — follow the setup steps in the output

  3. Configure tracking — add identify and track calls:

    // On login/signup
    g8.identify("user-123", { email: "user@example.com", name: "Jane" });
    // On key actions
    g8.track("plan_selected", { plan: "pro", billing: "annual" });
  4. Add progressive forms — once tracking is working:

    Terminal window
    g8 form --framework nextjs --variant embedded
  5. Verify - open DevTools Network tab and look for requests to your tracking host


CRM Commands

g8 search-contacts

Search contacts already in your CRM.

Terminal window
g8 search-contacts --job-title "VP Sales" --limit 10
g8 search-contacts --email john@acme.com
g8 search-contacts --company "Acme" --seniority VP
g8 search-contacts --list-id 637
OptionDescription
--emailFilter by email (exact match)
--nameFilter by name (partial match)
--job-titleFilter by job title (partial match)
--seniorityFilter by seniority (C-Suite, VP, Director, Manager)
--companyFilter by company name (partial match)
--countryFilter by country
--list-idFilter by contact list ID
--pagePage number (default 1)
--limitResults per page (default 25)

g8 search-companies

Search companies in your CRM.

Terminal window
g8 search-companies --industry "SaaS" --limit 10
g8 search-companies --domain acme.com
OptionDescription
--domainFilter by domain
--industryFilter by industry
--nameFilter by company name
--pagePage number (default 1)
--limitResults per page (default 25)

g8 create-contact

Create a new contact in your CRM.

Terminal window
g8 create-contact --email jane@acme.com --first-name Jane --last-name Smith --job-title "VP Sales"
g8 create-contact --email john@startup.io --list-id 637
OptionDescription
--emailWork email (required)
--first-nameFirst name
--last-nameLast name
--job-titleJob title
--company-domainCompany domain
--list-idAdd to this list immediately

g8 create-list

Create a new contact or company list.

Terminal window
g8 create-list --title "VP Sales - SaaS SMB"
g8 create-list --title "Target Companies" --type companies
OptionDescription
--titleList name (required)
--typecontacts (default) or companies

g8 add-to-list

Add existing contacts to a list.

Terminal window
g8 add-to-list --list-id 637 --contact-ids 5028106,5028105,5028104
OptionDescription
--list-idList ID (required)
--contact-idsComma-separated contact IDs (required)

Prospecting Commands

g8 lookup-person

Look up a single person in graph8’s 300M+ data index. Costs 1 credit.

Terminal window
g8 lookup-person --email mark.rubin@tiledb.com
g8 lookup-person --linkedin "linkedin.com/in/jane-smith"
g8 lookup-person --first-name Jane --last-name Smith --company-domain acme.com
OptionDescription
--emailEmail address
--linkedinLinkedIn URL
--first-nameFirst name (use with last-name + company-domain)
--last-nameLast name
--company-domainCompany domain

g8 lookup-company

Look up a company. Costs 1 credit.

Terminal window
g8 lookup-company --domain tiledb.com
g8 lookup-company --name "Acme Corp"

g8 find-contacts

Search the open data index for new prospects. Credits charged per result.

Terminal window
g8 find-contacts --filters '[{"field":"seniority_level","operator":"any_of","value":["VP","Director"]},{"field":"company_industry","operator":"contains","value":["SaaS"]}]' --limit 10
OptionDescription
--filtersJSON array of filter objects (required)
--pagePage number (default 1)
--limitResults per page (default 25)

Filter fields: first_name, last_name, work_email, job_title, seniority_level, company_name, company_domain, company_industry, company_employee_count, company_revenue, country, state, city

Operators: any_of, contains, all_of, none_of, is_empty, is_not_empty, between, exists

g8 find-companies

Search the company database. Credits charged per result.

Terminal window
g8 find-companies --filters '[{"field":"industry","operator":"contains","value":["SaaS"]},{"field":"employee_count","operator":"between","value":[50,500]}]'

g8 build-list

Search for prospects and save to a new list. Credits charged per contact saved.

Terminal window
g8 build-list --filters '[{"field":"seniority_level","operator":"any_of","value":["VP"]}]' --title "VP Sales - SaaS" --max-results 50
OptionDescription
--filtersJSON filter array (required)
--titleList name (required)
--max-resultsMax contacts to save (default 100)

Enrichment

g8 enrich

Enrich contacts with verified emails, phones, and company data. Credits charged per contact.

Terminal window
g8 enrich --contact-ids 5028106,5028105,5028104 --list-id 637
OptionDescription
--contact-idsComma-separated contact IDs (required)
--list-idList ID the contacts belong to (required)

Sequences

g8 sequences

List available outbound sequences.

Terminal window
g8 sequences --limit 10

g8 add-to-sequence

Enroll contacts in an outbound sequence.

Terminal window
g8 add-to-sequence --sequence-id "0686895f-..." --contact-ids 5028106,5028105 --list-id 637
OptionDescription
--sequence-idSequence ID from g8 sequences (required)
--contact-idsComma-separated contact IDs (required)
--list-idList ID (required)

g8 create-sequence

Create a new outreach sequence.

Terminal window
g8 create-sequence --name "Q2 VP Outbound" --description "Multi-step email + LinkedIn sequence"
OptionDescription
--nameSequence name (required)
--descriptionSequence description
--stepsJSON array of step configs
--channelsJSON array of channel configs
--campaign-idLink to a campaign (optional)

g8 sequence-preview

Preview a sequence’s steps and channels before launching.

Terminal window
g8 sequence-preview --sequence-id "0686895f-..."

g8 update-sequence

Update sequence metadata.

Terminal window
g8 update-sequence --sequence-id "0686895f-..." --name "Updated Name" --description "New goal"

g8 pause-sequence

Pause a live sequence. No new messages will be sent until resumed.

Terminal window
g8 pause-sequence --sequence-id "0686895f-..."

g8 resume-sequence

Resume a paused sequence. Execution times are recalculated respecting business hours.

Terminal window
g8 resume-sequence --sequence-id "0686895f-..."

g8 sequence-analytics

Get performance metrics for a sequence.

Terminal window
g8 sequence-analytics --sequence-id "0686895f-..."

Returns overview (total contacts, completion rate), performance (funnel, response rates), engagement (reply rate, bounce rate), and timeline data.

g8 delete-sequence

Archive a sequence (soft delete). Active sequences are paused first.

Terminal window
g8 delete-sequence --sequence-id "0686895f-..."

Inbox

g8 inbox-list

List reply threads across email, SMS, and LinkedIn.

Terminal window
g8 inbox-list --channel email --limit 20
g8 inbox-list --sequence-id "0686895f-..." --status unread
g8 inbox-list --assignee jane@company.com --tag qualified
OptionDescription
--channelFilter by channel: email, sms, linkedin
--sequence-idFilter by sequence
--statusFilter by thread status
--assigneeFilter by assigned user email
--tagFilter by tag
--pagePage number (default 1)
--limitResults per page (default 20)

g8 inbox-get

Get a single reply thread with full message history.

Terminal window
g8 inbox-get --reply-id <thread-id> --channel email

g8 inbox-assign

Assign a reply thread to a team member.

Terminal window
g8 inbox-assign --reply-id <thread-id> --assignee jane@company.com

g8 inbox-tag

Tag a reply thread for categorization.

Terminal window
g8 inbox-tag --reply-id <thread-id> --tag-ids "qualified,hot-lead"

g8 inbox-draft

Generate an AI reply draft based on conversation context. Charges credits.

Terminal window
g8 inbox-draft --reply-id <thread-id>

g8 inbox-send

Send a reply via email, SMS, or LinkedIn.

Terminal window
g8 inbox-send --reply-id <thread-id> --channel email --body "Thanks for your interest..."

Audience & CRM Sync

g8 sync-audience-list

List configured audience syncs to ad platforms.

Terminal window
g8 sync-audience-list

g8 sync-audience-create

Create a new audience sync to Meta, LinkedIn Ads, Google Ads, or X.

Terminal window
g8 sync-audience-create --audience-id 42 --platform meta --mode mirror --cadence 24
OptionDescription
--audience-idSource audience/list ID (required)
--platformTarget platform: meta, linkedin, google, x (required)
--modeSync mode: mirror (full replace) or append_only (required)
--cadenceRefresh cadence in hours (0 = manual only)

g8 sync-audience-trigger

Manually trigger a sync run.

Terminal window
g8 sync-audience-trigger --config-id <id>

g8 sync-audience-runs

View sync run history with record counts.

Terminal window
g8 sync-audience-runs --config-id <id>

g8 sync-audience-errors

View error logs for failed sync runs.

Terminal window
g8 sync-audience-errors --config-id <id>

g8 sync-crm-list

List connected CRM integrations.

Terminal window
g8 sync-crm-list

g8 sync-crm-push

Push contacts, companies, or list memberships to a CRM.

Terminal window
g8 sync-crm-push --provider hubspot --type contacts --records '[{"email":"jane@acme.com","properties":{"firstname":"Jane"}}]'
g8 sync-crm-push --provider salesforce --type companies --records '[{"Name":"Acme Corp","Website":"acme.com"}]'
OptionDescription
--providerCRM provider: hubspot, salesforce, pipedrive, zoho, sugarcrm (required)
--typePush type: contacts, companies, lists (required)
--recordsJSON array of records to push (required)

g8 sync-crm-fields

Discover available field mappings for a CRM provider.

Terminal window
g8 sync-crm-fields --provider hubspot

g8 sync-crm-status

Check CRM connection health and rate limits.

Terminal window
g8 sync-crm-status --provider salesforce

Campaigns

g8 campaigns

List campaigns in your organization.

Terminal window
g8 campaigns --limit 10

g8 campaign

Get full details for a specific campaign.

Terminal window
g8 campaign 4781adce-464b-402e-9a69-b6dbb6376150

Piping & Scripting

All commands output JSON, making them scriptable:

Terminal window
# Extract emails from search results
g8 search-contacts --job-title "CTO" --limit 50 | jq '.[].work_email'
# Count contacts in a list
g8 search-contacts --list-id 637 | jq 'length'
# Export to CSV
g8 search-contacts --seniority VP --limit 100 | jq -r '.[] | [.first_name,.last_name,.work_email,.job_title] | @csv'