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.
How this skill is triggered — by the user, by Claude, or both
Slash command
/clari-pack:clari-hello-worldThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
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.
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.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin clari-packConfigures Clari API key authentication, environment setup, and connectivity tests for forecast data exports to Snowflake, BigQuery, or Redshift.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.