salvy

n8n community node for the Salvy public API: phone accounts, employees, cost centers, assets and invoices

Package Information

Released: this month
Downloads: 0 weekly / 0 monthly
Latest Version: 0.1.1
Author: Salvy

Documentation

n8n-nodes-salvy

This is an n8n community node for the Salvy public API (v3). It lets you manage phone accounts, employees, cost centers, assets, asset statements and invoices from your n8n workflows.

n8n is a fair-code licensed workflow automation platform.

Installation

Follow the installation guide in the n8n community nodes documentation and install the package @salvyltd/n8n-nodes-salvy.

Credentials

The node uses a Salvy API credential with a single field, API Key.

  1. In the Salvy dashboard, create a company or organization API key (API keys guide).
  2. In n8n, create a new Salvy API credential and paste the key.

The key is sent as Authorization: Bearer <key> to https://api.salvy.com.br. Sandbox and production keys use the same base URL; the key decides the environment (environments). n8n tests the credential with a read-only call to GET /api/v3/companies.

Operations

Resource Operations
Area Code Get Many
Asset Archive, Create, Create Timeline Note, Delete, Get, Get Many, Unarchive, Update
Asset Statement Download Signed File, Get, Get Many, Send, Simulate Signature
Company Get Many
Cost Center Create, Delete, Get, Get Many, Update
Employee Batch Sync, Create, Delete, Get, Get Many, Update
Invoice Download NFe PDF, Download NFe XML, Download PDF, Get, Get Many, Get Phone Accounts
Phone Account Activate, Batch Update Cost Center, Block, Cancel, Create Mobile, Create Mobile DID, Get, Get Data Balance, Get eSIM, Get Many, Get SMS Messages, Simulate SMS, Top Up Data, Unblock, Unschedule Cancellation, Update
Phone Account Group Create, Delete, Get, Get Many, Update
Plan Get, Get Many
Task Get, Get Results

Notes:

  • Get Many operations return one item per record, with Return All / Limit handling the API's page-based pagination.
  • Download operations return the file as binary data (field data by default).
  • Simulate SMS and Simulate Signature are sandbox-only in the API; use them with a sandbox key.
  • Batch operations (Batch Sync, Batch Update Cost Center) run in the background and return a task ID; poll it with Task > Get and Task > Get Results.
  • The experimental WebRTC token endpoint is intentionally not included.

Operation coverage

Generated from openapi/salvy-v3.json by npm run generate. "generated" means the @devlikeapro/n8n-openapi-node output was used as is; "fixed" lists what had to be corrected or added on top of it.

Resource Operation Endpoint Status Notes
Area Code Get Many GET /api/v3/area-codes fixed not paginated (no pagination in the response): no Return All/Limit; optional query params grouped under Filters/Options (generator sends every param, even empty); list response split into one item per record (data)
Asset Statement Download Signed File GET /api/v3/asset-statements/{id}/signed-file fixed file response returned as n8n binary data (generator: JSON only)
Asset Statement Get Many GET /api/v3/asset-statements fixed array query params as comma-separated text (generator sends them as a JSON string); array query params as multi-select (generator sends them as a JSON string); page/pageSize replaced by Return All + Limit with generic pagination; optional query params grouped under Filters/Options (generator sends every param, even empty); list response split into one item per record (data)
Asset Statement Get GET /api/v3/asset-statements/{id} generated —
Asset Statement Send POST /api/v3/asset-statements fixed oneOf body merged; branch-only fields shown per type; assetIds (array of IDs) as comma-separated text (generator: raw JSON field)
Asset Statement Simulate Signature POST /api/v3/asset-statements/{id}/simulate-signature generated —
Asset Archive POST /api/v3/assets/{id}/archive generated —
Asset Create Timeline Note POST /api/v3/assets/{id}/timeline-notes fixed optional body fields grouped under Additional Fields (generator sends every field, even empty)
Asset Create POST /api/v3/assets fixed nullable types (OpenAPI 3.1) collapsed; nested customFields exposed as a JSON field (generator: first level only); optional body fields grouped under Additional Fields (generator sends every field, even empty)
Asset Delete DELETE /api/v3/assets/{id} fixed 204 No Content mapped to { success: true }
Asset Get Many GET /api/v3/assets fixed includeArchived is a string in the spec; exposed as a boolean; array query params as multi-select (generator sends them as a JSON string); array query params as comma-separated text (generator sends them as a JSON string); page/pageSize replaced by Return All + Limit with generic pagination; optional query params grouped under Filters/Options (generator sends every param, even empty); list response split into one item per record (data)
Asset Get GET /api/v3/assets/{id} generated —
Asset Unarchive POST /api/v3/assets/{id}/unarchive generated —
Asset Update PATCH /api/v3/assets/{id} fixed nullable types (OpenAPI 3.1) collapsed; nested customFields exposed as a JSON field (generator: first level only); optional body fields grouped under Update Fields (generator sends every field, even empty)
Company Get Many GET /api/v3/companies fixed page/pageSize replaced by Return All + Limit with generic pagination; list response split into one item per record (data)
Cost Center Create POST /api/v3/cost-centers fixed nullable types (OpenAPI 3.1) collapsed; optional body fields grouped under Additional Fields (generator sends every field, even empty)
Cost Center Delete DELETE /api/v3/cost-centers/{id} fixed nullable types (OpenAPI 3.1) collapsed; 204 No Content mapped to { success: true }
Cost Center Get Many GET /api/v3/cost-centers fixed array query params as multi-select (generator sends them as a JSON string); page/pageSize replaced by Return All + Limit with generic pagination; optional query params grouped under Filters/Options (generator sends every param, even empty); list response split into one item per record (data)
Cost Center Get GET /api/v3/cost-centers/{id} generated —
Cost Center Update PATCH /api/v3/cost-centers/{id} fixed nullable types (OpenAPI 3.1) collapsed; optional body fields grouped under Update Fields (generator sends every field, even empty)
Employee Batch Sync POST /api/v3/employees/batch-sync fixed nested employees exposed as a JSON field (generator: first level only)
Employee Create POST /api/v3/employees fixed nested address hand-written as a collection (generator: first level only); optional body fields grouped under Additional Fields (generator sends every field, even empty)
Employee Delete DELETE /api/v3/employees/{id} fixed 204 No Content mapped to { success: true }
Employee Get Many GET /api/v3/employees fixed array query params as multi-select (generator sends them as a JSON string); page/pageSize replaced by Return All + Limit with generic pagination; optional query params grouped under Filters/Options (generator sends every param, even empty); list response split into one item per record (data)
Employee Get GET /api/v3/employees/{id} generated —
Employee Update PATCH /api/v3/employees/{id} fixed nullable types (OpenAPI 3.1) collapsed; nested address hand-written as a collection (generator: first level only); optional body fields grouped under Update Fields (generator sends every field, even empty)
Invoice Download NFe PDF GET /api/v3/invoices/{id}/nfe/pdf fixed file response returned as n8n binary data (generator: JSON only)
Invoice Download NFe XML GET /api/v3/invoices/{id}/nfe/xml fixed file response returned as n8n binary data (generator: JSON only)
Invoice Download PDF GET /api/v3/invoices/{id}/pdf fixed file response returned as n8n binary data (generator: JSON only)
Invoice Get Many GET /api/v3/invoices fixed array query params as multi-select (generator sends them as a JSON string); page/pageSize replaced by Return All + Limit with generic pagination; optional query params grouped under Filters/Options (generator sends every param, even empty); list response split into one item per record (data)
Invoice Get Phone Accounts GET /api/v3/invoices/{id}/phone-accounts fixed page/pageSize replaced by Return All + Limit with generic pagination; list response split into one item per record (data)
Invoice Get GET /api/v3/invoices/{id} generated —
Phone Account Group Create POST /api/v3/phone-account-groups fixed optional body fields grouped under Additional Fields (generator sends every field, even empty)
Phone Account Group Delete DELETE /api/v3/phone-account-groups/{id} fixed 204 No Content mapped to { success: true }
Phone Account Group Get Many GET /api/v3/phone-account-groups fixed page/pageSize replaced by Return All + Limit with generic pagination; list response split into one item per record (data)
Phone Account Group Get GET /api/v3/phone-account-groups/{id} generated —
Phone Account Group Update PATCH /api/v3/phone-account-groups/{id} fixed optional body fields grouped under Update Fields (generator sends every field, even empty)
Phone Account Activate POST /api/v3/phone-accounts/{id}/activate fixed optional body fields grouped under Additional Fields (generator sends every field, even empty)
Phone Account Batch Update Cost Center POST /api/v3/phone-accounts/batch-update-cost-center fixed nullable types (OpenAPI 3.1) collapsed; phoneAccountIds (array of IDs) as comma-separated text (generator: raw JSON field)
Phone Account Block POST /api/v3/phone-accounts/{id}/block fixed optional body fields grouped under Additional Fields (generator sends every field, even empty)
Phone Account Cancel POST /api/v3/phone-accounts/{id}/cancel fixed optional body fields grouped under Additional Fields (generator sends every field, even empty)
Phone Account Create Mobile DID POST /api/v3/phone-accounts/mobile-did fixed nullable types (OpenAPI 3.1) collapsed; nested customFields exposed as a JSON field (generator: first level only); optional body fields grouped under Additional Fields (generator sends every field, even empty)
Phone Account Create Mobile POST /api/v3/phone-accounts/mobile fixed oneOf body merged; branch-only fields shown per simType; nullable types (OpenAPI 3.1) collapsed; nested customFields exposed as a JSON field (generator: first level only); optional body fields grouped under Additional Fields (generator sends every field, even empty)
Phone Account Get Data Balance GET /api/v3/phone-accounts/{id}/balance generated —
Phone Account Get Many GET /api/v3/phone-accounts fixed array query params as multi-select (generator sends them as a JSON string); array query params as comma-separated text (generator sends them as a JSON string); page/pageSize replaced by Return All + Limit with generic pagination; optional query params grouped under Filters/Options (generator sends every param, even empty); list response split into one item per record (data)
Phone Account Get SMS Messages GET /api/v3/phone-accounts/{id}/sms-messages fixed array query params as multi-select (generator sends them as a JSON string); page/pageSize replaced by Return All + Limit with generic pagination; optional query params grouped under Filters/Options (generator sends every param, even empty); list response split into one item per record (data)
Phone Account Get eSIM GET /api/v3/phone-accounts/{id}/esim generated —
Phone Account Get GET /api/v3/phone-accounts/{id} generated —
Phone Account Simulate SMS POST /api/v3/phone-accounts/{id}/sms fixed 204 No Content mapped to { success: true }
Phone Account Top Up Data POST /api/v3/phone-accounts/{id}/top-up-data generated —
Phone Account Unblock POST /api/v3/phone-accounts/{id}/unblock generated —
Phone Account Unschedule Cancellation POST /api/v3/phone-accounts/{id}/unschedule-cancellation generated —
Phone Account Update PATCH /api/v3/phone-accounts/{id} fixed nullable types (OpenAPI 3.1) collapsed; nested customFields exposed as a JSON field (generator: first level only); optional body fields grouped under Update Fields (generator sends every field, even empty)
Plan Get Many GET /api/v3/plans fixed not paginated (no pagination in the response): no Return All/Limit; list response split into one item per record (data)
Plan Get GET /api/v3/plans/{id} generated —
Task Get Results GET /api/v3/tasks/{id}/results fixed array query params as multi-select (generator sends them as a JSON string); page/pageSize replaced by Return All + Limit with generic pagination; optional query params grouped under Filters/Options (generator sends every param, even empty); response is a oneOf union keyed by type; items are passed through as-is (the generator does not read responses); list response split into one item per record (data)
Task Get GET /api/v3/tasks/{id} generated —
— — POST /api/v3/webrtc/tokens excluded WebRTC is experimental; excluded from this node on purpose.

Compatibility

Built with @n8n/node-cli 0.52.2. Tested by loading the built node into n8n 2.43.4.

Development

npm install
npm run spec:refresh   # download the latest OpenAPI spec from docs.salvy.com.br
npm run generate       # regenerate nodes/Salvy/Salvy.properties.generated.ts
npm run lint
npm run build
npm run dev            # run n8n locally with the node loaded

The node is declarative: nodes/Salvy/Salvy.properties.generated.ts holds every parameter and request mapping and is produced at build time from the vendored spec. The generator is a dev dependency only; the published package has no runtime dependencies. Operation names and English descriptions live in scripts/salvy-operations.mjs and scripts/i18n/descriptions.en.json; npm run generate fails if the spec gains an unmapped operation or an untranslated description.

Resources

Discussion