npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@approx-tech/n8n-nodes-approx

v0.5.1

Published

n8n community nodes for Approx — construction cost-estimation and quantity-takeoff automation.

Readme

@approx-tech/n8n-nodes-approx

npm version

n8n community node for Approx — automate construction cost-estimation and quantity-takeoff workflows.

Heads-up — breaking change in 0.5.0: the five previous nodes (Approx Project, Approx Report, Approx Unit Price, Approx Authority, Approx Template) have been consolidated into a single Approx node. Every former node is now a Resource inside that node. The credential has also been renamed (approxApiapproxOAuth2Api) and now uses n8n's built-in OAuth2 client-credentials flow. See Migrating from 0.4.x.


Contents


Install

Self-hosted n8n

In the n8n UI go to Settings → Community Nodes → Install, enter:

@approx-tech/n8n-nodes-approx

…and click Install. Restart n8n if it doesn't reload automatically.

Or from the host shell:

npm install @approx-tech/n8n-nodes-approx

n8n Cloud

The package will appear in the verified community catalogue once approved.


Credentials

Approx authenticates with Auth0 Machine-to-Machine (client-credentials) tokens. Ask your Approx contact for a client_id/client_secret issued by the Approx Auth0 tenant.

In n8n: Credentials → New → Approx OAuth2 API.

| Field | Required | Default | Description | | --- | :---: | --- | --- | | Client ID | ✅ | — | Auth0 M2M application client id (inherited from OAuth2 API). | | Client Secret | ✅ | — | Auth0 M2M application client secret (inherited from OAuth2 API). | | Auth0 Domain | ✅ | auth.approx.cloud | Approx Auth0 tenant domain (no protocol). | | Audience | ✅ | https://approx.azurewebsites.net | API audience configured in Auth0. Sent as audience in the token request body. | | Base URL | ✅ | https://approx.azurewebsites.net | Approx API base URL (no trailing slash). |

n8n handles fetching, caching and refreshing the bearer token — there is no custom token code in this package. Click Save: n8n will issue a test request to GET /api/integrations/projects?dqb.take=1 and confirm the credential works.


Resources and operations

Every former node is now a Resource on the single Approx node. Choose the resource, then the operation, then fill in the parameters.

| Resource | Operations | Approx API endpoint(s) | | --- | --- | --- | | Authority | Get Many, Get, Create, Update Name, Update Logo, Delete | /api/integrations/authorities[/{id}[/name\|logo]] | | File | Download | GET /api/integrations/files/{blobId}/download | | Original File | Get Many, Upload Many, Delete | /api/integrations/projects/{projectId}/original-files[:bulk\|/{id}] | | Pricing | Get Many | GET /api/integrations/pricing/libraries/{libraryId}/pricings | | Pricing Library | Get Many | GET /api/integrations/pricing/libraries | | Project | Get Many, Get, Create, Update, Delete | /api/integrations/projects[/{id}] | | Property | Get Many, Get, Create, Create Many, Update Name, Update Multiplier, Delete | /api/integrations/projects/{projectId}/properties[…] | | Property Type | Get by Takeoff Template, Get by Project | /api/integrations/templates/{takeoff/{id}\|projects/{id}}/property-types | | Report | Create, Get, Download | /api/integrations/reports[/{id}[/download]] | | Report Template | Get Many | GET /api/integrations/templates/takeoff/{id}/report-templates | | Static File | Get Many, Upload Many, Delete | /api/integrations/projects/{projectId}/static-files[:bulk\|/{id}] | | Takeoff Template | Get Many, Get | /api/integrations/templates/takeoff[/{id}] | | Work Group Type | Get Many | GET /api/integrations/projects/{projectId}/work-group-types |

List endpoints accept the optional Query Options collection (Skip, Take, Order By, Where) which is mapped to the standard Approx DQB query string (dqb.skip, dqb.take, dqb.orderBy, dqb.where).


Usage example: list projects, generate a report, download the ZIP

The workflow below walks the three most common Approx operations end-to-end:

  1. Approx (Project: Get Many) — fetch the first 5 projects.
  2. Approx (Report: Create) — queue a report for the first returned project.
  3. Wait — give the report queue ~30 s to finish.
  4. Approx (Report: Download) — download the generated ZIP into a binary field called report.

Step-by-step (manual setup)

  1. Add a Manual Trigger.
  2. Add an Approx node:
    • Credential: select your Approx OAuth2 API credential
    • Resource: Project
    • Operation: Get Many
    • Query Options → Take: 5
  3. Add another Approx node:
    • Resource: Report
    • Operation: Create
    • Project ID: ={{ $json.id }} (expression — picks the id from the first node)
  4. Add a Wait node — 30 seconds (Approx reports usually finish in seconds; for big projects use the Report → Get operation in a loop with If status === "Completed" instead).
  5. Add a third Approx node:
    • Resource: Report
    • Operation: Download
    • Report ID: ={{ $json.id }}
    • Put Output File in Field: report

Execute the workflow. The last node's output will contain binary.report holding the report ZIP, ready to be written to disk, uploaded to S3, sent over email, etc.

Importable workflow JSON

Copy the snippet below and in n8n press Ctrl/Cmd + V on an empty canvas (or use Import from Clipboard). Replace REPLACE_WITH_CREDENTIAL_ID with the id n8n assigns to your saved Approx OAuth2 API credential.

{
  "name": "Approx — generate and download a report",
  "nodes": [
    {
      "parameters": {},
      "id": "1",
      "name": "When clicking 'Test workflow'",
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [240, 300]
    },
    {
      "parameters": {
        "resource": "project",
        "operation": "getMany",
        "queryOptions": { "take": 5 }
      },
      "id": "2",
      "name": "List 5 projects",
      "type": "@approx-tech/n8n-nodes-approx.approx",
      "typeVersion": 1,
      "position": [480, 300],
      "credentials": {
        "approxOAuth2Api": {
          "id": "REPLACE_WITH_CREDENTIAL_ID",
          "name": "Approx OAuth2 API"
        }
      }
    },
    {
      "parameters": {
        "resource": "report",
        "operation": "create",
        "projectId": "={{ $json.id }}"
      },
      "id": "3",
      "name": "Queue report",
      "type": "@approx-tech/n8n-nodes-approx.approx",
      "typeVersion": 1,
      "position": [720, 300],
      "credentials": {
        "approxOAuth2Api": {
          "id": "REPLACE_WITH_CREDENTIAL_ID",
          "name": "Approx OAuth2 API"
        }
      }
    },
    {
      "parameters": { "amount": 30, "unit": "seconds" },
      "id": "4",
      "name": "Wait 30s",
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1,
      "position": [960, 300]
    },
    {
      "parameters": {
        "resource": "report",
        "operation": "download",
        "reportId": "={{ $json.id }}",
        "binaryPropertyName": "report"
      },
      "id": "5",
      "name": "Download report ZIP",
      "type": "@approx-tech/n8n-nodes-approx.approx",
      "typeVersion": 1,
      "position": [1200, 300],
      "credentials": {
        "approxOAuth2Api": {
          "id": "REPLACE_WITH_CREDENTIAL_ID",
          "name": "Approx OAuth2 API"
        }
      }
    }
  ],
  "connections": {
    "When clicking 'Test workflow'": {
      "main": [[{ "node": "List 5 projects", "type": "main", "index": 0 }]]
    },
    "List 5 projects": {
      "main": [[{ "node": "Queue report", "type": "main", "index": 0 }]]
    },
    "Queue report": {
      "main": [[{ "node": "Wait 30s", "type": "main", "index": 0 }]]
    },
    "Wait 30s": {
      "main": [[{ "node": "Download report ZIP", "type": "main", "index": 0 }]]
    }
  }
}

Sample success outputs

Project: Get Many (trimmed to one item)

{
  "id": "6d3a1f7e-1c2b-4f4c-9a7d-2b8d9d2f8a3e",
  "name": "Demo Villa — Antalya",
  "authorityId": "0b8e5d59-3f72-4d4a-9e0d-4f7e6f1c2a91",
  "takeoffTemplateId": "b3d20b6c-7d6f-4f02-9c54-3c1c1c5a4e22",
  "reportTemplateId": "f1b9c8e0-aa11-4af0-9c5d-5a2f3b4c6d70",
  "carriagePercentage": 0.04,
  "expandCustomPricings": false,
  "createdAt": "2026-05-21T08:14:33Z",
  "updatedAt": "2026-05-30T14:02:11Z"
}

Project: Create

{
  "id": "8f9a2b1c-aa00-4bbb-8e9c-1234567890ab",
  "name": "New Office Block — Istanbul",
  "authorityId": "0b8e5d59-3f72-4d4a-9e0d-4f7e6f1c2a91",
  "takeoffTemplateId": "b3d20b6c-7d6f-4f02-9c54-3c1c1c5a4e22",
  "reportTemplateId": "f1b9c8e0-aa11-4af0-9c5d-5a2f3b4c6d70",
  "carriagePercentage": 0.04,
  "expandCustomPricings": false
}

Report: Create

{
  "id": "c7a4b6d2-9e1f-4c83-bd6e-7a8d9f0b1c23",
  "projectId": "6d3a1f7e-1c2b-4f4c-9a7d-2b8d9d2f8a3e",
  "status": "Queued",
  "createdAt": "2026-06-02T16:18:00Z"
}

Report: Get (polled later)

{
  "id": "c7a4b6d2-9e1f-4c83-bd6e-7a8d9f0b1c23",
  "projectId": "6d3a1f7e-1c2b-4f4c-9a7d-2b8d9d2f8a3e",
  "status": "Completed",
  "createdAt": "2026-06-02T16:18:00Z",
  "completedAt": "2026-06-02T16:18:22Z"
}

Report: Download

{
  "reportId": "c7a4b6d2-9e1f-4c83-bd6e-7a8d9f0b1c23",
  "filename": "report-c7a4b6d2-9e1f-4c83-bd6e-7a8d9f0b1c23.zip",
  "mimeType": "application/zip"
}

…plus a binary.report field containing the actual ZIP bytes (default field name; configurable via Put Output File in Field).

Pricing Library: Get Many (one item)

{
  "id": "lib-2025-istanbul",
  "name": "İBB 2025 Birim Fiyat Listesi",
  "authorityId": "0b8e5d59-3f72-4d4a-9e0d-4f7e6f1c2a91",
  "culture": "tr-TR"
}

Authority: Get Many (one item)

{
  "id": "0b8e5d59-3f72-4d4a-9e0d-4f7e6f1c2a91",
  "name": "Çevre, Şehircilik ve İklim Değişikliği Bakanlığı",
  "createdAt": "2025-01-12T10:00:00Z"
}

Takeoff Template: Get Many (one item)

{
  "id": "b3d20b6c-7d6f-4f02-9c54-3c1c1c5a4e22",
  "name": "Konut — Standart Şablon",
  "culture": "tr-TR",
  "version": 3
}

Migrating from 0.4.x

Two breaking changes ship in 0.5.0; both are required to pass n8n community verification.

1. One node instead of five

The previous five nodes are gone:

| Old node | New resource (on the single Approx node) | | --- | --- | | Approx Project | Project, Property, Work Group Type, Original File, Static File, File | | Approx Report | Report | | Approx Unit Price | Pricing, Pricing Library | | Approx Authority | Authority | | Approx Template | Takeoff Template, Report Template, Property Type |

In existing workflows, delete the old node and add the new Approx node in its place — the operation names and parameter names are unchanged, so you can copy values straight across.

2. Credential renamed and rewired to built-in OAuth2

The credential class is now ApproxOAuth2Api (internal name approxOAuth2Api). n8n's built-in OAuth2 client-credentials grant is used — no custom token code lives in this package any more.

You must recreate the credential (n8n cannot migrate between credential types). Create a new Approx OAuth2 API credential with the same Client ID, Client Secret, Auth0 Domain, Audience and Base URL values, then re-pick it on each Approx node.


License

MIT.

Support