From clari-pack
Exports Clari forecasts and pipeline snapshots via REST API. Tests connectivity, polls job status, downloads JSON data. For initial integrations post-auth.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin clari-packThis skill is limited to using the following tools:
First API calls against Clari: list available forecasts, export a forecast snapshot, and check export job status. The Clari Export API is the primary integration point for getting forecast, quota, and CRM data out of Clari.
Configures Clari API key authentication, environment setup, and connectivity tests for forecast data exports to Snowflake, BigQuery, or Redshift.
Guides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Share bugs, ideas, or general feedback.
First API calls against Clari: list available forecasts, export a forecast snapshot, and check export job status. The Clari Export API is the primary integration point for getting forecast, quota, and CRM data out of Clari.
clari-install-auth setupCLARI_API_KEY environment variable setcurl -s -H "apikey: ${CLARI_API_KEY}" \
https://api.clari.com/v4/export/forecast/list \
| jq '.forecasts[] | {forecastName, forecastId, timePeriods}'
import requests
import json
import os
import time
api_key = os.environ["CLARI_API_KEY"]
headers = {"apikey": api_key, "Content-Type": "text/plain"}
# Replace with your forecast name from Step 1
forecast_name = "company_forecast"
payload = json.dumps({
"timePeriod": "2026_Q1",
"typesToExport": [
"forecast",
"quota",
"forecast_updated",
"adjustment",
"crm_total",
"crm_closed"
],
"currency": "USD",
"schedule": "NONE",
"includeHistorical": False,
"exportFormat": "JSON"
})
response = requests.post(
f"https://api.clari.com/v4/export/forecast/{forecast_name}",
headers=headers,
data=payload,
)
response.raise_for_status()
job = response.json()
print(f"Export job started: {job['jobId']}")
print(f"Status: {job['status']}")
# Poll for job completion
job_id = job["jobId"]
while True:
status_resp = requests.get(
f"https://api.clari.com/v4/export/jobs/{job_id}",
headers={"apikey": api_key},
)
status = status_resp.json()
if status["status"] == "COMPLETED":
print(f"Export ready: {status['downloadUrl']}")
break
elif status["status"] == "FAILED":
print(f"Export failed: {status.get('error', 'Unknown')}")
break
print(f"Status: {status['status']}... waiting 5s")
time.sleep(5)
if status["status"] == "COMPLETED":
download = requests.get(status["downloadUrl"])
forecast_data = download.json()
# Print summary
for entry in forecast_data.get("entries", [])[:5]:
print(f" Rep: {entry.get('ownerName')}")
print(f" Forecast: ${entry.get('forecastAmount', 0):,.0f}")
print(f" Quota: ${entry.get('quotaAmount', 0):,.0f}")
print()
| Error | Cause | Solution |
|---|---|---|
401 Unauthorized | Bad API key | Regenerate token in Clari settings |
| No forecasts listed | Wrong org or no forecasts configured | Contact Clari admin |
Job stays PENDING | Large export | Wait longer, check job status endpoint |
404 on forecast name | Name mismatch | Use exact name from list endpoint |
Proceed to clari-local-dev-loop for development workflow setup.