n8n-nodes-humanhours adds a humanhours node + a humanhoursApi credential to n8n. Drop it at the end of any workflow that runs an AI agent and the dashboard fills in.
Install
In n8n Cloud or self-hosted:
- Open Settings → Community Nodes.
- Click Install a community node.
- Enter the package name:
n8n-nodes-humanhours
- Confirm the consent checkbox, click Install.
The humanhours node shows up under the Transform section of the node picker after the install completes. n8n self-hosted may need a restart.
Listing on npm: npmjs.com/package/n8n-nodes-humanhours.
Credential
Create a humanhoursApi credential:
- API Key —
hh_live_...from /api-keys in the dashboard. Paste the raw value, noBearerprefix; the node prepends it for you. - Base URL — defaults to
https://humanhours.dev. Override only for self-hosted or local dev.
The credential's Test connection button hits GET /api/v1/agents to verify.
Track Event operation
| Field | Required | Description |
|---|---|---|
| Agent ID | yes | slug, e.g. support-classifier |
| Task Type | yes | one of the 50 built-in keys, or your custom |
| Outcome | yes | success / failure / needs_review |
| Agent Duration (seconds) | no | omit for 0 |
| Human Baseline (minutes) | no | override the built-in for this event |
| Model | no | model id, ideally the OpenRouter id (e.g. anthropic/claude-opus-4.8). With tokens, auto-prices the run into net_saved |
| Tokens In / Tokens Out | no | prompt and completion token counts; used with Model to compute the real cost |
| Agent Cost | no | pass the cost directly instead of deriving it from Model + tokens |
| Metadata | no | free-form JSON object |
All fields except Agent ID, Task Type, and Outcome live under Add Field (Additional Fields).
The node sends an Idempotency-Key built from the n8n execution id, the node-run index, and the item index. Retries of the same node-run are deduped (you get the original event back), while loops, Split-In-Batches, sub-workflows, and fan-in patterns each record their own event.
Patterns
Pattern 1: end of a single-node agent. Drop a humanhours node at the end of an OpenAI / Claude / HTTP-Request flow. Wire agent_id to a workflow constant, task_type to whatever the workflow does.
Pattern 2: branch on outcome. Use an If node to set outcome based on the agent's structured output, then feed both branches into a single humanhours node.
Pattern 3: real net ROI from model cost. Set Model to the OpenRouter id of the model you ran (e.g. anthropic/claude-opus-4.8), and wire Tokens In / Tokens Out to {{ $json.usage.prompt_tokens }} / {{ $json.usage.completion_tokens }}. HumanHours prices the run automatically and subtracts it into net_saved. See Model cost and net ROI.
Company enrichment operations
The same node also drives company enrichment: turn a domain into an outside-in wage breakdown, then pull it for outreach. Pick the Operation in the node.
| Operation | What it does | Charges a lookup? |
|---|---|---|
| Enrich Company | Researches a single Domain and adds it to your library. Synchronous, 15-30s. Optional External ID and Tags; turn on Refresh to re-run an existing entry. | Yes, when the domain is new or Refresh is on |
| Get Company | Reads one company back from your library. | No |
| Refresh Company | Re-enriches an owned company. | Yes |
| List Companies | Lists your library. Format JSON emits one item per company; Format CSV emits a single csv field. Filter by Tag, cap with Limit (max 1000). |
No |
| Queue Bulk Enrichment | Queues a background job for a list of Domains (one per line, max 1000). Returns a job_id straight away. |
Per domain, as the worker processes each one |
| Get Job Status | Polls a bulk job. Read percent and wait for status to reach done. |
No |
Pattern 4: enrich a prospect list. Read domains from a sheet, feed them into Queue Bulk Enrichment, then loop Get Job Status behind a Wait node until status is done, and finish with List Companies (Format CSV) to hand a ready file to your outreach step.
Pattern 5: enrich on demand. When a new account lands in your CRM, fire Enrich Company on its domain and read business_case.summary straight into your first-touch message.
Lookups are a hard cap with no overages (Pro 100 per month, Agency 500 pooled). Hitting the limit returns lookup_quota_exceeded until you upgrade.