Install
openclaw skills install ghostfolioManage and query Ghostfolio portfolio data (performance, holdings, dividends) using API endpoints and token auth patterns.
openclaw skills install ghostfolioUse this skill when the user asks about Ghostfolio portfolio metrics, holdings, dividends, or API troubleshooting.
# Prefer local access when available
export GHOSTFOLIO_BASE_URL="http://127.0.0.1:3333"
# Optional remote example:
# export GHOSTFOLIO_BASE_URL="https://rpi5.gate-mintaka.ts.net:8444"
# Long-lived token supplied by user/admin
export GHOSTFOLIO_TOKEN="..."
# Optional but recommended
export GHOSTFOLIO_TIMEZONE="Europe/Paris"
Ghostfolio setups can differ. Support both modes:
AUTH_HEADER="Authorization: Bearer $GHOSTFOLIO_TOKEN"
AUTH_TOKEN=$(curl -fsS "$GHOSTFOLIO_BASE_URL/api/v1/auth/anonymous" \
-H 'Content-Type: application/json' \
--data "{\"accessToken\":\"$GHOSTFOLIO_TOKEN\"}" \
| jq -r '.authToken')
[ -n "$AUTH_TOKEN" ] && [ "$AUTH_TOKEN" != "null" ] || {
echo "Failed to obtain authToken" >&2
exit 1
}
AUTH_HEADER="Authorization: Bearer $AUTH_TOKEN"
curl -fsS "$GHOSTFOLIO_BASE_URL/api/v2/portfolio/performance?range=ytd" \
-H "$AUTH_HEADER" \
-H 'Accept: application/json' \
-H "x-ghostfolio-timezone: $GHOSTFOLIO_TIMEZONE" \
| jq .
curl -fsS "$GHOSTFOLIO_BASE_URL/api/v1/portfolio/holdings?range=ytd" \
-H "$AUTH_HEADER" \
-H 'Accept: application/json' \
-H "x-ghostfolio-timezone: $GHOSTFOLIO_TIMEZONE" \
| jq .
curl -fsS "$GHOSTFOLIO_BASE_URL/api/v1/portfolio/dividends?groupBy=month&range=ytd" \
-H "$AUTH_HEADER" \
-H 'Accept: application/json' \
-H "x-ghostfolio-timezone: $GHOSTFOLIO_TIMEZONE" \
| jq .
# 1) Try direct bearer first
for ep in \
'/api/v2/portfolio/performance?range=ytd' \
'/api/v1/portfolio/holdings?range=ytd' \
'/api/v1/portfolio/dividends?groupBy=month&range=ytd'
do
code=$(curl -s -o /tmp/gf_probe.json -w '%{http_code}' "$GHOSTFOLIO_BASE_URL$ep" \
-H "Authorization: Bearer $GHOSTFOLIO_TOKEN" \
-H 'Accept: application/json' \
-H "x-ghostfolio-timezone: $GHOSTFOLIO_TIMEZONE")
echo "direct $ep -> $code"
done
# 2) If direct is 401/403, try anonymous exchange
AUTH_TOKEN=$(curl -fsS "$GHOSTFOLIO_BASE_URL/api/v1/auth/anonymous" \
-H 'Content-Type: application/json' \
--data "{\"accessToken\":\"$GHOSTFOLIO_TOKEN\"}" | jq -r '.authToken')
echo "anonymous exchange token present: $([ -n "$AUTH_TOKEN" ] && [ "$AUTH_TOKEN" != "null" ] && echo yes || echo no)"
401 Unauthorized
403 Forbidden
Timezone inconsistencies
x-ghostfolio-timezone (or at least Timezone) explicitly.Connectivity issues
http://127.0.0.1:3333) if service runs locally.curl -k can help.curl -fsS so HTTP/API errors are not silently ignored.