{
  "schemaVersion": "1.0",
  "item": {
    "slug": "freshbooks-cli",
    "name": "FreshBooks CLI",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/haseebuchiha/freshbooks-cli",
    "canonicalUrl": "https://clawhub.ai/haseebuchiha/freshbooks-cli",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/freshbooks-cli",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=freshbooks-cli",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/freshbooks-cli"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/freshbooks-cli",
    "agentPageUrl": "https://openagent3.xyz/skills/freshbooks-cli/agent",
    "manifestUrl": "https://openagent3.xyz/skills/freshbooks-cli/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/freshbooks-cli/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "freshbooks-cli",
        "body": "CLI tool for managing FreshBooks invoices, clients, and billing. Uses the official @freshbooks/api SDK."
      },
      {
        "title": "Install",
        "body": "npm install -g @haseebuchiha/freshbooks-cli\n\nRequires .npmrc with @haseebuchiha:registry=https://npm.pkg.github.com for GitHub Package Registry."
      },
      {
        "title": "Setup (once)",
        "body": "Authenticate with FreshBooks OAuth2. You must use the --manual flag (localhost redirect does not work with FreshBooks).\n\nfreshbooks auth login \\\n  --client-id \"<FRESHBOOKS_CLIENT_ID>\" \\\n  --client-secret \"<FRESHBOOKS_CLIENT_SECRET>\" \\\n  --manual\n\nThis opens the browser. Authorize, then copy the code from the page and paste it into the CLI. Tokens are stored at ~/.config/freshbooks-cli/config.json (0600 permissions) and auto-refresh before expiry.\n\nVerify: freshbooks auth status"
      },
      {
        "title": "Auth commands",
        "body": "freshbooks auth login --client-id <id> --client-secret <secret> --manual -- authenticate via OAuth2 OOB flow\nfreshbooks auth logout -- clear stored tokens and credentials\nfreshbooks auth status -- show account ID, token expiry, and auth state\nfreshbooks auth refresh -- manually refresh the access token"
      },
      {
        "title": "Clients commands",
        "body": "freshbooks clients list [-p <page>] [--per-page <n>] [-s <search>] -- list clients, search by org name\nfreshbooks clients get <id> -- get a single client by ID\nfreshbooks clients create [--fname <name>] [--lname <name>] [--email <email>] [--organization <org>] -- create a client\nfreshbooks clients create --data '<json>' -- create with full JSON payload\nfreshbooks clients update <id> --data '<json>' -- update a client\n\nExample: freshbooks clients create --fname \"Taha\" --organization \"abcg.io\""
      },
      {
        "title": "Invoices commands",
        "body": "freshbooks invoices list [-p <page>] [--per-page <n>] -- list invoices\nfreshbooks invoices get <id> -- get a single invoice by ID\nfreshbooks invoices create --client-id <id> [--lines '<json>'] -- create an invoice with line items\nfreshbooks invoices create --client-id <id> --data '<json>' -- create with full JSON payload\nfreshbooks invoices update <id> --data '<json>' -- update an invoice\nfreshbooks invoices archive <id> -- archive an invoice (no permanent delete in FreshBooks)\nfreshbooks invoices share-link <id> -- get a shareable link for an invoice"
      },
      {
        "title": "Line items format",
        "body": "Lines are a JSON array. Each line has name, qty, and unitCost (money object):\n\n[\n  {\"name\": \"Web Services\", \"qty\": 1, \"unitCost\": {\"amount\": \"15000.00\", \"code\": \"USD\"}},\n  {\"name\": \"App Services\", \"qty\": 1, \"unitCost\": {\"amount\": \"15000.00\", \"code\": \"USD\"}}\n]\n\nExample (full invoice create):\n\nfreshbooks invoices create --client-id 818183 \\\n  --lines '[{\"name\":\"Web Services\",\"qty\":1,\"unitCost\":{\"amount\":\"15000.00\",\"code\":\"USD\"}},{\"name\":\"App Services\",\"qty\":1,\"unitCost\":{\"amount\":\"15000.00\",\"code\":\"USD\"}}]'"
      },
      {
        "title": "Onboard a new client and invoice them",
        "body": "freshbooks clients create --fname \"Name\" --organization \"Company\" -- note the returned id\nfreshbooks invoices create --client-id <id> --lines '[...]' -- create the invoice\nfreshbooks invoices share-link <invoice-id> -- get shareable link"
      },
      {
        "title": "Look up billing for a client",
        "body": "freshbooks clients list -s \"company name\" -- find the client ID\nfreshbooks invoices list -- list all invoices (filter by client in output)\nfreshbooks invoices get <id> -- get full invoice details"
      },
      {
        "title": "Notes",
        "body": "All output is JSON to stdout. Pipe to jq for filtering: freshbooks clients list | jq '.clients[].organization'\nMoney values are {\"amount\": \"string\", \"code\": \"USD\"}. The amount is always a string like \"30000.00\", never a number. Do not use parseFloat on money.\narchive sets vis_state=1. FreshBooks does not support permanent deletion.\nTokens auto-refresh. If refresh fails, re-run freshbooks auth login --client-id <id> --client-secret <secret> --manual.\nClient credentials can also be read from env vars FRESHBOOKS_CLIENT_ID and FRESHBOOKS_CLIENT_SECRET (takes priority over stored config).\nAlways use --manual for auth login. The localhost callback redirect URI does not work with FreshBooks.\nConfirm with the user before creating invoices or modifying billing data."
      }
    ],
    "body": "freshbooks-cli\n\nCLI tool for managing FreshBooks invoices, clients, and billing. Uses the official @freshbooks/api SDK.\n\nInstall\nnpm install -g @haseebuchiha/freshbooks-cli\n\n\nRequires .npmrc with @haseebuchiha:registry=https://npm.pkg.github.com for GitHub Package Registry.\n\nSetup (once)\n\nAuthenticate with FreshBooks OAuth2. You must use the --manual flag (localhost redirect does not work with FreshBooks).\n\nfreshbooks auth login \\\n  --client-id \"<FRESHBOOKS_CLIENT_ID>\" \\\n  --client-secret \"<FRESHBOOKS_CLIENT_SECRET>\" \\\n  --manual\n\n\nThis opens the browser. Authorize, then copy the code from the page and paste it into the CLI. Tokens are stored at ~/.config/freshbooks-cli/config.json (0600 permissions) and auto-refresh before expiry.\n\nVerify: freshbooks auth status\n\nAuth commands\nfreshbooks auth login --client-id <id> --client-secret <secret> --manual -- authenticate via OAuth2 OOB flow\nfreshbooks auth logout -- clear stored tokens and credentials\nfreshbooks auth status -- show account ID, token expiry, and auth state\nfreshbooks auth refresh -- manually refresh the access token\nClients commands\nfreshbooks clients list [-p <page>] [--per-page <n>] [-s <search>] -- list clients, search by org name\nfreshbooks clients get <id> -- get a single client by ID\nfreshbooks clients create [--fname <name>] [--lname <name>] [--email <email>] [--organization <org>] -- create a client\nfreshbooks clients create --data '<json>' -- create with full JSON payload\nfreshbooks clients update <id> --data '<json>' -- update a client\n\nExample: freshbooks clients create --fname \"Taha\" --organization \"abcg.io\"\n\nInvoices commands\nfreshbooks invoices list [-p <page>] [--per-page <n>] -- list invoices\nfreshbooks invoices get <id> -- get a single invoice by ID\nfreshbooks invoices create --client-id <id> [--lines '<json>'] -- create an invoice with line items\nfreshbooks invoices create --client-id <id> --data '<json>' -- create with full JSON payload\nfreshbooks invoices update <id> --data '<json>' -- update an invoice\nfreshbooks invoices archive <id> -- archive an invoice (no permanent delete in FreshBooks)\nfreshbooks invoices share-link <id> -- get a shareable link for an invoice\nLine items format\n\nLines are a JSON array. Each line has name, qty, and unitCost (money object):\n\n[\n  {\"name\": \"Web Services\", \"qty\": 1, \"unitCost\": {\"amount\": \"15000.00\", \"code\": \"USD\"}},\n  {\"name\": \"App Services\", \"qty\": 1, \"unitCost\": {\"amount\": \"15000.00\", \"code\": \"USD\"}}\n]\n\n\nExample (full invoice create):\n\nfreshbooks invoices create --client-id 818183 \\\n  --lines '[{\"name\":\"Web Services\",\"qty\":1,\"unitCost\":{\"amount\":\"15000.00\",\"code\":\"USD\"}},{\"name\":\"App Services\",\"qty\":1,\"unitCost\":{\"amount\":\"15000.00\",\"code\":\"USD\"}}]'\n\nWorkflows\nOnboard a new client and invoice them\nfreshbooks clients create --fname \"Name\" --organization \"Company\" -- note the returned id\nfreshbooks invoices create --client-id <id> --lines '[...]' -- create the invoice\nfreshbooks invoices share-link <invoice-id> -- get shareable link\nLook up billing for a client\nfreshbooks clients list -s \"company name\" -- find the client ID\nfreshbooks invoices list -- list all invoices (filter by client in output)\nfreshbooks invoices get <id> -- get full invoice details\nNotes\nAll output is JSON to stdout. Pipe to jq for filtering: freshbooks clients list | jq '.clients[].organization'\nMoney values are {\"amount\": \"string\", \"code\": \"USD\"}. The amount is always a string like \"30000.00\", never a number. Do not use parseFloat on money.\narchive sets vis_state=1. FreshBooks does not support permanent deletion.\nTokens auto-refresh. If refresh fails, re-run freshbooks auth login --client-id <id> --client-secret <secret> --manual.\nClient credentials can also be read from env vars FRESHBOOKS_CLIENT_ID and FRESHBOOKS_CLIENT_SECRET (takes priority over stored config).\nAlways use --manual for auth login. The localhost callback redirect URI does not work with FreshBooks.\nConfirm with the user before creating invoices or modifying billing data."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/haseebuchiha/freshbooks-cli",
    "publisherUrl": "https://clawhub.ai/haseebuchiha/freshbooks-cli",
    "owner": "haseebuchiha",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/freshbooks-cli",
    "downloadUrl": "https://openagent3.xyz/downloads/freshbooks-cli",
    "agentUrl": "https://openagent3.xyz/skills/freshbooks-cli/agent",
    "manifestUrl": "https://openagent3.xyz/skills/freshbooks-cli/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/freshbooks-cli/agent.md"
  }
}